Контрольная работа № 1 По курсу «Основы алгоритмизации и программирования» Студенту ФЗВ и ДО БГУИР Специальность ИСИТвЭ Группа 702302
Задание. Разработать программу по учету выдачи курсовых проектов учащимся.
Содержание. Задание…………………………………………………………………………….2 Содержание………………………………………………………………………..3 Введение………………………………………………………………………….. 4 Постановка задачи………………………………………………………………. .5 Описание программы ……………………………………………………… 5 Укрупненная схема алгоритма программы………………………………..7 Описание использованных функций……………………………………… 8 Описание локальных переменных использованных функциями……….10 Руководство пользователя ……………………………………………………..11 Описание работы меню……………………………………………………11 Описание ограничений возможностей программы ……………………..13 Описание тестового примера …………………………………………….14 Заключение……………………………………………………………………...23 Список использованных источников………………………………………….24 Приложение 1………………………………………………………………….. 25
Введение. В данной контрольной работе необходимо описать написание программы по учету выдачи курсовых проектов учащимся. Программу по условию задания необходимо написать в консольном режиме, что повлияет на её качество. Но основной задачей контрольной работы является ознакомление с конструкцией языка, изучение принципов написания программ.
Постановка задачи Необходимо разработать программу по учету выдачи курсовых проектов учащимся. Согласно поставленной задаче, программа должна работать со структурой данных, содержащей сведения о курсовых проектах учащихся. В понятие «работа со структурой» входят: • добавление записей; • просмотр записей; • корректировка записей; • удаление записей; • сортировка по возрастанию; • сортировка по убыванию; • открытие структуры из файла; • сохранение структуры в файл; • выход из программы; Тесной связи между необходимыми действиями программы над структурой нет, каждую операцию целесообразно реализовать отдельной функцией. Все действия программы будут происходить над структурой данных, поэтому объявляем ее как глобальный массив структур. Так же объявляем переменную структуры для сортировки записей. И для работы над массивом структур вводим переменную, хранящую в себе количество записей.
Содержание полей массива структуры делаем следующим: Название поля Тип поля Размер поля Тип данных поля fio char 20 символов строка fak char 20 символов строка grup char 6 символов строка kaf char 20 символов строка pred char 20 символов строка ruk char 20 символов строка svid long 32 bit число szd Также объявляем переменную kol типа int, в которой по ходу выполнения программы будет храниться количество записей массива структур. И переменную key типа char, которая используется в каждой функции программы, для улавливания нажатых клавиш. Еще в головном модуле программы использована переменная ext типа int, которая отвечает за постоянный вывод меню программы.
Описание программы Укрупненная схема алгоритма программы.
Описание использованных функций. В программе использовались следующие функции: prolist(); vvods(); vivod(); korr(): udal(); sortub(); sortvoz(); otkr(); soxr(); vixod(); Описаны функции перед телом главного модуля программы. Заголовки функций описаны без применения передачи параметров, и при этом они не возвращают никаких значений. Функции выполняют необходимые действия над глобальными переменными программы. Ниже описаны действия самих функций. prolist(); – функции выполняющая пролистывание экрана при помощи неоднократного оператора «printf("\n");» с параметром «\n», осуществляющего перевод каретки курсора на следующую строку. Используется как внутри тела главного модуля программы, так и в остальных функциях. vvods(); – функция выполняет ввод записей в программу. Действие функции основано на работе цикла с постусловием. Поочередно при помощи операторов «scanf();» вводится каждое поле структуры, после ввода записи выдается запрос на продолжение ввода данных. Если ответ положительный, то продолжается работа цикла, иначе осуществляется выход из цикла и следует завершение процедуры. vivod(); – функция выполняет вывод на экран записей, с которыми работает программа. Это осуществляется поочередным выводом полей записей структуры при помощи оператора «printf();». Действие по выводу выполняется такое количества, сколько записей в структуре программы. korr(); – на экран выводятся пронумерованные записи структуры и задается запрос на ввод номера корректируемой записи. Если номер корректируемой записи введен правильно, то происходит вывод на экран старого значения записи и выдаётся запрос на ввод её нового значения. Если номер введен не правильно, то выводится сообщение об этом. Все действия происходят в цикле с постусловием и при необходимости корректировку записи можно повторить. udal(); – сначала на экран выводятся пронумерованные записи структуры и задается запрос на ввод номера удаляемой записи. Если номер удаляемой записи введен правильно то происходит перезапись структуры с введенным номером следом идущей записью, следом идущая запись переписывается следом идущей за ней и так до конца файла. Еще уменьшается счетчик количества записей на единицу. Если номер введен не правильно выводится сообщение об этом. Все действия происходят в цикле с постусловием и при необходимости удаление записи можно повторить. sortub(); – сортирует записи структуры по убыванию методом пузырька. Метод основан на «всплытии» записей с большими значениями поля хранения данных о выплачиваемых налогах. Максимальное значение поднимается наверх и уже не участвует в сравнении. Затем, максимальный из оставшихся, поднимается на ниже стоящую позицию за предыдущим максимальным элементом. И так до конца структуры. sortvoz();– сортирует записи структуры по убыванию методом пузырька. Метод основан на «всплытии» записей с меньшими значениями поля хранения данных о выплачиваемых налогах. Минимальное значение поднимается наверх и уже не участвует в сравнении. Затем, минимальный из оставшихся, поднимается на ниже стоящую позицию за предыдущим минимальным элементом. И так до конца структуры. otkr(); – открывает записи из файла, строго определенной структуры. Сначала считывается общее количество записей, а затем такое количества раз происходит считывание полей записей структуры, причем каждое поле записывается отдельной строкой. При работе функции программа открывает файл с введенным названием для чтения. soxr();¬ – сохраняет записи в файл, название которого вводится с клавиатуры. При отсутствии файла он создается, а если он уже есть происходит его перезапись. Вначале файла отдельной строкой сохраняется общее количество записей структуры, а затем, построчно вносятся значение полей записей структуры. Затем файл просто закрывается. vixod(); – функция, осуществляющая выход из программы при помощи оператора «exit(1);» .
Описание локальных переменных использованных функциями:
Функция Переменная Тип перемен. Назначение переменных vivod() i int для работы цикла вывода записей korr() udal() dz int для ввода номера удаляемой записи i int для работы цикла вывода записей sortub() sortvoz() i int для работы цикла сортировки записей j int для работы цикла сортировки записей otkr() soxr() *f; FILE для работы с файлом i int для цикла работы с записями Руководство пользователя Описание работы меню Меню программы представлено в следующей реализации:
Где 1. Vvod zapisey: осуществляет ввод и добавление записей в конец структуры. 2. Prosmotr zapisey: производит вывод на экран структуры в табличном виде. 3. Korrektirovka zapisey: выполняет корректировку записей из структуры по номеру записи, номер определяется по предварительно выведенному списку записей с их номерами. 4. Udalenie zapisey: выполняет удаление записей из структуры по номеру записи, номер определяется по предварительно выведенному списку записей с их номерами. 5. Sortirovka po ybuvaniy: сортирует записи структуры, по убыванию суммы выплачиваемых налогов работником. 6. Sortirovka po vozrostaniy: сортирует записи структуры, по возрастанию суммы выплачиваемых налогов работником. 7. Otkrut': открывает структуру записей из файла с введенным названием, при этом записи хранящиеся в программе удаляются. 8. Soxranit': сохраняет структуру записей в файл с введенным названием. 9. Vixod: заканчивает работу с программой. После описания пунктов меню, стоит строка предложения выбора действия: Vibrannoe deystvie: Здесь необходимо ввести номер выбранного пункта, при вводе символа, не подразумевающего никакого действия, происходит его игнорирование.
Описание ограничений возможностей программы В программе заложено ограничение максимального количества записей структуры равное ста. При введении значения полей подразумевается компетентность пользователя и введение им логичных данных. При введении номера выбранного пункта меню происходит игнорирование неверно введенного номера. Здесь номер вводится как символ, поэтому может вводится и буква, но и она будет игнорироваться. Когда происходит ответ на вопросы «Bydite vvodit' eco zapici? y/n:» и «Bydet ece ydalenie? y/n:» при введении y либо Y, подразумевается, что да, любой другой введенный символ буден означать нет.
Описание тестового примера. Постановка задачи. Для описания тестового примера выполним следующую задачу: № 1. 2. 3. Фамилия Petrov Petr Petrovich Ivanov Ivan Ivanovich Sidorov Sidor Sidorovich Факультет FZViDO FZViDO FZViDO Группа 702302 702301 703302 Кафедра Informatik Informatik Informatik Предмет OAiP OAiP OAiP Руководитель Sobolev Vorob’ev Kirov Дата выдачи 21.03.08 22.03.08 4.04.08 Дата сдачи 20.05.08 26.05.08 20.05.08 Ввести 3 записи в программу: Просмотреть записи. Отсортировать записи по убыванию. Просмотреть записи. Сохранить записи в файл «123». Удалить записи под номерами 3 и 2. Просмотреть записи. Попытаться открыть записи из файла «321». Открыть записи из файла «123». Просмотреть записи. Отсортировать записи по возрастанию. Попытаться удалить запись под номером 5. Просмотреть записи. Откорректировать запись под номером 1. Просмотреть записи. Выйти из программы. Тестовый пример запуска программы. Запускаем программу «Galkin.exe», в предложенном меню выбираем пункт 1:
На предложение программы вводим информацию:
После ввода каждого значения нажимам Enter. После ввода записи на экран отобразится запрос о вводе новой записи:
Нажимаем «у» и вводим вторую запись:
Опять нажимаем «у» и вводим третью запись:
Выбираем «n», и для просмотра выбираем второй пункт меню:
На это программа выводит на экран содержащиеся записи:
Нажимаем любую клавишу и попадаем в меню программы, где выбираем 5, для сортировки записей по убыванию, на что программа выводит следующее сообщение:
Нажимаем любую клавишу и попадаем в меню программы, где выбираем 2 пункт меню для просмотра:
Записи отсортированы по убыванию налогов. Сохраним записи в файл. Для этого нажмем любую клавишу для выхода в меню. В меню выберем 8. На запрос программы ввести имя файла, вводим «123» и нажимаем Enter.
На это программа выдает сообщение о количестве сохраненных записей названии файла, в который записи сохранены, при этом если файл отсутствует, он создаётся, если присутствует его содержимое удаляется и в пустой файл записываются записи структуры, поэтому следует быть осторожным с записью в фйл.
Нажимаем любую клавишу и в меню программы для удаления записей выбираем 4, на что программа выводит следующий запрос:
Выбираем номер удаляемой записи, это 3. Программа выводит следующее сообщение:
Нажимаем «у», и вводим «2» для удаления второй записи:
Нажимаем «n», и в меню выбираем «2» для просмотра записей:
Как видим, записи под номерами 2 и 3, после сортировки, удалены. Нажимаем любую клавишу и выходим в меню. Для того чтобы попытаться открыть несуществующий файл «321» в меню выбираем «6» и на запрос программы вводим имя «321». Программа реагирует следующим образом:
При этом записи хранящиеся в памяти программы не удалились. Нажимаем любую клавишу и попадаем в меню. Здесь выбираем «6» и на запрос программы вводим имя «123». Программа выводит сообщение о количестве открытых записей и из какого файла они открыты:
Теперь просмотрим записи, хранящиеся в программе. Для этого сначала, для выхода в меню, нажмем любую клавишу, а затем в меню выберем «2»:
Теперь сортируем записи по убыванию. Нажимаем любую клавишу, для выхода в меню. Выбираем «6» и видим:
Нажимаем любую клавишу и в меню программы выбираем «4», на запрос программы вводим запись под номером 5, программа реагирует следующим образом:
Выбираем «n» и выходим в меню программы. Для просмотра выбираем «2»:
Как видим, не одна запись не удалена и все они отсортированы по возрастанию. Нажимаем любую клавишу и выходим в меню программы. Для корректировки выбираем «3», вводим номер редактируемой записи 3, и вводимеё новое значение.
Нажимаем «n», и в меню выбираем просмотр, как видим запись изменила значение:
Нажимаем любую клавишу и для выхода нажмем «8», программа закроется.
Заключение. В данной контрольной работе описано написание программы по учету выдачи курсовых проектов учащимся и приведен текст программного продукта в приложении.. Программу по условию задания необходимо было написать в консольном режиме, что повлияло на её качество. Существующими на данный момент программными средствами логичнее всего использовать в программных продуктах наглядный графический интерфейс. Но назначение программы это ознакомится с конструкцией языка, изучить принцип написания программ.
Список использованных источников. 1. Харви Дейтел, Пол Дейтел “Как программировать на Си” 2. Е. М. Демидович “Основы алгоритмизации и программирования”, Минск 1999 г. 3. Керниган Б., Ритчи Д. “Язык программирования Си”, Финансы и статистика, 1992 г. 4. Ю. Тихомиров «Visual C++6. Новые возможности для программистов» Дюссельдорф, Киев, Москва, Санкт-Петербург, BHV 1999.
Приложение 1 Текст программного модуля «Galkin.cpp» # include <process.h> # include <stdio.h> # include <conio.h> # include <math.h> # include <dos.h> struct { char fio[20]; char fak[20]; char grup[6]; char kaf[20]; char pred[20]; char ruk[20]; char svid[8]; char szd[8]; } rab[100],p; int kol=0; char key=' '; prolist() { printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); } vvods() {key='y'; do {prolist(); printf("\n"); printf("FIO:"); key=getch(); scanf("%20s",rab[kol].fio); printf("Fakultet:"); scanf("%20s",rab[kol].fak); printf("Gruppa:"); scanf("%6s",rab[kol].grup); printf("Kafedra:"); scanf("%20s",&rab[kol].kaf); printf("Predmet:"); scanf("%20s",&rab[kol].pred); printf("Rukovoditel:"); scanf("%20s",rab[kol].ruk); printf("Data vidachi:"); scanf("%8s",&rab[kol].svid); printf("Data sdachi:"); scanf("%8s",&rab[kol].szd); kol++; printf("Bydite vvodit' eco zapici? y/n: "); key=getch(); printf("%c",key); } while (key=='y' || key=='Y'); } vivod() { prolist(); int i=0; puts("-----------------------------------------------------------------------"); for (i=0;i<kol;i++) {printf("Nomer:"); printf("%2d\n",i+1); printf("FIO:"); printf("%20s\n",rab[i].fio); printf("Fakultet:"); printf("%20s\n",rab[i].fak); printf("Gruppa:"); printf("%6s\n",rab[i].grup); printf("Kafedra:"); printf("%20s\n",rab[i].kaf); printf("Predmet:"); printf("%20s\n",rab[i].pred); printf("Rukovoditel:"); printf("%20s\n",rab[i].ruk); printf("Data vidachi:"); printf("%8s\n",rab[i].svid); printf("Data sdachi:"); printf("%8s\n",rab[i].szd); puts("-----------------------------------------------------------------------"); }; key=getch(); } korr() {int dz,i=0; key='y'; do { prolist(); puts("-----------------------------------------------------------------------"); for (i=0;i<kol;i++) {printf("Nomer:"); printf("%2d\n",i+1); printf("FIO:"); printf("%20s\n",rab[i].fio); printf("Fakultet:"); printf("%20s\n",rab[i].fak); printf("Gruppa:"); printf("%6s\n",rab[i].grup); printf("Kafedra:"); printf("%20s\n",rab[i].kaf); printf("Predmet:"); printf("%20s\n",rab[i].pred); printf("Rukovoditel:"); printf("%20s\n",rab[i].ruk); printf("Data vidachi:"); printf("%8s\n",rab[i].svid); printf("Data sdachi:"); printf("%8s\n",rab[i].szd); puts("---------------------------------------------------------------------------"); }; printf ("Vvedite nomer korrektiruemoy zapisi: "); key=getch(); scanf("%d",&dz); if ((dz>kol) || (dz<1)) puts("Vveden neverniy nomer korrektiruemoy zapisi."); else { printf("Nomer:"); printf("%2d\n",dz); scanf("%20s",rab[dz-1].fio); printf("Fakultet:"); scanf("%20s",rab[dz-1].fak); printf("Gruppa:"); scanf("%6s",rab[dz-1].grup); printf("Kafedra:"); scanf("%20s",&rab[dz-1].kaf); printf("Predmet:"); scanf("%20s",&rab[dz-1].pred); printf("Rukovoditel:"); scanf("%20s",rab[dz-1].ruk); printf("Data vidachi:"); scanf("%8s",&rab[dz-1].svid); printf("Data sdachi:"); scanf("%8s",&rab[dz-1].szd); }; puts("---------------------------------------------------------------------------"); printf("Bydet ece korrektirovka? y/n:"); key=getch(); printf("%c\n",key); } while (key=='y' || key=='Y'); } udal() {int dz,i=0; key='y'; do { prolist(); puts("---------------------------------------------------------------------------"); for (i=0;i<kol;i++) { printf("FIO:"); printf("%20s\n",rab[i].fio); printf("Fakultet:"); printf("%20s\n",rab[i].fak); printf("Gruppa:"); printf("%6s\n",rab[i].grup); printf("Kafedra:"); printf("%20s\n",rab[i].kaf); printf("Predmet:"); printf("%20s\n",rab[i].pred); printf("Rukovoditel:"); printf("%20s\n",rab[i].ruk); printf("Data vidachi:"); printf("%8s\n",rab[i].svid); printf("Data sdachi:"); printf("%8s\n",rab[i].szd); puts("---------------------------------------------------------------------------"); }; printf ("Vvedite nomer udalaimoy zapisi: "); key=getch(); scanf("%d",&dz); if ((dz>kol) || (dz<1)) puts("Vveden neverniy nomer ydalyemou zapisi."); else {for (i=dz-1;i<kol-1;i++) rab[i]=rab[i+1]; kol--; }; printf("Bydet ece ydalenie? y/n:"); key=getch(); printf("%c\n",key); } while (key=='y' || key=='Y'); } sortub() { int i,j; prolist(); for(i=1;i<=kol;i++) for(j=kol;j>=i;j--) if(rab[j].fio>rab[j-1].fio) {p=rab[j];rab[j]=rab[j-1];rab[j-1]=p;}; puts("Zapisi otsortirovanu po ubivaniy"); key=getch(); } sortvoz() { int i,j; prolist(); for(i=0;i<=kol;i++) for(j=kol-1;j>=i;j--) if(rab[j].grup<rab[j-1].grup) {p=rab[j];rab[j]=rab[j-1];rab[j-1]=p;}; puts("Zapisi otsortirovanu po vozpostaniy"); key=getch(); } otkr() {FILE *f; int i; prolist(); char name[20]; puts("Vvedite imia fayla:"); key=getch(); scanf("%10s",name); if((f=fopen(name,"rt"))!=NULL) {fscanf(f,"%d",&kol); for (i=0;i<kol;i++) {fscanf(f,"%s",&rab[i].fio); fscanf(f,"%s",&rab[i].fak); fscanf(f,"%s",&rab[i].grup); fscanf(f,"%ld",&rab[i].kaf); fscanf(f,"%ld",&rab[i].pred); fscanf(f,"%s",&rab[i].ruk); fscanf(f,"%ld",&rab[i].svid); fscanf(f,"%ld",&rab[i].szd); } fclose(f); printf("Otkrito %d zapisey iz fayla %s.",kol,name);} else puts("Net takogo fayla."); key=getch(); } soxr() {{FILE *f; int i; char name[20]; prolist(); if ( kol!=0 ) {puts("Vvedite imia fayla:"); key=getch(); scanf("%10s",name); f=fopen(name,"wt"); fprintf(f,"%d\n",kol); for (i=0;i<kol;i++) {fprintf(f,"%s\n",rab[i].fio); fprintf(f,"%s\n",rab[i].fak); fprintf(f,"%s\n",rab[i].grup); fprintf(f,"%ld\n",rab[i].kaf); fprintf(f,"%ld\n",rab[i].pred); fprintf(f,"%s\n",rab[i].ruk); fprintf(f,"%ld\n",rab[i].svid); fprintf(f,"%ld\n",rab[i].szd); } fclose(f); printf("Soxraneno %d zapisey v fayl %s.",kol,name);} else {puts("Net zapisey dly soxraneniy.");}; } key=getch(); } vixod() { exit(1);} void main() { int ext=1; do { prolist(); puts("Viberite deistvie:"); puts("1. Vvod zapisey."); puts("2. Prosmotr zapisey."); puts("3. Korrektirovka zapisey."); puts("4. Udalenie zapisey."); puts("5. Sortirovka po ybuvaniy."); puts("6. Sortirovka po vozrostaniy."); puts("7. Otkrut'."); puts("8. Soxranit'."); puts("9. Vixod."); printf("Vibrannoe deystvie: "); key=getch(); switch(key) { case '1': vvods(); break; case '2': vivod(); break; case '3': korr(); break; case '4': udal(); break; case '5': sortub(); break; case '6': sortvoz(); break; case '7': otkr(); break; case '8': soxr(); break; case '9': vixod(); break; }; } while ( ext == 1); }