Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР14-С++-24-мая-2012.doc
Скачиваний:
34
Добавлен:
23.09.2019
Размер:
2.26 Mб
Скачать

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 ("Нет записей для вывода!");

}