Высокоуровневые методы программирования

 

Содержание                стр

Задание на разработку программного комплекса. 2

Функциональная  схема приложения 3

Спецификация  программного комплекса. 5

Название  задачи. 5

Описание  задачи. 5

Управление  режимами работы программы. 5

Входные данные. 6

Выходные  данные 6

Структурная диаграмма программного комплекса. 7

Блок  схема главного модуля 8

Данные  для тестирования программного модуля и программного комплекса в целом. 9

Инструкция  пользователя. 10

Список  используемых источников. 17

Приложение 1 18

 

 

Задание на разработку программного комплекса.

Разработать информационную подсистему контроля бюджета семьи.

Информация, обрабатываемая в системе, должна храниться в  текстовом или типизированном файлах.

Данные, которые должны быть отражены в подсистеме: месяц, доход, коммунальные расходы, продуктовые  расходы, расходы на промтовары, расходы  на удовлетворение духовных потребностей, другие расходы.

Сведения о доходах  и расходах дополняются по мере их появления.

В подсистеме должны решаться следующие задачи:

  1. Создание файла.
  2. Дополнение файла.
  3. Корректировка данных.
  4. Формирование ответов на запросы пользователя:
    1. За указанный месяц определить суммарные доходы и расходы;
    2. За текущий год вывести на экран в виде таблицы данные об ежемесячных суммарных доходах и расходах;
    3. За текущий год вывести на экран названия месяцев в порядке убывания разности между доходами и расходами;
    4. За текущий год по месяцам построить графики изменения расходов на коммунальные услуги в процентах к доходам;
    5. За указанный месяц построить круговую диаграмму, отражающую долю каждого вида расходов в суммарных расходах;
    6. Построить столбиковую диаграмму, отражающую за год долю каждого вида расходов в суммарных расходах. Столбики диаграммы расположить в порядке возрастания доли.

 

Функциональная схема  приложения

Запуск программы


Загрузка данных и структуры таблицы из файла

Выбор дальнейших действий

Ввод дополнительных данных в таблицу

Вывод диаграммы

Круговая диаграмма

Столбиковая диаграмма или  график

 

Заполнение временной  таблицы

 

Диаграмма на экране

 

Сохранение данных в Файл


 

 

 

 

 

 

 

 

 


 


 

 

 

 

 

 

 

 

Спецификация программного комплекса.

Название задачи.

Задача на разработку программы  учета семейного бюджета.

Программа называется «Бюджет семьи».

Для разработки использована среда программирования Delphi 2007 и набор дополнительных компонентов Developer Express.

Программа написана для операционной системы Windows XP и её работа гарантируется на любом компьютере поддерживающего работу с данной ОС.

Описание задачи.

Так как в рамках данной программы было необходимо было строить диаграммы соотношения велечин, то в программе использованы следующие формулы.

∑X т.е. сумма всех элементов. Заданного множества. Например сумма доходов за год

∑Y/∑X отношения сумм всех элементов двух различных множеств. Например отношение суммы коммунальных расходов к доходам за месяц.

Управление режимами работы программы.

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

Экран 1. Таблица  отображающая полные данные. Пользователь имеет возможность отфильтровать, отсортировать или сгруппировать данные по любому столбцу. Тут же можно внести данные  напрямую в таблицу.

Экран 2. Круговая диаграмма показывающая какое влияние на итоговую сумму денег в кошельке пользователя повлиял тот или иной год. При нажатие на конкретный год, диаграмма меняется и показывает сумму доходов и каждого типа расходов, и их влияние на итоговую сумму за год.

Экран 3. График изменения  доли коммунальных платежей за год  по месяцам относительно доходов  за месяц.

(Для отображения диаграммы  надо выбрать год вверху экрана  диаграммы)

Экран 4. Столбиковая диаграмма показывающая долю каждого типа расходов в доходах за месяц.

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

В верхней части экрана находится меню, позволяющее выбирать экран для отображения.

Входные данные.

Входными данными являются год за который вносится запись (тип  поля integer), месяц(тип поля String. Вносится из списка) сумма дохода/расхода(тип поля Float), и тип дохода/расхода (тип поля String, вносится из списка).

Выходные данные

