Доработайте программу «Сумма чисел» так, чтобы она производила проверку значений запрашиваемых параметров на соответствие числовому типу данных. Программа должна просить ввести корректное значение до тех пор, пока оно не будет введено. И так для каждого из аргументов.
repeat while
Int(_:)
возвращает значение опционального типа Int?
. В случае, если приведение к числу невозможно, будет возвращен nil
. Этой особенностью можно воспользоваться при определении соответствия введенных чисел целочисленному типу данных
//запрос первого аргумента var num1: String? repeat { print("Введите числовое значение первого аргумента") num1 = readLine() } while Int(num1!) == nil //запрос второго аргумента var num2: String? repeat { print("Введите числовое значение второго аргумента") num2 = readLine() } while Int(num2!) == nil //подсчет суммы аргументов var result = sum(num1, num2) //вывод результата на консоль print("Результат сложения - \(result)")
Доработайте программу таким образом, чтобы она позволяла выбирать, какую из арифметических операций выполнить (/, *, +, -, корень, степень)
Доработайте программу таким образом, чтобы появлялся запрос количества аргументов (будьте внимательны, что для возведения в степень и корня количество аргументов фиксировано)
17 Comments
нужно ли корить себя за то, что я два дня думал над первым заданием, пробовал, перечитывал главу с repeat while и в итоге не смог? Пришлось поглядывать в ответ…
Конечно же нет! Советую вам вернуться к нему через пару дней и посмотреть, сможете ли вы его решить самостоятельно.
Спасибо за ответ)
Я тут решил Задание 2, но пока не разобрался с корнем и степенью
func sum(_ a: String?, _ b: String?) -> Int {
print(«Введите нужный знак для арифметической операции +,-,*,/»)
let x = readLine()
var yes = Int()
switch x {
case «+»:
yes = Int(a!)! + Int(b!)!
case «-«:
yes = Int(a!)! — Int(b!)!
case «*»:
yes = Int(a!)! * Int(b!)!
case «/»:
yes = Int(a!)! / Int(b!)!
default:
print(«Введен неверный знак»)
}
return yes
}
Хотел подглядеть, но скачивая вариант Тимура, не могу его открыть, архивы множатся при каждом нажатии. Как его открыть?
ответ для второго задания баганный((( Перезалейте, пожалуйста
Задание 2 (ответ):
//изменения внес только в файл func.swift
func sum(_ a: String?, _ b: String?) -> Int {
print(«Введите нужный знак для арифметической операции +, -, *, /, x^n, sqrt(корень для первого аргумента)»)
let x = readLine()
var yes = Int()
switch x {
case «+»:
yes = Int(a!)! + Int(b!)!
case «-«:
yes = Int(a!)! — Int(b!)!
case «*»:
yes = Int(a!)! * Int(b!)!
case «/»:
yes = Int(a!)! / Int(b!)!
case «x^n»:
yes = Int(pow(Double(Int(a!)!),Double(Int(b!)!)))
case «sqrt»:
yes = Int(sqrt(Double(Int(a!)!)))
default:
print(«Введен неверный знак»)
}
return yes
}
Задание 3:
// код из main.swift
print(«Введите количество аргументов (для x^ — 2шт, для sqrt — 1шт)»)
var countArg = readLine()
var arrayNum = [Int]()
while arrayNum.count Int {
print(«Введите нужный знак для арифметической операции +, -, *, /, x^n, sqrt(корень для первого аргумента)»)
let x = readLine()
var yes = Int()
switch x {
case «+»:
yes = a.reduce(0, +)
case «-«:
yes = a.reduce(0, -)
case «*»:
yes = a.reduce(1, *)
case «/»:
yes = a.reduce(1, /)
case «x^»:
yes = Int(pow(Double(a[0]),Double(a[1])))
case «sqrt»:
yes = Int(sqrt(Double(Int(a[0]))))
default:
print(«Введен неверный знак»)
}
return yes
}
// Буду благодарен, если разберете мой код, оптимизируете
// Не могу понять, почему приходится отнимать единицу в (Int(countArg!)! — 1)
Задание 3 (в прошлый раз криво залилось, сорян):
// код из main.swift
print(«Введите количество аргументов (для x^ — 2шт, для sqrt — 1шт)»)
var countArg = readLine()
var arrayNum = [Int]()
while arrayNum.count Int {
print(«Введите нужный знак для арифметической операции +, -, *, /, x^n, sqrt(корень для первого аргумента)»)
let x = readLine()
var yes = Int()
switch x {
case «+»:
yes = a.reduce(0, +)
case «-«:
yes = a.reduce(0, -)
case «*»:
yes = a.reduce(1, *)
case «/»:
yes = a.reduce(1, /)
case «x^»:
yes = Int(pow(Double(a[0]),Double(a[1])))
case «sqrt»:
yes = Int(sqrt(Double(Int(a[0]))))
default:
print(«Введен неверный знак»)
}
return yes
}
// Буду благодарен, если разберете мой код, оптимизируете
// Не могу понять, почему приходится отнимать единицу в (Int(countArg!)! – 1)
не заливается полностью((((((((((((
Вижу по дате комента, что ответ мой будет неактуальным для тебя, но все же предположу: если значение будет какое нибудь такое 5.348394 и мы попытаемся представить типом Int, то это будет 6. у меня сейчас проблема в том, что я не могу вытащить корень н-степени с типом данных Double …(
Удалите мои комменты, плиз
Вот ссылка на ответ для 3 задания: https://yadi.sk/d/M_2TZITisN_PQw
Первое задание выполнил с объединением проверки ввода для обоих слагаемых, но пришлось изменить входные параметры функции:
func readNumber () -> Int {
if let a = Int(readLine()!) {
return a
} else {
print(«Введите корректное число»)
return readNumber()
}
}
print(«Введите значение первого аргумента»)
var a = readNumber()
print(«Введите значение второго аргумента»)
var b = readNumber()
Вот основной код всех 3-х заданий: var intFlag = falsevar opFlag = falsevar countFlag = falsevar opCorrectlyFlag = false var op: String?repeat { if opFlag == false { print(«Введите арифметическую операцию») opFlag = true } else { print(«Введите корректную арифметическую операцию») } op = readLine() if op! == «+» || op! == «-» || op! == «*» || op! == «/» || op! == «^2» || op! == «sqrt» { opCorrectlyFlag = true }} while opCorrectlyFlag == false var count: String?repeat { if op == «^2» || op == «sqrt» { count = «1» break } else { if countFlag == false { print(«Введите количество элементов для операции») countFlag = true } else { print(«Введите корректное количество элементов для операции») } } count = readLine()} while Int(count!) == nil var array: Array<String?> = []var funcCount = Int(count!)! — 1for i in 0…funcCount { print(«Введите значение аргумента») array.append(readLine()) while Int(array[i]!) == nil { array.removeLast() print(«Введите корректное значение аргумента») array.append(readLine()) } if op == «^2» || op == «sqrt» { break }} let result = sum(array, op)print(«Результат операции: \(result)»)А вот функция: func sum(_ array: Array<String?>, _ op: String?) -> Int { var result: Int = 0 switch op! { case «+»: result = 0 for i in 0…funcCount { result += Int(array[i]!)! } case «-«: result = 0 for i in 0…funcCount { if i == 0 { result += Int(array[i]!)! continue } result -= Int(array[i]!)! } case «*»: result = 1 for i in 0…funcCount { result *= Int(array[i]!)! } case «/»: result = 1 for i in 0…funcCount { if Int(array[i]!)! == 0 { continue } if i == 0 { result += Int(array[i]!)! continue } result /= Int(array[i]!)! } case «^2»: result = Int(pow(Double(array[0]!)!, 2)) case «sqrt»: if sqrt(Double(array[0]!)!).truncatingRemainder(dividingBy: 2) != 0 { print(«Ошибка: квадратный корень не может быть извлечён») return 0 } result = Int(sqrt(Double(array[0]!)!)) default: break } return result}Беда в том, что думал над 3-м заданием довольно долго, но, к счастью, смог додуматься ;)P.S. – Извиняйте за чёрный фон
Оуф, что-то совсем всё криво отображается…
2-задание выполнила с использованием словарей (для проверки знака и хранения безымянных функций, их вызова).
Основной файл
import Foundation
func insert(print str: String) -> String?{
var a: String?
repeat {
print(str)
a = readLine()
}while(Int(a!)==nil)
return a
}
var a = insert(print: «Enter value 1: «)
var b = insert(print: «Enter value 2: «)
var znaki: [String: (Double, Double) -> Double] = [«/»: {$0 / $1}, «*»: {$0*$1}, «+»: {$0+$1}, «-«: {$0-$1}, «корень»: {pow(Double($0), 1.0/Double($1))}, «степень»: {pow(Double($0), Double($1))}]
var zn: String?
repeat {
print(«Enter sign: «)
zn = readLine()
}while(!znaki.keys.contains(zn!))
let result = operat(a, b, znaki[zn!]!)
print(«Result = \(result)»)
Второй файл
func operat(_ a:String?, _ b: String?, _ zn: (Double, Double)->Double) -> Double {
return zn(Double(a!)!,Double(b!)!)
}
Добрый день! У меня случился небольшой ступор: во-первых, данный файл main.swift не отображается в xcode ( его новой версии??)
создавая новый файл для данной программы и делая все, как написано, выкидывает ошибку «expressions are not allowed at the top level»
заварачиваю все в функции — ошибок нет, но не билдится (
может я глупая, но сижу целый день и не могу понять
и в Терминал не выводит (пробовала 2 способа открытия , но не работает)
Добрый вечер. Только что попробовал создать новый проект — файл на месте. Может быть вы выбираете неверный шаблон приложения при его создании? Необходимо macOS — Command Line Tool