Задание
Для сведения составить программу построения графику изменения зарплаты работников по каждому дню.
Выбор алгоритма решения задачи
Для решения этой задачи надо использовать класс в каком все данные нужно сделать закрытыми (для того чтобы при работе случайно не повредить их) и методы обработки этих данных. Уместным я считаю сделать методы: добавление, удаление одного или всех элементов, вывод графику и списка на экран, а также несколько универсальных функций которые помогут в работе как: функция поиска, заполнение, и индексирование элементов.
Описание алгоритма решения задачи
Основа программы это функция main, поскольку в ней находится меню пользователя из которого можно задействовать любую из функций. Меню всегда находится на экране как в начале работы так и после окончания работы одной из функций, завершение программы происходит при нажатии клавиши Esc.
Удаление всего списка происходит благодаря поочередному переходу с начала до конца списка с одновременным удалением активного элемента.
Добавление/удаление отдельного элемента происходит в два этапа, после того как пользователь выберет место добавления/удаление элемента, функция поиска возвратит показатель на тот элемент который забав пользователь, а потом функция добавления/удаление разорвет цепь и прибавит/удалит элемент.
Функция вывода таблицы/графику поочередно перебирает все элементы списка и выводит список/график (лишь производительность в виде шкалы) на экран.
Схему алгоритма см. здесь
Описание программы
1 Функция inf: После добавления нового элемента в список эта функция заполняет все его поля произвольными значениями давая лишь возможность пользователю самостоятельно выбрать как будет заполняться: из клавиатуры или произвольным значением.
2 Функция index: Эта функция индексирует все элементы списка в порядке роста.
3 Функция find: Эта функция перед добавлением нового элемента в список, ищет тот элемент на место которого должен прибавиться новый. И возвращает показатель на него, в случае если заданная позиция большая чем мается в списке элементов, то новой элемент добавится в конец списка.
4 Функция add: Прибавляет новой элемент в список учитывающие те данные которые возвратит функция find.
5 Функция view: Выводит таблицу на экран монитора в которой отображаются все элементы списка.
6 Функция graf: Выводит на экран график производительности работы всех рабочих в списке по каждому дню за неделю.
7 Функция del: Удаляет тот элемент списка который укажет пользователь, функция удаляет элемент в соответствии с тем какое значение возвратит функция find.
8 Функция del_all: Удаляет весь список и возвращает показателю на первый элемент нулевое значение.
Текст программы
Head.h
#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;
const int hr=8;
class A //объявление класса А
{
private: //закрытые данные
A *prev;
int no;
char fio[9];
char pro[9];
struct B
{
int ch,zar;
}B[5];
A *next;
public: // открытые данные
//прототипы функций для работы со списком
void inf(A *p); //функция заполнения полей данными
void index(A *first); // функция индексирует все элементы списка в порядке роста
A *find(A *first, int n); // функция ищет тот элемент, на место которого должен
//прибавиться новый
A *add(A *first,A *fin); // Прибавляет новой элемент в список учитывающие те
//данные которые
// возвратит функция find
void view(A *first); //Функция выводит данные таблицы на экран
void graf(A *first); // Выводит на экран график производительности работы
//всех рабочих
A *del(A *first,A *fin); //удаление одного элемента
A *del_all(A *first); //удаление всех элементов
};
#endif
Func.cpp
#include "Head.h" //подключение файла Head.h
int key, count=0;
void A::inf(A *p) //реализация функции заполнения
{
srand(unsigned (time(NULL))); //инициализация хаотичного случайного набора
int y,s,flag=0;
char ch;
p->no=++count;
cout<<"1. Vvesti FIO\n";
cout<<"2. Sgenerirovat' FIO\n\n";
ch=getch();
switch(ch) //выбор действий
{
case '1': //если нажата цифра 1
cout<<"Vvedite FIO ";
cin>>p->fio;
cout<<endl;
break;
case '2': //если нажата цифра 2
flag=1;
break;
}
for (s=0;s<8;s++)
{
if (flag==1) //если нажата была цифра 2
p->fio[s]=char((rand()%26)+64); //сгенерировать случайную ФИО
p->pro[s]=char((rand()%26)+64); //генерирования случайной профессии
}
p->fio[s]='\0'; //присвоение конца строки
p->pro[s]='\0'; //присвоение конца строки
for (y=0;y<5;y++)
{
p->B[y].ch=rand()%(hr+1);
p->B[y].zar=p->B[y].ch*56;
}
}
////////////////////////////////////////////////////////////////////////////
void A::index(A *first) //реализации функции индексации
{
A *p;
int flag=1;
count=0;
while (flag) //пока не достигнут конец списка
{
p=first;
p->no=++count;
if (p->next==0)
flag=0;
else
first=p->next;
}
}
////////////////////////////////////////////////////////////////////////////
A * A::find(A *first, int n) //реализации функции позиции на добавление
{
int i=0;
A *p;
if (n>0) //если позиция больше нуля
{
if (first==0) //если список еще не создан
{
key=1;
return first;
}
if (n==1) //если введена первая позиция
{
key=1;
return (first);
}
else //иначе введено число больше чем 1
{
while (i<n-1) //пока не достигнут конец списка
{
p=first;
if (p->next==0)//если уже конец списка
{
i=n;
key=0;
return (p);//возврат указателя на посдедний элемент списка
}
else //если не конец списка
first=p->next;
i++; //инктемент i
}
key=1;
return (first);
}
}
else //иначе введено n<1 список не может быть создан
{
key=-1;
cout<<"Zadanoe chislo ne vhodit v predel spiska...\a\n";
}
}
////////////////////////////////////////////////////////////////////////////
A * A::add(A *first,A *fin) //реализация функции прибавления нового элемента в список
{
A *p;
if (key>=0) // если key>=0 тогда можна добавить список
{
p=new A;
if (fin==0) //если списка еще нет
{
p->prev=0;
first=p;
p->next=0;
p->inf(p);
}
else
{
if (key==0) //если список достигнут конца
{
p->prev=fin;
p->next=0;
fin->next=p;
p->inf(p);
}
else //иначе позиция не достигла конца
{
if (fin==first!=0) //если fin==first!=0 то это первый список
{
p->prev=0;
p->next=first;
first->prev=p;
first=p;
p->inf(p);
}
else
{
if (fin!=first) //это не первый список. Добавлять нужно в середине
{ //списка
p->prev=fin->prev;
p->next=fin;
fin->prev->next=p;
fin->prev=p;
p->inf(p);
}
}
}
}
}
return first;
}
////////////////////////////////////////////////////////////////////////////
void A::view(A *first) //реализация функции вывода на экран
{
A *p;
int flag=1;
if(first!=0)
{
int y;
printf(" ----------------------------------------------------------------------------\n");
printf("| | | | Mo | Tu | We | Th | Fr |\n");
printf("| # | FIO |Profession| Ch| $ | Ch| $ | Ch| $ | Ch| $ | Ch| $ |\n");
printf("|---|-----------|----------|---------|---------|---------|---------|---------|\n");
p=first;
while (flag!=0)
{
p=first;
printf("|%2d | %9s | %8s |",p->no,p->fio,p->pro);
for (y=0;y<5;y++)
printf("%2d |%4d |",p->B[y].ch,p->B[y].zar);
cout<<endl;
first=p->next;
if (p->next==0)
flag=0;
}
printf(" ----------------------------------------------------------------------------\n\n");
}
else
cout<<"\nNe zadano kolichestvo rabochih\n";
}
////////////////////////////////////////////////////////////////////////////
void A::graf(A *first) //реализация функции построения графика
{
A *p, *temp;
int y,a,b,k=1,max=0,s[5];
if(first!=0)
{
for (y=0;y<5;y++)
{
int flag=1;
temp=first;
s[y]=0;
while (flag!=0)
{
p=temp;
s[y]=s[y]+p->B[y].zar;
temp=p->next;
if (p->next==0)
flag=0;
}
}
for (y=0;y<5;y++)
{
if (max<s[y])
max=s[y];
}
while (max>20)
{
max=max/2;
k=k*2;
}
for (y=0;y<5;y++)
s[y]=s[y]/k;
b=max;
for (a=0;a<b;a++)
{
printf("%3d| ",a+1);
for (y=0;y<5;y++)
{
if (s[y]<max)
cout<<" ";
else
cout<<"************* ";
}
cout<<endl;
max--;
}
cout<<" ----------------------------------------------------------------------------->\n ";
for (y=1;y<6;y++)
{
cout<<" "<<y<<"-iu";
cout<<" - Den'";
}
cout<<endl;
}
else
cout<<"Ne zadano kolichestvo rabochih\n";
}
////////////////////////////////////////////////////////////////////////////
A *A::del(A *first,A *fin) //функция удаления одного элемента
{
A *p, *temp;
if (key>=0)
{
if (fin==0) //если список пуст, то нечего удалять
{
cout<<"Spisok pyst!\n";
}
else
{
if (key==0) //если в списке нет такого элемента
{
//if ()
cout<<"Takogo elementa nety v spiske!";
}
else
{
if (fin==first!=0)//если это первый элемент
{
if (first->next==0) //и он последний
{
p=first;
delete p;
first=0;
return first;
}
else //если он не последний
{
p=first;
first=p->next;
first->prev=0;
delete p;
return first;
}
}
else //если это не первый элемент
{
if (fin!=first)
{
p=fin;
if (p->next==0)//если он последний
{
p->prev->next=0;
delete p;
return first;
}
else //иначе он не последний
{
fin->prev->next=p->next;
p->next->prev=fin->prev;
delete p;
return first;
}
}
}
}
}
}
return first;
}
////////////////////////////////////////////////////////////////////////////
A * A::del_all(A *first) //реализация удаления всего списка
{
A *p;
int flag=1;
if (first!=0)
{
if (flag!=0)
{
p=first;
if (p->next==0)
flag=0;
else
first=p->next;
delete p;
}
}
first=0;
return first;
}
Main.cpp
#include "Head.h"
void main(void)
{
A a, *first=0, *p;
int n,x,end=1;
char ch;
while (end!=0) //пока не нажата клавиша ESC
{
system("cls");
cout<<"===========Menu===========\n";
cout<<" 1. Dobavit'\n";
cout<<" 2. Tablica\n";
cout<<" 3. Grafik\n";
cout<<" 4. Indexirovanie\n";
cout<<" 5. Ydalit' element\n";
cout<<" 6. Ydalit' spisok\n";
cout<<"Esc. Exit\n";
cout<<"==========================\n";
ch=getch();
switch (ch) // выбор от нажатия
{
case '1': //если нажата клавиша 1, то добавление элемента
system("cls");
cout<<"\nVvedite poziciy elementa ";
cin>>n;
first=first->add(first,first->find(first,n));
break;
case '2': //если нажата клавиша 2, то вывод на экран списка
system("cls");
first->view(first);
getch();
break;
case '3':
system("cls");
first->graf(first);
getch();
break;
case '4':
system("cls");
first->index(first);
first->view(first);
getch();
break;
case '5':
system("cls");
cout<<"\nVvedite ydaliaemeu element ";
cin>>n;
first=first->del(first,first->find(first,n));
break;
case '6':
system("cls");
first=first->del_all(first);
break;
case 27: //если нажата клавиша ESC, значит выход
end=0;
break;
}
}
first->del_all(first); //удаление всего списка
}
Результат работы программы