0% found this document useful (0 votes)
11 views

Lab4 Swift

The document defines data structures for cities and locations in Belarus. It includes functions to find cities by name, keyword, calculate distances between locations, and find the closest and farthest cities to a given point.
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views

Lab4 Swift

The document defines data structures for cities and locations in Belarus. It includes functions to find cities by name, keyword, calculate distances between locations, and find the closest and farthest cities to a given point.
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 5

import Cocoa

import Foundation

struct Location {
let id: Int
let type: String // such as restaurants, pubs, museums, monuments
let name: String
let rating: Int // from 1 to 5
}
struct City {
let id: Int
let name: String
let description: String
let latitude: Double
let longitude: Double
let keywords: [String]
let locations: [Location]
}

let belarusianCities: [City] = [


City(id: 1, name: "Minsk", description: "Capital city of Belarus", latitude:
53.9045, longitude: 27.5615, keywords: ["capital", "urban", "culture"], locations:
[
Location(id: 1, type: "Restaurant", name: "Central Perk", rating: 4),
Location(id: 2, type: "Park", name: "Dreamland Park", rating: 5),
]),
City(id: 2, name: "Brest", description: "City in southwest Belarus",
latitude: 52.0976, longitude: 23.7341, keywords: ["border", "history", "culture"],
locations: [
Location(id: 1, type: "Theater", name: "Fantasy Theater", rating: 5),
Location(id: 2, type: "Café", name: "Wonderland Café", rating: 4),
]),
City(id: 3, name: "Grodno", description: "City in western Belarus",
latitude: 53.6884, longitude: 23.8258, keywords: ["historical", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Pub", name: "Magic Brew", rating: 4),
Location(id: 2, type: "Garden", name: "Enchanted Garden", rating: 3),
]),
City(id: 4, name: "Mogilev", description: "City in eastern Belarus", latitude:
53.9023, longitude: 30.3346, keywords: ["industrial", "cultural", "architecture"],
locations: [
Location(id: 1, type: "Theater", name: "Grand Theater", rating: 4),
Location(id: 2, type: "Park", name: "City Park", rating: 3),
]),
City(id: 5, name: "Vitebsk", description: "City in northern Belarus",
latitude: 55.1904, longitude: 30.2046, keywords: ["cultural", "historical",
"architecture"], locations: [
Location(id: 1, type: "Restaurant", name: "Riverside Grill", rating: 5),
Location(id: 2, type: "Museum", name: "History Museum", rating: 4),
]),
City(id: 5, name: "Vitebsk", description: "City in northern Belarus", latitude:
55.1904, longitude: 30.2046, keywords: ["cultural", "historical", "architecture"],
locations: [
Location(id: 1, type: "Café", name: "Artisan Café", rating: 4),
Location(id: 2, type: "Park", name: "City Park", rating: 3),
]),
City(id: 6, name: "Gomel", description: "City in southeastern Belarus",
latitude: 52.4345, longitude: 31.0128, keywords: ["industrial", "cultural",
"parks"], locations: [
Location(id: 1, type: "Theater", name: "Sunset Theater", rating: 5),
Location(id: 2, type: "Garden", name: "Green Oasis", rating: 4),
]),
City(id: 7, name: "Molodechno", description: "City in northwestern
Belarus", latitude: 54.3128, longitude: 26.8607, keywords: ["historic", "cultural",
"nature"], locations: [
Location(id: 1, type: "Pub", name: "Rustic Tavern", rating: 4),
Location(id: 2, type: "Lake", name: "Serene Lake", rating: 3),
]),
City(id: 8, name: "Orsha", description: "City in northeastern Belarus",
latitude: 54.5131, longitude: 30.4173, keywords: ["historical", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Museum", name: "Ancient Art Museum", rating: 5),
Location(id: 2, type: "Restaurant", name: "Renaissance Eatery", rating:
5),
]),
City(id: 9, name: "Novopolotsk", description: "City in northern Belarus",
latitude: 55.5291, longitude: 28.6166, keywords: ["industrial", "modern", "urban"],
locations: [
Location(id: 1, type: "Shopping Mall", name: "Metropolis Mall", rating:
4),
Location(id: 2, type: "Bowling Alley", name: "Strikes & Spares",
rating: 3),
]),
City(id: 10, name: "Bobruisk", description: "City in eastern Belarus",
latitude: 53.1599, longitude: 29.2333, keywords: ["industrial", "historical",
"urban"], locations: [
Location(id: 1, type: "Amusement Park", name: "Thrill Zone", rating:
5),
Location(id: 2, type: "Coffee Shop", name: "Brewed Perfection", rating:
4),
]),
City(id: 11, name: "Baranovichi", description: "City in western Belarus",
latitude: 53.1333, longitude: 26.0139, keywords: ["industrial", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Gym", name: "Fitness Fusion", rating: 4),
Location(id: 2, type: "Library", name: "Book Haven", rating: 3),
]),
City(id: 12, name: "Pinsk", description: "City in southern Belarus",
latitude: 52.1273, longitude: 26.091, keywords: ["historical", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Historic Site", name: "Heritage Square", rating:
5),
Location(id: 2, type: "Market", name: "Local Bazaar", rating: 4),
]),
City(id: 13, name: "Lida", description: "City in western Belarus",
latitude: 53.8885, longitude: 25.2906, keywords: ["historical", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Theater", name: "Classic Theater", rating: 4),
Location(id: 2, type: "Café", name: "Cozy Corner Café", rating: 3),
]),
City(id: 14, name: "Slonim", description: "City in western Belarus",
latitude: 53.0862, longitude: 25.3206, keywords: ["historic", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Garden", name: "Secret Garden", rating: 5),
Location(id: 2, type: "Restaurant", name: "Rustic Retreat", rating: 4),
]),
City(id: 15, name: "Polotsk", description: "City in northern Belarus",
latitude: 55.4853, longitude: 28.7736, keywords: ["historic", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Museum", name: "Ancient Artifacts Museum",
rating: 5),
Location(id: 2, type: "Park", name: "Riverfront Park", rating: 4),
]),
City(id: 16, name: "Luninets", description: "Town in southeastern Belarus",
latitude: 52.2268, longitude: 26.8138, keywords: ["rural", "historic", "nature"],
locations: [
Location(id: 1, type: "Lake", name: "Tranquil Lake", rating: 4),
Location(id: 2, type: "Hiking Trail", name: "Scenic Trail", rating: 3),
]),
City(id: 17, name: "Zhlobin", description: "City in southeastern Belarus",
latitude: 52.8884, longitude: 30.034, keywords: ["industrial", "modern", "urban"],
locations: [
Location(id: 1, type: "Shopping Center", name: "MegaMart", rating: 4),
Location(id: 2, type: "Sports Complex", name: "FitZone", rating: 3),
]),
City(id: 18, name: "Svetlogorsk", description: "Town in southeastern
Belarus", latitude: 52.6263, longitude: 29.7301, keywords: ["coastal", "nature",
"resort"], locations: [
Location(id: 1, type: "Beach", name: "Sunny Shores Beach", rating: 5),
Location(id: 2, type: "Aquarium", name: "Marine World", rating: 4),
]),
City(id: 19, name: "Salihorsk", description: "City in central Belarus",
latitude: 52.7932, longitude: 27.5424, keywords: ["industrial", "mining",
"modern"], locations: [
Location(id: 1, type: "Shopping Mall", name: "Diamond Plaza", rating:
4),
Location(id: 2, type: "Nightclub", name: "Neon Nights", rating: 3),
]),
City(id: 20, name: "Staropolatsk", description: "City in northern Belarus",
latitude: 54.5291, longitude: 29.6166, keywords: ["imagined", "old", "idk"],
locations: [
Location(id: 1, type: "Observatory", name: "Stargazer Observatory",
rating: 5),
Location(id: 2, type: "Bookstore", name: "Wise Words Bookstore",
rating: 4),
]),
]

