Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Приведемо текст програми роботи зі структурами з використанням інформації по дискам.




 

//Програма роботи зі структурами

//з використанням диску

 

#include <iostream>

#include <fstream>

#include <iomanip>

using namespace std;

 

#include <conio.h>

 

#include <windows.h>

 

fstream pp;

 

struct inf_d //Визначення структури

{

long int ob; //число оборотів

int vr; //час доступу до диску

long int kod;//код виробу

double cena; //ціна виробу

char firma[20]; //назва фірми

};

 

int menu(void); //Оголошення функцій: меню,

void v_dan(void); //перегляду,

void readst(int nom = 0); //читання структури

int vib_struct(void); // вибір елемента структури

// переведення символів із кодировки Windows у кодировку DOS

char* recode(char *TXT);

// перевірка символів на числа

bool IsNumeric(char *str, bool dr);

 

//Функція очищення екрану

void cls()

{

system("cls");

}

 

//Функція переходу у точку з координатами X,Y для виведення даних

void GotoXY(int X, int Y)

{

COORD coord = { X, Y };

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);

}

 

// Головна функція програми

void main ()

{

 

int nom_menu;

pp.open("Ot.txt",(ios::in)|(ios::out)

|(ios::app)|(ios::binary));

 

while(1)

{

cls();

nom_menu = menu();

if (nom_menu == 1) v_dan();

if (nom_menu == 2) readst();

if (nom_menu == 3) readst(vib_struct());

if (nom_menu == 4) break;

}

 

pp.close(); //Закриття файла

}

//**************МЕНЮ*********************

 

//Визначення функції меню

int menu()

{

char s[50];

int nom_menu;

long kol_st;

pp.seekg(0L,ios::end);

kol_st = pp.tellg()/sizeof(inf_d);

 

while(1)

{

nom_menu = 0;

 

cls();

GotoXY(27,4);

cout<<recode("Всего структур ")<<kol_st;

GotoXY(20,6);

cout<< "====================================";

GotoXY(20,7);

cout<<recode("| 1 - Ввод данных по дисководу |");

GotoXY(20,8);

cout<<recode("| 2 - Отображение всех данных |");

GotoXY(20,9);

cout<<recode("| 3 - Просмотр заданной структуры |");

GotoXY(20,10);

cout<<recode("| 4 - Выход |");

GotoXY(20,11);

cout<< "====================================\n";

 

 

GotoXY(27,13);

cout << recode("Введите пункт меню ");

gets(s);

 

if (IsNumeric(s, 0))nom_menu = atoi(s);

if ((nom_menu < 1 )||(nom_menu > 4))

{

GotoXY(18,18);

cout<< "----------------------------------------";

GotoXY(18,19);

cout<<recode("| Ошибка! Пункт меню должен быть 1 - 4 |");

GotoXY(18,20);

cout<<recode("| Нажмите любую клавишу |");

GotoXY(18,21);

cout<< "----------------------------------------";

getch();

GotoXY (44,13);

cout << " ";

continue;

}

return nom_menu;

}

}

// Функція вибору номера структури

int vib_struct()

{

char s[50];

int nom_st;

long kol_st;

pp.seekg(0L,ios::end);

kol_st = pp.tellg()/sizeof(inf_d);

 

if(!kol_st)return 0;

 

while(1)

{

nom_st = 0;

cls();

 

GotoXY(1,2);

cout<<recode("Введите номер структуры -> ");

gets(s);

if(IsNumeric(s, 0))nom_st=atoi(s);

if(nom_st<1) continue;

if(nom_st<=kol_st)break;

 

GotoXY(18,10);

cout<< "------------------------------------------";

GotoXY(18,11);

cout<<recode("| Внимание!!! |");

 

GotoXY(18,12);

cout<< recode("| В файле нет")<<setw(3)<<nom_st;

cout<<recode("-й структуры |");

 

GotoXY(18,13);

cout<< recode("| Файл содержит только")<<setw(3)<<kol_st;

cout<<recode(" структур(ы) |");

 

GotoXY(18,14);

cout<<recode("| Нажмите любую клавишу |");

GotoXY(18,15);

cout<< "------------------------------------------";

 

getch();

}

 

return nom_st;

}

 

//*****************ВВЕДЕННЯ**********************

 

// Визначення функції введення даних

void v_dan()

