Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
8
Добавлен:
25.02.2016
Размер:
92.69 Кб
Скачать

Министерство образования Республики Беларусь

Белорусский Национальный Технический Университет

Факультет информационных технологий и робототехники

Кафедра «Программное обеспечение вычислительной техники

и автоматизированных систем»

Отчёт

по лабораторной работе № 5

по дисциплине «Операционные системы»

тема: «Основы файлового ввода-вывода в

Linux: использование стандартной

библиотеки С++»

Исполнитель:

студент группы 10702112

Сидоров А.О.

Преподаватель:

Радкевич А.С.

2013-2014 учебный год

ЛАБОРАТОРНАЯ РАБОТА № 5

Основы файлового ввода-вывода в Linux: использование

стандартной библиотеки С++

Цель работы

Изучить основные функции ввода-вывода стандартной библиотеки языка

программирования С++ и закрепить навыки их применения при написании про-

грамм.

Требования

1) С использованием функций стандартной библиотеки С++ разработать модуль-

ное консольное приложение согласно варианту задания А и В.

2) Для повышения производительности программы использовать функции для

динамического выделения памяти языка программирования С++.

3) Для компиляции, компоновки и выполнения программы использовать ути-

литу make, для чего необходимо дополнительно создать make-файл.

4) Для каждой бригады необходимо выполнить задание А полностью и один ва-

риант задания В.

Индивидуальное задание:

Задание A

Расширить программу, разработанную при выполнении лабораторной работы № 3, функционалом, который бы позволял читать размерность и содержимое матрицы из одного файла, а также выводить конечные результаты в

другой файл. Входной файл должен содержать совокупность строк. Строка

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

и его заполнение, так и генерацию файла в автоматическом режиме.

Задание B

В программе необходимо определить структура сущностей согласно варианту

бригады (разрешается придумать свою структуру-сущность, предварительно

согласовав её с преподавателем). Затем объявить два массива данного типа и

инициализировать один из них соответствующими данными (массивы

должны быть созданы динамически). Далее программа должна предоставлять

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

в другой массив. В программе дополнительно предусмотреть возможность

для манипуляции списка сущностей соответствующей предметной области (к

примеру, отсортировать список по заданному критерию, осуществить необходимы поиск и т.д.).

Phone: id, Фамилия, Имя, Отчество, Адрес, Номер кредитной карточки, Дебет,Кредит, Время городских и междугородных разговоров.

Ход выполнения лабораторной работы:

  1. В текстовом редакторе gedit набрал исходный код решения задания на языке программирования С++ и сохранил исходник. Программа состоит из следующих файлов:

    • function.h файл заголовка, в котором описаны прототипы функций.

    • function.cc файл реализации функций;

    • test.cc файл, в котором описана главная функция программы main;

  1. В папке с программой создал make-файл.

  2. Запустил терминал Linux и с помощью команды cd перешёл в папку местонахождения исходных кодов программы.

  3. Для компиляции программы использовал утилиту make и созданный make-файл.

Результаты выполнения лабораторной работы:

Рисунок 1 — Использование утилиты make

Рисунок 2 — Выполнение программы

Что я освоил в процессе выполнения лабораторной работы:

  1. Научился использовать функции для динамического выделения памяти языка программирования С++, такие как:

new выделяет память для хранения значения типа тип_переменной и возвращает ее адрес.

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

ifstream связывает ввод программы с файлом;

ofstream связывает вывод программы с файлом;

fstream связывает как ввод, так и вывод программы с файлом.

open открывает файл и связывает поток с открытым файлом

Выводы:

  1. Для повышения производительности программы используются функции для динамического выделения памяти.

  2. Функциями стандартной библиотеки С++ для ввода-вывода данных являются: ifstream, ofstream, fstream.

ПРИЛОЖЕНИЕ A

Листинг исходного кода программы

Файл functions.h

#ifndef function_H

#define function_H

int polz(int **a,int N,int M);

void print(int **a, int n, int m);

int generator(int **a,int N,int M);

bool LocalMinimum(int **a, int x, int y, int maxX, int maxY);

void find(int **a, int maxX, int maxY);

void file(int **p,int N,int M);

#endif

Файл functions.cc

#include <stdio.h>

#include <iostream>

#include <stdlib.h>

#include "function.h"

using namespace std;

void file(int **p,int N,int M)

{

FILE *out;

if ((out = fopen("file.out", "w"))==NULL) {

printf("He удается открыть файл.\n");

exit(1);

}

fprintf(out,"%d %d\n",N,M);

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

{

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

{

fprintf(out,"%d ",p[i][j]);

}

fprintf(out,"\n");

}

fclose(out);

}

int polz(int **a,int N,int M)

{

int i,j;

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

for (j=0; j<M; j++)

{

cin>>a[i][j];

}

return 0;

}

void print(int **a, int n, int m)

{

int i, j;

cout << "Матрица:" << endl;

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

{

for(j = 0; j < m; j++)

cout << a[i][j] << " ";

cout << endl;

}

}

