Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные программирование часть 1.doc
Скачиваний:
89
Добавлен:
07.03.2016
Размер:
783.36 Кб
Скачать

Лабораторная работа № 7. Файлы и структуры

1. Цель работы

Изучение описания и принципов работы с пользовательскими типами данных: перечисляемый тип, записи. Изучение принципов алгоритмизации задач, связанных с обработкой файлов разного типа. Изучение перегрузки функций.

2. Порядок выполнения работы

    1. Изучить общую схему работы с файлами, принципы хранения содержимого файла в памяти, содержимое файловой переменной. Изучить описание перечисляемого типа и структуры, правила работы с ними. Изучить отличия работы с бинарными и текстовыми файлами.

    2. Изучить возможности и правила перегрузки функций.

    3. Изучить синтаксические конструкции enum и struct, объявление файловой переменной FILE *.

    4. Изучить функции для работы с бинарными и текстовыми файлами: fopen, fclose, fwrite, fread, ferror, eof, fgets, fputs.

    5. Изучить пример выполнения задания.

    6. Разработать алгоритм решения индивидуального задания, удовлетворяющий требованиям п. 2.7, используя метод пошаговой детализации.

    7. Требования к алгоритму. Алгоритм должен соответствовать требованиям структурного подхода. Необходимо организовать интерфейс ввода – вывода всех требуемых данных, организовать проверку входных данных на допустимые значения. Необходимо решить задачу, предполагая, что исходная информация может храниться и в бинарном, и в текстовом файле. Организовать информацию для хранения в бинарном файле в виде структуры, одно из полей которой сделать перечисляемого типа. Алгоритм решения задачи разбить на функциональные блоки, оформить блоки в виде функций. Выделить функции, одинаковые по смыслу, но различные по реализации, в зависимости от типа входных данных, и создать перегружаемые функции.

    8. Разработать программу на языке С++ для алгоритма п. 2.6, используя модульный подход (см. п. 2.8 лаб. раб. № 6).

    9. Выполнить отладку и компиляцию программы, получить исполняемый файл.

    10. Выполнить тестирование программы несколькими наборами входных данных.

    11. Составить диаграмму модулей, дерево вызова функций и спецификации функций (в отчет по лабораторной работе).

3. Пример выполнения задания

Дан файл, содержащий сведения об учениках школы и их оценках. Определить, имеются ли в школе однофамильцы, и подсчитать количество учеников, имеющих отметки не ниже «хорошо».

3.1 Текст программы на С++ (часть).

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

//модуль type_menu.h

//файл содержит интерфейсы функций для "типизированного" файла (функции //верхнего уровня, вызываемые из меню)

#pragma once

#include "type_func.h"

//перегружаемые функции

void WriteFile(int n, rec &wrec);//открытие "типизированного" файла для записи

void ReadFile(int n, rec &wrec);//открытие "типизированного" файла для чтения

void CheckNameDuplicated(int n, rec &nrec); //проверка однофамильцев

void NumberOfBPupil(rec &urec);//поиск кол-ва учеников с отметками не ниже //хорошо в типизированном файле

//============================================================

//модуль text_menu.h

//файл содержит интерфейсы функций для текстового файла (функции верхнего //уровня, вызываемые из меню)

#pragma once

#include "text_func.h"

//перегружаемые функции

void WriteFile(int n, string_user &st); //открытие текстового файла для записи

void ReadFile(int n, string_user &st); //открытие текстового файла для чтения

void CheckNameDuplicated(int n, string_user &st); //проверка однофамильцев

void NumberOfBPupil(string_user &st); //поиск кол-ва учеников с отметками не //ниже хорошо в текстовом файле

//============================================================

//модуль type_menu.срр (представлена одна функция)

//файл содержит реализации функций для "типизированного" файла (для меню)

#include "stdafx.h"

#include "type_menu.h"

//открытие "типизированного" файла для записи

void WriteFile(int n, rec &wrec)

{ FILE * fo;

fo = fopen("type.txt","wb"); //открываем (создаем) файл для записи

if (fo == NULL)

{ cout << "Ошибка открытия файла для записи" << endl;

exit(EXIT_FAILURE);

}

for(int i = 0; i < n; i++)

{ int temp=0; //временная переменная для оценок

cout << "Введите имя ученика: "; cin >> wrec.name;

cout << "Введите фамилию ученика: "; cin >> wrec.subname;

cout << "Введите класс, где обучается ученик: "; cin >> wrec.clas;

cout << "Введите оценки ученика (4 штуки от 1 до 5)" << endl;

for(int j = 0; j < 4; j++)

{ cout << "Введите " << j+1 << " оценку: "; cin >> temp;

wrec.marks[j] = (mark)temp;

}

WriteElement(wrec, fo); //запись одной структуры в файл

cout << endl;

}

fclose(fo); //закрываем файл

cout << endl;

}//============================================================

