Лабораторная работа №4 Тема : Структурный тип данных в языке С++
Вид материала | Лабораторная работа |
СодержаниеУказатели и массивы структур Операции над структурами |
- Лабораторная работа №3 кпк лабораторная работа №3 Тема: карманный персональный компьютер, 173.34kb.
- Лабораторная работа, 436.64kb.
- Методические указания к лабораторным работам Лабораторная работа, 357.24kb.
- Методическая разработка по дисциплине «Информатика» Тема: «Организация данных в виде, 447.07kb.
- Методические возможности стенда Особенности работы на стендах уилс-1 Ознакомительное, 1487.3kb.
- Специальная часть, 103.31kb.
- Лабораторная работа по курсу «Физические основы микроэлектроники», 136.21kb.
- Лабораторная работа, 39.3kb.
- § Логический (Булевый) тип данных. Основные сведения, 48.61kb.
- Лабораторная работа по дисциплине «Компьютерные технологии в науке и производстве», 77.14kb.
Лабораторная работа №4
Тема: Структурный тип данных в языке С++
Цель: Изучение алгоритмов обработки объектов структурного типа данных и способов их реализации в языке С++.
- Задания для самостоятельного выполнения.
- Методические указания.
- Пример выполнения задания.
- Рейтинговый контроль.
- Задания для самостоятельного выполнения
Вариант №1
Описать структуру с именем STUDENT, содержащую следующие поля:
- Фамилия и инициалы;
- Номер группы;
- Успеваемость (массив из 5 элементов).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 10 структур типа STUDENT; записи должны быть упорядочены по возрастанию номера группы;
- Вывод фамилий и номеров групп тех студентов, чей средний балл больше 4.0.
- Если таких студентов нет, вывести соответствующее сообщение.
Вариант №2
Описать структуру с именем STUDENT, содержащую следующие поля:
- Фамилия и инициалы;
- Номер группы;
- Успеваемость (массив из 5 элементов).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 10 структур типа STUDENT; записи должны быть упорядочены по возрастанию среднего балла.
- Вывод фамилий и номеров групп студентов, имеющих оценки 4 и 5.
- Если таких студентов нет, вывести соответствующее сообщение.
Вариант №3
Описать структуру с именем STUDENT, содержащую следующие поля:
- Фамилия и инициалы;
- Номер группы;
- Успеваемость (массив из 5 элементов).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 10 структур типа STUDENT; записи должны быть упорядочены по алфавиту.
- Вывод фамилий и номеров групп студентов, имеющих хотя бы одну 2.
- Если таких студентов нет, вывести соответствующее сообщение.
Вариант №4
Описать структуру с именем AEROFLOT, содержащую следующие поля:
- Название пункта назначения рейса;
- Номер рейса;
- Тип самолёта.
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 7 структур типа AEROFLOT; записи должны быть упорядочены по возрастанию номера рейса;
- Вывод номеров рейсов и типов самолётов, вылетающих в пункт назначения, название которого совпало с названием, введённым с клавиатуры.
- Если таких рейсов нет, вывести соответствующие сообщение.
Вариант №5
Описать структуру с именем AEROFLOT, содержащую следующие поля:
- Название пункта назначения рейса;
- Номер рейса;
- Тип самолёта.
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 7 структур типа AEROFLOT; записи должны быть упорядочены в алфавитном порядке по названиям пунктов назначения;
- Вывод пунктов назначения и номеров рейсов, обслуживаемых самолётом, тип которого введён с клавиатуры.
- Если таких рейсов нет, вывести соответствующие сообщение.
Вариант №6
Описать структуру с именем NOTE содержащую следующие поля:
- Фамилия, имя;
- Номер телефона;
- Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа NOTE, записи должны быть упорядочены по датам рождения;
- Вывод информации о тех людях, чьи дни рождения приходятся на месяц, значение которого введено с клавиатуры.
- Если таких нет, вывести соответствующие сообщение.
Вариант №7
Описать структуру с именем NOTE содержащую следующие поля:
- Фамилия, имя;
- Номер телефона;
- Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа NOTE, записи должны быть размещены по алфавиту;
- Вывод информации о человеке, номер телефона которого введён с клавиатуры;
- Если такого нет, вывести соответствующие сообщение.
Вариант №8
Описать структуру с именем NOTE содержащую следующие поля:
- Фамилия, имя;
- Номер телефона;
- Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа NOTE, записи должны быть упорядочены по первым цифрам телефона;
- Вывод информации о человеке, чья фамилия введена с клавиатуры;
- Если такого нет, вывести соответствующие сообщение.
Вариант №9
Описать структуру с именем ZNAK содержащую следующие поля:
- Фамилия, имя;
- Знак Зодиака;
- Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа ZNAK, записи должны быть упорядочены по датам рождения;
- Вывод информации о человеке, чья фамилия введена с клавиатуры;
- Если такого нет, вывести соответствующие сообщение.
Вариант №10
Описать структуру с именем ZNAK содержащую следующие поля:
- Фамилия, имя;
- Знак Зодиака;
- Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа ZNAK, записи должны быть упорядочены по знакам зодиака;
- Вывод информации о людях, родившихся под знаком, введённом с клавиатуры.
- Если такого нет, вывести соответствующие сообщение.
- Методические указания
Для выполнения данной лабораторной работы необходимо изучить теоретический материал по теме «Структуры».
Структура как и массив относятся к составным данным, т.е. это объект, состоящий из нескольких элементов (в Паскале – запись, состоящая из полей). В простейшем случае элементами структуры являются объекты типа int, float, char… В более сложных –можно использовать объекты любого типа, в том числе массивы, структуры.
- Объявление структурного шаблона (структурного типа).
Информация о книге:
Автор | Название | Год | Цена |
struct kniga /* имя шаблона */
{
char avtor[20];
char nazv[60];
int god;
float cena;
};
или
#define KNIGA struct kniga
Шаблон может быть локальным (внутри функции) или глобальным (вне функции).
Описание шаблона не вызывает выделения памяти. Это - аналог описания типа.
- Определение структурных переменных
Определим структурную переменную kn1:
- Ссылка на шаблон:
struct kniga kn1; или
KNIGA kn1;
struct kniga - тип переменной;
kn1 – имя переменной;
struct kniga kn1, kn2, *uk_kniga;
kn1, kn2 - две переменных;
*uk_kniga – указатель на структуру kniga
- Определение структурной переменной без ссылки на шаблон:
struct
{
int a;
float b;
}z1, z2;
z1,z2 – две переменных типа struct;
- Использование typedef
typedef struct
{
…
}KNIGA;
KNIGA kn1;
- Инициализация
Инициализация возможна только для внешних и статистических структур.
Принадлежность к внешнему типу определяется местом объявления структурной переменной, а не шаблона.
static struct kniga kn1={“Иванов А.И.”, ”физика”, 1983, 1.75} ;
- Доступ к элементам структуры
Аналогично Паскалю используются составные имена.
<имя переменной>.<имя элемента> |
struct kniga kn1;
kn1.avtor – имя символьного массива[20] – адрес
kn1.nazv – имя символьного массива[60]
kn1.god – имя переменной типа int
kn.cena – имя переменной типа float, &kn1.cena – адрес
Эти имена могут быть использованы так же, как и обычные имена переменных:
kn1.avtor[5]=‘a‘;
scanf(“% f“,&kn1.cena);
kn1.god =1988 ;
*(kn1.avtor+1)=‘p‘ ;
gets(kn1.nazv);
- Массивы структур
struct kniga kns[3] – массив из трех структур
kns[0].avtor – указатель на массив
kns[1].god - третий элемент второй структуры
kns[2].nazv[0]
номер элемента массива всегда указывается после имени.
0 1 2 3
Автор | название | год | цена | | |
| | | | 0 | |
| | | | 1 | |
| | | | | 2 |
- Вложенные структуры
| | |
---|---|---|
| |
-
КНИГА
АВТОР | НАЗВАНИЕ | ГОД | АВТОР |
ИМЯ
ОТЧЕСТВО
ФАМИЛИЯ
struct avtor
{
char im[10];
char ot[15];
char fam[15];
};
struct kninga1
{
struct avtor avt; /* Вложенная структура */
char nazv[60];
int god;
float cena;
};
- Определение переменной и инициализация
struct avtor avt1;
struct kniga1 kn_89 = / * инициализация только внешних или статических * /
/ * переменных */
{
{“Иван “, ”Иванович”, “ Иванов “},
”физика“,
1989,
1.75
};
Доступ:
kn_89.avt.fam[1]=‘p‘; Иранов
- Указатели на структуры
Целесообразно использование указателей на структуры по трем причинам:
- так же, как и указатели на массивы, они легче в использовании, чем сами массивы;
- многие удобные представления данных являются структурами, содержащими указатели к другим структурам.
struсt avtor *ukavt;
struсt kniga1 *ukknig; /* объявление двух указателей на структуры * /
Все операции с указателями, справедливые для обычных переменных, справедливы и для структурных переменных.
Можно использовать операции:
ukavt=&avt1;
ukknig=&kn-89;
*ukavt avt1
Имя структуры - это не адрес!
Указатели и массивы структур
struct kniga1 kni[100];
ukknig=kni; ukknig=&kni[0];
ukknig=kni+1; ukknig=&kni[1];
Прибавление “1“ к указателю увеличивает его значение (адрес) на число байтов, которое занимает соответствующий тип.
ukknig++; ukknig=&kni[2]; *ukknig=kni[2];
Операции над структурами
- Присваивание: struсt kniga kn1,kn2;
kn2=kn1;
- Сравнение структур - осуществляют специальные подпрограммы.
- Доступ к элементу структуры выполняется при помощи указателя:
struct avtor *ukavt, avt1;
ukavt – указатель на структуру
avt1 – переменная типа структуры
ukavt=&avt1; /* указатель ссылается на avt1*/
avt1.im[0]=‘a‘; Имя структуры - это не адрес
Как с помощью указателя ukavt получить доступ к этому же элементу ?
Существует два способа:
1. Операция присоединения
ukavt–>im[0]= 'a'; |
Смысл новой операции –>:
avt1.im[0] и ukavt=&avt1;
Cтруктурный указатель, за которым следует операция –>, работает так же, как имя структуры с последующей операцией “.“.
( нельзя записать ukavt.im[0] т.к. ukavt – не является именем структуры).
Важно отметить, что ukavt – указатель, а ukavt–>im[0] - элемент структуры, на которую делается ссылка и имеет тип char.
2. Другой способ получить доступ к элементу структуры с помощью составного имени.
Составное имя
(*ukavt ).im[0]= 'a'; |
Круглые скобки необходимы, т.к. операция “.” имеет более высокий приоритет, чем *
Содержимое по адресу ukavt:
ukavt=&avt1;
*ukavt=*(&avt1);
avt1
“Дыры” могут возникать на стыке соседних элементов структуры из-за выравнивания границ памяти.
| ‘ a ‘ | ? | 1 | 2 |
char int
8. Передача информации о структурах функциям
Саму структуру можно использовать в качестве формальных параметров функции.
- Можно передавать в качестве фактических параметров элемент структуры или его адрес.
struct pr
{
int a;
float b;
};
int ab ( int a , float *b )
{
*b=2.5*(float)a;
return (2*a);
}
void main()
{
struct pr pr1;
scanf(“%d“,&pr1.a); /* адрес элемента */
printf(“результат: %db=%f\n“,ab(pr1.a,&pr1.b),pr1.b);
}
- Можно использовать адрес структуры в качестве фактического параметра.
Объявим шаблон и переменные одновременно в задаче определения остатка от деления целых чисел.
struct sab
{
int a,b;
}pr1={21,3};
/* int по умолчанию */ ab1(struct sab *prim) / * указатель на структуру pr1 */
{
return (prim->a%prim->b); /* остаток от деления */
}
void main()
{
printf(“остаток=%d“,ab1(&pr1));
}
- Можно использовать имя массива структур в качестве фактического параметра
(то есть адрес первого элемента массива).
struct pr /* Глобальный шаблон */
{
int a;
float b;
};
void main() /*найти сумму всех элементов*/ структуры
{ /*в массиве структур 10 записей*/
int i;
float ab2(struct pr *prim); /*прототип функции*/
struct pr pr2[10];
for(i=0;i<10;i++)
scanf(“%d %f”,&pr2[i].a,&pr2[i].b);
printf(“сумма=%f“,ab2(pr2)); /* pr2 – имя массива структур, адрес первой
структуры. */
}
float ab2(struct pr *prim)
{
int i;
float sum=0;
for(i=0;i<10;i++,prim++)sum+=prim->a+prim->b;
return (sum);
}
Данная лабораторная работа предусматривает в качестве контроля отчет в печатном виде и его защита
Отчет должен включать в себя:
- Текст задания
- Блок – схему
- Программный код с комментариями
- Примеры рез-та работы программы.
- Пример выполнения задания.
Описать структуру с именем NOTE содержащую следующие поля:
- Фамилия, имя;
- Номер телефона;
- Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа NOTE, записи должны быть размещены по алфавиту;
- Вывод информации о человеке, номер телефона которого введён с клавиатуры;
Если такого нет, вывести соответствующие сообщение.
#include
#include
main()
{clrscr();
struct NOTE
{char fn[30]; int no; int bd[3];};
int q,i,e,a,ctr[8],num;
char c;
c='#'; q=8;
NOTE box[8]; NOTE box1[8];
for(i=0;i
{cout<<"Vvedite Familiy, Imya (cherez probel)"<
gets(box[i].fn);
cout<<"Vvedite nomer telefona"<
cout<<"Vvedite daty rozhdeniya"<
cout<<"chislo"<
cout<<"mesyatc"<
cout<<"god"<
cout<<"Vvedite nomer telefona"<
cout<<"Yporyadocheno po alfavity:"<
for(i=0;i
{c='#';
for(e=0;e
{if(box[e].fn[0]>=c)
{c=box[e].fn[0]; a=e;};};
strcpy(box1[i].fn,box[a].fn);
box1[i].no=box[a].no;box1[i].bd[0]=box[a].bd[0];
box1[i].bd[1]=box[a].bd[1];
box1[i].bd[2]=box[a].bd[2];box[a].fn[0]='!';};
for(i=q-1;i>=0;i--)
{cout<
cout<
cout<
cout<
cout<<"sovpadeniya"<
for(i=q-1;i>=0;i--)
if(box1[i].no==num)
{cout<
cout<
cout<
cout<
cout<
if (a!=1) cout<<"takih nety";
getch();}
4. Рейтинговый контроль.
Выполнение задания в аудитории | 2 балла |
Отчет лабораторной работы | 2 балла |
Максимум за работу | 4 балла |
Минимум за работу | 0 баллов |