Задание
Для сведения составить программу построения графику изменения зарплаты работников по каждому дню.
Выбор алгоритма решения задачи
Выбор алгоритма решения задачи был аналогичен предыдущей программе -> см. здесь.
Схема алгоритма решения задачи
Основная программа
Функция del
Функция SRAND
Функция name
Функция add
Функции view и graf см. здесь ->>
Описание программы
Функция add
Эта функция заполняет массив структур (размер массива отмечается в константе), заполнение происходит автоматически с помощью произвольных чисел и имен, пользователь не берет ни которой участия в заполнении.
Функции view и graf см. здесь ->>
Функция del
Эта функция удаляет весь список с помощью поочередного удаления каждого элемента.
Текст программы
stdafx.h
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;
const int ch=8;
struct A //структура рабочего
{
A *prev; //указатель на предыдущий
int no;
char fio[9];
char pro[9];
struct B
{
int ch,zar;
}B[5];
A *next; //указатель на следующий
};
//прототипы функций
int SRAND();
int name(int y);
A *add(int n, A *first);
void view(int n, A *first);
void graf(int n, A *first);
void del(A *first);
Func.cpp
#include "stdafx.h" //подключение файла stdafx.h
int SRAND() // функция случайное число в диапазоне от 0 .. 1000
{
int i=0;
cout<<"Press any key to start...";
while (!kbhit()) //если клавиша не нажата
{
if (i>1000)
i=0;
i++;
}
cout<<endl;
return(i); //возвращение полученного числа
}
int name(int y) //функция получение буквы
{
int x,m[26];
for (x=0;x<26;x++)
m[x]=x+65;
return (m[y]);
}
A *add(int n, A *first) //функция добавление списка и заполнение случайным числом.
{
A *p, *temp=0;
int x,y,z,s,numb;
char nam[9];
srand(SRAND()); //функция для хаотичного случайного числа
p=new A; //выделение памяти под список
for (x=0;x<n;x++) //цикл добавления
{
if (x==0) //если список первый
first=p; //указатель на первый элемент
else p->prev->next=p;
p->prev=temp; //указатель на предыдущий
temp=p;
p->no=x+1;
for (s=0;s<8;s++)
{
p->fio[s]=name(rand()%26); //случайное заполнение фамилии из 8 букв
p->pro[s]=name(rand()%26); //случайное заполнение профессии из 8 букв
}
p->fio[s]='\0'; //присвоение конца строки
p->pro[s]='\0'; //присвоение конца строки
for (y=0;y<5;y++)
{
p->B[y].ch=rand()%(ch+1);
p->B[y].zar=p->B[y].ch*56;
}
if(x!=n-1) //если список не последний
{
p->next=new A;
p=p->next;
}
else p->next=0; //иначе он последний. Указатель на следующий принимает значение 0
}
return first; //возврат указателя на первый элемент
}
void view(int n, A *first) //вывод таблицы работников
{
A *p;
if(n>0)
{
int x,y;
printf(" ----------------------------------------------------------------------------\n");
printf("| | | | Mo | Tu | We | Th | Fr |\n");
printf("| # | FIO |Profession| Ch| $ | Ch| $ | Ch| $ | Ch| $ | Ch| $ |\n");
printf("|---|-----------|----------|---------|---------|---------|---------|---------|\n");
for(x=0;x<n;x++)
{
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;
}
printf(" ----------------------------------------------------------------------------\n\n");
}
else
cout<<"Ne zadano kolichestvo rabochih\n";
}
void graf(int n, A *first) //функция построения графика
{
A *p, *temp;
int x,y,a,b,k=1,max=0,s[5];
if(n>0)
{
for (y=0;y<5;y++)
{
temp=first;
s[y]=0;
for (x=0;x<n;x++)
{
p=temp;
s[y]=s[y]+p->B[y].zar; // Нахождение суммы зарплаты за неделю
temp=p->next;
}
}
for (y=0;y<5;y++)
{
if (max<s[y]) // Нахождение наибольшей зарплаты за неделю
max=s[y];
}
while (max>20) // Нахождение делителя для получения числа меньше 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'";
}
}
else
cout<<"Ne zadano kolichestvo rabochih\n";
}
void del(A *first) //функция удаления списка
{
A *p, *temp;
for(p=first, temp=p->next; temp; p=temp, temp=p->next) //пока не конец списка
delete p; //удаление текущего списка
}
Laba5.cpp
#include "stdafx.h" //подключение файла stdafx.h
void main(void)
{
A *first=0;
int n;
cout<<"Vvedite kolichestvo robochih ";
cin>>n;
first=add(n, first); //функция заполнения структуры
getch();
view(n, first); //функция вывода таблицы на экран
cout<<"Press any key to continue...\n\n";
getch();
graf(n, first); // функция рисования графику
del(first); // функция удаления списка
getch();
}
Результат работы программы