//модуль text_menu.cpp (представлена одна функция)

//файл содержит реализации функций для текстового файла (функции для меню)

#include "stdafx.h"

#include "text_menu.h"

//проверка однофамильцев в текстовом файле

void CheckNameDuplicated(int n, string_user &st)

{ FILE * ft;

ft = fopen("text.txt","r"); //открываем существующий файл для чтения

if (ft == NULL)

{ cout << "Ошибка открытия файла для чтения" << endl;

exit(EXIT_FAILURE);

}

if(HasDuplicatedName(n, st, ft))

cout << "В школе есть однофамильцы" << endl;

else

cout << "В школе нет однофамильцев" << endl;

fclose(ft);

cout << endl;

}//============================================================

//модуль type_func.h

//файл содержит интерфейсы функций для "типизированного" файла (функции //преобразования - функции нижнего уровня)

#pragma once

//перечисляемый тип с оценками

enum mark {very_bad = 1, bad = 2, satisfactory = 3, good = 4, excellent = 5};

struct rec //структура данных

{ char name[10];

char subname[15];

int clas;

mark marks[4];

};

//перегружаемые функции

void WriteElement(rec &wrec, FILE * f1); //запись структуры в файл

void ReadElement (rec &rrec, FILE * f1); //чтение структуры из файла

bool HasDuplicatedName(int n, rec &nrec, FILE * f1); //есть ли однофамильцы

int GetNumberOfBPupil(rec &urec, FILE * f1); // кол-во учеников с оценками не //ниже хорошо

//============================================================

//модуль type_func.срр (представлена только часть функций)

//файл содержит реализации функций преобразования для "типизиров." файла

#include "stdafx.h"

#include "type_func.h"

//-------------------------------------------------------------------------------------------------

//запись структуры в файл

void WriteElement(rec &wrec, FILE * f1)

{ fwrite(&wrec,sizeof(rec),1,f1); //записываем одну структуру

}//-------------------------------------------------------------------------------------------------

//чтение структуры из файла

void ReadElement(rec & rrec, FILE * f1)

{ fread(&rrec, sizeof(rec), 1, f1); //читаем одну структуру

}//-------------------------------------------------------------------------------------------------

//поиск однофамильцев в школе

bool HasDuplicatedName (int n, rec &nrec, FILE * f1)

{ char str[100][15]; //массив для фамилий

for(int i = 0; i < n; i++)

{ fread(&nrec, sizeof(rec), 1, f1);

strncpy(str[i], nrec.subname, 15); //записываем только фамилии в // созданный массив

}

for(int i = 0; i < n-1; i++) //поиск одинаковых фамилий

{ for(int j = i+1; j < n; j++)

if(strcmp(str[i], str[j]) == 0) //сравниваем строки (фамилии)

return true;

}

return false;

}//============================================================

//модуль text_func.h

//файл содержит интерфейсы функций для текстового файла (функции нижнего //уровня)

#pragma once

#define MAX_LEN 25

typedef char string_user[MAX_LEN];

//перегружаемые функции

void WriteElement(string_user &st, FILE * f1); //запись строки в файл

void ReadElement (string_user &st, FILE * f1); //чтение строки из файла

bool HasDuplicatedName (int n, string_user &st, FILE * f1); //поиск однофамильцев

int GetNumberOfBPupil(string_user &st, FILE * f1); //поиск кол-ва учеников с //оценками не ниже хорошо

//============================================================

//модуль text_func.cpp (представлена только часть функций)

//файл содержит реализации функций преобразования для текстового файла

#include "stdafx.h"

#include <fstream>

#include "text_func.h"

#include "type_func.h" //для типа оценок mark

//-------------------------------------------------------------------------------------------------

//запись строки в текстовый файл

void WriteElement(string_user &st, FILE * f1)

{ fputs(st, f1);

fputs("\n",f1);

}//-------------------------------------------------------------------------------------------------

//чтение строки из текстового файла

void ReadElement(string_user &st, FILE * f1)

{ fgets(st, MAX_LEN, f1);

OemToAnsi(st, st);

}//-------------------------------------------------------------------------------------------------

4. Контрольные вопросы

1. Что такое файл? Общая схема работы с файлом.

2. Что содержит файловая переменная?

3. Как работают функции fopen и fclose?

4. Что такое структура? Как обращаться к полям структуры?

5. Как выглядит объявление структуры? Как в памяти хранится переменная структурного типа?

6. В чем отличие обработки текстового и бинарного файлов?