Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Структуры Objective-C

0

Нередко возникает необходимость в создании переменной для хранения нескольких взаимосвязанных фрагментов данных. Допустим, вы пишете программу для вычисления индекса массы тела. (Что такое «индекс массы тела», или ИМТ? Это вес в килограммах, разделенный на квадрат роста в метрах. Значение ИМТ меньше 20 означает, что вес тела ниже нормы, а значения выше 30 указывают на избыточный вес. Это крайне неточная метрика для оценки физического состояния, но для примера по программированию она подходит.) Для описания человека нам понадобится значение float, содержащее рост в метрах, и значение типа int, в котором хранится вес в килограммах.

Для  хранения  этих  данных  мы  создадим  свой  собственный  тип  Person.

Переменная   типа   Person представляет   собой   структуру   с   двумя   полями:

heightInMeters типа float и weightInKilos тина int.

Создайте новый проект: программу командной строки С с именем BMICalc. Включите в main.c команды создания структуры, содержащей всю необходимую информацию о человеке:

#include <stdio.h>

//Обьяснение структуры Person struct Person {

float heightInMeters; int weightInKilos;

};

int main(int argc, const char * argv[])

{

struct Person person; person.weightInKilos = 96;

person.heightInMeters = 1.8;

printf("person weighs %i kilograms\n", person.weightInKilos); printf("person is %.2f meters tall\n", person.heightInMeters); return 0;

}

Обратите  внимание  на  синтаксис  обращения  к  полям  структуры  –  имя

структуры отделяется от имени поля точкой.

На рис. 10.1 показано, как выглядит кадр стека main() после присваивания значений полям структуры.

Рис. 10.1. Кадр после присваивания

Как правило, объявление структуры используется в программе многократно, поэтому для типа структур обычно создается typedef – псевдоним для объявления типа, позволяющий использовать его как обычный тип данных. Внесите изменения в main.с, чтобы в программе создавалось и использовалось определение typedef для структуры Person:

#include <stdio.h>

// объявление типа Person typedef struct {

float heightInMeters; int weightInKilos;

} Person;

int main(int argc, const {char * argv[])

{

Person person;

person.weightInKilos = 96;

person.heightInMeters = 1.8;

printf("person weighs %i kilograms\n", person.weightlnKilos); printf("person is %.2f meters tall\n", person.heightlnMeters); return 0;

}

После того как в программе появится определение typedef, структуру Person можно будет передать другой функции. Включите в программу функцию с именем bodyMassIndex(), которая получает структуру Person в аргументе и вычисляет ИМТ. Включите вызов этой функции в main():

#include <stdio.h>

// объявление типа Person typedef struct {

float heightlnMeters; int weightlnKilos;

} Person;

float bodyMassIndex(Person р)

{

return p.weightInKilos/(p.heightInMeters * p.heightInMeters);

}

int main(int argc, constchar * argv[])

{

Person person; person.weightlnKilos = 96;

person.heightlnMeters = 1.8;

float bmi = bodyMassIndex(person); printf("person has а ВМI of %.2f\n", bmi); return 0;

}

Упражнение

Первой структурой, с которой я столкнулся в программировании, была структура tm, используемая стандартной библиотекой С для хранения времени с разбивкой на компоненты. Структура определяется следующим образом:

struct tm{

int   tm_sec;   // секунды [0-­‐60] int   tm_min;   // минуты [0-­‐59] int   tm_hour;  // часы [0-­‐23]

int   tm_mday;  // день месяца [1-­‐31] int   tm_mon;   // месяц [0-­‐11]

int   tm_year;  // год от 1900

int     tm_wday;   // день недели с воскресенья [0-­‐6] int    tm_yday;   // день года с 1 января [0-­‐365] int     tm_isdst;  // флаг летнего времени

long  tm_gmtoff; /* смещение в секундах от CUT */ char  *tm_zone;  /* сокращение часового пояса */

};

Функция time() возвращает количество секунд от начала 1970 года по Гринвичу. Функция localtime_r() читает эту величину и заполняет структуру tm соответствующими значениями (точнее, при вызове ей передается адрес количества секунд с 1970 года и адрес структуры tm). Таким образом, получение текущего времени в виде структуры tm происходит так:

long secondsSince1970 = time(NULL);

printf("It has been %ld seconds since 1970\n", secondsSince1970); struct tm now;

localtime_r(&secondsSince1970, &now);

printf("The time is %d:%d:%d\n", now.tm_hour, now.tm_min, now.tm_sec);

Напишите программу, которая определяет, какая дата (В формате ММ-­‐ДД-­‐ ГГГГ) соответствует 4 миллионам секунд.

(Подсказка: tm_mon = 0 соответствует январю, поэтому не забудьте прибавить 1.

Также включите заголовочный файл <time. h> в начало программы.)

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии