Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №15.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
64.51 Кб
Скачать

Пример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, которому присваивается значение одной из структур массива. Простое присваивание в данном случае оказалось возможно потому, что компилятор знает, как копировать одну структуру в другую. Он просто копирует все члены исходной структуры в соответствующие члены вновь созданного экземпляра.