Вход/Регистрация
Программирование на Objective-C 2.0
вернуться

Кочан Стивен

Шрифт:

Мы можем определить переменную такого же типа purchaseDate (дата покупки) с помощью отдельного определения struct date purchaseDate;

или просто включить оба определения в одну строку: struct date today, purchaseDate;

В отличие от переменных типа int, float или char, при работе со структурными переменными требуется специальный синтаксис. Для доступа к компоненту структуры нужно указать имя структурной переменной, после которого следует точка (она называется оператором «точка» — dot operator) затем имя компо нента структуры. Например, чтобы задать значение 21 для компонента day переменной today, нужно написать today.day = 21;

Отметим, что между именем переменной, точкой и именем компонента не допускаются пробелы.

Вы можете возразить, что мы уже использовали, казалось бы, такой же опе-ратор для вызова свойства объекта. Вспомним, что оператор myRect.width = 12;

вызывает метод-установщика (с именем sefWidth) объекта класса Rectangle, передавая ему значение аргумента 12. Здесь нет никакой путаницы: компилятор сам определяет, что находится справа от оператора «точка», — структура или объект, — и выполняет соответствующую обработку.

Вернемся к примеру struct date, чтобы задать значение 2010 для компонента year в структуре today. today.year = 2010;

И, наконец, чтобы проверить, что значение month равно 12, можно исполь-зовать оператор if (today, month == 12 ) next_month = 1;

В программе 13.6 реализуется то, что мы обсуждали выше. #import <Foundation/Foundation.h> int main (int arge, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; struct date { int month; int day; int year; }; struct date today; today.month = 9; today.day = 25; today.year = 2009; NSLog (@"Today’s date is %i/%i/%.2i.", today.month, today.day, today.year % 100); [pool drain]; return 0; }

Вывод программы 13.6 Today’s date is 9/25/09. (Текущая дата - 25.9.09)

В первом операторе внутри main определяется структура с именем date, которая состоит из трех целых компонентов: month, day и year. Во втором операторе объявляется переменная today с типом struct date. Таким образом, в первом опе-раторе просто определяется, как выглядит структура даты для компилятора Objective-C, и не требуется никакого резервирования памяти внутри компьютера. Во втором операторе объявляется переменная типа struct date, и здесь происходит резервирование памяти для хранения трех целых компонентов структурной переменной today.

После присваивания значений соответствующий вызов NSLog выводит зна-чения, содержащиеся в этой структуре. Вычисляется остаток отделения today.year на 100, поэтому функция NSLog выводит для года только две цифры. Символы формата %.2i в обращении к NSLog указывают вывод не менее двух символов, в результате чего для года выводится ведущий нуль.

При вычислении выражений компоненты структуры подчиняются таким же правилам, что и обычные переменные в языке Objective-C. Деление целого ком-понента структуры на другое целое значение выполняется как деление целых, например century = today.year /100+ 1;

Напишем несложную программу, которая принимает на входе текущую дату и выводит завтрашнюю дату (tomorrow). На первый взгляд это кажется совсем простой задачей. Нужно запросить у пользователя ввод текущей даты и затем вычислить завтрашнюю дату с помощью следующего набора операторов. tomorrow.month = today.month; tomorrow.day = today.day + 1; tomorrow.year - today.year;

Конечно, для большинства дат это подходит, но два случая будут реализованы неверно.

Текущая дата приходится на конец месяца.

Текущая дата приходится на конец года (то есть на 3 1 декабря). Чтобы определить, приходится ли текущая дата на конец месяца, нужно задать массив целых значений, соответствующих числу дней каждого месяца.

Поиск в этом массиве даст число дней месяца (см. программу 13.7). // Программа определения завтрашней даты #import <Foundation/Foundation.h> struct date { int month; int day; int year; }; // Функция для вычисления завтрашней даты struct date dateUpdate (struct date today) { struct date tomorrow; int numberOfDays (struct date d); if (today.day != numberOfDays (today)) { tomorrow.day = today.day + 1; tomorrow.month = today.month; tomorrow.year = today.year; } else if (today.month == 12) // end of year { tomorrow.day = 1; tomorrow.month = 1; tomorrow.year = today.year + 1; } else { // конец месяца tomorrow.day = 1; tomorrow.month = today.month + 1; tomorrow.year = today.year; } return (tomorrow); } // Функция для поиска числа дней в месяце int numberOfDays (struct date d) { int answer; BOOL isLeapYear (struct date d); int daysPerMonth[12] = { 31,28, 31, 30, 31, 30, 31, 31,30, 31,30, 31 }; if (isLeapYear (d) == YES && d.month == 2) answer = 29; else answer = daysPerMonth[d. month - 1]; return (answer); } // Функция, определяющая, является ли год високосным BOOL isleapYear (struct date d) { if ((d.year % 4 == 0 && d.year % 100 != 0) || d.year % 400 == 0 ) return YES; else return NO; } int main (int argc, char *argv[]) { NSAutoreleasePool * poo! = [[NSAutoreleasePool alloc] init]; struct date datellpdate (struct date today); struct date thisDay, nextDay; NSLog (@nEnter today’s date (mm dd yyyy):"); scanf ("%i%i%i", SthisDay.month, SthisDay.day, &thisDay.year); nextDay = dateUpdate (thisDay); NSLog (@"Tomorrow’s date is %i/%i/%.2i.",nextDay.month, nextDay .day, nextDay.year % 100); [pool drain]; return 0; }

Вывод программы 13.7 Enter today’s date (mm dd yyyy): (Введите текущую дату (мм дд rrrr) 2 28 2012 Tomorrow’s date is 2/29/12. (Завтрашняя дата)

Вывод программы 13.7 (повторный запуск) Enter today’s date (mm dd yyyy): 10 2 2009 Tomorrow’s date is 10/3/09.

Вывод программы 13.7 (повторный запуск) Enter today’s date (mm dd yyyy): 12 31 2010 Tomorrow’s date is 1/1/10.

Хотя мы не работаем в этой программе с классами, здесь был импортирован файл Foundation.!!, поскольку нам нужен тип B00L и определенные имена YES и N0. Они определены в этом файле.

  • Читать дальше
  • 1
  • ...
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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