int generator(int **a,int N,int M)

{

int i,j,m;

srand(time(NULL));

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

for (j=0; j<M; j++){

m = 0 + rand() % 100;

a[i][j]=m;

}

return 0;

}

bool LocalMinimum(int **a, int x, int y, int maxX, int maxY)

{

int i,j,l=0,value=a[x][y];

if (x==0||y==0||x==maxX-1||y==maxY-1) {return false;}

for (i=x-1; i<x+2; i++)

for (j=y-1; j<y+2; j++)

if (value>=a[i][j]){l++;}

l--;

if (l>0) {return false;} else return true;

}

void find(int **a, int maxX, int maxY)

{

int count=0,o[maxX*maxY],i=0,max=0;

for(int x=0;x<maxX;x++)

for(int y=0;y<maxY;y++)

if(LocalMinimum(a, x, y, maxX, maxY))

{

o[i]=a[x][y];

i++;

cout<<"Локальный минимум "<<a[x][y]<<" -> ("<<x+1<<","<<y+1<<")"<<endl;

count++;

}

cout<<"Количество локальных минимумов "<<count<<endl;

count++;

if (i>1){

if (max<o[0]){max=o[0];}

for (int j=0;j<i-1;j++)

if (max<o[j+1])

max=o[j+1];

cout<<"Максимум из локальных минимумов "<<max<<endl<<endl;}

else if (i==1){

cout<<"Максимум из локальных минимумов "<<o[0]<<endl;}

else cout<<"Максимум из локальных минимумов 0"<<endl<<endl;

}

Файл test.cc

#include <stdio.h>

#include <iostream>

#include <stdlib.h>

#include <fstream>

#include "function.h"

using namespace std;

int main()

{

int i,M,N,**g,**p,**k;

char ch;

FILE *in;

cout<<"1-Инициализировать матрицу с помощью генератора случайных чисел"<<"\n";

cout<<"2-Инициализировать матрицу с помощью пользовательского ввода"<<"\n";

cout<<"3-Заполнить матрицу из файла"<<"\n";

cout<<"0-Выход"<<"\n";

cout<<"Ваш выбор: "<<"\n";

do {

ch = getchar();

switch(ch)

{

case '1' :

cout<<"Введите размер матрицы"<<"\n";

cout<<"Количество строк:";

cin>>N;

cout<<"Количество столбцов:";

cin>>M;

cout<<endl;

g=new int *[N];

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

g[i]=new int [M];

generator(g,N,M);

print(g,N,M);

find(g, N, M);

file(g,N,M);

delete g;

break;

case '2' :

cout<<"Введите размер матрицы"<<"\n";

cout<<"Количество строк:";

cin>>N;

cout<<"Количество столбцов:";

cin>>M;

cout<<endl;

p=new int *[N];

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

p[i]=new int [M];

polz(p,N,M);

print(p,N,M);

find(p, N, M) ;

file(p,N,M);

delete p;

break;

case '3' :

ifstream out;

out.open("file.out");

out>>N;

out>>M;

k=new int *[N];

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

k[i]=new int [M];

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

{

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

{

out>>k[i][j];

}

}

print(k,N,M);

find(k,N,M);

out.close();

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

delete [] k[i];

delete [] k; }

}

while(ch!='0');

return 0;

}

Файл Makefile

test: test.o function.o

g++ test.o function.o -o test

test.o: test.cc function.h

g++ -c test.cc

function.o: function.cc function.h

g++ -c function.cc

ПРИЛОЖЕНИЕ B

Листинг исходного кода программы

Файл functions.h

#ifndef function_H

#define function_H

struct Phone

{int id,nomer,kredit,vremmeg,vremgor,debet;

char im[15],fam[15],otch[15],adress[30];};

void file(Phone *obj);

void file1(Phone *obj);

void zap(Phone *obj);

void sort(Phone *obj,Phone p);

void poisk(Phone *obj);

void vivod();

#endif

Файл functions.cc

#include <stdio.h>

#include <iostream>

#include <stdlib.h>

#include <fstream>

#include "function.h"

using namespace std;

void file(Phone *obj)

{

ofstream out;

out.open("Phone.out");

for(int i=0;i<3;i++){

out<<obj[i].id<<" ";

out<<obj[i].nomer<<" ";

out<<obj[i].kredit<<" ";

out<<obj[i].vremmeg<<" ";

out<<obj[i].vremgor<<" ";

out<<obj[i].debet<<" ";

out<<obj[i].im<<" ";

out<<obj[i].fam<<" ";

out<<obj[i].otch<<endl;

out<<obj[i].adress<<endl;

}

out.close();

}

void file1(Phone *obj)

{

ifstream in;

in.open("Phone.out");

for(int i=0;i<3;i++){

in>>obj[i].id;

in>>obj[i].nomer;

in>>obj[i].kredit;

in>>obj[i].vremmeg;

in>>obj[i].vremgor;

in>>obj[i].debet;

in>>obj[i].im;

in>>obj[i].fam;

in.getline(obj[i].otch,15,'\n');

in.getline(obj[i].adress,30,'\n');}

in.close();

for(int i=0;i<3;i++){

cout<<"id: "<<obj[i].id<<endl;

cout<<"Номер кредитной карточки: "<<obj[i].nomer<<endl;

cout<<"Кредит: "<<obj[i].kredit<<endl;

cout<<"Время междугородных разговоров: "<<obj[i].vremmeg<<endl;

cout<<"Время городских разговоров: "<<obj[i].vremgor<<endl;

cout<<"Дебет: "<<obj[i].debet<<endl;

cout<<"Имя: "<<obj[i].im<<endl;

cout<<"Фамилия: "<<obj[i].fam<<endl;

cout<<"Отчество: "<<obj[i].otch<<endl;

cout<<"Адрес: "<<obj[i].adress<<endl;

}

}

void zap(Phone *obj)

{

for(int i=0;i<3;i++){

cout<<"id: ";cin>>obj[i].id;

cout<<"Номер кредитной карточки: ";cin>>obj[i].nomer;

cout<<"Кредит: ";cin>>obj[i].kredit;

cout<<"Время междугородных разговоров: ";cin>>obj[i].vremmeg;

cout<<"Время городских разговоров: ";cin>>obj[i].vremgor;

cout<<"Дебет: ";cin>>obj[i].debet;

cin.getline(obj[i].im,0);

cout<<"Имя: "; cin.getline(obj[i].im,15);

cout<<"Фамилия: ";cin.getline(obj[i].fam,15);

cout<<"Отчество: ";cin.getline(obj[i].otch,15);

cout<<"Адрес: ";cin.getline(obj[i].adress,30);

}

}

void sort(Phone *obj,Phone p)

{

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

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

{

if (obj[i].id>obj[j].id)

{

p = obj[i];

obj[i] = obj[j];

obj[j] = p;

}

}

}

for(int i=0;i<3;i++){

cout<<"id: "<<obj[i].id<<endl;

cout<<"Номер кредитной карточки: "<<obj[i].nomer<<endl;

cout<<"Кредит: "<<obj[i].kredit<<endl;

cout<<"Время междугородных разговоров: "<<obj[i].vremmeg<<endl;

cout<<"Время городских разговоров: "<<obj[i].vremgor<<endl;

cout<<"Дебет: "<<obj[i].debet<<endl;

cout<<"Имя: "<<obj[i].im<<endl;

cout<<"Фамилия: "<<obj[i].fam<<endl;

cout<<"Отчество: "<<obj[i].otch<<endl;

cout<<"Адрес: "<<obj[i].adress<<endl;

}

}

void poisk(Phone *obj)

{

int k,m=0;

cout<<"Введите нужный id: ";

cin>>k;

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

{

if (obj[i].id==k)

{

cout<<"id: "<<obj[i].id<<endl;

cout<<"Номер кредитной карточки: "<<obj[i].nomer<<endl;

cout<<"Кредит: "<<obj[i].kredit<<endl;

cout<<"Время междугородных разговоров: "<<obj[i].vremmeg<<endl;

cout<<"Время городских разговоров: "<<obj[i].vremgor<<endl;

cout<<"Дебет: "<<obj[i].debet<<endl;

cout<<"Имя: "<<obj[i].im<<endl;

cout<<"Фамилия: "<<obj[i].fam<<endl;

cout<<"Отчество: "<<obj[i].otch<<endl;

cout<<"Адрес: "<<obj[i].adress<<endl;

m++;

}

}

if (m==0){cout<<"Структура не найдена!"<<endl<<endl;}

}

void vivod()

{

cout<<"1-Заполнить 1 масив"<<"\n";

cout<<"2-Записать данные в файл"<<"\n";

cout<<"3-Заполнить 2 массив из файла"<<"\n";

cout<<"4-Отсортировать 2 массив по id"<<"\n";

cout<<"5-Поиск структуры во 2 массиве по id"<<"\n";

cout<<"0-Выход"<<"\n";

cout<<"Ваш выбор: "<<"\n";

}

Файл test.cc

#include <stdio.h>

#include <iostream>

#include <stdlib.h>

#include <fstream>

#include <string.h>

#include "function.h"

using namespace std;

Phone *obj = new Phone[3];

Phone *obj1 = new Phone[3];

Phone p;

int main()

{

char ch;

vivod();

do {

ch = getchar();

switch(ch)

{

case '1' : zap(obj);vivod();break;

case '2' : file(obj);vivod();break;

case '3' : file1(obj1);vivod();break;

case '4': sort(obj1,p);vivod();break;

case '5': poisk(obj1);vivod();break;

}

}

while(ch!='0');

delete [] obj;

delete [] obj1;

return 0;

}

Файл Makefile

test: test.o function.o

g++ test.o function.o -o test

test.o: test.cc function.h

g++ -c test.cc

function.o: function.cc function.h

g++ -c function.cc

Соседние файлы в папке Сидоров А.О