Слайд 1Информационные технологии
Заключение. Пример разработки программы
1
Заключение. Пример разработки программы
Шевченко А. В.
Слайд 2Информационные технологии
Заключение. Пример разработки программы
2
Постановка задачи
Шевченко А. В.
Разработать программу учета
успеваемости студентов по некоторой дисциплине. Программа должна подерживать следующие данные
о студентах: личные данные, принадлежность к группе, возраст, успеваемость. Данные должны читаться из файла и сохраняться в файле. В программе должны поддерживаться функции вывода списка студентов с их данными; внесение данных по успеваемости; различные отчеты, например средняя успеваемость по заданной группе.
Слайд 3Информационные технологии
Заключение. Пример разработки программы
3
Анализ данных. Определение функций программы
Шевченко А.
В.
Номер
Фамилия, имя, отчество
Группа
Возраст
Оценка
100101
Иванов Петр Сидорович
1001
?
100102
Петров Сидор Иванович
1001
?
100201
Сидоров Иван Петрович
1002
?
Чтение данных
из файла
Запись данных в файл
Вывод списка студентов
Средняя успеваемость по группе
Как определить возраст?
Какие значения имеет оценка?
Слайд 4Информационные технологии
Заключение. Пример разработки программы
4
Определение хранимых данных
Шевченко А. В.
Номер
Фамилия, имя,
отчество
Группа
Дата рожд.
Оценка
100101
Иванов Петр Сидорович
1001
11.01.1991
100102
Петров Сидор Иванович
1001
22.02.1991
100201
Сидоров Иван Петрович
1002
05.10.1992
Как определить возраст?
Какие
значения имеет оценка?
Хранить дату рождения. Возраст вычислять на текущую дату
{неизвестна, плохо, удовлетворительно, хорошо, отлично}
Слайд 5Перечислимый тип для оценки
Структура для даты
Информационные технологии
Заключение. Пример разработки программы
5
Определение
структуры данных
Шевченко А. В.
Номер
Фамилия, имя, отчество
Группа
Дата рожд.
Оценка
100101
Иванов Петр Сидорович
1001
11.01.1991
...
...
...
...
typedef struct
{
unsigned char day;
unsigned char month;
unsigned short year;
} DAT;
typedef enum
{
UNKNOWN = 0,
BAD = 2,
SATISFACTLY,
WELL,
EXCELLENT
} NOTE;
Слайд 6Основная структура данных
Информационные технологии
Заключение. Пример разработки программы
6
Определение структуры данных
Шевченко А.
В.
typedef struct
{
unsigned long num;
char name[32];
unsigned short group;
DAT bday;
NOTE note;
} STUDENT;
Номер
Фамилия, имя, отчество
Группа
Дата рожд.
Оценка
100101
Иванов Петр Сидорович
1001
11.01.1991
...
...
...
...
Файл learning.h
typedef struct
{
unsigned char day;
unsigned char month;
unsigned short year;
} DAT;
typedef enum
{
UNKNOWN = 0,
BAD = 2,
SATISFACTLY,
GOOD,
EXCELLENT
} NOTE;
Слайд 7Информационные технологии
Заключение. Пример разработки программы
7
Файл заголовка learning.h
Шевченко А. В.
typedef struct
{
unsigned char day;
unsigned char month;
unsigned short year;
} DAT; // структура даты
typedef enum
{
UNKNOWN = 0,
BAD = 2,
SATISFACTLY,
GOOD,
EXCELLENT
} NOTE; // тип для оценки
typedef struct
{
unsigned long num;
char name[32];
unsigned short group;
DAT bday;
NOTE note;
} STUDENT; // структура для списка студентов
float age(STUDENT* S);
bool ReadData();
bool SaveData();
void PrintList();
bool SetNote(long Num, NOTE Note);
float MedNote(short Group);
Слайд 8Информационные технологии
Заключение. Пример разработки программы
8
Реализация данных. Статический массив с инициализацией
Шевченко
А. В.
Текст программы - файл learning.cpp
STUDENT studs[] =
{
{100101,
"Иванов Петр Сидорович", 1001, {11, 01, 1991}, 0},
{100102, "Петров Сидор Иванович", 1001, {22, 02, 1991}, 0},
{100201, "Сидоров Иван Петрович", 1002, {05, 10, 1992}, 0}
};
int nstud = sizeof(studs)/sizeof(STUDENT);
Слайд 9Информационные технологии
Заключение. Пример разработки программы
9
Запись в файл. Вариант 1 -
текстовый файл данных
Шевченко А. В.
#include
bool SaveData()
{
FILE* out
= fopen("learning.txt", "wt");
if(out == NULL)
{
printf("Ошибка при открытии файла\n");
return(false);
}
for(int i = 0; i < nstud; i++)
fprintf(out, "%6d|%-31s|%4d|%02d.%02d.%4d|%1d\n", studs[i].num,
studs[i].name, studs[i].group, studs[i].bday.day,
studs[i].bday.month, studs[i].bday.year, studs[i].note);
fclose(out);
}
Слайд 10Информационные технологии
Заключение. Пример разработки программы
10
Содержимое текстового файла данных
Шевченко А. В.
100101|Иванов
Петр Сидорович |1001|11.01.1991|0
100102|Петров Сидор Иванович
|1001|22.02.1991|0
100201|Сидоров Иван Петрович |1002|05.10.1992|0
Слайд 11Информационные технологии
Заключение. Пример разработки программы
11
Запись в файл. Вариант 2 -
двоичный файл данных
Шевченко А. В.
#include
bool SaveData()
{
FILE* out
= fopen("learning.dat", "wb");
if(out == NULL)
{
printf("Ошибка при открытии файла\n");
return(false);
}
fwrite(studs, sizeof(STUDENT), nstud, out);
fclose(out);
}
Слайд 12Информационные технологии
Заключение. Пример разработки программы
12
Чтение из файла. Вариант 1 -
текстовый файл данных
Шевченко А. В.
STUDENT studs[100];
int nstud;
bool ReadData()
{
FILE*
inp = fopen("learning.txt", "rt");
... // проверка ошибки при открытии файла;
nstud = 0;
while(!feof(inp))
{
STUDENT* S = &studs[nstud++];
memset(S, 0, sizeof(STUDENT));
fscanf(inp, "%d|%31c|%d|%d.%d.%d|%d\n", &S->num, S->name,
&S->group, &S->bday.day, &S->bday.month, &S->bday.year,
&S->note);
}
fclose(inp);
}
Слайд 13Информационные технологии
Заключение. Пример разработки программы
13
Чтение из файла. Вариант 2 -
двоичный файл данных
Шевченко А. В.
STUDENT* studs;
int nstud;
bool ReadData()
{
FILE*
inp = fopen("learning.dat", "rb");
... // проверка ошибки при открытии файла;
fseek(inp, 0, SEEK_END);
nstud = ftell(inp)/sizeof(STUDENT);
studs = (STUDENT*)malloc(sizeof(STUDENT)*nstud);
fseek(inp, 0, SEEK_SET);
fread(studs, sizeof(STUDENT), nstud, inp);
fclose(inp);
}
Слайд 14Информационные технологии
Заключение. Пример разработки программы
14
Реализация функции вычисления возраста
Шевченко А. В.
float
age(STUDENT* S)
{
DAT today;
today.day = 22;
today.month = 5;
today.year = 2010;
float diff_y = S->bday.year-today.year;
float diff_m = S->bday.month-today.month;
float diff_d = S->bday.day-today.day;
return(diff_y+diff_m/12+diff_d/365);
}
Слайд 15Информационные технологии
Заключение. Пример разработки программы
15
Реализация функции вывода списка
Шевченко А. В.
void
PrintList()
{
printf(" ***** Список
студентов *****\n");
printf("-----------------------------------------------------\n");
printf("| Фамилия, имя, отчество | Возраст | Группа |\n");
printf("-----------------------------------------------------\n");
for(int i = 0; i < nstud; i++)
{
STUDENT* S = &studs[i];
printf("| %-30.30s | %5.1f | %4d |\n", S->name, age(S),
S->group);
}
printf("-----------------------------------------------------\n");
}
Слайд 16Информационные технологии
Заключение. Пример разработки программы
16
Результат вывода списка
Шевченко А. В.
***** Список студентов *****
-----------------------------------------------------
|
Фамилия, имя, отчество | Возраст | Группа |
-----------------------------------------------------
| Иванов Петр Сидорович | 19.4 | 1001 |
| Петров Сидор Иванович | 19.3 | 1001 |
| Сидоров Иван Петрович | 17.6 | 1002 |
-----------------------------------------------------
Слайд 17Информационные технологии
Заключение. Пример разработки программы
17
Реализация функции ввода оценки
Шевченко А. В.
bool
SetNote(long Num, NOTE Note)
{
for(int i = 0; i
< nstud; i++)
if(studs[i].num == Num)
{
studs[i].note = Note;
return(true);
}
return(false);
}
SetNote(100102, WELL);
SetNote(100201, EXCELLENT);
Слайд 18Информационные технологии
Заключение. Пример разработки программы
18
Реализация функции средней оценки по группе
Шевченко
А. В.
float MedNote(short Group)
{
int n = 0;
int s = 0;
for(int i = 0; i < nstud; i++)
if(studs[i].group == Group and studs[i].note != UNKNOWN)
{
s += studs[i].note;
n++;
}
return(n ? (float)s/(float)n : 0);
}