func findCityByName(_ city: String, _ cities: [City]) -> [City]{


let results = cities.filter{$0.name.contains(city)};
return results;
}
print("Found by name:");
let findingCities = findCityByName("N", belarusianCities);
findingCities.forEach{print($0.name)};

func findCityByKeyword(_ keyword: String, _ cities: [City]) -> [City]{


let results = cities.filter{$0.keywords.contains(keyword)};
return results;
}
print("Found by keyword:");
let findingCities2 = findCityByKeyword("industrial", belarusianCities);
findingCities2.forEach{print($0.name)};

func calculateDistance(_ latitudeA : Double, _ longitudeA : Double,_ latitudeB :


Double,_ longitudeB : Double) -> Double {
let earthRadius: Double = 6371 // Earth's radius in kilometers
let sourceLatitudeRadians = latitudeA * .pi / 180
let destinationLatitudeRadians = latitudeB * .pi / 180
let latitudeDifferenceRadians = (latitudeB - latitudeA) * .pi / 180
let longitudeDifferenceRadians = (longitudeB - longitudeA) * .pi / 180
let a = sin(latitudeDifferenceRadians / 2) * sin(latitudeDifferenceRadians / 2)
+
cos(sourceLatitudeRadians) * cos(destinationLatitudeRadians) *
sin(longitudeDifferenceRadians / 2) * sin(longitudeDifferenceRadians /
2)
let c = 2 * atan2(sqrt(a), sqrt(1 - a))
let distance = earthRadius * c

return distance
}