Выходными данными являются таблица со значениями, и диаграммы.

Во время ввода данных отслеживается соответствие типа вводимых данных типу поля, однообразность написания  месяцев и типов дохода/расхода.

 

Структурная диаграмма программного комплекса.

Программа состоит из одного единственного модуля.

UMAin.

В модуле находится cxGrid, отвечающий за ввод данных в таблицу и вывод данных в виде таблицы и диаграмм.

В этом же модуле находится  кнопка сохранения таблицы в файл и меню переключения между таблицей и диаграммами.

В модуле находятся следующие  процедуры. Иерархия соответствует  уровням списка.

  1. procedure bMainClick(Sender: TObject);
  2. procedure FormCreate(Sender: TObject);
  3. procedure mmCDiagClick(Sender: TObject);
  4. procedure mmTableClick(Sender: TObject);
  5. procedure mmGrafClick(Sender: TObject);
  6. procedure mmSDiagClick(Sender: TObject);
    1. procedure Summing;
      1. procedure Adding;
  7. procedure mmExitClick(Sender: TObject);

 

Блок схема главного модуля

mmGrafClick


Начало

vtData.LoadFromFile

onClick

bMainClick

mmCDiagClick

mmSDiagClick

mmExitClick

mmTableClick

Конец


 

Данные для тестирования программного модуля и программного комплекса в целом.

Так как несмотря на то, что данные хранятся в виде типизированного xml файла, приложение по своей сути работает с таблицей и является в некотором роде базой данных, то тестирование сводится к введению в поля таблицы значений для расчета.

 

Инструкция пользователя.

Ниже представлена краткая  инструкция по работе с программой Бюджет семьи. При первом запуске  программы  пользователю доступны для  отображения тестовые/демонстрационные данные для работы. После чего пользователь может смело удалить их и начать внесение собственных. В процессе работы данные сохраняются в файле data.xml в папке с программой. В случае удаления данного файла программа при запуске выдаст соответствующую ошибку, после чего программа вернется в состояние до первого запуска. Если по каким-то причинам файл data.xml не был получен вместе с программой, это не повод для беспокойства. Так как файл будет создан автоматически при сохранении данных.

Теперь рассмотрим интерфейс  программы.

Сразу после запуска перед  нами появится следующее окно.

В котором мы видим поле данных в центре, кнопку для сохранения данных в файл с подписью «Внести  данные», и в верхней части  окна мы видим меню «Файл».

Рассмотрим каждый элемент  подробнее.

Начиная с самого простого. Кнопка внесения данных.

Данная кнопка доступна в  любой момент работы программы. При  нажатии на неё происходит сохранения текущего состояния таблицы в  файл Data.xml.

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

Далее рассмотрим поле данных

В верхней части находится  место куда мы можем перетащить столбец для группировки данных. Например Сгруппировать данные по годам.

В верхнюю часть можно  поместить как 1 так и несколько столбцов, путем перетаскивая мышью прямо из таблицы.

При группировке в заголовке  группы отображается итоговая сумма  по столбцу «Сумма» для данной группы. А внизу поля появляется надпись «в кошельке осталось» показывающая итоговую сумму все доходы-все расходы

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

При выборе слова Custom нам будет предложено задать более сложный фильтр

В данном окне мы наблюдаем 2 списка условий в левой части, условия могут быть различны, равно, не равно, больше, меньше, больше или  равно, меньше или равно, и т.д. условия  имеют названия на английском языке. Справа в два поля мы можем ввести значения для данного условия. Условия  можно использовать оба сразу  или только одно из них, при использовании  обоих условий нужно выбрать  их соединитель and(и) или or (или), т.е. должны они выполняться оба или хотя бы одно из них.

 

В нижней части поля данных мы видим ряд кнопок

Слева направо эти кнопки служат

Переход к первой записи, переход к верхней записи в  окне(если все записи не помещаются на экран), переход к предыдущей записи, переход к следующей записи, переход к последней записи в окне, переход к последней записи таблицы, добавить запись, добавить запись в конец(разница в месте отображения записи. Сразу после текущей или в конце таблицы), удалить запись, редактировать запись, применить изменения, отменить изменения(эти две кнопки нужны при редактировании или добавлении записи), конструктор фильтров.

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