{

 

inf_d dis;

int i;

char s[50];

cls();

 

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

while(1)

{

GotoXY(1,2+2*i);

if(i==0)cout<<recode("Введите число оборотов диска ->");

if(i==1)cout<<recode("Введите время доступа к диску ->");

if(i==2)cout<<recode("Введите код товара ->");

if(i==3)cout<<recode("Введите цену дисковода ->");

 

GotoXY(35,2+2*i);

gets(s);

if(IsNumeric(s,(i==3)?1:0))

{

if(i==0)dis.ob=atoi(s);

if(i==1)dis.vr=atoi(s);

if(i==2)dis.kod=atoi(s);

if(i==3)dis.cena=atof(s);

break;

}

 

GotoXY(35,2+2*i);

cout<<" ";

}

 

GotoXY(1,10);

cout << recode("Введите название фирмы ->");

 

GotoXY(35,10);

gets(dis.firma);

 

//переведення курсору на кінець файла

pp.seekg(0L,ios::end);

pp.write((char*)&dis,sizeof(dis));//Запис на диск

}

 

//****************ЧИТАННЯ*********************

//Функція читання даних з диску

void readst(int nom_st)

{

inf_d od;

long kol_st, ch_b = 0;

cls();

 

pp.seekg(ch_b,ios::end);

 

kol_st = pp.tellg()/sizeof(inf_d);

 

if(!kol_st)

{

GotoXY(18,10);

cout<< "-----------------------------------------";

GotoXY(18,11);

cout<<recode("| Внимание! В файле нет информации |");

GotoXY(18,12);

cout<<recode("| Для ввода используйте пункт 1 меню |");

GotoXY(18,13);

cout<<recode("| Нажмите любую клавишу |");

GotoXY(18,14);

cout<< "-----------------------------------------";

getch();

return;

}

 

 

if(nom_st > 0)ch_b = sizeof(od)*(nom_st-1);

pp.seekg(ch_b,ios::beg);//Відкриття файла

//Читання файла з диска

 

cout<<recode("\n Данные по дискам:\n");

 

while(1)

{

pp.read((char *)&od, sizeof(od));

// Очистка біту помилки (clear()) та вихід з циклу

if(pp.eof()){pp.clear();break;}

cout<<"\n";

cout<<recode(" обороты-")<<setw(3)<<od.ob;

cout<<recode(" время-")<< setw(5)<<od.vr;

cout<<recode(" код-") << setw(3)<<od.kod;

cout<<recode(" цена-")<< setw(7)<<od.cena;

cout<<recode(" фирма- ")<< od.firma;

if(nom_st)break;

}

getch();

}

 

// Функція переведення кодировки із Windows у DOS

char* recode(char *TXT)

{

 

static char buf[257];

strcpy(buf,TXT);

 

unsigned int i,kol;

kol = strlen(buf);

 

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

{

if (buf[i]>='А'&&buf[i]<='п')buf[i]-=64;

if (buf[i]>='р'&&buf[i]<='я')buf[i]-=16;

}

 

return buf;

}

 

// Функція перевірки символів на числа

// Вхід:

// str - строка символів;

// dr = false (0) - перевірка на ціле число;

// dr = true (1) - перевірка на дробове число;

// Повертання:

// true - перевірка пройшла успішно

// false - введено не числове значення, або число не задовільняє умовам.

 

Bool

IsNumeric(char *str, bool dr)

{

int i;

if (!strlen(str) || str[0] == '.')return false ;

for (i = 0; i < (int)strlen(str); i++ )

{

if (i == 0 && (str[0] == '+' || str[0] == '-')) continue;

if ((str[i] >= '0' && str[i] <='9') ||

str[i]=='.') continue;

return false;

}

int pos = 0;

for (i = 0; i < (int)strlen(str);i++)

if (str[i]=='.')pos++;

if ( (!dr && pos) || (pos > 1)) return false ;

return true;

}

Контрольні питання

 

1. Що таке структура? Опис структури.

2. Наведіть приклади ініціалізації структури.

3. Як записати структуру до файлу?

4. Як зчитати структуру з файлу?

5. Розкрийте сутність вкладених структур.

6. Розкрийте сутність масивів структур.

7. Наведіть приклад запису на диск масиву структур.

8. Наведіть приклад зчитування з диску масиву структур.

9. Розкрийте сутність функції перекодування рядків із Windows у DOS – recode ().

10. Розкрийте сутність функції контролю числових даних IsNumeric().

 


Поделиться:

Дата добавления: 2014-12-30; просмотров: 189; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты