Site hosted by Angelfire.com: Build your free website today!
 

 


 
 


 


Структуры

Когда надо хранить несколько данных одинакового типа в одной переменной, используются массивы. Когда надо хранить набор разнородных данных, используются структуры. Например, надо хранить данные о человеке - имя, возраст, телефон, icq. Имя и телефон обычно хранят как строки, а возраст и icq как числа. При этом для хранения возраста будет достаточно 1го байта - char (вряд ли возраст превысит 255) а вот под icq потребуется 4 байта - long. Я бы завел следующую структуру:

struct {
char strName[50];
unsigned char nAge;
char strPhone[20];
unsigned long nICQ;
}person;

После этого мы получаем в распоряжение переменную person, которая является структурой. Заполним данными:

strcpy(person.strName,"Kurt Cobain");
person.nAge=20;
strcpy(person.strPhone,"+7(095)123-45-67");
person.nICQ=123456789;

Воспользуемся данными:

print ("a guy named %s, %d y.o. got icq#%d\n", person.strName, person.nAge, person.nICQ);

Так мы объявили одну переменную-структуру. Но мы можем объявить не переменную, а новый тип данных, чтобы потом создавать переменные этого типа:

struct tagPerson{
char strName[50];
unsigned char nAge;
char strPhone[20];
unsigned long nICQ;
};

содаем переменную этого типа:

struct tagPerson person;

Однако, чаще требуется хранить данный сразу о нескольких людях. В этом случае создают массив структур:

struct tagPerson people[20]; // массив на 20 человек

strcpy(people[0].strName,"Kurt Cobain"); // заполняем 1й элемент массива
people[0].nAge=20;

strcpy(people[1].strName,"Ricky Martin"); // заполняем 2й элемент массива
people[1].nAge=17;

Или еще более продвинутый вариант:

struct tagPerson *people; // указатель на структуру/динамический массив

people=new struct tagPerson[20]; // создаем массив на 20 человек

for(i=0;i<20;i++){
people[i].strName[0]=0; // (*)
people[i].strPhone[0]=0;
people[i].nAge=0;
people[i].nICQ=0;
}

strcpy(people[0].strName,"Kurt Cobain"); // ничем не отличается от статического массива
people[0].nAge=20;

strcpy(people[1].strName,"Ricky Martin");
people[1].nAge=17;

for(i=0;i<20;i++){
if(people[i].strName[0]!=0){ // (**)
print ("a guy named %s, %d y.o. got icq#%d\n", people[1].strName, people[1].nAge, people[1].nICQ);
}
}

delete people; // освобождаем память, занятую под динамический массив

(*) обычное дело после создания массива его проинициализировать. В данном случае я в каждой структуре в поле имя, которое является массивом char'ов в нулевой элемент заношу ноль. Как видишь, строка в Си - это последовательность байтов (char'ов), которая заканчивается байтом, в котором лежит число ноль. Таким образом, в поле лежит пустая строка. Это нам также поможет определить, какие элементы массива содержат информацию, а какие - пустые. Мы полагаем, что имя у человека всегда есть и ненулевой длины. Поэтому в строке (**) я печатаю только элементы, у которых в нулевом байте имени лежит не ноль. Это значит, что данная структура была проинициализирована.

Задача №1

Написать программу, которая
(1) спрашивает сколько человек
(2) создает динамический массив на это количество человек с полями
· ник
· аська
· мыло
· город
(3) просит по очереди ввести данные для каждого человека
(4) сохраняет все данные в файл

Задача №2

Написать программу, которая
(1) пытается открыть в текущей директории файл, записанный предыдущей программой.
(2) Выводит сообщение об ошибке, если не удается и завершает работу.
(3) Выводит меню
· вывести все записи
· вывести запись по номеру
· закончить работу
(4) выполняет то, что её просит пользователь :-).

 


 

Заглавна Форум Компилатори за C++