|
Структуры
Когда надо хранить несколько данных одинакового
типа в одной переменной, используются массивы. Когда надо хранить
набор разнородных данных, используются структуры. Например, надо
хранить данные о человеке - имя, возраст, телефон, 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) выполняет то, что её просит пользователь :-).
       

|