ЛР1_ДЗ (1079092), страница 2
Текст из файла (страница 2)
Вопросы для самопроверки.
-
Какие данные содержит узел списка?
-
Как формируется список?
-
Как выполняется поиск данных в списке?
-
Как удалить узел из односвязного линейного списка?
-
Как отсортировать список?
-
Какая информация должна храниться в файле БД?
-
Как в программе выполняется вывод данных из списка в файл?
-
Как в программе выполняется чтение данных из файла в ОП?
-
Как в программе организована «защита от дурака» при работе с меню?
-
Как в программе выполняется ввод-вывод кириллицы?
-
Как реализуется технология создания программы методом «сверху вниз»?
Задание для самостоятельной работы.
Используя приведенный в Приложении 1 текст программы, выполните следующее:
-
Разработайте и протестируйте функции print_dbase и remove в соответствии с описанным выше их назначением.
-
Добавьте в программу функцию формирования упорядоченного по фамилии списка.
Приложение 1.
#include <iostream>
#include <iomanip>
#include <fstream>
#include "c:\\MyLib\\PrintCyr.h"
using namespace std;
#define Man Data
const int l_name = 20;
struct Man {
char name[l_name];
int birth_year;
float pay;
};
struct Node {
Data d;
Node *next;
};
Node* read_dbase(char* filename);
Node* add(Node* beg, const Data &d_el);
int menu();
void print_dbase(Node* beg);
Data* get_data( );
int write_dbase(char* filename, Node* beg);
int edit(Node* beg);
void get_name(char* name);
Node* remove(Node* beg);
Node* find(Node* beg, char* name, Node** prev);
int find(Node* beg, int birth_year);
int find(Node* beg, float pay);
void find_man(Node* beg);
//---------------------------------------- Главная функция
int main(){
char *filename="dbase.txt";
Node* beg = read_dbase(filename);//чтение БД (создание списка сотрудников в ОП)
if (!beg){
cout<<"Ошибка чтения БД"<<endl;
return 1;
}
//print_dbase(beg);
while (true) {
switch (menu())
{
case 1: add(beg, *get_data()); break;
case 2: beg = remove(beg); break;//(=) -> для удаления из начала списка
case 3: find_man(beg); break;
case 4: edit(beg); break;
case 5: print_dbase(beg); break;
case 6: write_dbase(filename,beg); break;
case 7: return 0;
default: cout<<" Недопустимый номер операции"<<endl; break;
}
}
return 0;
}
//----------------------------------------- Добавление сотрудника
Node* add(Node* beg, const Data& d_el) {
Node* pd = new Node; // Формирование нового элемента
pd->d = d_el;
pd->next = 0;
if (beg) { // Список не пуст
Node* temp = beg;
while (temp->next)
temp = temp->next; // Поиск конца списка
temp->next = pd; // Привязывание нового элемента
}
else // Список пуст
beg = pd;
return beg;
}
//----------------------------------------- Корректировка сведений
int edit(Node* beg) {
char name[l_name];
get_name(name); // Кого ищем?
Node* prev;
Node* pd = find(beg, name, &prev);
if (!pd) return 1; // He нашли
cout<<"Введите новый оклад "<<endl;
cin>>pd->d.pay;//следует сделать контроль ввода
return 0;
}
//-----------------------------Поиск сотрудника в списке по фамилии
Node* find(Node* pd, char* name, Node** prev)
{
*prev = 0;//адрес предыдущего узла в списке (возвращается для удаления)
while(pd)
{
if (!strcmp(pd->d.name, name))
{
cout<< pd->d.name<<setw(l_name-strlen(pd->d.name)+5)
<< pd->d.birth_year<< setw(9)<< pd->d.pay<< endl;
return pd;
}
*prev = pd;
pd = pd->next;
}
cout<<"Сотрудника с фамилией "<< name<<" в списке нет."<<endl;
return 0;
}
//------- Поиск и вывод более старших по возрасту сотрудников
int find(Node* pd, int birth_year)
{
int flag=0;
while (pd)
{
if (pd->d.birth_year < birth_year)
{
cout<< pd->d.name<<setw(l_name-strlen(pd->d.name)+5)
<< pd->d.birth_year<< setw(9)<< pd->d.pay<< endl;
flag=1;
}
pd = pd->next;
}
return flag;
}
//-------- Поиск и вывод сотрудников с большим окладом
int find(Node* pd, float pay)
{
int flag=0;
while (pd)
{
if (pd->d.pay >= pay)
{
cout<< pd->d.name<<setw(l_name-strlen(pd->d.name)+5)
<< pd->d.birth_year<< setw(9)<< pd->d.pay<< endl;
flag=1;
}
pd = pd->next;
}
return flag;
}
//------------------------------------- Поиск
void find_man(Node* beg)
{
char buf[l_name];
int birth_year, option;
float pay;
bool flag;
while(true)
{
do
{
flag = false;
cout<<"\n----------------- ПОИСК -----------------\n";
cout<<"1 - поиск по фамилии 2 - по году рождения\n"
<<"3 - по окладу 4 - конец поиска\n ";
cin>> buf;//ввод строки, а не int, чтобы избежать ошибки
if(!(option=atoi(buf)))//убедиться, что строка - целое
{
flag = true;
cout<<"Для выбора операции введите число от 1 до 4"
<< endl;
}
}while(flag);
switch (option)
{
case 1: get_name(buf);
Node *prev;
find(beg, buf, &prev);
break;
case 2: cout<<"Введите год рождения"<< endl;
cin>> birth_year;
if(!find(beg, birth_year))
cout<< "В списке нет сотрудников, родившихся до "
<<birth_year<<" года"<< endl;
break;
case 3: cout<<"Введите оклад"<< endl;
cin>> pay;
if(!find(beg, pay))
cout<< "В списке нет сотрудников с окладом, большим "
<< pay<< endl;
break;
case 4: return;
default:
cout<<"Неверный номер операции"<< endl;
}
cin.clear();//очистка буфера потока от неконтролируемого ввода в switch
}
}
//------------------------------- Запрос фамилии
void get_name(char* name)
{
cout<<"Введите фамилию"<<endl;
cin>>name;
}
//------------------------------- Вывод меню
int menu( )
{
int option;
char buf[l_name];
bool flag;
do {
flag = false;
cout<<" ============== ГЛАВНОЕ МЕНЮ ============================ "<<endl;
cout<<"l - добавление сотрудника\t 4 - корректировка сведений"<<endl;
cout<<"2 - удаление coтpyдникa\t\t 5 - вывод базы на экран"<<endl;
cout<<"3 - поиск сотрудника\t\t 6 - вывод базы в файл"<<endl;
cout<<"\t\t\t 7 - выход"<<endl;
cin>>buf;
if(!(option=atoi(buf)))
{
flag=true;
cout<<"Для выбора операции введите цифру от 1 до 7"<< endl;
}
}while(flag);
return option;
}
//------------------------------ Вывод базы на экран
void print_dbase(Node* beg)
{
cout<<”Печать БД”<<endl;
}
// ------------------------------------ Чтение базы из файла
Node* read_dbase(char* filename)
{
Data d_el;
Node *beg=0;
ifstream fin(filename,ios::in);
if (!fin)
{
cout<<"Heт файла "<< filename <<endl;
return 0;
}
char buf[80];
while (fin.getline(buf,80))
{
strcpy(d_el.name,strtok( buf, " " ));
d_el.birth_year = atoi(strtok(NULL," "));
d_el.pay = atof(strtok(NULL," "));
beg = add(beg, d_el);
}
fin.close();
return beg;
}
//------------------------ Ввод информации о новом сотруднике
Data* get_data() {
Data *d_el;
d_el=new Data;
char buf[80];
cout<<"Введите следующие данные о сотруднике:"<<endl;
cout<<"фамилия <Enter>"<<endl;
cin>>buf; //т.к. операция >> перегружена для ввода кирилицы только для char*
strcpy(d_el->name,buf);
cout<<"год_рождения <Enter>"<<endl;
cin>>buf;
d_el->birth_year = atoi(buf);
cout<<"оклад <Enter>"<<endl;
cin>>buf;
d_el->pay = atof(buf);
return d_el;
}
//------------------------------------- Удаление сотрудника
Node* remove(Node* beg) {
cout<<”Удаление сотрудника из БД”<<endl;
return beg;
}
//------------------------------------ Вывод базы в файл
int write_dbase(char *filename, Node *beg)
{
ofstream fout(filename,ios::out);
if (!fout)
{
cout<<"Ошибка открытия файла"<<endl;
return 1;
}
Node* pd = beg;
while (pd)
{
fout<< pd->d.name<<' '<< pd->d.birth_year<<' '<< pd->d.pay<<endl;
pd = pd->next;
}
fout.close();
return 0;
}