Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
46
Добавлен:
01.10.2019
Размер:
243.74 Кб
Скачать

Лабораторная работа №11

РАБОТА С ФАЙЛАМИ

Студент гр. ИКПИ-81

Коваленко Л. А.

А. Постановка задачи

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

В каждой строке записано произвольное количество чисел, записанных в форме f. Сформировать новый файл, дописав в конец каждой строки исходного файла значение ее максимального элемента.

Лабораторная работа выполняется в виде одного файла, содержащего функцию main() и функцию для работы с файлом.

Б. Разработка алгоритма

Алгоритм решения задачи следующий:

  1. Открытие одного файла на чтение.

  2. Открытие второго файла на запись.

  3. Обработка двух файлов при помощи функции: поиск максимального из приведенных в каждой строке (первого файла) вещественных чисел и запись символов и максимального в конец строки (во второй файл).

  4. Закрытие двух файлов.

Входные данные находятся в файле rtext.txt. Выходные данные программа запишет в файл wtext.txt.

В. Таблица идентификаторов

N

Обозначение в задаче

Идентификатор

Назначение

1

Текстовый файл

rfile

Входные данные из файла

2

Новый текстовый файл

wfile

Выходные данные в файл

3

type

Промежуточные данные пользовательской функции

4

num

5

max

6

c

7

Функция обработки

FInputData(FILE *r, FILE *w)

Функция обработки двух файлов

0

Г. Схемы алгоритма

Начало

1

2

(rfile<>NULL) && (wfile<>NULL)

Да

Нет

3

5

Вывод "Не удалось открыть файл"

4

6

7

Останов

8

Конец

0

(c=fgetc(r)) <> EOF

max<num

Да

Нет

(c=='\n' || c=='\0')

max<num

Вывод max в файл w

Вывод c в файл w

c==' '

max<num

Нет

Да

Нет

Да

(c>='0')&&(c<='9')

Да

Нет

type==0

Да

Нет

Да

Нет

num=num*10+c-48

num=num+pow(0.1,type)*(c-48)

c=='.'

Да

Да

Нет

Нет

type=1

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

21

22

23

24

25

FInputData(*r,*w)

0

1

2

20

3

type=type+1

Вывод max в файл w

26

27

Д. Контрольный расчет

Контрольный расчет представлен в таблице.

Машинные результаты могут немного отличаться от ручных в случае с числами, у которого после точки более 6-ти знаков (программа округляет).

теста

Содержимое исходного файла rtext.txt

Максимумы в конце каждой строки файла wtext.txt

Ручные

Машинные

1

1.99 2.45 3.99 4.77 99.9 77.7

565.0 333.33 345.99

99.9

565

99.900000

565.000000

2

56.575676 56.5756768 9.99

544.557 454.111 3434.333

56.5756768

3434.333000

56.575677

3434.333000

3

56.22222 333.0

11.2

333.000000

11.200000

333.000000

11.200000

Е. Программа на языке Си

/* Файл Lab11.c */

// Стандарт языка СИ: "ISO C99"

// Компилятор: "TDM-GCC (MinGW) 4.9.2"

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

/*

Лабораторная работа 11

РАБОТА С ФАЙЛАМИ

Студент гр. ИКПИ-81

Коваленко Л. А.

*/

void FInputData(FILE *r, FILE *w);

int main() {

// Открытие файлов

FILE *rfile = fopen("rtext.txt", "r");

FILE *wfile = fopen("wtext.txt", "w");

// Проверка на наличие ошибок при открытии

if ((rfile != NULL) || (wfile != NULL))

FInputData(rfile, wfile);

else {

printf("Не удалось открыть файл!");

getchar();

}

// Закрытие файлов

fclose(rfile);

fclose(wfile);

return 0;

}

/// Функция добавляет максимальное знач. последовательности в конец строки

/// ***Функция универсальна для любой длины строки

/// Первый параметр — файл для чтения, второй — файл для записи

void FInputData(FILE *r, FILE *w){

// num - число последовательности

// max - максимальное последовательности

short int type = 0;

double num = 0, max = 0;

char c = 0;

while ((c = fgetc(r)) != EOF) {

if ((c == '\n') || (c == '\0')) {

if (max < num) max = num;

fprintf(w, " %lf", max);

max = 0;

num = 0;

type = 0;

}

else if (c == ' ') {

if (max < num) max = num;

num = 0;

type = 0;

}

else if ((c >= '0') && (c <= '9')) {

if (type == 0)

num = num * 10 + (c-48);

else {

num = num + pow(0.1, type) * (c-48);

type += 1;

}

}

else if (c == '.')

type = 1;

fprintf(w, "%c", c);

}

if (max < num) max = num;

fprintf(w, " %lf", max);

}

Ж. Выводы

Тот факт, что результаты контрольных расчетов, выполненных вручную, достаточно совпадают с результатами контрольных расчетов, выполненных на ЭВМ, свидетельствуют о том, что программа составлена правильно.

Соседние файлы в папке Примеры отчетов