Смекни!
smekni.com

Методические указания к лабораторным работам по дисциплине «Программирование на языке высокого уровня» (стр. 9 из 10)

#include <conio.h>

#include <stdlib.h>

#include <iomanip.h>

//Шаблон сортировки массива методом бинарной вставки

template <class TP>

void sort(TP a[], int n)

{

//Объявление переменных

int left, right, middle, i, j;

TP newElement;

for (i=1;i<n;i++)

{

//Обрабатываемый на данном этапе элемент

newElement=a[i];

//Границы отсортированной части массива

left=0; right=i-1;

while (left<=right)

{

//Средний элемент в отсортированной части

middle=(left+right)/2;

//Анализ отношения обрабатываемого и среднего элемента

if (a[middle]<=newElement)

left=middle+1;

else

right=middle-1;

}

//Сдвиг элементов вправо и вставка обрабатываемого элемента

//на новое место

for (j=i;j>right+1;j--) a[j]=a[j-1];

a[right+1]=newElement;

}

}

//Заполение массива, в зависимости от типа элементов

//(перегруженная функция)

void fill(int a[], int n)

{

randomize();

int i;

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

a[i]=rand()%1000;

}

void fill(float a[], int n)

{

randomize();

int i;

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

a[i]=(rand()%1000)/100.0;

}

void fill(char a[], int n)

{

randomize();

int i;

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

a[i]=rand()%200+56;

}

//Вывод массива на экран в зависимости от типа

//(перегруженная функция)

void print(int a[], int n)

{

int i;

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

cout<<setw(6)<<a[i];

cout<<endl<<endl;

}

void print(float a[], int n)

{

int i;

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

cout<<setprecision(2)<<setw(6)<<a[i];

cout<<endl<<endl;

}

void print(char a[], int n)

{

int i;

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

cout<<setw(6)<<a[i];

cout<<endl<<endl;

}

//Основная программа

void main(void)

{

//Объявление переменных

float a[100]; int b[100]; char c[100]; int n;

//Ввод числа элементов массивов

cout<<"Number of elements (from 1 to 100) >"; cin>>n;

cout<<endl;

//Заполнение массивов

fill(a,n); fill(b,n); fill(c,n);

//Вывод неотсортированных массивов на экран

print(a,n); print(b,n); print(c,n);

cout<<endl<<endl;

//Вызов функции сортировки массива

sort(a,n); sort(b,n); sort(c,n);

//Вывод отсортированных массивов на экран

print(a,n); print(b,n); print(c,n);

//Задержка

getch();

}

Тестовый пример:

Number of elements (from 1 to 100) >10

2 8.4 8.9 7.4 9.7 8.7 9.4 2.7 5.8 4.3

197 836 885 736 966 867 943 266 577 431

