Задача с книги Павловской, на тему Функции и Файлы (вариант 9)

О задаче:

По книге:C/C++ Программирование на языке высокого уровня: Учебник для вузов 
Автор книги: Павловская Татьяна Александровна
Задача на тему: Функции и Файлы — (на странице 151)
Вариант задачи: 9 — (на странице 154)’ style=’default’ collapse_link=’true’]

Условия задачи:
[свернуть]

Для хранения данных о планшетных сканерах описать структуру вида: 


struct scan_info {
char model[25]: // наименование подели
int price; // цена
double x_size; // горизонтальный размер области сканирования
double y_size; // вертикальный размер области сканирования
int optr; // оптическое разрешение
int grey: // число градаций серого
};

Написать функцию, которая запрашивает количество сканеров, информация о которых будет вводиться , динамически выделяет память под массив структур соответствующего размера и заполняет его данными в режиме диалога ( с клавиатуры ). При этом имя сканера может содержать пробелы. Написать функцию, которая записывает данный массив в создаваемый бинарный файл. Если цена сканера меньше 200, то данные об этом сканере в файл не записываются. Информация об остальных сканерах помещается в бинарный файл, причем сначала пишутся данные обо всех сканерах, имя которых начинается с заглавной буквы, а затем – с прописной. Структура файла: в первых четырех байтах размещается значение типа long, определяющее количество сделанных в файл записей; далее без пропусков размещаются записи о сканерах. Привести пример программы, создающей файл с данными о сканерах и осуществляющий вывод на дисплей данных о требуемой записи (либо всех, либо по номеру). Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается . 
‘ style=’default’ collapse_link=’true’]

Листинг(исходник) программы:
[свернуть]

Function.h
[свернуть]
scan_info *How_struct_add(int *Num);
void Write_in_bin_file(scan_info *SCANERS, const int Num);
void Output_on_display(scan_info *SCANERS, const int Num);

‘ style=’default’ collapse_link=’true’]

Struct.cpp
[свернуть]
#pragma once
struct scan_info
{
char model[25];
int price;
double x_size;
double y_size;
int optr;
int grey;
};

‘ style=’default’ collapse_link=’true’]

main.cpp
[свернуть]
#include <iostream>
#include <locale>
#include "Struct.cpp"
#include "Function.h"
using namespace std;
int main()
{
setlocale(LC_ALL,"Rus");
int Num; 
scan_info *pSCANERS = How_struct_add(&Num);
Write_in_bin_file( pSCANERS, Num );
Output_on_display( pSCANERS, Num);
delete [] pSCANERS;
system("pause");
return 0;
}

‘ style=’default’ collapse_link=’true’]

Func_Files.cpp
[свернуть]
#pragma once
#include <fstream>
#include <iostream>
#include <locale>
#include "Struct.cpp"
using namespace std;
scan_info *How_struct_add(int *Num)
{
///////////////////Запрос на число добавления скольки структур необходимо сделать/////////////////////////
int bufNum;
do
{ 
system("cls"); cout << "Введите кол-во структур для добавления. P.S. Вводить только положительное число отличное от нуля! : ";
cin>>bufNum; 
}
while(Num <= 0);
scan_info *SCANERS = new scan_info [bufNum]; // Создание динамического массива структур количества Num
*Num = bufNum; // Присваивание значение через указатель
for( int i = 0; i < bufNum; i++ ) 
{ 
cout<<" Введите наименование модели: "; cin.get(); cin.getline(SCANERS[i].model,25,\'\\n\');
cout<<"\\n Введите цену: "; cin>>SCANERS[i].price;
cout<<"\\n Введите горизонтальный размер области сканирования: "; cin>>SCANERS[i].x_size;
cout<<"\\n Введите вертикальный размер области сканирования: "; cin>>SCANERS[i].y_size;
cout<<"\\n Введите оптическое разрешение: "; cin>>SCANERS[i].optr;
cout<<"\\n Введите число градаций серого: "; cin>>SCANERS[i].grey;
system("cls");
}
return SCANERS;
}
void Write_in_bin_file(scan_info *SCANERS, const int Num)
{
ofstream fout("OutFile.bin", ios_base::binary); // Связываем поток ввода с файлом
for( int i=0, k=0; i < 2; i++)
{
if(!i)
{
for(int j=0; j < Num; j++)
{
if (SCANERS[j].model[0] > 64 && SCANERS[j].model[0] < 91 && SCANERS[j].price > 200)
{
k++; 
fout.seekp(0,ios_base::beg);
fout.write((char *)&k,sizeof(j));
fout.seekp(0,ios::end);
fout.write((char *)&SCANERS[j],sizeof(scan_info));
}
}
}
else
{
for(int j=0; j < Num; j++)
{
if (SCANERS[j].model[0] > 96 && SCANERS[j].model[0] < 123 && SCANERS[j].price > 200)
{
k++; 
fout.seekp(0,ios_base::beg);
fout.write((char *)&k,sizeof(j));
fout.seekp(0,ios::end);
fout.write((char *)&SCANERS[j],sizeof(scan_info));
}
}
}
}
fout.close();
}

void Output_on_display(scan_info *SCANERS, const int Num)
{
int selectNum, NumScan;
cout<<"Введите 1 для вывода всех записей или 2 для вывода записи по её номеру: "; cin>>selectNum; system("cls");
switch(selectNum)
{
case 1:
for(int i=0; i< Num; i++)
cout<<"Наименование модели: "<< SCANERS[i].model 
<<"\\n Цена: "<< SCANERS[i].price 
<<"\\n Горизонтальный размер области сканирования: "<< SCANERS[i].x_size
<<"\\n Вертикальный размер области сканирования: "<< SCANERS[i].y_size
<<"\\n Оптическое разрешение: "<< SCANERS[i].optr
<<"\\n Число градаций серого: "<< SCANERS[i].grey<<endl<<endl;
break;
case 2: 
cout<<"Введите номер записи сканера, от 1 до "<<Num<<": "; cin>>NumScan;
if(NumScan-1 < Num && NumScan-1 > -1)
{
NumScan -= 1;
cout<<"\\n Наименование модели: "<< SCANERS[NumScan].model 
<<"\\n Цена: "<< SCANERS[NumScan].price 
<<"\\n Горизонтальный размер области сканирования: "<< SCANERS[NumScan].x_size
<<"\\n Вертикальный размер области сканирования: "<< SCANERS[NumScan].y_size
<<"\\n Оптическое разрешение: "<< SCANERS[NumScan].optr
<<"\\n Число градаций серого: "<< SCANERS[NumScan].grey<<endl<<endl;
}
break;
default:
cout<<"Вы ввели не верное значение!!!\\n";
}
}

[свернуть]

Автор: Павел Кадыров