Сидоров А.О / ос5
.docx
Министерство образования Республики Беларусь
Белорусский Национальный Технический Университет
Факультет информационных технологий и робототехники
Кафедра «Программное обеспечение вычислительной техники
и автоматизированных систем»
Отчёт
по лабораторной работе № 5
по дисциплине «Операционные системы»
тема: «Основы файлового ввода-вывода в
Linux: использование стандартной
библиотеки С++»
Исполнитель: |
|
студент группы 10702112 Сидоров А.О. |
Преподаватель: |
|
Радкевич А.С. |
2013-2014 учебный год
ЛАБОРАТОРНАЯ РАБОТА № 5
Основы файлового ввода-вывода в Linux: использование
стандартной библиотеки С++
Цель работы
Изучить основные функции ввода-вывода стандартной библиотеки языка
программирования С++ и закрепить навыки их применения при написании про-
грамм.
Требования
1) С использованием функций стандартной библиотеки С++ разработать модуль-
ное консольное приложение согласно варианту задания А и В.
2) Для повышения производительности программы использовать функции для
динамического выделения памяти языка программирования С++.
3) Для компиляции, компоновки и выполнения программы использовать ути-
литу make, для чего необходимо дополнительно создать make-файл.
4) Для каждой бригады необходимо выполнить задание А полностью и один ва-
риант задания В.
Индивидуальное задание:
Задание A
Расширить программу, разработанную при выполнении лабораторной работы № 3, функционалом, который бы позволял читать размерность и содержимое матрицы из одного файла, а также выводить конечные результаты в
другой файл. Входной файл должен содержать совокупность строк. Строка
файла содержит строку матрицы. Предусмотреть как ручное создание файла
и его заполнение, так и генерацию файла в автоматическом режиме.
Задание B
В программе необходимо определить структура сущностей согласно варианту
бригады (разрешается придумать свою структуру-сущность, предварительно
согласовав её с преподавателем). Затем объявить два массива данного типа и
инициализировать один из них соответствующими данными (массивы
должны быть созданы динамически). Далее программа должна предоставлять
возможность записывать данные инициализированного массива на диск в одноименный структуре файл, а также возможность считывать данные обратна
в другой массив. В программе дополнительно предусмотреть возможность
для манипуляции списка сущностей соответствующей предметной области (к
примеру, отсортировать список по заданному критерию, осуществить необходимы поиск и т.д.).
Phone: id, Фамилия, Имя, Отчество, Адрес, Номер кредитной карточки, Дебет,Кредит, Время городских и междугородных разговоров.
Ход выполнения лабораторной работы:
-
В текстовом редакторе gedit набрал исходный код решения задания на языке программирования С++ и сохранил исходник. Программа состоит из следующих файлов:
-
function.h – файл заголовка, в котором описаны прототипы функций.
-
function.cc – файл реализации функций;
-
test.cc – файл, в котором описана главная функция программы main;
-
В папке с программой создал make-файл.
-
Запустил терминал Linux и с помощью команды cd перешёл в папку местонахождения исходных кодов программы.
-
Для компиляции программы использовал утилиту make и созданный make-файл.
Результаты выполнения лабораторной работы:
Рисунок 1 — Использование утилиты make
Рисунок 2 — Выполнение программы
Что я освоил в процессе выполнения лабораторной работы:
-
Научился использовать функции для динамического выделения памяти языка программирования С++, такие как:
new выделяет память для хранения значения типа тип_переменной и возвращает ее адрес.
-
Изучил основные функции ввода-вывода стандартной библиотеки языка программирования С++, такие как:
ifstream связывает ввод программы с файлом;
ofstream связывает вывод программы с файлом;
fstream связывает как ввод, так и вывод программы с файлом.
open открывает файл и связывает поток с открытым файлом
Выводы:
-
Для повышения производительности программы используются функции для динамического выделения памяти.
-
Функциями стандартной библиотеки С++ для ввода-вывода данных являются: 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