русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Готовая программа: Классы. Инкапсуляция на языке Си

Задание

Для сведения составить программу построения графику изменения зарплаты работников по каждому дню.

Выбор алгоритма решения задачи

Для решения этой задачи надо использовать класс в каком все данные нужно сделать закрытыми (для того чтобы при работе случайно не повредить их) и методы обработки этих данных. Уместным я считаю сделать методы: добавление, удаление одного или всех элементов, вывод графику и списка на экран, а также несколько универсальных функций которые помогут в работе как: функция поиска, заполнение, и индексирование элементов.

Описание алгоритма решения задачи

Основа программы это функция 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);    //удаление всего списка
}

 

Результат работы программы

Просмотров: 12225

Вернуться воглавление




Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Полезен материал? Поделись:

Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.