Чтение онлайн

на главную - закладки

Жанры

Программирование на 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) 1/3 [myFraction setNumerator: 1]; [myFraction setDenominator: 3]; // вывод дроби NSLog (@"The value of myFraction is:"); [myFraction print]; [myFraction release]; [pool drain]; return 0; }

В этот файл не включено определение класса 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

Поделиться:
Популярные книги

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VII

Изгой Проклятого Клана. Том 6

Пламенев Владимир
6. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 6

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Кодекс Крови. Книга I

Борзых М.
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга I

Наследник для дона мафии

Тоцка Тала
2. Наследники мафии
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
Наследник для дона мафии

Роза ветров

Кас Маркус
6. Артефактор
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Роза ветров

Я еще не царь

Дрейк Сириус
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще не царь

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Родословная. Том 4

Ткачев Андрей Юрьевич
4. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 4

Страж Кодекса. Книга VII

Романов Илья Николаевич
7. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга VII

Наномашины, сынок! Том 1

Новиков Николай Васильевич
1. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наномашины, сынок! Том 1

Брак по-драконьи

Ардова Алиса
Фантастика:
фэнтези
8.60
рейтинг книги
Брак по-драконьи

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8

Сердце Дракона. Том 11

Клеванский Кирилл Сергеевич
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Сердце Дракона. Том 11