КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Приведемо текст програми роботи зі структурами з використанням інформації по дискам.
//Програма роботи зі структурами //з використанням диску
#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().
|