Uploaded by Onslov Ivan

Пояснительная

advertisement
Задание 1. Создать файл , содержащий сведения о сдаче студентами сессии .
Структура записи: индекс группы, фамилия студента, оценки по пяти экзаменам
и пяти зачетам (" з " означает зачет, " н " – незачет).
2
Содержание
1. Постановка задачи .................................................................................................... 4
2. Блок-схема алгоритма решения .............................................................................. 6
3. Текст программы на языке Visual Basic ................................................................. 8
4. Анализ полученного результата ............................................................................. 9
5. Вывод ....................................................................................................................... 10
3
1. Постановка задачи
Создать файл, содержащий сведения о сдаче студентами сессии. Каждая
запись имеет поля: индекс группы, фамилия студента, оценки по пяти
экзаменам и пяти зачетам (з – зачет, н – незачет).
Написать программу выдающую след. информацию:
- фамилии неуспевающих студентов с указанием индексов групп и кол-ва
задолжностей;
- средний балл, полученный каждым студентом группы Х, и всей группой
в целом.
4
Создание текстового файла
Для выполнения поставленной задачи в текущем каталоге был создан
файл data.txt, в котором находились необходимые сведения для решения
задачи.
Данный файл используется как файл последовательного доступа, в
котором данные в цикле считываются в соответствующие переменные, в нашем
случае в массив данных, с которым впоследствии мы и работаем. Как видно из
рисунка, согласно заданию, формат ввода данных таков:
р 11,Лактионова,5,5,5,5,5,з,з,з,з,з Эти данные могут быть любыми, их вводит
пользователь, но обязательно должны быть обязательно такого формата.
р 11 – Группа
Лактионова – фамилия курсанта(ки)
5 – оценка за экзамен (всего пять экзаменов)
з – зачет (з – зачет, н – незачет, всего пять зачетов)
5
Создание формы
Объект форма создается с помощью Visual Basic. В нашей программе она
одна: “Form1”. На данной форме находятся командные кнопки, элементы
управления Label, а также комбинированное поле ComboBox, с помощью
которых мы выполняем поставленную перед нами задачу. На рисунке можно
увидеть эту форму.
Форма:
6
2. Блок-схема алгоритма решения
Блок-схема Form_Load()
Начало
Dim Zach As Integer
i = -1
Open App.Path + "\data.txt" For Input As #1
Do Until EOF(1)
i=i+1
Input #1, Stud(0, i),
Stud(1, i), Ball(0, i),
Ball(1, i), Ball(2, i),
Ball(3, i), Ball(4, i),
Stud(2, i), Stud(3, i)
Stud(6, i)
For Zach = 2 To 6
If Stud(Zach, i)
= "н"
Ball(5, i) = Ball(5, i) + 1
If Ball(5, i) > 0
Close #1
List1.AddItem Stud(1, i)
List2.AddItem Stud(0, i)
Конец
List3.AddItem Ball(5, i)
7
Блок-схема Combo1_Click()
Начало
List4.Clear
List5.Clear
Dim N As Integer
Dim SrBall, AllCadets As Single
For N = 0 To i
If Stud(0, N) =
Combo1.Text
List4.AddItem Stud(1, N)
List5.AddItem (Ball(0, N)+…)/5
SrBall = (Ball(0, N)+…)/5
Конец
AllCadets = (AllCadets + SrBall) / 2
Label7 = AllCadets
8
3. Текст программы на языке Visual Basic
Dim Stud(7, 100) As String
Dim Ball(5, 100), i As Integer
Private Sub Combo1_Click()
List4.Clear
List5.Clear
Dim N As Integer
Dim SrBall, AllCadets As Single
For N = 0 To i
If Stud(0, N) = Combo1.Text Then
List4.AddItem Stud(1, N)
List5.AddItem (Ball(0, N) + Ball(1, N) + Ball(2, N) + Ball(3, N) + Ball(4, N)) / 5
SrBall = (Ball(0, N) + Ball(1, N) + Ball(2, N) + Ball(3, N) + Ball(4, N)) / 5
AllCadets = (AllCadets + SrBall) / 2
Label7 = AllCadets
End If
Next N
End Sub
Private Sub Command1_Click()
End
End Sub
Private Sub Form_Load()
Dim Zach As Integer
i = -1
'Загрузка значений в массивы
Open App.Path + "\data.txt" For Input As #1
Do Until EOF(1)
i=i+1
Input #1, Stud(0, i), Stud(1, i), Ball(0, i), Ball(1, i), Ball(2, i), Ball(3, i), Ball(4, i), Stud(2, i),
Stud(3, i), Stud(4, i), Stud(5, i), Stud(6, i)
For Zach = 2 To 6
If Stud(Zach, i) = "н" Then
Ball(5, i) = Ball(5, i) + 1
End If
Next Zach
If Ball(5, i) > 0 Then
List1.AddItem Stud(1, i)
List2.AddItem Stud(0, i)
List3.AddItem Ball(5, i)
End If
Loop
Close #1
End Sub
9
4. Анализ полученного результата
При запуске программы в массивы загружаются данные из файла. Затем из
массивов в List1, List2 и List3 загружается фамилия, группа и кол-во
задолжностей каждого курсанта (имеющего задолжность) соответственно. При
выборе в Combo1 группы в List4, List5 будут загружены все фамилии и средний
балл каждого студента, в Label7 выводится средний балл всей группы.
10
Вывод по проделанной работе
При выполнении курсового проекта я научилась составлять элементарные
(простые) программы в среде объектного программирования MS Visual Basic.
11
Задание 2. Написать программу , выдающую следующую информацию :
- фамилии неуспевающих студентов с указанием индекса группы и количества
задолженностей,
- средний балл, полученный каждым студентом группы Х, и всей группой в
целом.
12
АННОТАЦИЯ
В данном документе описывается программа, написанная в соответствии с постановкой задачи на курсовое проектирование по
теме "Разработка программы об успеваемости студентов" по дисциплине "Основы программирования и алгоритмические языки". Структура
записей входного файла имеет следующий шифр группы(6символов), шифр дисциплины(6 символов), количество отличных, хороших,
удовлетворительных, неудовлетворительных оценок, пропущено лекций, пропущено практических занятий.
Для проверки функционирования программы разработан тестовый пример. Результаты тестирования показывают, правильность
выполнения программой всех операций по обработке входных данных и формированию выходных данных.
Область применения программы - любое высшее учебное заведение, где требуется анализ информации об успеваемости и
количестве пропущенных занятий.
13
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1. НАЗНАЧЕНИЕ И ОБЛАСТЬ ПРИМЕНЕНИЯ
2. ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ
2.1 ПОСТАНОВКА ЗАДАЧИ
2.2 ОПИСАНИЕ ОСНОВНЫХ ТИПОВ ДАННЫХ
2.3 ВХОДНЫЕ ДАННЫЕ
2.4 ВЫХОДНЫЕ ДАННЫЕ
2.5 ОПИСАНИЕ АЛГОРИТМА ПРОГРАММЫ
2.6 ОПИСАНИЕ ПРОЦЕДУР
2.7 ВЫБОР ЯЗЫКА ПРОГРАММИРОВАНИЯ
3. ОСНОВНЫЕ ТЕХНИКО-ЭКОНОМИЧЕСКИЕ ПОКАЗАТЕЛИ
ЗАКЛЮЧЕНИЕ
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
ПРИЛОЖЕНИЕ А
ПРИЛОЖЕНИЕ Б
14
ВВЕДЕНИЕ
Развитие компьютерных технологий позволило упростить ручную,
монотонную и расчетную работу. На данный момент создано большое
количество программ, обрабатывающих разнотипную информацию. В
настоящее время работа любого предприятия просто немыслима без
применения компьютерных технологий. Современные программы могут
значительно
упростить
производством.
И
соответствующих
процесс
только
с
программ
управления
использованием
современное
предприятием
и
компьютеров
и
предприятие
может
плодотворно работать и достигать немыслимых при некомпьютерной
обработке информации результатов.
Программа
предназначена
посещаемости
студентов
предназначена
для
для
высших
подсчета
контроля
учебных
среднего
бала
успеваемости
заведений.
по
и
Программа
заданному
шифру
дисциплины, количество пропущенных лекций и практических занятий.
Позволяет вносить корректировки в уже имеющиеся данные и создавать
новые записи, сохранять отредактированные записи.
Эта программа может применяться в любых высших учебных заведениях,
где необходим контроль успеваемости и количество пропущенных занятий.
15
1. НАЗНАЧЕНИЕ И ОБЛАСТЬ ПРИМЕНЕНИЯ
В данной программе учитывается информация о количестве пропущенных занятий студентами и количество полученных
отличных, хороших, удовлетворительных и неудовлетворительных оценок. Причем учет идет по шифрам групп и дисциплин. В
результате работы программы выводится таблица, в которой приводиться статистика об успеваемости студентов по дисциплинам, в
виде среднего бала, также показывается информация о количестве пропущенных практических занятий и лекций и общее количество
пропущенных занятий.
Программа
работает
в
текстовом
режиме
под
управлением
операционной системы MS DOS, а также Windows.Для загрузки списка
требуется специально организованный файл. Вывод выходной таблицы
производится как на экран, так и в файл, задаваемый пользователем. Для
работы программы подходит практически любой PC компьютер, оснащенный
цветным дисплеем.
2. ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ
2.1 ПОСТАНОВКА ЗАДАЧИ
Требуется
написать
программу
обработки
информации,
осуществляющую ввод исходной информации из файла, обработку в
соответствии с вариантом задания, а также печать содержимого исходных
файлов и файлов расчетов. Выводимую информацию оформить в виде
таблицы со всеми необходимыми полями записей и результатов расчетов.
Даны учетные записи по шифрам дисциплины, в которых указывается номер
шифра и данные о количестве оценок и пропущенных занятий.
Получить отчет по шифрам дисциплины содержащий: шифр каждой дисциплины,
номер группы, средний бал студентов с данной дисциплины и количество пропущенных
16
ими занятий (лекций и практических занятий). Результаты отпечатать в виде
соответствующей таблицы (Таблица 2.1)
Структура записей входного файла имеет следующий вид: шифр группы
(6 символов), шифр дисциплины (6 символов), количество отличных, хороших,
удовлетворительных,
неудовлетворительных
оценок,
пропущено
лекций,
пропущено практических занятий
Таблица 2.1 – Выходная таблица
Шифр дисциплины
Средний балл
Пропущено занятий
Лекций
Практических
Всего
В программе необходимо организовать процедуры: открытия файла с
данными,
просмотр
содержимого
файла,
сортировки,
добавления,
редактирования и удаления данных, а так же информации по заданию.
2.2 ОПИСАНИЕ ОСНОВНЫХ ТИПОВ ДАННЫХ
Для внутреннего хранения входных данных о студенте в программе
используется комбинированный тип данных:
struct student {
char group[6];
char dis[6];
unsigned int best, good, bad, poor;
unsigned int miss_lection, miss_practic; };
typedef struct obrab
{
char dis[6];
17
float bal;
float bal_c;
int prop_pr;
int prop_lec;
};
Информация, содержащаяся в полях:
1.
Структура student – структура с входными данными
group – шифр дисциплины;
dis – шифр дисциплины;
best – количество отличных оценок;
good - количество хороших оценок;
bad – количество удовлетворительных оценок;
poor – количество неудовлетворительных оценок;
miss_lection – количество пропущенных лекций;
miss_practic – количество пропущенных практик.
2.
Структура obrab – структура для выходных данных
dis - шифр дисциплины
bal – суммарный балл
bal_c – количество оценок
prop_pr - кол-во пропущенных практик
prop_lec – кол-во пропущенных лекций
Для того чтобы возможно было обрабатывать множество записей,
необходимо организовать их в массив или список. В данном случае
используется список, так как заранее неизвестно количество элементов, поэтому
нельзя
задать
размер
массива.
Для
удобства
работы
организуется
однонаправленный список записей.
2.3 ВХОДНЫЕ ДАННЫЕ
18
Входные данные представляют собой текстовый файл, в котором по
строкам разбита информация о студентах с разных дисциплин и групп и имеет
следующий вид: шифр группы(6 символов), шифр дисциплины(6 символов),
количество отличных, хороших, удовлетворительных, неудовлетворительных
оценок, пропущено лекций, пропущено практических занятий.
A-25 0704 10 55 0 40 0 0
A-23 0604 20 10 10 40 0 10
A-24 0604 12 55 0 0 0 10
B-25 0504 22 35 55 60 0 20
B-26 0504 23 55 0 30 0 0
I-11 0804 10 50 20 1 1 1
I-11 0804 91 53 2 2 54 9
I-12 0804 12 34 0 0 0 19
I-21 O804 0 0 0 0 0 0
A-11 0704 9 52 0 40 0 0
A-12 0704 1 1 1 1 1 1
A-12 0704 54 63 23 1 1 1
A-23 0704 96 55 0 0 40 0
A-23 0704 93 50 20 0 0 0
A-22 0704 21 55 0 0 0 10
A-22 0704 22 35 55 60 0
M-13 0914 10 9 8 0 7 6
M-12 0914 1 2 3 4 5 6
M-21 0914 5 4 6 77 9 88
A-32 0704 5 23 43 7 68 0
A-31 0704 10 55 0 40 0 0
I-32 0804 23 55 0 0 10 40
19
I-31 0804 3 3 4 5 6 7
I-24 0804 0 0 0 0 0 0
I-22 0804 23 13 14 10 9 5
I-22 0804 20 10 10 4 4 4
I-21 0804 0 0 0 0 0 0
I-22 0804 10 10 10 10 11 12
A-22 0704 1 11 11 22 3 4
A-41 0704 5 5 5 5 5
I-25 0804 6 36 24 13 23 9
I-15 0804 7 6 7 8 9 9
I-14 0804 0 0 0 0 0 0
M-25 0914 12 15 15 12 15 7
M-14 0914 5 5 5 5 5 5
P-13 0976 8 8 8 8 8 8
P-12 0976 1 1 1 1 1 1
M-21 0914 0 0 0 0 0 0
M-32 0914 6 6 6 47 12 32
I-33 0804 5 5 5 5 5 5
I-23 0804 7 7 7 7 7 7
A-21 0704 50 50 45 34 54 7
A-21 0704 10 10 8 9 7 0
Рисунок 2.1 - Пример входных данных
2.4 ВЫХОДНЫЕ ДАННЫЕ
Выходные данные представляют собой информацию об успеваемости
студента – Таблица 2.3.
Таблица 2.2 – Пример выходных данных
20
Шифр дисциплины
Средний балл
Пропущено занятий
Лекций
Практических
Всего
0804
4,53
0
40
40
0704
3,33
0
0
0
0604
3,6
20
0
20
0504
3,3
20
0
20
Описание алгоритма программы об успеваемости студентов
Начало
1
Введите имя
2
файла
2
Чтение
имени
3
Открыть
файл
4
Проверка
наличия файла .
5
Чтение
записи
6
nova->zap=data;
nova>next=NULL;
temp=nova;
10
7
Пока не
конец
файла
first=nova;
8
Чтение
записи
11
выд. памяти
Данные успешно
считаны
9
Закрыть
файл
nova->zap=data;
nova->next=NULL;
temp=nova;
Конец
21
Рисунок 2.3 – Организация списка
Блок 1 – Вывод на экран запроса о введении имени файла, который
необходимо открыть
Блок 2 – Чтение имени файла
Блок 3 – Проверка правильности имени файла и его наличия
Блок 4 – Открытие файла
Блок 5 – Чтение первой записи
Блок 6 – Сохранение первой записи в структуре линейного списка.
Запоминание указателя на первый элемент.
Блок 7 – Цикл, в основе которого лежит проверка окончания файла
Блок 8 – Печать на экран сообщения об успешном считывании данных
Блок 9 – Закрытие файла
Блок 10 – Чтение очередной записи
Блок 11 – Сохранение записи в общем списке.
22
Рисунок 2.4 - Сортировка по шифру дисциплины
Начало
кол-во
зап. > 0
1
2
j=0;
j<numer;
j++
3
temp1=
getel(j); 4
k=0;
Конец
k<numer;
k++
5
temp2=
getel(k); 6
Если дисц.
равны
7
data=temp1-zap;
temp1zap=temp-2zap;
temp2->zap=data
23
Блок 1 – Проверка наличия записей. Осуществляется путем сравнивания
порядкового номера (последней записи) с нулем
Блок 2 - Происходит проход по циклу n раз (где n – количество записей).
Блок 3 – Вызов функции getel, которая возвращает запись (temp1) с
заданным порядковым номером (задается в параметре вызова)
Блок 4 - Происходит проход по циклу n раз (где n – количество записей).
Блок 5 - Вызов функции getel, которая возвращает запись (temp2) с
заданным порядковым номером (задается в параметре вызова)
Блок 6 – Осуществляется проверка на равенство дисциплин в разных
записях (temp1 и temp2)
Блок 7 – Производится обмен информационными полями
2.6 ОПИСАНИЕ ФУНКЦИЙ, ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ

org – функция организации линейного списка.

print – распечатывает входные данные

udal – функция удаления указанного элемента из линейного списка.

sort – функция сортировки линейного списка.

addelement – функция добавления нового элемента в линейный
список (вручную).

obrabotka – функция, которая обрабатывает данные и выводит
таблицу результатов на экран.

edit – функция корректирования данных в линейном списке.
24

getel – получает элемент по номеру в списке

save – функция, которая сохраняет данные из линейного списка в
указанный файл

menu_edit – функция вызывающая подменю редактирования
таблицы

raschet – функция производящая обработку данных и распечатку

add_obrabotka – функция производящая непосредственный расчет
выходных данных
2.7 ВЫБОР ЯЗЫКА ПРОГРАММИРОВАНИЯ
Программа написана на языке высокого уровня С++ и скомпилирована
компилятором Borland C 3.1 для MSDOS v.5.0 с использованием бесплатно
распространяемого (посредством FIDO и Internet ) пакета ComC для работы с
текстовыми окнами, клавиатурой и т.д. Данный пакет предоставляет подобные
TurboVision средства для работы с окнами, меню, но занимает значительно
меньше места и работает быстрее.
Язык С++ и компилятор выбраны из-за его гибкости, широкого
распространения, малого объема исполняемого файла и большой скорости
выполнения. Компилятор Borland C++ к тому же включает в себя опциональную
возможность оптимизации кода программы как по скорости, так и по размеру
[1–3].
Для разработки программ такого типа удобнее использовать язык
высокого уровня;
1. Легкость в работе с указателями;
2. Достаточная скорость выполнения готовой программы;
Всем этим требованиям удовлетворяет язык программирования Borland
C++
25
3. ОСНОВНЫЕ ТЕХНИКО-ЭКОНОМИЧЕСКИЕ ПОКАЗАТЕЛИ
Для нормальной работы программы необходима следующая аппаратная
база: совместимый IBM-PC компьютер на базе процессора Intel 80286, 640Кб
оперативной памяти, накопитель жестких или гибких магнитных дисков
объемом не менее 10 Мб, CGA VGA, SVGA видеоадаптеры, цветной монитор,
поддерживающий текстовый режим 80х25.
Программа предназначена для работы в среде операционной системы MSDOS . Также работоспособность программы сохранится при использовании ее
под линии Windows 9х. Все вышеперечисленные требования являются
оптимальными.
26
ЗАКЛЮЧЕНИЕ
Данная программа, составлена в соответствии с постановкой задачи на
курсовое проектирование по теме "Разработка программы об успеваемости
студентов" по дисциплине "Основы программирования и алгоритмические
языки" (ОП и АЯ).
В программе были реализованы функции: открытия файла с данными,
просмотр содержимого файла, cортировки, добавления, редактирования и
удаления данных, а так же вывод результирующей таблицы на экран.
Для проверки работоспособности программы и правильности обработки
входных данных разработан тестовый пример который подтвердил, что
программа правильно выполняет обработку данных и выдаёт верные
результаты. Всё это свидетельствует о работоспособности программы и
позволяет сделать вывод о пригодности программы к решению практических
задач по обработке информации о студентах и ее успешного применения в
любом высшем учебном заведении, где необходимо ведение статистики
успеваемости и посещаемости занятий студентов.
При написании программы использованы методические указания по
курсовому проектированию по дисциплине "ОП и АЯ", а также материал из
книг указанных в библиографическом списке.
27
ПРИЛОЖЕНИЕ А
Текст программы
#include <stdio.h> //подключение модулей
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <iostream.h>
#define cons zero //константа
struct student { //запись о студентах
unsigned int x;
char group[6];
char dis[6];
unsigned int best, good, bad, poor;
unsigned int miss_lection, miss_practic; };
typedef struct obrab //объявление типа структуры
{
char dis[6];
float bal;
float bal_c;
int prop_pr;
int prop_lec;
};
struct obrabotk //структура элемента списка
28
{
obrab inf; //информационное поле
obrabotk *next; //ссылка на структуру obrabotk
};
struct node { // структура элемента списка
student zap;
node *next; };
typedef struct obrabotk *obrabotka; //объявление переменных
obrabotka nachalo,tmp,konec;
typedef struct node *listptr;
struct student data;
struct node *first, *temp, *nova, *temp1, *temp2, *left;
void print(void); //объявление функций
void org (void);
void addelement(void);
void udal (void);
void edit(void);
void save(void);
void menu_edit(void);
listptr getel(int);
void sort(void);
void raschet();
void add_obrabotka(student dat);
unsigned int numer ;
29
//-------------------- ---------MAIN-------------------------------void main() //основная программа
{
char stroka[256];
int choice;
textbackground(BLUE); //установка цвета фона
for (;;) //бесконечный цикл вывода меню на экран
{
clrscr(); //очистка экрана
printf("1 - Чтение данных \n");
printf("2 - Просмотр исходной таблицы\n");
printf("3 - Редактирование таблицы\n");
printf("4 - Сортировка таблицы\n");
printf("5 - Обработка таблицы\n");
printf("9 - Выход \n");
cin.getline (stroka, 256);
if ( strlen(stroka)!=1)
strcpy(stroka, '\0');
choice=atoi (stroka);
switch (choice) //оператор выбора функций
{
case 1:
{ org(); break;} //вызов функции организации списка
case 2:
{ clrscr();
30
print(); //вызов функции распечатки таблицы на экран
getch();
break;}
case 3:
{ menu_edit(); break; } //вызов функции редактирования списка
case 4:
{sort(); break;} //вызов функции сортировки
case 5:
{ raschet(); //вызов функции обработки таблицы
break;}
case 9:
{ exit(9); break; } //вызов функции выхода из программы
}
} } //конец основной программы
//----------------------------------Edit menu -----------------------------void menu_edit() // функция подменю редактирования списка
{
char stroka[256]; //объявление переменных
int choice; //объявление переменных
for(;;)
{
clrscr(); //очистка экрана
printf(" ---------- РЕДАКТИРОВАНИЕ ТАБЛИЦЫ ------------------\n\n");
printf("1 - Добавление новой записи\n");
printf("2 - Удаление записи\n");
printf("3 - Редактирование записей\n");
printf("4 - Сохранение таблицы\n");
31
printf("5 - Выход\n");
printf("Выберите пункт меню... ");
cin.getline(stroka,256);
if ( strlen(stroka)!=1)
strcpy(stroka, '\0');
choice=atoi (stroka);
switch (choice) //оператор выбора
{
case 1:
{ addelement(); //добавление новой записи
break; }
case 2:
{ udal(); //удаление записи
break; }
case 3:
{ edit(); //редактирование записи
break; }
case 4:
{ save(); //сохранение записи
break;}
case 5:
return; } //выход в главное меню
}
}
//---------------------Чтение данных из файла-----------------------32
void org() //функция организации и чтения данных в списке
{
char filename[256];
FILE *fileptr;
numer=1;
printf("Введите имя файла...\n");
cin.getline(filename,256);
if (strlen(filename)>=13)
{printf("Неправильное имя файла!!!");
getch(); //ожидание нажатия любой клавиши
return;} //выход в главное меню
for (int i=0; i<=strlen(filename); i++) //цикл чтения из файла
if (filename[i]==' ')
{ printf("HUI");
getch();
return;}
if ((fileptr = fopen(filename, "r"))==NULL) //проверка наличия файла
{ printf ("Файл не обнаружен!\n");
getch();
return; }
temp->zap.x=numer;
numer++; //увеличение на 1
fscanf(fileptr,"%s%s%d%d%d%d%d%d", &data.group, &data.dis,
33
&data.best, &data.good, &data.bad,
&data.poor, &data.miss_lection, &data.miss_practic ); //чтение данных из
файла
if( (nova=(struct node*)malloc(sizeof (struct node) )) == NULL )
{printf ("No memory"); //оператор проверки нужного кол-ва опер. памяти
getch();
exit(10); }
nova->zap=data; //организация 1-го элемента списка
nova->next=NULL;
temp=nova;
first=nova;
while(!feof(fileptr)) //пока не конец файла
{
temp->zap.x=numer;
numer++; //увеличение на 1
fscanf(fileptr,"%s%s%d%d%d%d%d%d", &data.group, &data.dis,
&data.best, &data.good, &data.bad,
&data.poor, &data.miss_lection, &data.miss_practic );
//чтение данных из файла
if( (nova=(struct node*)malloc(sizeof (struct node) )) == NULL )
{printf ("No memory"); //оператор проверки нужного кол-ва опер. памяти
getch();
exit(10); }
nova->zap=data; //организация последующих элементов списка
temp->next=nova;
34
temp=nova;
nova->next=NULL; }
printf("Данные успешно считаны!\n");
getch();
fclose(fileptr); //закрытие файла
}
//-------------------------Печать исходной таблицы-----------------------void print() //функция печати исходной таблицы
{
numer=1;
temp=first; //присвоить temp к началу списка
if (temp==NULL) //если список пустой
{ printf("Не обнаружено данных!\n"); //печать строки на экран
printf("Считайте данные из файла!\n");
getch();
return; } //выход из функции
else { //оператор «иначе»
//вывод на экран верхушки исходной таблицы
printf(" Исходная таблица \n");
printf(" +--+------+------+-------------------+---------+\n");
printf(" | | | | Кол-во оценок | |\n");
printf(" |# | Шифр | Шифр +----+----+----+----|Пропуcки |\n");
printf(" | |группы| дисц |5-ки|4-ки|3-ки|2-ки|лек прак|\n");
printf(" +--+------+------+----+----+----+----+----+----|\n");
35
while(temp!=NULL) //пока не конец списка
{
if ((numer%16)==0)
{
printf(" +--+------+------+----+----+----+----+----+----+\n");
printf("Нажмите калвишу для продолжения");
getch();
clrscr();
printf(" +--+------+------+-------------------+---------+\n");
printf(" | | | | Кол-во оценок | |\n");
printf(" |# | Шифр | Шифр +----+----+----+----|Пропуcки |\n");
printf(" | |группы| дисц |5-ки|4-ки|3-ки|2-ки|лек прак|\n");
printf(" +--+------+------+----+----+----+----+----+----|\n");
}
temp->zap.x=numer;
numer++;
printf (" |%-2d|%-6s|%-6s|% -4d|% -4d|% -4d|% -4d|% -4d|% -4d|\n",
temp->zap.x,
temp->zap.group,
temp->zap.dis,
temp->zap.best,
temp-
>zap.good, temp->zap.bad,
temp->zap.poor, temp->zap.miss_lection, temp->zap.miss_practic);
temp=temp->next; }
}
printf(" +--+------+------+----+----+----+----+----+----+\n");
}
36
//-------------------------------Добавление записи-----------------------void addelement() //добавление элемента в список
{
int temp,i;
char dat[256];
//заполнение полей списка
printf("Введите данные для записи:\n\n");
printf("Введите шифр группы \n");
cin.getline(dat,256);
if( (strlen(dat)>5 )||(strlen(dat)==0) )
{ printf("Номер группы должен состоять не меньше чем из 1 символа и не
больше чем из 5 !!!\n");
getch();
return;}
strcpy(data.group, dat);
printf("Введите шифр дисциплины\n");
cin.getline(dat,256);
if( (strlen(dat)>5 )||(strlen(dat)==0) )
{ printf("Номер шифра должен состоять не меньше чем из 1 символа и не
больше чем из 5 !!!\n");
getch();
return; }
strcpy(data.dis, dat);
printf("Введите количество отличных оценок\n");
cin.getline(dat,256);
for(i=0; i<=strlen(dat); i++)
37
if ( (isalpha(dat[i]) ) || (isspace(dat[i])) )
{ printf("Здесь не должно быть букв!!!\n");
getch();
return; }
if (strlen(dat)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
temp=atoi(dat);
data.best=temp;
printf("Введите количество хороших оценок\n");
cin.getline(dat,256);
for(i=0; i<=strlen(dat); i++)
if (isalpha(dat[i]))
{ printf("Здесь не должно быть букв!!!\n");
getch();
return; }
if (strlen(dat)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
temp=atoi(dat);
data.good=temp;
printf("Введите количсетво плохих оценок\n");
cin.getline(dat,256);
for(i=0; i<=strlen(dat); i++)
if (isalpha(dat[i]))
38
{ printf("Здесь не должно быть букв!!!\n");
getch();
return; }
if (strlen(dat)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
temp=atoi(dat);
data.bad=temp;
printf("Введите количество очень плохихи оценок\n");
cin.getline(dat,256);
for(i=0; i<=strlen(dat); i++)
if (isalpha(dat[i]))
{ printf("Здесь не должно быть букв!!!\n");
getch();
return; }
if (strlen(dat)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
temp=atoi(dat);
data.poor=temp;
printf("Введите количесвто пропоущенных лекций\n");
cin.getline(dat,256);
for(i=0; i<=strlen(dat); i++)
if (isalpha(dat[i]) )
{ printf("Здесь не должно быть букв!!!\n");
39
getch();
return; }
if (strlen(dat)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
temp=atoi(dat);
data.miss_lection=temp;
printf("Введите количество пропущенных практик\n");
cin.getline(dat,256);
for(i=0; i<=strlen(dat); i++)
if (isalpha(dat[i]))
{ printf("Здесь не должно быть букв!!!\n");
getch();
return; }
if (strlen(dat)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
temp=atoi(dat);
data.miss_practic=temp;
if( (nova=(struct node*)malloc(sizeof (struct node) )) == NULL )
{ printf ("Недостаточно памяти для выполнения программы. Программы
будет оключена :-0");
getch();
exit(10); }
40
nova->zap=data;
temp2=first;
first=nova;
first->next=temp2; //переход к следующему элемента
}
//------- --------------------Удаление записи-----------------------void udal () //удаление элемента списка
{
int choose, boolean = 0;
char stroka [256];
if (first==NULL)
{printf("Необходимо прочитать файл!\n");
getch();
return;}
clrscr();
print();
printf("Выберите запись, которую необходимо удалить\n");
cin.getline(stroka,256);
if ( strlen(stroka)> 4)
{ printf ("Неправильный выбор!!!\n");
getch();
return; }
choose=atoi(stroka);
41
if (choose<=0)
{printf("Несуществует такой записи!!!\n");
getch();
return;}
if (first->zap.x==choose)
{
temp2=first;
first=first->next;
free(temp2);
printf("Запись найдена и удалена!\n");
boolean=1;
getch();
}
else
{
temp=first;
while (temp!=NULL) //пока не конец списка
{
if (temp->next->zap.x==choose)
{
temp2=temp->next;
temp->next=temp2->next;
free(temp2);
printf("Запись найдена и удалена!\n");
boolean=1;
getch();
};
temp=temp->next; //переход к следующему элементу
42
};
};
if (boolean==0)
{ printf("Запись с указанным номером не найдена!\n");
getch(); }
}
//------------------------Редактирование записей------------------void edit() //функция редактирования элемента списка
{
int num, numx, choose;
int boolean=0;
char stroka[256], dat[256];
int i, tem;
clrscr(); //очистка экрана
if (first==NULL)
{ printf("Прочитайте данные из файла!\n");
getch();
return;}
print();
printf("\nВыберите запись для редактирования ");
cin.getline(stroka,256);
if ( strlen(stroka)>4)
{printf("Неверный ввод записи!\n");
getch();
return;}
43
num=atoi (stroka);
clrscr(); //очистка экрана
temp=first;
while(temp!=NULL) //пока не конец списка
{
if (temp->zap.x==num)
{
//печать верхушки таблицы
printf(" +--+------+------+-------------------+---------+\n");
printf(" | | | | Кол-во оценок | |\n");
printf(" |# | Шифр | Шифр +----+----+----+----|Пропуcки |\n");
printf(" | |группы| дисц |5-ки|4-ки|3-ки|2-ки|лек прак|\n");
printf(" +--+------+------+----+----+----+----+----+----|\n");
printf(" |%-2d|%-6s|%-6s|% -4d|% -4d|% -4d|% -4d|% -4d|% -4d|\n",
//печать элементов списка
temp->zap.x,
temp->zap.group,
temp->zap.dis,
temp->zap.best,
temp-
>zap.good, temp->zap.bad,
temp->zap.poor, temp->zap.miss_lection, temp->zap.miss_practic);
printf(" +--+------+------+----+----+----+----+----+----+\n\n");
printf("1. Шифр группы\n");
printf("2. Шифр дисциплины\n");
printf("3. Количество отличных оценок\n");
printf("4. Количество хороших оценок\n");
printf("5. Количество плохих оценок\n");
printf("6. Количество очень плохих оценок\n");
printf("7. Количесвто пропущенных лекций\n");
printf("8. Количесвто пропущенных практик\n");
44
printf("Какое поле заменть? ");
cin.getline(stroka,256);
if ( strlen(stroka)!=1)
{printf("Неправильный выбор!!!\n");
getch();
return;}
for(i=0; i<=strlen(stroka); i++)
if (isalpha(stroka[i]))
{printf("Выбор не буквенный !!!\n");
getch();
return;}
choose=atoi(stroka);
switch (choose) { //оператор выбора
case 1:
{
printf("Введите шифр группы \n");
cin.getline(stroka,256);
if( (strlen(stroka)>5 )||(strlen(stroka)==0) )
{ printf("Номер группы должен состоять не меньше чем из 1 символа и не
больше чем из 5 !!!\n");
getch();
return;}
strcpy(temp->zap.group, stroka);
boolean=1;
break; }
45
case 2:
{ printf("Введите шифр дисциплины\n");
cin.getline(stroka,256);
if( (strlen(stroka)>5 )||(strlen(stroka)==0) )
{ printf("Номер шифра должен состоять не меньше чем из 1 символа и не
больше чем из 5 !!!\n");
getch();
return; }
strcpy(temp->zap.dis, stroka);
boolean=1;
break; }
case 3:
{printf("Введите количество отличных оценок\n");
cin.getline(stroka,256);
for(i=0; i<=strlen(stroka); i++)
if ( (isalpha(stroka[i]) ) || (isspace(stroka[i])) )
{ printf("Здесь не должно быть букв!!!\n");
getch();
return; }
if (strlen(stroka)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
tem=atoi(stroka);
temp->zap.best=tem;
boolean=1;
break;}
case 4:
46
{ printf("Введите количество хороших оценок\n");
cin.getline(dat,256);
for(i=0; i<=strlen(dat); i++)
if (isalpha(dat[i]))
{ printf("Здесь не должно быть букв!!!\n");
getch();
return; }
if (strlen(dat)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
tem=atoi(dat);
temp->zap.good=tem;
boolean=1;
break;}
case 5:
{
printf("Введите количсетво плохих оценок\n");
cin.getline(dat,256);
for(i=0; i<=strlen(dat); i++)
if (isalpha(dat[i]))
{ printf("Здесь не должно быть букв!!!\n");
getch();
return; }
if (strlen(dat)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
47
tem=atoi(dat);
temp->zap.bad=tem;
boolean=1;
break;}
case 6:
{
printf("Введите количество очень плохихи оценок\n");
cin.getline(dat,256);
for(i=0; i<=strlen(dat); i++)
if (isalpha(dat[i]))
{ printf("Здесь не должно быть букв!!!\n");
getch();
return; }
if (strlen(dat)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
tem=atoi(dat);
temp->zap.poor=tem;
boolean=1;
break;}
case 7:
{printf("Введите количесвто пропоущенных лекций\n");
cin.getline(dat,256);
for(i=0; i<=strlen(dat); i++)
if (isalpha(dat[i]) )
{ printf("Здесь не должно быть букв!!!\n");
getch();
return; }
48
if (strlen(dat)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
tem=atoi(dat);
temp->zap.miss_lection=tem;
boolean=1;
break;}
case 8:
{printf("Введите количество пропущенных практик\n");
cin.getline(dat,256);
for(i=0; i<=strlen(dat); i++)
if (isalpha(dat[i]))
{ printf("Здесь не должно быть букв!!!\n");
getch();
return; }
if (strlen(dat)>3)
{ printf("Количество н может превышать 999\n");
getch();
return;}
tem=atoi(dat);
temp->zap.miss_practic=tem;
boolean=1;
break;}
default:
{printf("Вы сделали ошибку! Выбрали несуществующее поле!\n");
getch();
break; }}
49
}
temp=temp->next; //переход к следующему элементу
}
if (boolean!=1)
{ printf("Вы ошиблись! Такой записи не существует!");
getch() ; }
else if (boolean==1)
{printf("Запись обновлена!");
getch(); }
}
//---- Сохранение исходной таблицы----------------------------------void save() //сохранение списка
{
FILE *file; //объявление файловой переменной
char file_save[256];
if (first==NULL) //если список пуст
{printf("Отсутствуют данные для сохранения!\n");
getch();
return;}
printf("Введите имя файла в который сохранить таблицу\n");
cin.getline(file_save,256);
50
if (strlen(file_save)>13)
{printf("Неправильное имя файла!!!");
getch();
return;}
if ( (file=fopen(file_save, "w+")) == NULL)
{ printf ("Ошибка с созданием файла!!!\n");
getch();
return; }
//печать верхушки таблицы
fprintf(file, " Исходная таблица \n");
fprintf(file, " +--+------+------+-------------------+---------+\n");
fprintf(file, " | | | | Кол-во оценок | |\n");
fprintf(file, " |# | Шифр | Шифр +----+----+----+----|Пропуcки |\n");
fprintf(file, " | |группы| дисц |5-ки|4-ки|3-ки|2-ки|лек прак|\n");
fprintf(file, " +--+------+------+----+----+----+----+----+----|\n");
numer=1;
temp=first;
while(temp!=NULL) //пока не конец списка
{
temp->zap.x=numer;
numer++; //увеличение на 1
//запись в файл
fprintf (file," |%-2d|%-6s|%-6s|% -4d|% -4d|% -4d|% -4d|% -4d|% -4d|\n",
temp->zap.x,
temp->zap.group,
temp->zap.dis,
temp->zap.best,
temp-
>zap.good, temp->zap.bad,
temp->zap.poor, temp->zap.miss_lection, temp->zap.miss_practic);
51
temp=temp->next; //переход к следующему элементу
}
fprintf(file," +--+------+------+----+----+----+----+----+----+\n");
printf("Файл сохранен!");
getch();
}
// -----------------------------------------сортировка-----------------------void sort()
//функция сортировки данных
{
if (numer>0)
{
for (int j=0;j<numer;j++)
{
temp1=getel(j);
for (int k=0;k<numer;k++)
{
temp2=getel(k);
if (strcmp(temp2->zap.dis,temp1->zap.dis)>0)
{ data=temp1->zap;
temp1->zap=temp2->zap;
temp2->zap=data; }
}
}
printf("Таблица отсортирована!!");
getch();
};
52
};
// -----------------------------------------для сортировки-----------------listptr getel(int h)
{
temp=first;
for (int c=0;c!=h;c++)
temp=temp->next;
return temp;
};
//--------------------------------------obrabotka--------------------void add_obrabotka(student dat) //функция обработки данных
{
obrabotka temp;
if (nachalo==NULL)
{
tmp=(struct obrabotk*)malloc(sizeof(struct obrabotk));
strcpy(tmp->inf.dis,dat.dis);
tmp->inf.bal=(dat.best*5)+(dat.good*4)+(dat.bad*3)+(dat.poor*2);
tmp->inf.bal_c=dat.best+dat.good+dat.bad+dat.poor;
tmp->inf.prop_pr=dat.miss_practic;
tmp->inf.prop_lec=dat.miss_lection;
nachalo=tmp;
nachalo->next=NULL;
konec=nachalo;
53
return;
}
else
{
temp=nachalo;
while (temp!=NULL) //пока не конец списка
{
if (strcmp(temp->inf.dis,dat.dis)==0)
{
temp->inf.bal=temp>inf.bal+((dat.best*5)+(dat.good*4)+(dat.bad*3)+(dat.poor*2));
temp->inf.bal_c=temp->inf.bal_c+(dat.best+dat.good+dat.bad+dat.poor);
temp->inf.prop_pr=temp->inf.prop_pr+dat.miss_practic;
temp->inf.prop_lec=temp->inf.prop_lec+dat.miss_lection;
return;
};
temp=temp->next; //переход к следующему элменту
};
tmp=(struct obrabotk*)malloc(sizeof(struct obrabotk));
strcpy(tmp->inf.dis,dat.dis);
tmp->inf.bal=(dat.best*5)+(dat.good*4)+(dat.bad*3)+(dat.poor*2);
tmp->inf.bal_c=dat.best+dat.good+dat.bad+dat.poor;
tmp->inf.prop_pr=dat.miss_practic;
tmp->inf.prop_lec=dat.miss_lection;
tmp->next=NULL;
konec->next=tmp;
konec=tmp;
return;
};
54
};
void raschet() //функция расчёта
{
int u=1;
if (numer>0)
{
temp=first;
float c;
while (temp!=NULL)
{
add_obrabotka(temp->zap);
temp=temp->next; //переход к следующему элементу
};
clrscr(); //очистка экрана
//вывод резльтата
printf(" Отчет по дисциплинам \n");
printf(" +-+------+-------------+------------------+\n");
printf(" | | | | Пропуски занятий |\n");
printf(" |#| Шифр | Средний бал +-----+-----+------|\n");
printf(" | | дисц | | Прк | Лек | Всего|\n");
printf(" +-+------+-------------+-----+-----+------|\n");
tmp=nachalo;
while(tmp!=NULL) //пока не конец списка
{
c=tmp->inf.bal/tmp->inf.bal_c;
printf(" |%d| ",u);
printf("%-5s|", tmp->inf.dis);
printf(" %-10f| ",c);
55
printf("%-3d| ",tmp->inf.prop_pr);
printf("%-3d| ",tmp->inf.prop_lec);
printf("%-4d| \n",tmp->inf.prop_pr+tmp->inf.prop_lec);
tmp=tmp->next; //переход к следующему элементу
u++;
};
printf(" +-+------+-------------+-----+-----+------+\n");
getch();
};
};
56
ПРИЛОЖЕНИЕ Б
программа алгоритм студент данные
ВЫПОЛНЕНИЕ ПРОГРАММЫ
Для выполнения программы необходимо запустить исполняемый файл
Katya.exe. После запуска программы на экране появляется окно – рис. 2.1
Рисунок 2.1 – Основное окно программы
При выборе пункта 1 (чтение данных) из меню (Рис 2.1) будет сделан
запрос о имени файла с данными: “введите имя файла” и в случае открытия
файла на экране появится информация о том что он открыт успешно.
При выборе пункта 2 (просмотр исходной таблицы) будет выведена
исходная таблица, предварительно считанная из файла.
При выборе пункта 3 (Редактирование таблицы) появиться следующее
меню – рис. 2.2
57
Рисунок 2.2 Меню редактирования таблицы
При выборе пункта 3.1 можно будет добавить новую запись , при этом
запроситься ввести все данные по полям
При выборе пункта 3.2 удалить запись из списка, указав ее
номенклатурный номер, который запроситься.
При выборе пункта 3.3 и 3.4 происходит сохранение редактирование в
списке, при этом запросится имя файла, куда нужно сохранить изменения.
При выборе пункта 4 (сортировка таблицы), в данном меню сортирует
первые 3 столбца в исходной таблице.
Выбрав любое меню сортировки, список будет отсортирован по этому
полю.
При выборе пункта 5 (обработка таблицы), в данном меню можно
отредактировать данные таблицы , при этом нужно будет ввести номер цеха и
год заполнения бланка, затем программа сделает запрос хотите ли вы
сохранить измененные данные, и если да то попросит ввести имя файла.
При выборе пункта 9 (Выход) будет осуществлен выход из программы.
58
замещен Allbesu
59
Download