МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САПР
Звіт
до лабораторної роботи №1
на тему:
«Послідовний метод доступу до файлів на зовнішніх запам’ятовуючих пристроях»
Тема: послідовний метод доступу до файлів на зовнішніх запам’ятовуючих пристроях.
Мета: розглянути органiзацiю i ведення файлiв послiдовного доступу; набути практичнi навички у програмуваннi алгоритмiв роботи з файлами послiдовного доступу.
Завдання
Створити програму для підтримки БД на тему «Компютерні ігри», яка реалізує наступні операції:
1.1. Друк бази даних.
1.2. Пошук запису за введеним ключем.
1.3. Видалення запису за введеним ключем.
1.4. Вставлення запису.
1.5. Модифiкацiя запису.
2.Написати програму групового оброблення файла даних, яка реалiзує наступнi функцiї:
2.1. Створення файла повiдомлень.
2.2. Пошук запису за введеним ключем.
2.3. Видалення запису за введеним ключем.
2.4. Вставлення запису.
2.5. Модифiкацiя запису.
2.6. Друк файлу групової обробки.
Теоретичні відомості
Будь-який обмiн даними передбачає присутнiсть джерела iнформацiї, каналу передачi та її приймача. У випадку обмiну даними мiж програмою i периферiйним пристроєм одним кiнцем каналу обмiну даними завжди є оперативна пам’ять ПЕОМ. Другий кiнець цього каналу у бiльшостi мов програмування визначений як файл.
Поняття файла достатньо широке. Це може бути комунiкацiйний порт, пристрiй друку. У данiй роботi розглядається файл даних.
Одним iз головних чинникiв, що впливає на продуктивнiсть програм, якi взаємодiють iз базою даних, є спосiб зберiгання i доступу до файлiв даних: послiдовний, iндексно-послiдовний, індексно-довiльний, прямий, хешування.
Усi методи розглядаються за двома критерiями:
1. Ефективнiсть доступу - величина, обернена середнiй кiлькостi фiзичних звертань, необхiдних для логiчного доступу, тобто запиту конкретного запису бази даних. Фiзичнi звертання забезпечують задоволення запиту. Наприклад, якщо для пошуку потрiбного запису система звертається до двох записiв, то ефективнiсть доступу дорiвнює 0,5.
2. Ефективнiсть зберiгання - величина, обернена середнiй кiлькостi байтiв поля вторинної пам’ятi, яка необхiдна для зберiгання одного байта вхiдних даних.
Крiм вхiдних даних, пам’ять займають таблицi, керуюча iнформацiя, вiльна пам’ять, яка резервується для розширень, i дiлянка, яка не використовується через фрагментацiю
2.1. ДОСТУП ДО ЗАПИСІВ
Записи у простому послiдовному файлi доступнi лише послiдовно один за одним. Наприклад, можна звернутися до n-го запису тiльки пiсля звертання до 1,2,...,n-1 записiв. Для того, щоб видалити запис з файла, необхiдно створити копiю файла, у якiй цей запис є вiдсутнiм; для того, щоб помiстити запис у файл, також необхiдно створити копiю файла, у яку цей новий запис входить. Щоб змiнити хоча б одне з полiв у записi, необхiдно створити копiю файла, який мiститиме модифiкований запис. При послiдовному методi доступу значення ключiв фiзичних записiв знаходяться у логiчнiй послiдовностi.
2.1.1. Ефективнiсть доступу. Нехай вибрано один фiзичний запис, i належить вибрати iнший з бiльшим значенням ключа. У найгiршому випадку для вибору потрiбного запису необхiдно переглянути всi записи бази даних, а у кращому достатньо вибрати наступний запис. Для того, щоб виявити необхiдний запис у послiдовному файлi, який складається з N записiв, необхiдно переглянути у середньому N/2 записiв. Це пояснюється так. Нехай здiйснюється достатньо багато випробовувань, пов’язаних iз пошуком у послiдовному файлi випадково вибраних значень ключа. Причому кожний пошук починається з першого запису файла. Тодi для виявлення шуканого запису потрiбно переглянути у середньому половину загальної кiлькостi записiв.
2.1.2. Ефективнiсть зберiгання. Ефективнiсть використання пам'ятi близька до 100%. Зберiгання фiзичних записiв у логiчнiй послiдовностi можна використовувати для прискорення доступу, якщо перед звертанням до власне записiв бази даних перевiряти значення ключiв.
2.1.3 Алгоритм вставляння запису
<зчитати номер запису, який потрiбно вставити><m>
<зчитати данi><str>
<вiдкрити два файли, файл А - для читання, файл B - для зберiгання модифiкованої iнформацiї>
i:=1
доки не кiнець файла А
якщо m<>i
тодi <зчитати з А, записати в B>
i:=i+1
iнакше <записати у В str>
якщо m>=i
тодi <записати в В str>
<закрити файли А, В>
<змiнити iм'я з В на А>
2.1.4. Алгоритм модифiкацiї записiв
<зчитати номер запису, який потрiбно модифiкувати><m>
<зчитати данi><str>
<вiдкрити два файли, файл А - для читання, файл B - для зберiгання модифiкованої iнформацiї>
i:=1
доки не кiнець файла А
якщо i=m
тодi <зчитати з А><sm>
<записати в B><str>
i:=i+1
iнакше <зчитати з А><sm>
<записати у В>< sm>
<закрити файли А, В>
<змiнити iм'я з В на А>
2.1.5. Алгоритм видалення запису
<зчитати номер запису, який потрiбно видалити><m>
<вiдкрити два файли, файл А - для читання, файл B - для зберiгання
модифiкованої iнформацiї>
i:=1
доки не кiнець файла А
якщо i=m
тодi <зчитати з А><sm>
<записати в B><sm>
2.2. ГРУПОВЕ ОБРОБЛЕННЯ ПОСЛІДОВНИХ ФАЙЛІВ
Якщо необхiдно органiзувати доступ до М записiв послiдовного файла, який складається з N записiв, то звичайно прагнуть не застосовувати методу лiнiйного пошуку. Адже тодi знадобиться застосовувати цей метод М разiв, починаючи кожного разу перегляд файла з першого запису. Всього потрiбно проаналiзувати MN/2 записiв; очевидно, що при великому N на це буде витрачено значний час.
Існує ефективнiший метод перегляду файла: лише один раз. Для того, щоб використати цей метод, необхiдно всi значення шуканих первинних ключiв вставити у новий файл. Цей файл звичайно називають файлом повiдомлень,
а файл, у якому здiйснюється пошук, головним файлом. Головний файл i файл повiдомлень повиннi бути впорядкованi за одним ключем.
Спершу з файла повiдомлень зчитується перше значення первинного ключа i за методом лiнiйного пошуку у головному файлi шукається запис, що йому вiдповiдає. Потiм зчитується друге значення первинного ключа, i пошук у головному файлi продовжується, починаючи з того запису, на якому вiн припинився. Цей процес послiдовно повторюється для всiх значень первинного ключа з файла повiдомлень.
Текст програми:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#define ROWS 0
#define MAXNAME 40
#define MAXPLATFORM 20
#define MAXDEVELOPER 30
#define MAXPUBLISHER 30
#define MAXRELEASEDATE 10
#define MAXGENRE 20
#define MAXHOMEPAGE 20
#define MAXTRANSMITTER 10
#define MAXGRAPHICS 10
char nameOfDatabase[20];
FILE *f;
FILE *fTemp;
struct game {
int ID;
char name[MAXNAME];
char developer[MAXDEVELOPER];
char publisher[MAXPUBLISHER];
char platform[MAXPLATFORM];
char genre[MAXGENRE];
char homepage[MAXHOMEPAGE];
char releaseDate[MAXRELEASEDATE];
int age;
char transmitter[MAXTRANSMITTER];
int gameRate;
char graphics[MAXGRAPHICS];
};
struct gameM2Edit {
int ID;
char name[MAXNAME];
char developer[MAXDEVELOPER];
char publisher[MAXPUBLISHER];
char platform[MAXPLATFORM];
char genre[MAXGENRE];
char homepage[MAXHOMEPAGE];
char releaseDate[MAXRELEASEDATE];
int age;
char transmitter[MAXTRANSMITTER];
int gameRate;
char graphics[MAXGRAPHICS];
int what;
int whatEdit;
};
void addElementInDatabase(struct game addGame);
void deleteElementInDatabase(int);
void edit(int,int,struct game addGame);
void revision();
void search(int,struct game addGame);
int main(void) {
int methodBool=0; //Змінна для перевірки вибору методу.
int back=1; //Змінна для перевірки чи потрібно виводити головне меню.
int method; //method - змінна для збереження вибору методу.
int menuItem,menuExit=7,menuExit2=5; // menuItem - змінна для зберігання вибору пункту головного меню, menuExit - змінна для перевірки виходу з програми.
int menuItemP; //Змінна для зберігання вибору підменю кожного меню.
int yes_no; //Змінна для перевірки вибору меню кожного підменю.
int backGo; //Змінна для перевірки нажато "0" для виходу в гол. меню.
int yes_noGameRate=0; //Змінна для перевірки вибору оцінки гри.
int ID; //ID - елемента, який потрібно видалити або редагувати.
char nameOfFile[20]; //Змінна для збереження назви нової бази даних.
FILE *fileDatabase; //Мітка для файлу ств. бази даних.
struct game workGame;
system("cls");
//***Вибір методу роботи з файлом бази даних.
printf("Choose the method of work with the database:\n\n");
printf("1. Sequential access to the file.\n");
printf("2. Access to the files with the batch-processing of information.\n\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&method);
//**Перевірка вибраний пункт меню чи ні.
do {
if (method==1 || method==2) {
methodBool=1;
}
else {
printf("You have not chosen any menu item. Please enter once again: ");
scanf("%d",&method);
}
} while (methodBool != 1);
//**Кінець - Перевірка вибраний пункт меню чи ні.
//***Кінець - Вибір методу роботи з файлом бази даних.
//***Перший метод.
if (method==1) {
//***Перевірка виходу з програми.
do {
//***Перевірка виводу головного меню.
if (back==1) {
system("cls");
printf(" You chosen a method 1.\n");
printf(" Menu:\n1. Creation a database.\n2. Insert the element in a database (ID).\n3. Delete of element. \n4. Editing is after the key field. \n5. Revision bases given. \n6. Search in the database. \n7. Close a programm.\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItem);
}
//***Кінець - Перевірка виводу головного меню.
//**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ВИБІР ПУНКТУ '1'.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
if (menuItem==1) {
menuItemP=0;
printf("\n Do you want to create a new database? The old database will be deleted.\n");
printf("1. Yes\n2. No\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemP);
//**Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
else {
yes_no=0;
}
//*Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
while (yes_no!=1) {
printf("You have not chosen any menu item. Please enter once again: ");
scanf("%d",&menuItemP);
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
}
//*Кінець - Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
//**Кінець - Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1) { //Потрібно створювати базу даних???
printf("\nEnter name of the file (MAX-20): ");
scanf("%s",&nameOfFile); //Введення назви файлу бази даних.
strcat(nameOfFile,".txt"); //Додавання розширення .txt до імені.
//**Перевірка чи створений файл бази даних чи ні та виведення результату.
if ((fileDatabase=fopen(nameOfFile,"w")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfFile);
}
else {
printf("\nA file is successfully creation. Name of file %s.",nameOfFile);
}
//**Кінець - Перевірка чи створений файл бази даних чи ні та виведення результату.
//*Перевірка чи закритий файл бази даних чи ні та виведення результату.
if (fclose(fileDatabase) != 0) {
printf("\nAn error is at closing of file %s.",nameOfFile);
}
else {
printf("\nA file is successfully closed.");
}
//*Кінець - Перевірка чи закритий файл бази даних чи ні та виведення результату.
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1; //Вивід головного меню дозволений.
}
//**Кінець - Вибір пункту 1.
//**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ВИБІР ПУНКТУ '2'.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
else if (menuItem==2) {
menuItemP=0;
printf("\n Do you want to insert a new element in a database?\n");
printf("1. Yes\n2. No\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemP);
//**Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
else {
yes_no=0;
}
//*Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
while (yes_no!=1) {
printf("You have not chosen any menu item. Please enter once again: ");
scanf("%d",&menuItemP);
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
}
//*Кінець - Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
//**Кінець - Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1) {
printf("\nEnter the name database which you want to open (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
//***Введення даних.
printf("\nEnter next information for a record in a database.");
printf("\n1. Enter ID of the game: ");
scanf("%d",&workGame.ID);
printf("2. Enter platform (MAX-10): ");
scanf("%s",&workGame.platform);
printf("3. Enter name of the game (MAX-40): ");
scanf("%s",&workGame.name);
printf("4. Enter developer (MAX-30): ");
scanf("%s",&workGame.developer);
printf("5. Enter publisher (MAX-30): ");
scanf("%s",&workGame.publisher);
printf("6. Enter release date (MAX-10): ");
scanf("%s",&workGame.releaseDate);
printf("7. Enter genre (MAX-20): ");
scanf("%s",&workGame.genre);
printf("8. Enter homepage (MAX-20): ");
scanf("%s",&workGame.homepage);
printf("9. Enter transmitter (MAX-10): ");
scanf("%s",&workGame.transmitter);
printf("10. Enter graphics (MAX-10): ");
scanf("%s",&workGame.graphics);
printf("11. Enter age (MAX-3): ");
scanf("%d",&workGame.age);
printf("12. Enter game rate (1,2,3,4 or 5): ");
scanf("%d",&workGame.gameRate);
if (workGame.gameRate==1 || workGame.gameRate==2 || workGame.gameRate==3 || workGame.gameRate==4 || workGame.gameRate== 5) {
yes_noGameRate=1;
}
while (yes_noGameRate!=1) {
printf("You have not enter 1, 2, 3, 4 or 5. Please enter once again: ");
scanf("%d",&workGame.gameRate);
if (workGame.gameRate==1 || workGame.gameRate==2 || workGame.gameRate==3 || workGame.gameRate==4 || workGame.gameRate== 5) {
yes_noGameRate=1;
}
}
//***Кінець - Введення даних.
//**Вивід даних.
printf("\n----------------------------------");
printf("\nYour dates:\n");
printf("\nID: %d\nPlatform: %s\nName: %s\nDeveloper: %s\nPublisher: %s\nRelease date: %s\nGenre: %s\nHomepage: %s\nTransmitter: %s\nGraphics: %s\nAge: %d\nGame rate: %d\n",workGame.ID,workGame.platform,workGame.name,workGame.developer,workGame.publisher,workGame.releaseDate,workGame.genre,workGame.homepage,workGame.transmitter,workGame.graphics,workGame.age,workGame.gameRate);
printf("\n----------------------------------\n");
//**Кінець - Вивід даних.
addElementInDatabase(workGame);
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1;
}
//**Кінець - Вибір пункту 2.
//**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ВИБІР ПУНКТУ '3'.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
else if (menuItem==3) {
menuItemP=0;
printf("\n Do you want to delete an element in a database?\n");
printf("1. Yes\n2. No\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemP);
//**Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
else {
yes_no=0;
}
//*Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
while (yes_no!=1) {
printf("You have not chosen any menu item. Please enter once again: ");
scanf("%d",&menuItemP);
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
}
//*Кінець - Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
//**Кінець - Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1) {
printf("\nEnter the name database which you want to open (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
//***Введення даних.
printf("\nEnter ID of element to delete: ");
scanf("%d",&ID);
deleteElementInDatabase(ID);
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1;
}
//**Кінець - Вибір пункту 3.
//**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ВИБІР ПУНКТУ '4'.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
else if (menuItem==4) {
menuItemP=0;
printf("\n Do you want to edit an element in a database?\n");
printf("1. Yes\n2. No\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemP);
//**Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
else {
yes_no=0;
}
//*Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
while (yes_no!=1) {
printf("You have not chosen any menu item. Please enter once again: ");
scanf("%d",&menuItemP);
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
}
//*Кінець - Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
//**Кінець - Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1) {
printf("\nEnter the name database which you want to open (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
//***Введення даних.
printf("\nEnter ID of element to edit: ");
scanf("%d",&ID);
yes_no=0;
int menuItemEdit; //Змінна для збереження вибору меню.
int elemEdit=0; //Який елемент маэ бути відредагований.
while (yes_no!=1) {
system("cls");
printf("\nWhat you want to edit: ");
printf("\n1. Platform\n2. Name\n3. Developer\n4. Publisher\n5. Release date\n6. Genre\n7. Homepage\n8. Transmitter\n9. Graphics\n10. Age\n11. Game rate\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemEdit);
if (menuItemEdit==1) {
printf("Enter platform (MAX-10): ");
scanf("%s",&workGame.platform);
elemEdit=1;
edit(ID,elemEdit,workGame);
}
else if (menuItemEdit==2) {
printf("Enter name (MAX-40): ");
scanf("%s",&workGame.name);
elemEdit=2;
edit(ID,elemEdit,workGame);
}
else if (menuItemEdit==3) {
printf("Enter Developer (MAX-30): ");
scanf("%s",&workGame.developer);
elemEdit=3;
edit(ID,elemEdit,workGame);
}
else if (menuItemEdit==4) {
printf("Enter Publisher (MAX-30): ");
scanf("%s",&workGame.publisher);
elemEdit=4;
edit(ID,elemEdit,workGame);
}
else if (menuItemEdit==5) {
printf("Enter Release date (MAX-10): ");
scanf("%s",&workGame.releaseDate);
elemEdit=5;
edit(ID,elemEdit,workGame);
}
else if (menuItemEdit==6) {
printf("Enter Genre (MAX-20): ");
scanf("%s",&workGame.genre);
elemEdit=6;
edit(ID,elemEdit,workGame);
}
else if (menuItemEdit==7) {
printf("Enter Homepage (MAX-20): ");
scanf("%s",&workGame.homepage);
elemEdit=7;
edit(ID,elemEdit,workGame);
}
else if (menuItemEdit==8) {
printf("Enter Transmitter (MAX-10): ");
scanf("%s",&workGame.transmitter);
elemEdit=8;
edit(ID,elemEdit,workGame);
}
else if (menuItemEdit==9) {
printf("Enter Graphics (MAX-10): ");
scanf("%s",&workGame.graphics);
elemEdit=9;
edit(ID,elemEdit,workGame);
}
else if (menuItemEdit==10) {
printf("Enter Age: ");
scanf("%d",&workGame.age);
elemEdit=10;
edit(ID,elemEdit,workGame);
}
else if (menuItemEdit==11) {
printf("Enter Game Rate: ");
scanf("%d",&workGame.gameRate);
elemEdit=11;
edit(ID,elemEdit,workGame);
}
yes_no=1;
}
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1;
}
//**Кінець - Вибір пункту 4.
//**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ВИБІР ПУНКТУ '5'.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
else if (menuItem==5) {
menuItemP=0;
printf("\n Do you want to revision a database?\n");
printf("1. Yes\n2. No\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemP);
//**Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
else {
yes_no=0;
}
//*Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
while (yes_no!=1) {
printf("You have not chosen any menu item. Please enter once again: ");
scanf("%d",&menuItemP);
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
}
//*Кінець - Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
//**Кінець - Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1) {
printf("\nEnter the name database which you want to open (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
//***Введення даних.
revision();
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1;
}
//**Кінець - Вибір пункту 5.
//**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ВИБІР ПУНКТУ '6'.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
else if (menuItem==6) {
menuItemP=0;
printf("\n Do you want to search in database?\n");
printf("1. Yes\n2. No\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemP);
//**Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
else {
yes_no=0;
}
//*Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
while (yes_no!=1) {
printf("You have not chosen any menu item. Please enter once again: ");
scanf("%d",&menuItemP);
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
}
//*Кінець - Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
//**Кінець - Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1) {
printf("\nEnter the name database which you want to open (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
//***Введення даних.
yes_no=0;
int menuItemSearch; //Змінна для збереження вибору меню.
int elemSearch=0; //Який елемент маэ бути відредагований.
while (yes_no!=1) {
system("cls");
printf("\nWhat you want to edit: ");
printf("\n1. Platform\n2. Name\n3. Developer\n4. Publisher\n5. Release date\n6. Genre\n7. Homepage\n8. Transmitter\n9. Graphics\n10. Age\n11. Game rate\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemSearch);
if (menuItemSearch==1) {
printf("Enter platform (MAX-10): ");
scanf("%s",&workGame.platform);
elemSearch=1;
search(elemSearch,workGame);
yes_no=1;
}
else if (menuItemSearch==2) {
printf("Enter name (MAX-40): ");
scanf("%s",&workGame.name);
elemSearch=2;
search(elemSearch,workGame);
yes_no=1;
}
else if (menuItemSearch==3) {
printf("Enter Developer (MAX-30): ");
scanf("%s",&workGame.developer);
elemSearch=3;
search(elemSearch,workGame);
yes_no=1;
}
else if (menuItemSearch==4) {
printf("Enter Publisher (MAX-30): ");
scanf("%s",&workGame.publisher);
elemSearch=4;
search(elemSearch,workGame);
yes_no=1;
}
else if (menuItemSearch==5) {
printf("Enter Release date (MAX-10): ");
scanf("%s",&workGame.releaseDate);
elemSearch=5;
search(elemSearch,workGame);
yes_no=1;
}
else if (menuItemSearch==6) {
printf("Enter Genre (MAX-20): ");
scanf("%s",&workGame.genre);
elemSearch=6;
search(elemSearch,workGame);
yes_no=1;
}
else if (menuItemSearch==7) {
printf("Enter Homepage (MAX-20): ");
scanf("%s",&workGame.homepage);
elemSearch=7;
search(elemSearch,workGame);
yes_no=1;
}
else if (menuItemSearch==8) {
printf("Enter Transmitter (MAX-10): ");
scanf("%s",&workGame.transmitter);
elemSearch=8;
search(elemSearch,workGame);
yes_no=1;
}
else if (menuItemSearch==9) {
printf("Enter Graphics (MAX-10): ");
scanf("%s",&workGame.graphics);
elemSearch=9;
search(elemSearch,workGame);
yes_no=1;
}
else if (menuItemSearch==10) {
printf("Enter Age: ");
scanf("%d",&workGame.age);
elemSearch=10;
search(elemSearch,workGame);
yes_no=1;
}
else if (menuItemSearch==11) {
printf("Enter Game Rate: ");
scanf("%d",&workGame.gameRate);
elemSearch=11;
search(elemSearch,workGame);
yes_no=1;
}
}
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1;
}
//**Кінець - Вибір пункту 6.
//**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ВИБІР ПУНКТУ '7'.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
else if (menuItem==7) {
printf("Thanks for using a programm. Good bye!!!\n");
}
//**Кінець - Вибір пункту 7.
//**Не вибрано жодного пункту.
else {
printf("You have not chosen any menu item. Please enter once again: ");
scanf("%d",&menuItem);
back=0;
}
//**Кінець - Не вибрано жодного пункту.
} while (menuItem != menuExit);
//***Кінець - Перевірка виходу з програми.
}
//***Кінець - Перший метод.
//??????????????????????????????????????????????????????????????????????????????????????????????
//Другий метод
else if (method==2) {
do {
//***Перевірка виводу головного меню.
if (back==1) {
system("cls");
printf(" You chosen a method 1.\n");
printf(" Menu:\n1. Creat a new database.\n2. Main funcions. \n3. Revision bases given. \n4. Search in the database. \n5. Close a programm.\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItem);
}
//***Кінець - Перевірка виводу головного меню.
//**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ВИБІР ПУНКТУ '1'.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
if (menuItem==1) {
menuItemP=0;
printf("\n Do you want to create a new database? The old database will be deleted.\n");
printf("1. Yes\n2. No\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemP);
//**Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
else {
yes_no=0;
}
//*Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
while (yes_no!=1) {
printf("You have not chosen any menu item. Please enter once again: ");
scanf("%d",&menuItemP);
if (menuItemP==1 || menuItemP==2) {
yes_no=1;
}
}
//*Кінець - Перевірка чи потрібно виконувати цикл, якщо не вибраний пункт підменю.
//**Кінець - Перевірка вибраний пункт підменю головного меню чи ні.
if (menuItemP==1) { //Потрібно створювати базу даних???
printf("\nEnter name of the file (MAX-20): ");
scanf("%s",&nameOfFile); //Введення назви файлу бази даних.
strcat(nameOfFile,".txt"); //Додавання розширення .txt до імені.
//**Перевірка чи створений файл бази даних чи ні та виведення результату.
if ((fileDatabase=fopen(nameOfFile,"w")) == NULL) {
printf("\nAn error is at creation of file. %s.",nameOfFile);
}
else {
printf("\nA file is successfully creation. Name of file %s.",nameOfFile);
}
//**Кінець - Перевірка чи створений файл бази даних чи ні та виведення результату.
//*Перевірка чи закритий файл бази даних чи ні та виведення результату.
if (fclose(fileDatabase) != 0) {
printf("\nAn error is at closing of file %s.",nameOfFile);
}
else {
printf("\nA file is successfully closed.");
}
//*Кінець - Перевірка чи закритий файл бази даних чи ні та виведення результату.
}
//**Повернення в головне меню.
printf("\nEnter '0' for returning in a main menu: ");
scanf("%d",&backGo);
while (backGo!=0) {
printf("You have not enter '0'. Please enter once again: ");
scanf("%d",&backGo);
}
//**Кінець - Повернення в головне меню.
back=1; //Вивід головного меню дозволений.
}
//**Кінець - Вибір пункту 1.
//**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ВИБІР ПУНКТУ '2'.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
else if (menuItem==2) {
menuItemP=0;
char words[250];
int n=0;
FILE *fGr;
printf("\nEnter the name database which you want to open (MAX-20): ");
scanf("%s",&nameOfDatabase); //Введення назви файлу бази даних.
strcat(nameOfDatabase,".txt"); //Додавання розширення .txt до імені.
if ((fileDatabase=fopen(nameOfDatabase,"r+")) == NULL) {
printf("\nAn error is at opening of database. %s.",nameOfDatabase);
}
while(fgets(words,250,fileDatabase) != NULL && words[0] != '\n') {
n++;
}
if (fclose(fileDatabase) != 0) {
printf("\nAn error is at closing of file %s.",nameOfDatabase);
}
if ((f=fopen(nameOfDatabase,"r+")) == NULL) {
printf("\nAn error is at opening of database. %s.",nameOfDatabase);
}
if ((fTemp=fopen("temp.txt","w")) == NULL) {
printf("\nAn error is at opening of database. %s.",nameOfDatabase);
}
if ((fGr=fopen("gr.txt","w")) == NULL) {
printf("\nAn error is at opening of database. %s.",nameOfDatabase);
}
yes_no=0;
int menuItemF; //Змінна для збереження вибору меню.
int nOp=0; //Змінна для збереження операції, яку потрібно зробити(вставка, редагування, видалення)
int yes_noGameRate=0; //Змінна для вибору оцінки гри.
struct gameM2Edit zenGame; //Структура потрібна для сортування структур.
while (yes_no!=1) {
system("cls");
printf("\nWhat you want to do: ");
printf("\n1. Add an element.\n2. Edit an element.\n3. Delete an element.\n4. Start a modification of database.\n5. Back.\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemF);
//***Введення даних.
if (menuItemF==1) {
printf("\nEnter next information for a record in a database.");
printf("\n1. Enter ID of the game: ");
scanf("%d",&zenGame.ID);
printf("2. Enter platform (MAX-10): ");
scanf("%s",&zenGame.platform);
printf("3. Enter name of the game (MAX-40): ");
scanf("%s",&zenGame.name);
printf("4. Enter developer (MAX-30): ");
scanf("%s",&zenGame.developer);
printf("5. Enter publisher (MAX-30): ");
scanf("%s",&zenGame.publisher);
printf("6. Enter release date (MAX-10): ");
scanf("%s",&zenGame.releaseDate);
printf("7. Enter genre (MAX-20): ");
scanf("%s",&zenGame.genre);
printf("8. Enter homepage (MAX-20): ");
scanf("%s",&zenGame.homepage);
printf("9. Enter transmitter (MAX-10): ");
scanf("%s",&zenGame.transmitter);
printf("10. Enter graphics (MAX-10): ");
scanf("%s",&zenGame.graphics);
printf("11. Enter age (MAX-3): ");
scanf("%d",&zenGame.age);
printf("12. Enter game rate (1,2,3,4 or 5): ");
scanf("%d",&zenGame.gameRate);
if (zenGame.gameRate==1 || zenGame.gameRate==2 || zenGame.gameRate==3 || zenGame.gameRate==4 || zenGame.gameRate== 5) {
yes_noGameRate=1;
}
while (yes_noGameRate!=1) {
printf("You have not enter 1, 2, 3, 4 or 5. Please enter once again: ");
scanf("%d",&zenGame.gameRate);
if (zenGame.gameRate==1 || zenGame.gameRate==2 || zenGame.gameRate==3 || zenGame.gameRate==4 || zenGame.gameRate== 5) {
yes_noGameRate=1;
}
}
//***Кінець - Введення даних.
zenGame.what=1; //Зберігання, що потрібно робити зі структурою.
//**Вивід даних.
printf("\n----------------------------------");
printf("\nYour dates:\n");
printf("\nID: %d\nPlatform: %s\nName: %s\nDeveloper: %s\nPublisher: %s\nRelease date: %s\nGenre: %s\nHomepage: %s\nTransmitter: %s\nGraphics: %s\nAge: %d\nGame rate: %d\nDo: %d\n",zenGame.ID,zenGame.platform,zenGame.name,zenGame.developer,zenGame.publisher,zenGame.releaseDate,zenGame.genre,zenGame.homepage,zenGame.transmitter,zenGame.graphics,zenGame.age,zenGame.gameRate,zenGame.what);
printf("\n----------------------------------\n");
//**Кінець - Вивід даних.
nOp++;
fprintf(fGr,"%d %d %s ",zenGame.what, zenGame.ID,zenGame.platform);
fprintf(fGr,"%s %s ",zenGame.name,zenGame.developer);
fprintf(fGr,"%s %s ",zenGame.publisher,zenGame.releaseDate);
fprintf(fGr,"%s %s ",zenGame.genre,zenGame.homepage);
fprintf(fGr,"%s %s ",zenGame.transmitter,zenGame.graphics);
fprintf(fGr,"%d %d\n",zenGame.age,zenGame.gameRate);
}
else if (menuItemF==2) {
printf("\nEnter ID of element to edit: ");
scanf("%d",&zenGame.ID);
zenGame.what=2;
fprintf(fGr,"%d %d ",zenGame.what, zenGame.ID);
yes_no=0;
int menuItemEdit; //Змінна для збереження вибору меню.
int yes_noP=0;
while (yes_noP!=1) {
system("cls");
printf("%d\n",nOp);
printf("\nWhat you want to edit: ");
printf("\n1. Platform\n2. Name\n3. Developer\n4. Publisher\n5. Release date\n6. Genre\n7. Homepage\n8. Transmitter\n9. Graphics\n10. Age\n11. Game rate\n");
printf("Choose and enter one of menu items: ");
scanf("%d",&menuItemEdit);
if (menuItemEdit==1) {
printf("Enter platform (MAX-10): ");
scanf("%s",&zenGame.platform);
zenGame.whatEdit=1;
fprintf(fGr,"%d %s\n",zenGame.whatEdit, zenGame.platform);
yes_noP=1;
}
else if (menuItemEdit==2) {
printf("Enter name (MAX-40): ");
scanf("%s",&zenGame.name);
zenGame.whatEdit=2;
fprintf(fGr,"%d %s\n",zenGame.whatEdit, zenGame.name);
yes_noP=1;
}
else if (menuItemEdit==3) {
printf("Enter Developer (MAX-30): ");
scanf("%s",&zenGame.developer);
zenGame.whatEdit=3;
fprintf(fGr,"%d %s\n",zenGame.whatEdit, zenGame.developer);
yes_noP=1;
}
else if (menuItemEdit==4) {
printf("Enter Publisher (MAX-30): ");
scanf("%s",&zenGame.publisher);
zenGame.whatEdit=4;
fprintf(fGr,"%d %s\n",zenGame.whatEdit, zenGame.publisher);
yes_noP=1;
}
else if (menuItemEdit==5) {
printf("Enter Release date (MAX-10): ");
scanf("%s",&zenGame.releaseDate);
zenGame.whatEdit=5;
fprintf(fGr,"%d %s\n",zenGame.whatEdit, zenGame.releaseDate);
yes_noP=1;
}
else if (menuItemEdit==6) {
printf("Enter Genre (MAX-20): ");
scanf("%s",&zenGame.genre);
zenGame.whatEdit=6;
fprintf(fGr,"%d %s\n",zenGame.whatEdit, zenGame.genre);
yes_noP=1;
}
else if (menuItemEdit==7) {
printf("Enter Homepage (MAX-20): ");
scanf("%s",&zenGame.homepage);
zenGame.whatEdit=7;
fprintf(fGr,"%d %s\n",zenGame.whatEdit, zenGame.homepage);
yes_noP=1;
}
else if (menuItemEdit==8) {
printf("Enter Transmitter (MAX-10): ");
scanf("%s",&zenGame.transmitter);
zenGame.whatEdit=8;
fprintf(fGr,"%d %s\n",zenGame.whatEdit, zenGame.transmitter);
yes_noP=1;
}
else if (menuItemEdit==9) {
printf("Enter Graphics (MAX-10): ");
scanf("%s",&zenGame.graphics);
zenGame.whatEdit=9;
fprintf(fGr,"%d %s\n",zenGame.whatEdit, zenGame.graphics);
yes_noP=1;
}
else if (menuItemEdit==10) {
printf("Enter Age: ");
scanf("%d",&zenGame.age);
zenGame.whatEdit=10;
fprintf(fGr,"%d %d\n",zenGame.whatEdit, zenGame.age);
yes_noP=1;
}
else if (menuItemEdit==11) {
printf("Enter Game Rate: ");
scanf("%d",&zenGame.gameRate);
zenGame.whatEdit=11;
fprintf(fGr,"%d %d\n",zenGame.whatEdit, zenGame.gameRate);
yes_noP=1;
}
}
nOp++;
}
else if (menuItemF==3) {
printf("\nEnter ID of element to delete: ");
scanf("%d",&zenGame.ID);
zenGame.what=3;
fprintf(fGr,"%d %d\n",zenGame.what, zenGame.ID);
nOp++;
}
else if (menuItemF==4) {
int i,j;
struct gameM2Edit allGame[20]; //Масив структур для збереження даних;
if (fclose(fGr) != 0) {
printf("\nAn error is at closing of file gr.txt.");
}
if ((fGr=fopen("gr.txt","r+")) == NULL) {
printf("\nAn error is at opening of database. %s.",nameOfDatabase);
}
printf("\nnOp = %d\n",nOp);
for (i=0; i<nOp; i++) {
char one[40];
char *end;
fscanf(fGr,"%s",&one);
allGame[i].what=strtol(one,&end,10);
fscanf(fGr,"%c");
if (allGame[i].what==1) {
for (j=0;j<12;j++) {
fscanf(fGr,"%s",&one);
if (j==0) {
allGame[i].ID=strtol(one,&end,10);
fscanf(fGr,"%c");
}
else if (j==1) {
strcpy(allGame[i].platform,one);
fscanf(fGr,"%c");
}
else if (j==2) {
strcpy(allGame[i].name,one);
fscanf(fGr,"%c");
}
else if (j==3) {
strcpy(allGame[i].developer,one);
fscanf(fGr,"%c");
}
else if (j==4) {
strcpy(allGame[i].publisher,one);
fscanf(fGr,"%c");
}
else if (j==5) {
strcpy(allGame[i].releaseDate,one);
fscanf(fGr,"%c");
}
else if (j==6) {
strcpy(allGame[i].genre,one);
fscanf(fGr,"%c");
}
else if (j==7) {
strcpy(allGame[i].homepage,one);
fscanf(fGr,"%c");
}
else if (j==8) {
strcpy(allGame[i].transmitter...