э &bsol; Ќ А Ю { З z й W

2 2.7 4.3 5.8 7.4 8.4 8.7 8.9 9.4 9.7

197 266 431 577 736 836 867 885 943 966

Ќ А З Ю й э W &bsol; z {

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

Тема: Файловый ввод – вывод в С++

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

Разработать программу, выполняющую следующие функции:

· поэкранный вывод текстового файла

· преобразование текстового файла в двоичный файл

· вывод двоичного файла

· выполнение дополнительной операции с двоичным файлом

Для работы с файлами использовать библиотеку классов потокового ввода – вывода fstream.h.Текстовый файл создать с помощью любого текстового редактора, записав в каждую строку файла информацию об одном экземпляре объекта. Варианты заданий приведены в табл.11

Таблица 11

Варианты заданий

Объект

Дополнительная операция с двоичным файлом

1

ФИО, номер подразделения, зарплата

Добавление информации о работнике в конец файла

2

Табельный номер, ФИО, номер подразделения

Удаление записи о работнике с заданным табельным номером

3

Наименование товара, цена, количество

Поиск товара с заданным наименованием

4

Телефон, ФИО, адрес

Изменение информации о владельце данного телефона

5

Шифр студента, ФИО, группа

Подсчет количества студентов в заданной группе

6

Шифр студента, ФИО, средний балл

Удаление записей о студентах, со средним баллом<3

7

Табельный номер, ФИО, кафедра

Изменение кафедры у работника с заданным табельным номером

8

Наименование товара, цена, количество

Добавление информации о товаре в конец файла

9

Шифр студента, год поступления. специальность

Запись информации о студентах с заданной специальностью в новый файл

10

Шифр студента, четыре оценки

Формирование нового файла, каждая запись которого содержит шифр студента и средний балл

11

ФИО, год рождения, пол

Копирование файла в другой файл

12

Номер заказа, ФИО и телефон заказчика

Поиск номеров заказа данного заказчика

13

Шифр группы, средний балл

Поиск лучшей группы

14

Номер заказа, цена заказа, заказчик

Добавление нового заказа

15

Автор, название и год издания книги

Удаление книги с заданным названием и заданного автора

16

Номер задания, имя задания, количество страниц

Формирование нового файла, из заданий с числом страниц, большим заданного

17

Код работника, профессия, опыт работы

Изменение опыта работы у работника с заданным кодом на новое значение

18

Код детали, наименование детали

Добавление новой детали

19

Табельный номер, должность, подразделение

Подсчет работников из заданного подразделения

20

Авторы, название, специальность для учебного пособия

Копирование файла в другой файл

Методические указания

В С++ для работы с файлами определены три класса потоков:

ifstream Файловый поток ввода (чтения) данных из файла
ofstream Файловый поток вывода (записи) данных в файл
fstream Файловый поток ввода и вывода данных

Объявления этих классов находятся в заголовочном файле <fstream.h>.

Основные компонентные функции классов-потоков приведены в табл. 12.

Таблица 12

Компонентные функции классов-потоков

Функция

Описание функции

void open(«Внешнее имя файла»[, режим])

Открывает файл

ostream& write(const signed char*, int n)

Выводит в выходной поток n символов из массива, на который указывает первый параметр

istream& read (const signed char*, int n)

Читает из входного потока n символов в массив, на который указывает первый параметр

int eof(void)

Тестирует конец файла (1- конец файла)

void close(void)

Закрывает поток (файл)

ostream& seekp (смещение, точка отсчета)

Смещает указатель записи выходного потока на заданное число байтов от точки отсчета (0-начало, 1-текщая позиция, 2-конец потока)

istream& seekg (смещение, точка отсчета)

Смещает указатель записи входного потока на заданное число байтов от точки отсчета (0-начало, 1-текщая позиция, 2-конец потока)

long tellg()

Возвращает текущую позицию указателя чтения входного потока

long tellp()

Возвращает текущую позицию указателя записи выходного потока

Значения параметра «режим» функции открытия файла приведены в табл. 13.

Таблица 13

Режимы открытия файла

Значение параметра «режим»

Описание параметра

ios::in

Задает режим открытия файла для ввода

ios::out

Задает режим открытия файла для вывода

ios::ate

Задает режим открытия файла для добавления в конец файла

ios::app

Задает режим открытия файла для добавления в конец файла

ios::trunc

Удаляет содержимое файла

ios::binary

Задает режим открытия файла в двоичном режиме

Для обмена данными с двоичными файлами используются компонентные функции read и write, а для работы с текстовыми файлами - перегруженные операции >> и <<. На рис. 18 приведена программа, которая создает текстовый файл и записывает в него данные. Пример программы чтения записи с заданным номером из двоичного файла приведен на рис. 19.

#include <conio.h>

#include <fstream.h>

#include <stdlib.h>

struct rab

{

long nom;

char fam[15];

char name[15];

int zar;

int nal;

};

void main(void)

{

rab r;

ofstream f; // выходной поток

char name[12]; // имя файла

cout<<"Введите имя файла";

cin>>name;

f.open(name); //открытие файла для записи

if(!f) //проверка выполнения операции открытия

{ cout<<"Ошибка"; getch(); exit(1); }

for(int i=1;i<=10;i++) //цикл ввода данных и записи в файл

{cout<<"? "; cin>>r.nom>>r.fam>>r.name>>r.zar>>r.nal;

f<<r.nom<<" "<<r.fam<<" "<<r.name<<" "<<r.zar<<" "<<r.nal <<endl;}

f.close();

}

Рис. 18. Создание текстового файла

#include <iostream.h>

#include <fstream.h>

#include <stdlib.h>

struct rab

{

long nom;

char fam[15];

char name[15];

int zar;

int nal;

};

void main(void)

{

rab r;

int n;

ifstream f; //входной поток

f.open("d:&bsol;user&bsol;b.dat",ios::binary| ios::in);

if(!f)

{ cout<<"Ошибка"; getch(); exit(1);}