let city1 = belarusianCities[2];


let city2 = belarusianCities[0];
print("Distance between \(city1.name) and \(city2.name) is \
(calculateDistance(city1.latitude, city1.longitude, city2.latitude,
city2.longitude))");

func findClosetFarthest(latitudeA : Double, longitudeA : Double, _ cities: [City])


-> (City, City){
var farthestCity = cities[0]
var closestCity = cities[0]
var farthest = calculateDistance(farthestCity.latitude, farthestCity.longitude,
latitudeA, longitudeA);
var closest = calculateDistance(farthestCity.latitude, farthestCity.longitude,
latitudeA, longitudeA);

for city in cities{


if(calculateDistance(latitudeA, longitudeA, city.latitude, city.longitude)
> farthest){
farthest = calculateDistance(latitudeA, longitudeA, city.latitude,
city.longitude);
farthestCity = city;
}
if(calculateDistance(latitudeA, longitudeA, city.latitude, city.longitude)
< closest){
closest = calculateDistance(latitudeA, longitudeA, city.latitude,
city.longitude);
closestCity = city;
}
}
return (closestCity, farthestCity);
}

let (closestCity, farthestCity) = findClosetFarthest(latitudeA: 53.6884,


longitudeA: 23.8258, belarusianCities);
print("Closest city is \(closestCity.name). Farthest is \(farthestCity.name)");

func citiesWithFiveStarRestaurants(_ cities: [City]) -> [City] {


return cities.filter { city in
city.locations.contains(where: { $0.type == "Restaurant" && $0.rating ==
5 })
}
}

print("Cities with 5-raiting resataurant:");


let citiesRest = citiesWithFiveStarRestaurants(belarusianCities);
citiesRest.forEach{print($0.name)};

func relatedLocationsSortedByRating(_ city: City) -> [Location] {


return city.locations.sorted(by: { $0.rating > $1.rating })
}

print("Locations in city \(city2.name):");


let citiesLocations = relatedLocationsSortedByRating(city2);
citiesLocations.forEach{print($0.name)};

func displayCitiesWithFiveStarLocations(cities: [City]) {


for city in cities {
let fiveStarLocations = city.locations.filter { $0.rating == 5 }
print("\(city.name) has \(fiveStarLocations.count) location(s) with a 5-
star rating:")
for location in fiveStarLocations {
print("- \(location.name)")
}
print()
}
}

print("Cities with 5-raiting locations:");


displayCitiesWithFiveStarLocations(cities: belarusianCities);

You might also like