Консольное приложение «Сумма двух чисел» под macOS

Домашняя работа к главе 19

Задание 1

Доработайте программу «Сумма чисел» так, чтобы она производила проверку значений запрашиваемых параметров на соответствие числовому типу данных. Программа должна просить ввести корректное значение до тех пор, пока оно не будет введено. И так для каждого из аргументов.

Для решения поставленной задачи вы можете использовать оператор повторения 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)")

 

Задание 2

Доработайте программу таким образом, чтобы она позволяла выбирать, какую из арифметических операций выполнить (/, *, +, -, корень, степень)

 

Задание 3

Доработайте программу таким образом, чтобы появлялся запрос количества аргументов (будьте внимательны, что для возведения в степень и корня количество аргументов фиксировано)

17 Comments

  1. Vlados:

    нужно ли корить себя за то, что я два дня думал над первым заданием, пробовал, перечитывал главу с repeat while и в итоге не смог? Пришлось поглядывать в ответ…

    • Конечно же нет! Советую вам вернуться к нему через пару дней и посмотреть, сможете ли вы его решить самостоятельно.

      • Vlados:

        Спасибо за ответ)
        Я тут решил Задание 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. Vlados:

    ответ для второго задания баганный((( Перезалейте, пожалуйста

  3. Vlados:

    Задание 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
    }

  4. Vlados:

    Задание 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. Vlados:

    Задание 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)

    • Vlados:

      не заливается полностью((((((((((((

      • shirokov44007:

        Вижу по дате комента, что ответ мой будет неактуальным для тебя, но все же предположу: если значение будет какое нибудь такое 5.348394 и мы попытаемся представить типом Int, то это будет 6. у меня сейчас проблема в том, что я не могу вытащить корень н-степени с типом данных Double …(

  6. Vlados:

    Удалите мои комменты, плиз
    Вот ссылка на ответ для 3 задания: https://yadi.sk/d/M_2TZITisN_PQw

  7. Dmitry:

    Первое задание выполнил с объединением проверки ввода для обоих слагаемых, но пришлось изменить входные параметры функции:
    func readNumber () -> Int {
        if let a = Int(readLine()!) { 
        return a
        } else {
            print(«Введите корректное число»)
            return readNumber()
        }
    }

    print(«Введите значение первого аргумента»)
    var a = readNumber()

    print(«Введите значение второго аргумента»)
    var b = readNumber()

  8. Hutr0:

    Вот основной код всех 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. – Извиняйте за чёрный фон

  9. julea-parhomova:

    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!)!)
    }

  10. nastia_sharf:

    Добрый день! У меня случился небольшой ступор: во-первых, данный файл main.swift не отображается в xcode ( его новой версии??)
    создавая новый файл для данной программы и делая все, как написано, выкидывает ошибку «expressions are not allowed at the top level»
    заварачиваю все в функции — ошибок нет, но не билдится (

    может я глупая, но сижу целый день и не могу понять

Добавить комментарий