Пример1 использования структур
Приер содержит программу, которая запрашивает у пользователя три имени и адреса, после чего сохраняет их в массиве структур. По окончании ввода имена выводятся на экран и пользователю предоставляется возможность изменить любую запись. После выбора одной из записей, она выводится на экран.
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#pragma hdrstop
void displayRecord (int, mailingListRecord mlRec) ;
struct mailingListRecord {
char firstName[20];
char lastName[20];
char address[50];
char city[20];
char state[5];
int zip;
};
int main {int, char**)
// Создание массива структур mailingListRecord
//
mailingListRecord listArray [3] ;
cout << endl;
int index = 0;
// Ввод трех записей
//
do {
cout << "First Name: ";
cin. getline (listArray [index] . f irstName,
sizeof (listArray [index] . firstName) - 1) ;
cout<< "Last Name: " ;
cin. getline (listArray [index] . lastName,
sizeof (listArray [index] . lastName) - 1);
cout << "Address: ";
cin. getline (listArray [index] .address,
sizeof (listArray [index] .address) - 1) ;
cout <<"City: ";
cin. getline (listArray [index] .city,
sizeof (listArray [index] . city) - 1) ;
cout << "State: ";
cin. getline (listArray [index] . state,
sizeof (listArray [index] . state) - 1) ;
char buff [10] ;
cout << "Zip: ";
cin. getline (buff , sizeof (buff) - 1) ;
listArray [index] . zip = atoi (buf f ) ;
index++;
cout << endl;
}
while (index < 3);
//
// Очистка экрана
//
clrscr();
//
// Вывод трех записей
//
for (int i = 0; i < 3; i++) {
displayRecord(i, listArray[i]);}
//
// Выбор записи для изменения
//
cout << "Choose a record: ";
char rec;
//
// Можно выбрать только 1, 2 или 3
//
do {
rec = getch();
rec -= 49;
} while (rec < 0 || rec > 2);
//
//Копирование выбранной записи во временную переменную
//
mailingListRecord temp = listArray[rec] ;
clrscr();
cout << endl;
//
// Вывод выбранной записи
//
displayRecord(rec, temp);
getch();
return 0;
}
void displayRecord(int num, mailingListRecord mlRec)
{
cout << "Record " << num + 1 << ":" << endl;
cout << "Name: " << mlRec.firstName << " ";
cout << mlRec.lastName;
cout << endl;
cout << "Address: " << mlRec.address;
cout << endl << " ";
cout << mlRec.city << ", ";
cout << mlRec.state << " ";
cout << mlRec.zip;
cout << endl << endl;
}
В этой программе есть несколько новых для вас вещей, а также дополнений к тому, что уже было изучено.
Во-первых, здесь использована функция getline() из класса cin для ввода данных пользователем. Это сделано из-за того, что оператор >> реагирует на пробел не совсем так, как нам нужно. Второй параметр функции getline() определяет максимальное количество символов, помещаемых в буфер (в данном случае буфером является член структуры mailingListRecord). Это число выбирается таким образом, чтобы предотвратить выход за границу массивов структуры. Оператор sizeof() используется для определения размера массива, а следовательно, и буфера.
Функция atoi() также встречается вам впервые. Она принимает строку символов и преобразует ее в целое число. Это необходимо для преобразования текста в поле ZIP-кода (который вводится пользователем как строка цифр) в целое число, которое можно сохранить в члене zip структуры mailingListRecord.
Функция displayRecord() имеет два параметра. Первый из них, num, целого типа и содержит номер выводимой записи. Эта переменная используется только для вывода на экран номера записи. Второй параметр функции displayRecord() является экземпляром структуры mailingListRecord. Внутри функции используется локальная копия передаваемой структуры для вывода ее содержимого на экран.
В этой программе есть еще один фрагмент, который заслуживает внимания. Посмотрите на цикл do-while:
{
гeс = getch();
rec -= 49;
while (rec < 0 | | геc > 2) ;
}
Сначала с помощью функции getch() с клавиатуры вводится символ. Как помните, getch() используется в конце программ, чтобы предотвратить их преждевременное завершение, и при этом игнорируется возвращаемое значение. Вообще, функция getch() возвращает ASCII-код нажатой клавиши. Поскольку ASCII-код клавиши 1 равен 49, для получения значения индекса нужно вычесть из него 49. Если пользователь нажимает 1, функция возвращает 49, 49 - 49 = 0, что соответствует индексу первого элемента массива. Если пользователь нажмет 2, результатом вычисления будет 1 (50 - 49), и т.д. В цикле do-while предполагается, что будет нажата клавиша 1, 2 или 3. При нажатии любой другой клавиши цикл будет повторяться, ожидая правильного ввода.
Наконец, обратите ваше внимание на строку:
mailingListRecord temp = listArray [rec] ;
Эта строка не является необходимой в данной программе, она использована в качестве иллюстрации. В ней создается экземпляр структуры mailingListRecord, которому присваивается значение одной из структур массива. Простое присваивание в данном случае оказалось возможно потому, что компилятор знает, как копировать одну структуру в другую. Он просто копирует все члены исходной структуры в соответствующие члены вновь созданного экземпляра.
