- •1. Кроки для створення виконання програми
- •2. Змінні та константи
- •3. Символьні масиви і рядки
- •4. Директиви препроцесора
- •Тема 2: введення-виведення даних план
- •Аргументи для setiosflags і resetiosflags
- •2. Функція printf
- •2. Операції відношення
- •3. Логічні операції
- •4. Додаткові операції
- •5. Порозрядні операції
- •Тема 4: організація циклів план
- •1. Організація циклів за допомогою while і do...While
- •2. Організація циклів із використанням оператора for
- •3. Оператори switch і goto
- •Тема 5: створення функцій план
- •1. Створення функцій
- •2. Видимість змінних
- •3. Передача значень
- •4. Повертаємі значення і прототипи функцій
- •Тема 6: зовнішні пристрої і символьне введення/виведення план
- •1. Загальна концепція
- •2. Функції символьного введення-виведення
- •3. Символьні функції
- •4. Рядкові функції
- •5. Числові функції
- •6. Функції роботи з датою та часом
- •Тема 7: масиви план
- •1. Одномірні масиви, їхня ініціалізація
- •2. Сортування масивів
- •3. Розміщення одномірного масиву в пам’яті
- •4. Багатомірні масиви і їхнє розміщення в пам’яті
- •Тема 8. Вказівки і посилання план
- •1. Вказівки
- •2. Масиви і вказівки
- •Тема 9: робота з файлами план
- •1. Загальна характеристика роботи з файлами
- •2. Послідовні файли
- •Можливі режими доступу
- •3. Файли довільного доступу (із випадковим доступом)
- •Тема 10. Структури план
- •1. Загальна характеристика структури
- •2. Масиви структур
- •3. Використання масивів, як елементів структур
- •2. Робота зі структурами є універсальною, передбачено додавання записів до файлу (флаг ios:app). Для підрахунку кількості структур на диску приведемо наступні рядки програми:
- •Список літератури
2. Робота зі структурами є універсальною, передбачено додавання записів до файлу (флаг ios:app). Для підрахунку кількості структур на диску приведемо наступні рядки програми:
..................................................................................................
pp.seekg(0L,ios::end);
kol_st = pp.tellg()/sizeof(inf_d);
..................................................................................................
Спочатку встановлюється вказівка у кінець файлу, а потім ділимо поточну позицію файлу (функція tellg()) на кількість байтів нашої структури inf_d. Таким чином отримуємо кількість структур на диску (змінна kol_st).
3. Після переведення вказівки на кінець файлу (функція eof()) виникає біт помилки ios::eofbit, що дорівнює 1. Для того щоб продовжити роботу з файлом потоку, необхідно скинути цей біт. Робиться це за допомогою функції clear(), яка скидує всі біти помилок файлового потоку.
Приведемо текст програми роботи зі структурами з використанням інформації по дискам.
//Програма роботи зі структурами
//з використанням диску
# include <iostream.h>
# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
# include <fstream.h>
# include <iomanip.h>
# include <string.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 main ()
{
int nom_menu;
pp.open("Ot.txt",(ios::in)|(ios::out)
|(ios::app));
while(1)
{
clrscr();
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;
clrscr();
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;
clrscr();
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];
clrscr();
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;
clrscr();
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);
for(int i=0;i<strlen(buf);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;
}