Рассмотрим компоненты меню «Файл»

В данном меню 4 пункта.

3 отвечают за отображения  диаграмм. Экраны диаграмм абсолютно  аналогичны друг другу.

1)Круговая диаграмма.  Вызов диаграммы показывающей  долю годовых сумм в итоговой. При нажатии на любой год диаграмма преобразуется в подробную по доходам и расходам в году

Параметр vtfYear показывает какой год сейчас выбран, при нажатии на него открывается список годов за которые есть данные.

2)График. Показывает график  изменения %доли  комунальных расходов в доходе семьи. Для отображения необходимо выбрать год

3)Столбиковая диаграмма  показывающая долю каждого типа  расходов в доходах за месяц. Сначала отображается по годам, т.е. общая доля расходов в доходе семь. При нажатии на год, появляется диаграмма  показывающая конкретные виды расходов и их доли.

4)Выход. Выход из программы

 

Список используемых источников.

  1. www.cyberforum.ru
  2. www.delphikingdom.ru
  3. www.forum.sources.ru
  4. www.rsdn.ru
  5. www.sql.ru

 

Приложение 1

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, cxStyles, dxSkinsCore, dxSkinsDefaultPainters, dxSkinscxPCPainter,

  cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DB,

  cxDBData, StdCtrls, ExtCtrls, cxGridCustomTableView, cxGridTableView,

  cxGridDBTableView, cxGridLevel, cxClasses, cxControls, cxGridCustomView,

  cxGrid, MemDS, VirtualTable, cxDropDownEdit, cxCurrencyEdit, cxPropertiesStore,

  cxGridChartView, cxGridDBChartView, Menus, DBTables, cxLookAndFeels,

  cxLookAndFeelPainters, dxSkinBlack, dxSkinBlue, dxSkinCaramel, dxSkinCoffee,

  dxSkinDarkRoom, dxSkinDarkSide, dxSkinFoggy, dxSkinGlassOceans,

  dxSkiniMaginary, dxSkinLilian, dxSkinLiquidSky, dxSkinLondonLiquidSky,

  dxSkinMcSkin, dxSkinMoneyTwins, dxSkinOffice2007Black, dxSkinOffice2007Blue,

  dxSkinOffice2007Green, dxSkinOffice2007Pink, dxSkinOffice2007Silver,

  dxSkinOffice2010Black, dxSkinOffice2010Blue, dxSkinOffice2010Silver,

  dxSkinPumpkin, dxSkinSeven, dxSkinSharp, dxSkinSilver, dxSkinSpringTime,

  dxSkinStardust, dxSkinSummer2008, dxSkinValentine, dxSkinXmas2008Blue;

 

type

  TfMain = class(TForm)

    cxGrid1DBTableView1: TcxGridDBTableView;

    cxGrid1Level1: TcxGridLevel;

    cxGrid1: TcxGrid;

    Panel1: TPanel;

    Panel2: TPanel;

    Panel3: TPanel;

    bMain: TButton;

    DataSource1: TDataSource;

    cxGrid1DBTableView1vtfMonth: TcxGridDBColumn;

    cxGrid1DBTableView1vtfYear: TcxGridDBColumn;

    cxGrid1DBTableView1vtfSum: TcxGridDBColumn;

    cxGrid1DBTableView1Column1: TcxGridDBColumn;

    MainMenu1: TMainMenu;

    mmFail: TMenuItem;

    mmCDiag: TMenuItem;

    cxGrid1Level2: TcxGridLevel;

    cxGrid1DBChartView1: TcxGridDBChartView;

    cxGrid1DBChartView1Series1: TcxGridDBChartSeries;

    cxGrid1DBChartView1DataGroup1: TcxGridDBChartDataGroup;

    cxGrid1DBChartView1DataGroup2: TcxGridDBChartDataGroup;

    mmTable: TMenuItem;

    cxGrid1Level3: TcxGridLevel;

    cxGrid1DBChartView2: TcxGridDBChartView;

    cxGrid1DBChartView2Series1: TcxGridDBChartSeries;

    DataSource2: TDataSource;

    mmGraf: TMenuItem;

    cxGrid1DBChartView2DataGroup1: TcxGridDBChartDataGroup;

    cxGrid1DBChartView2DataGroup2: TcxGridDBChartDataGroup;

    cxGrid1Level4: TcxGridLevel;

    cxGrid1DBChartView3: TcxGridDBChartView;

    cxGrid1DBChartView3Series1: TcxGridDBChartSeries;

    cxGrid1DBChartView3DataGroup1: TcxGridDBChartDataGroup;

    mmExit: TMenuItem;

    mmSDiag: TMenuItem;

    cxGrid1DBChartView3DataGroup2: TcxGridDBChartDataGroup;

    vtData: TVirtualTable;

    vtData2: TVirtualTable;

    procedure bMainClick(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure mmCDiagClick(Sender: TObject);

    procedure mmTableClick(Sender: TObject);

    procedure mmGrafClick(Sender: TObject);

    procedure mmSDiagClick(Sender: TObject);

    procedure Summing;

    procedure Adding;

    procedure mmExitClick(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  fMain: TfMain;

  rc, rc1: integer; //переменные содержат номер строки

  sy, sm, sty: string;  //значение года, месяца тип дохода/расхода

  sum, sum1: real;       //сумма по данному типу доходов/расходов

  bis:boolean;     //наличие данных по году во второй таблице

 

 

implementation

 

{$R *.dfm}

 

procedure TfMain.bMainClick(Sender: TObject);//При нажатии на кнопку

begin

vtData.SaveToFile('Data.xml');//сохранение данных в файл на жестком диске

end;

 

procedure TfMain.FormCreate(Sender: TObject);

begin

vtData.LoadFromFile('Data.xml');//при запуске загружаем данные с диска

cxGrid1Level1.Visible:=true;//видим уровень таблици

cxGrid1Level2.Visible:=false;// уровни диаграмм

cxGrid1Level3.Visible:=false;//скрыты

cxGrid1Level4.Visible:=false;//в начале работы

end;

 

procedure TfMain.mmCDiagClick(Sender: TObject);//выбор круговой диаграммы

begin

cxGrid1Level1.Visible:=false;//делаем видимой

cxGrid1Level2.Visible:=true;//круговую диаграмму

cxGrid1Level3.Visible:=false;//скрываем уровень

cxGrid1Level4.Visible:=false;//таблици

end;

 

procedure TfMain.mmExitClick(Sender: TObject);

begin

close();

end;

 

procedure TfMain.mmGrafClick(Sender: TObject);//при выборе графика

begin

vtData2.Clear;//очищаем временную таблицу

rc:=1;//переходим к первой записи

sum:=0;//обнуляем переменную для суммы

while rc<=vtData.RecordCount+1 do//цикл до конца таблици

begin

  vtData.RecNo:=rc;//переход к следующей записи

  if vtData.Fields[3].AsString='Комун.Расходы' then//ищем поля содержащие

    begin                                   //данные по комунальным расходам

    sm:=vtData.Fields[0].AsString;//считываем данные о годе

    sy:=vtData.Fields[1].AsString;//и месяце найденной записи

    sum:=sum+ABS(vtData.Fields[2].AsFloat);//записываем сумму расходов в переменную

    rc1:=1;//ставим в начало второй счетчик записей

    while rc1<=vtData.RecordCount+1 do//до конца таблици ищем

    begin

    vtData.RecNo:=rc1;//начиная с первой записи

    if (vtData.Fields[0].AsString=sm)and//данные о доходе

       (vtData.Fields[1].AsString=sy)and//за месяц и год

       (vtData.Fields[3].AsString='Доход') then//в котором найдены комунальные расходы

        begin

        sum:=sum/vtData.Fields[2].AsFloat*100;//ищем процентное соотношение дохода и расхода

        vtData2.Append;//вносим

        vtData2.Fields[0].AsString:=sm;//соответствующие

        vtData2.Fields[1].AsString:=sy;//данные

        vtData2.Fields[2].AsFloat:=sum;//во временную таблицу

        end;

      inc(rc1);//переходим к следующей строке

      end;

      sum:=0;//обнуляем сумму за месяц

    end;

  inc(rc);//ищем далее

end;

cxGrid1Level4.Visible:=false;//переключаемся

cxGrid1Level3.Visible:=true;//на уровень

cxGrid1Level2.Visible:=false;//с граффиком

cxGrid1Level1.Visible:=false;//другие уровни не видны

end;

 

procedure TfMain.mmSDiagClick(Sender: TObject);//при выборе столбиковой диаграммы

begin

vtData2.Clear;//очищаем временную таблицу

summing;//вызов процедуры для заполнения данных

cxGrid1Level1.Visible:=false;//видимый уровень

cxGrid1Level2.Visible:=false;//со столбиковой диаграммой

cxGrid1Level3.Visible:=false;//остальные уровни

cxGrid1Level4.Visible:=true;//не видны

end;

 

procedure TfMain.mmTableClick(Sender: TObject);

begin

cxGrid1Level1.Visible:=true;//виден уровень

cxGrid1Level2.Visible:=false;//в котором отображаются

cxGrid1Level3.Visible:=false;//данные из таблици

cxGrid1Level4.Visible:=false;///остальные уровни не видны

end;

 

procedure TfMain.Summing;

var

rc2, rc3:integer;//счетчики записей

begin

  rc2:=1;//счетчик устанавливается в начальное значение

  sum:=0;

  while rc2<=vtData.RecordCount+1 do//перебор записей до конца таблици

  begin

  vtData.RecNo:=rc2;//переход к следующей записи

  bis:=False;//иначально считается что во временной таблице данных нет

    if vtData.Fields[3].AsString='Доход' then//как только найден доход

      begin

        rc3:=1;//второй счетчик в начальном положении

        sy:=vtData.Fields[1].AsString;//считываем год за который найден доход

        while rc3<=vtData2.RecordCount+1 do//до конца таблици ищем

        begin

          vtData2.RecNo:=rc3;

          if vtData2.Fields[1].AsString=sy then//есть ли во временной таблице данные

          bis:=true;//за заданный год. Если находим переменная становится истинна

          inc(rc3);//переход к следующей записи

        end;

        if bis=false then//если даненых за год нет, начинаем их собирать

        begin

          rc3:=rc2+1;//начиная с последней обнаруженной записи по доходу

          sum:=sum+vtData.Fields[2].AsFloat;//складываем суммы доходов

          while rc3<=vtData.RecordCount do//до конца таблицуи

          begin

            vtData.RecNo:=rc3;

            if(vtData.Fields[1].AsString=sy)and//если запись соответствует году

            (vtData.Fields[3].AsString='Доход') then//и типу доходы

             sum:=sum+vtData.Fields[2].AsFloat;//

          inc(rc3);

          end;

          sum1:=sum;//записываем сумму доходов в другую переменную

          sty:='Комун.Расходы';//задаем тип расходов для поиска

          Adding;//находим данные и добавляем в таблицу

          sty:='Промтов.Расходы';//для каждого типа

          Adding;//с помощью отдельной процедуры

          sty:='Продукт. Расходы';//

          Adding;//

          sty:='Душевные Расходы';//

          Adding;//

          sty:='Прочие Расходы';//

          Adding;//

        end;

     end;

  inc(rc2);

  end;

end;

 

procedure TfMain.Adding;

var

rc4: integer;//счетчик записей

begin

  rc4:=1;//ставим в начало

  sum:=0;//обнуляем сумму

  while rc4<=vtData.RecordCount+1 do//ищем до конца таблици

  begin

    vtData.RecNo:=rc4;

    if((vtData.Fields[1].AsString=sy)and (vtData.Fields[3].AsString=sty)) then

    begin//если найденная строка подходит по году и типу суммы

      sum:=sum+ABS(vtData.Fields[2].AsFloat);//добавляем по модулю её в переменную

    end;

  inc(rc4);

  end;

  sum:=sum/sum1;//находим отношение

  vtData2.Append;//добавляем запись во вторую таблицу

  vtData2.Fields[1].AsString:=sy;//вставляем соответствующие параметры

  vtData2.Fields[2].AsFloat:=sum;//в соответствующие

  vtData2.Fields[3].AsString:=sty;//столбци таблици

end;

 

end.


Высокоуровневые методы программирования