Программирование на Objective-C 2.0
Шрифт:
Упражнения
Напишите программу, которая запрашивает у пользователя ввод двух целых значений. Проверьте, делится ли первое число без остатка на второе число, и выведите на терминал соответствующее сообщение.
Программа 6.8А выводит значение, содержащееся в сумматоре, даже если введен неверный оператор или пользователь пытается выполнить деление на нуль. Решите эту проблему.
Внесите изменения в метод print из класса Fraction, чтобы целые числа выводились в обычном виде (например, дробь 5/1 должна выводиться как 5). Внесите изменения в этот метод, чтобы дроби с делителем, равным 0, выводились просто как 0.
Напишите программу, которая действует как простой калькулятор.
/ S Е Оператор S указывает, что программа должна присвоить сумматору (accumulator) введенное число, и оператор Е указывает программе, что нужно закончить выполнение. Арифметические операции выполняются для содержимого сумматора с числом, которое введено для операции как второй операнд. Ниже приводится пример, показывающий, как должна работать эта программа. Начало вычислений 10 S Сумматору (Accumulator) присваивается значение = 10.000000 Содержимое сумматора 2 / Divide by 2 = 5.000000 Содержимое сумматора 55 - Вычитание 55 10 = -50.000000 100.25 S Сумматору присваивается значение 100.25 = 100.250000 4 Умножение на 4 = 401.000000 0 Е Завершение программы = 401.000000 End of Calculations. (Конец вычислений) Сделайте так, чтобы программа обнаруживала деление на 0, а также выполняла проверку на неизвестные операторы. Используйте для своих вычислений класс Calculator из программы 6.8 5, В программе 5.9 выполняется вывод цифр введенного числа в обратном порядке. Однако эта программа не работает должным образом, если введено отрицательное число. Определите, что происходит в этом случае, и затем внесите в программу изменения, чтобы правильно обрабатывались отрицательные числа. Это означает, например, что если введено число -8645, то программа должна вывести 5468-. 6 Напишите программу, которая читает число, введенное с терминала, и выводит каждую цифру этого числа буквами. Например, если пользователь ввел 932, то программа должна вывести следующее. девять три два (Выведите слово нуль, если пользователь ввел 0.) Примечание. Это довольно трудное упражнение!
Программа 6.10 в ряде случаев работает неэффективно. Например, это касается проверки четных чисел. Поскольку любое четное число больше 2 не может быть простым, программа могла бы пропускать все четные числа и как возможные простые числа, и как возможные делители. Внутренний цикл for тоже работает неэффективно, поскольку для р все время выполняется деление на все значения d от 2 до р-1. Чтобы избежать этой неэффективности, можно добавить значение isPrime в условия for. Тогда вы можете задать выполнение цикла for до тех пор, пока не найден делитель и значение d меньше р. Модифицируйте программу 6.10, чтобы внести эти два изменения, затем выполните эту программу, чтобы проверить ее работу.
Глава 7. Более подробно о классах
В этой главе мы продолжим изучение классов и методов и научимся работать с программными циклами, выражениями и операторами выбора, которые изучили в предыдущей главе. Начнем с разбиения программы на несколько файлов, которое упрощает работу с большими программами. 7.1. Разделение файлов объявлений и определений (секции interface и implementation)
Объявления классов и определения классов для сложных программ принято размещать в отдельных файлах.
Если вы используете Xcode, начните с нового проекта с именем FractionTest. Введите следующую программу в файл FractionTest.m. #import Traction.h" int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Fraction *myFraction = [[Fraction alloc] init]; //
В этот файл не включено определение класса Fraction, имеется импорт файла Fraction.h.
Обычно объявление класса (то есть секцию @interface) помещают в отдельный файл с именем классМ. Определение класса (то есть секцию @implementation) помещают обычно в файл с тем же именем, но с расширением .т. Мы помещаем объявление класса Fraction в файл Fraction.fi, а определение этого класса — в файл Fraction.m.
В Xcode выберите New File (Новый файл) в меню File (Файл). В левой панели выберите Cocoa. В верхней правой панели выберите Objective-C class (рис. 7.1).
Рис. 7.1. Меню New File в Xcode
Щелкните на кнопке Next (Далее). Введите Fraction.m в поле имени файла (File name). Оставьте установленным флажок Also Create Fraction.h (Создать также Fraction.h). Местоположением (Location) этого файла должна быть папка с файлом FractionTest.m (рис. 7.2).
Теперь щелкните на кнопке Finish (Готово). Xcode добавит в ваш проект два файла: Fraction.h и Fraction.m (рис. 7.3).
Мы не работаем здесь с Cocoa, поэтому заменим в файле Fraction.h строку #import <Cocoa/Cocoa.h>
на строку #import <Foundation/Foundation.h>
Рис. 7.2. Добавление нового класса к проекту
Рис. 7.3. Xcode создает файлы для нового класса
В этом файле (Fraction.h) введем секцию interface для класса Fraction. // // Fraction.h // FractionTest // // Created by Steve Kochan on 7/5/08. // Copyright 2008 _MyCompanyName_. All rights reserved. // #import <Foundation/Foundation.h> // Класс Fraction @interface Fraction : NSObject { int numerator; int denominator; } -(void) print; -(void) setNumerator: (int) n; -(void) setDenominator: (int) d; -(int) numerator; -(int) denominator; -(double) convertToNum; @end
Этот файл указывает компилятору (и программистам, см. ниже), как должен выглядеть объект класса Fraction: он содержит две целых переменных экземпляра с именами numerator (числитель) и denominator (знаменатель). Он также содержит шесть методов экземпляра: print, setNumerator:, setDenominator:, numerator, denominator и convertToNum. Первые три метода не возвращают никакого значения, следующие два возвращают значение типа int, а последний метод возвращает значение типа double. Методам setNumerator: и setDenominator: передается аргумент целого типа.
Детали определения (implementation) класса Fraction содержатся в файле Fraction.m. // // Fraction.m // FractionTest // // Created by Steve Kochan on 7/5/08. // Copyright 2008 _MyCompanyName_. All rights reserved. // #import Traction.h" @implementation Fraction -(void) print { NSLog (@"%i/%in, numerator, denominator); } -(void) setNumerator: (int) n { numerator = n; } -(void) setDenominator: (int) d { denominator = d; } -(int) numerator { return numerator; } -(int) denominator { return denominator; } -(double) convertToNum { if (denominator != 0) return (double) numerator / denominator; else return 1.0; } @end