- •1. Краткие теоретические сведения
- •1.1. Понятие структуры
- •1.2. Определение (описание) шаблона структуры
- •1.3. Описатель типа
- •1.4. Объявление переменных структурного типа
- •1.5. Инициализация переменной структурного типа
- •1.6. Операции со структурами
- •1.7. Доступ к значениям полей структурного типа
- •1.8. Вложенные структурные типы
- •1.9. Массивы структурного типа
- •1.10. Структурные переменные и указатели
- •1.11. Структуры и функции
- •1.11. Использование синонима типа
- •1.12. Доступ к отдельному биту
- •1.13.Типичные ошибки при разработке структур
- •1.14. Примеры программирования задач на структуры
- •2. Задание
- •2.4. Задания для выполнения на занятиях
- •2.4.1. Задание 1. Вычисление с использованием структур
- •2.4.1.1. Условие задания
- •2.4.1.2. Пример для варианта 30
- •2.4.1.3. Программа
- •2.4.1.4. Тестирование
- •2.4.2. Задание 2. Массив структур
- •2.4.2.1. Условие задания
- •2.4.2.2. Пример выполнения работы
- •2.4.2.3. Программа
- •2.4.2.4. Тестирование
- •2.4.3. Задание 3. Структуры данных
- •2.4.3.1. Условие задания
- •2.4.3.2. Пример для варианта 30
- •2.4.3.3. Программа
- •2.4.3.4. Тестирование
- •2.4.4. Задание 4. Структуры данных
- •2.4.4.1. Условие задания
- •2.4.4.2. Пример для варианта 31
- •2.4.4.3. Программа
- •2.4.4.4. Тестирование
- •2.4.5. Задание 5. Создание и обработка структур
- •2.4.5.1. Условие задания
- •2.4.6.2. Пример для варианта 30
- •2.4.7.2. Пример для варианта 30
- •2.4.7.3. Программа
- •2.4.7.4. Тестирование
- •3. Выводы
- •4. Требование к отчету
- •4. Краткие теоретические сведения.
- •5. Вопросы для самоконтроля
- •Литература
- •1. Краткие теоретические сведения 2
- •1.1. Понятие структуры 2
2.4.7.2. Пример для варианта 30
Описать структуру Регистрация контрольных работ заочников, содержащую следующие поля:
1. ФИО студента
2. Номер группы
3. Название предмета
4. Дата поступления работы
5. ФИО преподавателя, проверяющего работу.
6. Оценка о зачете (зачет, незачет)
Написать программу (Регистрация контрольных работ заочников), выполняющую следующие действия:
ввод с клавиатуры данных в массив;
добавлять записи в массив;
выводить на экран все записи в виде таблицы;
удалять из массива запись с заданным номером;
осуществлять поиск в соответствии с запросами:
удалять все записи по конкретной группе;
изменять фамилию заданного студента;
вывести все данные о зачтенных контрольных работах конкретного студента;
результаты поиска выводить на экран в виде таблицы.
2.4.7.3. Программа
Для упрощения основного алгоритма, его можно разделить на несколько подзадач:
- добавление записей (input);
- вывод записей в виде таблицы (output);
- удаление записи по номеру (delnum);
- удаление записей по конкретной группе (delgr);
- замена фамилии студента (change);
- вывод всех зачтенных работ конкретного лица (outstud).
Реализуем первую подзадачу. Для этого разработаем алгоритм ввода/добавления записей. Его графическая схема изображена на рис. 14.1.
Рис. 14.1. Алгоритм ввода/добавления записей в массив записей.
В табл. 14.8. указаны типы используемых в алгоритме переменных.
Таблица 14.8
Имя перем. в условии |
Имя перем. на С++ |
Тип |
Комментарий |
|
base |
zaochn |
Формальный параметр – указатель на структуру |
|
n |
int |
Формальный параметр - количество записей в массиве |
|
i |
int |
Параметр цикла |
|
m |
int |
Количество добавляемых записей |
|
nn |
int |
Начальное |
|
k |
int |
Параметр для ввода по полям |
Реализуем вторую подзадачу. Разработаем алгоритм вывода записей. Его графическая схема изображена на рис. 14.2. В табл. 13.3. указаны типы используемых в алгоритме переменных.
Таблица 14.9
Имя перем. в условии |
Имя перем. на С++ |
Тип |
Комментарий |
|
base |
zaochn |
Формальный параметр – указатель на структуру |
|
n |
int |
Количество записей во всей структуре |
|
i |
int |
Параметр цикла |
|
i_nach |
int |
Номер начальной записи |
|
i_kon |
int |
Номер конечной записи |
|
vvod |
int |
Параметр для организации прокрутки |
|
koef |
int |
Параметр для вычисления количества записей на страницу |
Реализуем третью подзадачу. Разработаем алгоритм удаления записи по номеру. Его графическая схема изображена на рис. 14.3. В табл. 14.10 указаны типы используемых в алгоритме переменных.
Таблица 14.10
Имя перем. в условии |
Имя перем. на С++ |
Тип |
Комментарий |
|
base |
zaochn |
Формальный параметр – указатель на структуру |
|
n |
int |
Количество записей во всей структуре |
|
i |
int |
Параметр цикла |
|
j |
int |
Параметр цикла |
|
k |
int |
Номер удаляемой записи |
Рис. 14.2. Алгоритм вывода записей
Рис. 14.3. Алгоритм удаления записи по номеру
Реализуем четвертую подзадачу. Разработаем алгоритм удаления записи по группе. Его графическая схема изображена на рисунке 14.4. В таблице 14.11 указаны типы используемых в алгоритме переменных.
Таблица 14.11
Имя перем. в условии |
Имя перем. на С++ |
Тип |
Комментарий |
|
base |
zaochn |
Формальный параметр – указатель на структуру |
|
n |
int |
Количество записей во всей структуре |
|
i |
int |
Параметр цикла |
|
j |
int |
Параметр цикла |
|
k |
int |
Номер удаляемой записи |
|
grp |
char |
Номер группы |
Рис. 14.4. Алгоритм удаления записи по группе
Реализуем пятую подзадачу. Разработаем алгоритм смены фамилии конкретного студента. Его графическая схема изображена на рис. 14.5. В табл. 14.12 указаны типы используемых в алгоритме переменных.
Рис. 14.5. Алгоритм смены фамилии конкретного студента
Таблица 14.12
Имя перем. в условии |
Имя перем. на С++ |
Тип |
Комментарий |
|
base |
zaochn |
Формальный параметр – указатель на структуру |
|
n |
int |
Количество записей во всей структуре |
|
i |
int |
Параметр цикла |
|
j |
int |
Параметр цикла |
|
k |
int |
Номер удаляемой записи |
|
stud |
char |
Начальная фамилия студента |
|
chstud |
char |
Конечная фамилия студента |
Реализуем шестую подзадачу. Разработаем алгоритм вывода зачтенных работ конкретного студента. Его графическая схема изображена на рис. 14.6. В табл. 14.13 указаны типы используемых в алгоритме переменных.
Рис. 14.6. Алгоритм вывода зачтенных работ конкретного студента.
Таблица 14.13
Имя перем. в условии |
Имя перем. на С++ |
Тип |
Комментарий |
|
base |
zaochn |
Формальный параметр – указатель на структуру |
|
n |
int |
Количество записей во всей структуре |
|
i |
int |
Параметр цикла |
|
k |
int |
Параметр для подсчета зачтенных работ |
|
stud |
char |
Фамилия студента |
|
chstud |
char |
Конечная фамилия студента |
Основной алгоритм выглядит следующим образом.
Рис. 14.7. Основной алгоритм (к- параметр для организации меню)
Листинг программы:
/* Выполнил студент группы ИНФО-101 Иваненко Никита Игоревич */
#include <stdio.h>
#include <conio.h>
#include <string.h>
typedef struct Regrz
{
char fios[21];
char gr[6];
char subj[7];
char date[10];
char fiop[21];
char zach[8];
} zaochn;
void input (zaochn *base, int *n);
void output (zaochn *base, int n);
void delnum (zaochn *base, int *n);
void delgr (zaochn *base, int *n);
void change (zaochn *base, int n);
void outstud (zaochn *base, int n);
main()
{
int k,n;
zaochn base[100];
k=7;
n=0;
while (k!=0)
{
textcolor(11);
textbackground(1);
clrscr();
puts("\t\t╔═══════════════════════════════════╗");
puts("\t\t║ Главное меню. ║");
puts("\t\t║ Выберите действие: ║");
puts("\t\t╟─────┬─────────────────────────────╢");
puts("\t\t║ 1 │ Добавление записи(-сей) ║");
puts("\t\t╟─────┼─────────────────────────────╢");
puts("\t\t║ 2 │ Вывод записей на экран в виде таблицы ║");
puts("\t\t╟─────┼─────────────────────────────╢");
puts("\t\t║ 3 │ Удаление записи по номеру ║");
puts("\t\t╟─────┼─────────────────────────────╢");
puts("\t\t║ 4 │Удаление записи(-сей) по конкретной группе ║");
puts("\t\t╟─────┼─────────────────────────────╢");
puts("\t\t║ 5 │ Замена фамилии студента ║");
puts("\t\t╟─────┼─────────────────────────────╢");
puts("\t\t║ 6 │ Вывод всех зачтенных работ конкретного лица ║");
puts("\t\t╟─────┼─────────────────────────────╢");
puts("\t\t║ 0 │ Завершение работы программы ║");
puts("\t\t╚═══════════════════════════════════╝");
printf ("\t\tВаш выбор(0-6):");
scanf ("%d",&k);
switch (k)
{
case 1 : {
input(base,&n);
puts("Добавление записи(-сей) окончено. Нажмите любую клавишу для продолжения...");
getch();
}
break;
case 2 : {
output(base,n);
puts("Вывод записи(-сей) окончен. Нажмите любую клавишу для продолжения...");
getch();
}
break;
case 3 : {
delnum(base,&n);
puts("Удаление записи окончено. Нажмите любую клавишу для продолжения...");
getch();
}
break;
case 4 : {
delgr(base,&n);
puts("Удаление записи(-сей) окончено. Нажмите любую клавишу для продолжения...");
getch();
}
break;
case 5 : {
change(base,n);
puts("Изменение записи(-сей) окончено. Нажмите любую клавишу для продолжения...");
getch();
}
break;
case 6 : {
outstud(base,n);
puts("Вывод записи(-сей) окончен. Нажмите любую клавишу для продолжения...");
getch();
}
break;
case 0 : {
textcolor(14);
clrscr();
puts("Выход... Нажмите любую клавишу для продолжения...");
getch();
}
break;
default : {
textcolor(12);
clrscr();
puts("Неправильный ввод! Вводите число от 0 до 6!");
getch();
}
break;
}
}
return(0);
}
void input (zaochn *base, int *n)
{ //Функция для ввода/добавления записей в структуру
int i,m,nn,k;
textcolor(10);
clrscr();
puts("Введите кол-во записей:");
scanf("%d",&m);
nn=*n;
*n+=m;
for (i=nn;i<*n;i++)
{
if (i%21==0||nn!=0&&i==nn)
{
clrscr();
k=4;
puts("┌───┬─────────────────┬─────┬──────┬────
─────┬────────────────────┬───────┐");
puts("│ № │ ФИО студента │ Гр. │Предм.│Дата п.р.│
ФИО преподавателя │ Оц. │");
puts("├───┼──────────────────┼─────┼──────┼────
─────┼────────────────────┼───────┤");
}
printf("│%3d│",i+1);
scanf("%s",&base[i].fios);
gotoxy(26,k);
printf("│");
scanf ("%s",&base[i].gr);
gotoxy(32,k);
printf("│");
scanf ("%s",&base[i].subj);
gotoxy(39,k);
printf("│");
scanf ("%s",&base[i].date);
gotoxy(49,k);
printf("│");
scanf("%s",&base[i].fiop);
gotoxy(70,k);
printf("│");
scanf ("%s",&base[i].zach);
gotoxy(78,k);
printf("│\n");
k++;
}
puts("└───┴──────────────────┴─────┴──────┴────
─────┴────────────────────┴───────┘");
}
void output (zaochn *base, int n)
{ //Функция для вывода записей в виде таблицы
int i,i_nach,i_kon,vvod,koef;
clrscr();
if (n>0)
{
i=0;
koef=0;
i_nach=0;
i_kon=17;
vvod=0;
while (vvod!=27)
{
if (i%(17+koef)==0||i==n)
{
if (i!=0)
{
puts("└───┴───────────────────┴─────┴──────┴─
────────┴────────────────────┴───────┘");
if (i_nach>0) printf("Нажмите \"Backspace\" для
прокрутки текста вверх.\n");
if (i<n) printf("Нажмите \"Enter\" для прокрутки текста
вниз.\n");
printf("Нажмите \"Esc\" для выхода.\n");
vvod=getch();
switch (vvod)
{
case 8 : if (koef>0)
{
i_nach=i_nach-1;
koef--;
}
break;
case 13 : if (i_kon<n)
{
i_nach=i_nach+1;
koef++;
}
break;
}
}
clrscr();
puts("┌───┬────────────────┬─────┬──────┬────
─────┬────────────────────┬───────┐");
puts("│ № │ ФИО студента │ Гр. │Предм.│Дата п.р.│
ФИО преподавателя │ Оц. │");
puts("├───┼─────────────────┼─────┼──────┼────
─────┼────────────────────┼───────┤");
}
if (i_nach+17<n+1) i_kon=i_nach+17;
else i_kon=n;
for(i=i_nach;i<i_kon;i++) printf("│%3d│%-20s│%-5s│%-6s│%-
9s│%-20s│%-7s│\n",i+1,base[i].fios, base[i].gr, base[i].subj, base[i].date,
base[i].fiop, base[i].zach);
if (vvod==27)
puts("└───┴────────────────┴─────┴──────┴────
─────┴────────────────────┴───────┘");
}
}
else puts ("Нет записей для вывода!");
}
void delnum (zaochn *base, int *n)
{ //Функция для удаление записи по номеру
int i,j,k;
textcolor(13);
clrscr();
if (*n>0)
{
puts("Введите № удаляемой записи:");
scanf("%d",&k);
for (i=k-1;i<*n;i++)
for(j=0;j<22;j++)
{
if (j<22)
{
base[i].fios[j]=base[i+1].fios[j];
base[i].fiop[j]=base[i+1].fiop[j];
}
if (j<11) base[i].date[j]=base[i+1].date[j];
if (j<9) base[i].zach[j]=base[i+1].zach[j];
if (j<8) base[i].subj[j]=base[i+1].subj[j];
if (j<7) base[i].gr[j]=base[i+1].gr[j];
}
*n=*n-1;
}
else puts ("Нет записей для удаления!");
}
void delgr (zaochn *base, int *n)
{ //Функция для удаления записей по конкретной группе
int i,j,k;
char grp[6];
textcolor(11);
clrscr();
if (*n>0)
{
puts("Введите название группы для удаления записи(-сей):");
scanf("%s",&grp);
i=0;
while (i<*n)
{
if (strcmp(base[i].gr,grp)==0)
{
for (k=i;k<*n-1;k++)
for (j=0;j<22;j++)
{
if (j<22)
{
base[k].fios[j]=base[k+1].fios[j];
base[k].fiop[j]=base[k+1].fiop[j];
}
if (j<11) base[k].date[j]=base[k+1].date[j];
if (j<9) base[k].zach[j]=base[k+1].zach[j];
if (j<8) base[k].subj[j]=base[k+1].subj[j];
if (j<7) base[k].gr[j]=base[k+1].gr[j];
}
*n=*n-1;
}
if (strcmp(base[i].gr,grp)!=0) i++;
}
}
else puts ("Нет записей для удаления!");
}
void change (zaochn *base, int n)
{ //Функция для смены фамилии студента с заданной на заданную
int i,j;
char stud[21],chstud[21];
textcolor(12);
clrscr();
if (n>0)
{
puts("Введите начальную фамилию студента:");
scanf("%s",&stud);
puts("Введите фамилию студента для смены:");
scanf("%s",&chstud);
for (i=0;i<n;i++) if (strcmp(base[i].fios,stud)==0) for (j=0;j<22;j++) if
(strlen(chstud)+1>j) base[i].fios[j]=chstud[j];
else
base[i].fios[strlen(chstud)+1]='\0';
}
else puts ("Нет записей для изменения!");
}
void outstud (zaochn *base, int n)
{ //Функция для вывода зачтенных работ конкретного лица
int i,k;
char stud[21];
clrscr();
if (n>0)
{
puts("Введите фамилию студента для вывода записи(-сей):");
scanf("%s",&stud);
k=0;
for (i=0;i<n;i++) if
(strcmp(base[i].fios,stud)==0&&strcmp(base[i].zach,"зачет")==0) k++;
if (k>0)
{
puts("┌───┬──────────────────┬─────┬──────┬────
─────┬────────────────────┬───────┐");
puts("│ № │ ФИО студента │ Гр. │Предм.│Дата п.р.│ ФИО
преподавателя │ Оц. │");
puts("├───┼──────────────────┼─────┼──────┼────
─────┼────────────────────┼───────┤");
k=1;
for (i=0;i<n;i++)
if (strcmp(base[i].fios,stud)==0&&strcmp(base[i].zach,"зачет")==0)
printf("│%3d│%-20s│%-5s│%-6s│%-9s│%-20s│%-7s│\n",k,base[i].fios,
base[i].gr, base[i].subj, base[i].date, base[i].fiop, base[i].zach);
puts("└───┴──────────────────┴─────┴──────┴────
─────┴────────────────────┴───────┘");
}
else printf ("У студента %s нет зачтенных работ!\n",stud);
}
else puts ("Нет записей для вывода!");
}