Програмирование на языке высокого уровня

Томский межвузовский центр дистанционного образования
Томский государственный  университет систем управления и радиоэлектроники (ТУСУР)
 
 
 
 
 
Кафедра автоматизированные системы управления (АСУ)
 
 
 
 
 
Курсовая работа

по дисциплине «Программирование на языке высокого уровня»

Тема: «Справочник  выданных мобильных карт» 
 
 
 
 
 

учебное пособие Е.Н. Сафьянова 'Основы алгоритмизации и программирование'

 
 
 
 
 
 
 
 
 
 
Выполнил

студент гр. з-435-б

специальность 230105 
 

Бессмертный Дмитрий Валерьевич

02 января 2010 г. 
 

 
г.Ноябрьск 2009
   

 

Содержание

    1. Введение ______________________________________________________________ 3

    2. Назначение и область применения _______________________________________ 4

    3. Постановка задачи _____________________________________________________ 5

    4. Используемые методы __________________________________________________ 6

    5. Алгоритм программы __________________________________________________ 7

    6. Заключение ___________________________________________________________ 10

    7. Список литературы ___________________________________________________ 11

    8. Приложение 1. Листинг программы _____________________________________ 12

    9. Приложение 2. Результат работы _______________________________________ 24 
     
     
     
     
     
     
     
     
     
     

 

1. Введение.

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

 

2. Назначение и область применения.

Программа представляет собой мини комплекс по учету выданных мобильных карт, областью применения могут быть Автомобильные  Заправочные Станции.

 

3. Постановка задачи.

Написать  программу, которая будет работать с базой выданных мобильных карт. При этом программа должна уметь добавлять, изменять, удалять, искать записи и создавать БД (База Данных) в случае если таковая отсутствует. Для упрощения работы с программой разработать интуитивно понятный интерфейс.

 

4. Используемые методы.

БД создается под именем CardsMK.dat в той же директории, где находится сама программа. Доступ к данным происходит напрямую из процедур или функции. При поиске или изменении записи создается временный файл с именем FTmp.dat, в него записываются  результат поиска из файла CardsMK.dat, используемые в дальнейшем для определенных целей: вывод на экран, визуального контроля редактируемой или удаляемой записи. Для удаления так же создается временный файл temp.dat, для хранения отредактированной БД, затем файл CardsMK.dat удаляется, а файл temp.dat переименовывается в CardsMK.dat.

В программе  использован метод объектно-ориентированного программирования. Программа разбита  на процедуры и функции, выполняющие определенные действия.

 

5. Алгоритм программы.

Создадим новый тип записи TCards. Именно он будет определять формат нашей БД, в нашем случае состоящей из одной таблицы с полями:

  • Client – поле строкового типа длинной не более 34 символов, предназначено для хранения Ф.И.О. владельца;
  • CardNo – поле строкового тип длинной 6 символов, может хранить в себе номера карт начинающиеся с № 100000 и до №999999;
  • GoodType – поле строкового типа длинной 7 символов. Содержит в себе тип топлива используемого картой. Может принимать только 4 значения: «АИ-80», «АИ-92», «АИ-95» и «Дт»;
  • ClientType - поле строкового типа длинной 10 символов. Содержит в себе тип клиента используемого картой. Может принимать только 2 значения: «Юр.лицо» и «Физ.лицо»;
  • Passwd - поле строкового типа длинной 4 символа. Содержит в себе пароль из 4-х цифр, принимает значения от 0000 до 9999.

Создадим  две константы строкового типа хранящие в себе названия выходных файлов:

  • FileName = ‘CardsMK.dat’ (файл БД);
  • FileFTmp = ‘FTmp.dat’ (временный файл);
 
    1. Процедура PMenu – представляет собой окно Главного меню. Используя цикл Repeat и оператора выбора Case (в основе всех меню пользователя используются похожая связка цикла и оператора) программа запрашивает у пользователя следующие варианты для действия по нажатию клавиш
  • ‘<1> Список карт.’ – вызывает процедуру ShowFile (FileName);
  • <Esc> Выход из программы..

    Для определения кода нажатой кнопки используем оператор ord(a : переменная типа char), возвращающий код нажатой клавиши типа integer.

      {Процедура  - Окно главного  меню}

      procedure PMenu; {объявление процедуры}

      var{объявление переменных}

        a: char; {необходимо для оператора Ord(а)}

        b: integer; {для оператора Case}

      begin {Начало процедуры}

        repeat {оператор цикла}

          begin {начало оператора цикла}

            ClrScr; {очистка экрана, встроенная процедура}

            WriteLn(' "Справочник выданных Мобильных карт" - Главное меню ');

            WriteLn; {оператор вывода текста на экран с переводом курсора на следующую строку}

            WriteLn ('<1> Список карт.');

            WriteLn;

            WriteLn ('<Esc> Выйти  из программы.');

            a:=ReadKey; {присваиваем значение ReadKey – встроенная функция считывания кода нажатой клавиши типа Char}

            b:=ord(a); {присваиваем переменной значение, возвращенное оператором ord-преобразует переменную типа Char в целочисленную - Integer}

            case b of {начало оператора выборки по значению переменной b}

              49 : ShowFile(FileName); {если b=49 (клавиша «1»), то запускаем ShowFile(FileName)}

            end; {конец оператора выборки}

          end; {конец оператора цикла}

        until b=27; {условие повторного запуска цикла: пока переменная не будет равна 27 (клавиша «Esc»)}

      end; {конец процедуры} 

    1. Процедура ShowFile (AFileName:string{переменная строкового типа должна содержать имя файла БД}) – Проверяет существование файла БД посредством вызова функции FileExists(AFileName:string). Если таковой отсутсвует, то процедура создает его. Далее вызывается функция вывода на экран файла БД – FshowFile(AFileName:string). Ниже прорисованной таблицы БД появляется меню пользователя:
    • <1>-«Поиск…» вызывает процедуру меню поиска: MPoisk;
    • <2>-«Выдать карту…» вызывает функцию : FAddCards (AFileName:string);
    • <3>-«Удалить карту…» вызывает функцию : FDelCardsNo (AFileName:string; AFTmp:string);
    • <4>-«Редактировать карту…» вызывает функцию: FEdit (AFileName:string; AFTmp:string);
    • <5>-«Сортировать список…» вызывает процедуру MSort;
    • <Esc>-«ВЫХОД – Главное меню» конец работы текущей процедуры;
 
      1. Процедура MPoisk - процедура представляющая собой не что иное, как меню пользователя где предлагается  для выбора три условия поиска нужной (ых) записи: по клиенту, по номеру карты и по типу топлива (соответственно по клавишам <1>,<2>,<3> для выхода <Esc>). Процедуры SelectCardsClient, SelectCardsNo, SelectCardsGoodType похожи по своей структуре и алгоритму работы и необходимым для работы входным параметрам (FileName{файл для поиска},FileFTmp{файл для вывода найденных данных}). Алгоритм сводится к открытию окна с возможностью ввода(выбора) данных для поиска(выборки) из БД и вывода результата на экран, по окончании процедура возвращает пользователя в меню поиска.
      2. Функция FAddCards (AFileName:string) – Предназначена для добавления записи в БД. Перед началом процедуры ведется проверка по наличию самого файла БД, в случае его отсутсвия программа сама создает его. Далее пользователю предлагается поэтапно ввести данные для одной записи, причем обязательным условием является заполнение всех полей!!! Алгоритм следующий:

      А) Вводим №карты – программа проверяет  на наличие данной карты в БД, в положительном случае выдаст сообщение  о том что данная карта зарегистрирована и имеет своего владельца. Также ведется проверка на обязательные условия ввода №карты – 6 цифр. Проверка проводится функцией FIntTrue (ATCardid:string,ADlina:integer):boolean. Последняя функция использует встроенный оператор val(a,b,c), которая преобразовывает строковую переменную a в целочисленную переменную b, при этом возвращает код c=0 при положительном варианте. Далее вычисляется длинна строки посредством встроенного оператора length(a) возвращающий числовое значение равное числу символов в строке. FIntTrue – логическая функция и потому возвращает лишь два значения True (в случае соответствия условиям) или False (несоответствия условию).

      1. FDelCardsNo (AFileName:string; AFTmp:string) – для поиска карты необходимой для удаления используем выше описанную функцию SelectCardsNo. В случае существования данной карты данная запись запишется во временный файл. Далее программа проверяет размер данного временного файла, и если оно равно нулю то выдается сообщение: «Внимание! Нет данных для удаления!!!» и завершает свою работу. Если данные все же найдены, то программа потребует повторного подтверждения для удаления найденных записей. Далее создается еще один временный файл Temp.dat, и туда переписываются все данные из файла БД кроме тех, что содержаться в FTmp.dat. После чего файл с БД удаляется, а Temp.dat переименовывается в файл БД - CardsMK.dat.
      2. FEdit (AFileName:string; AFTmp:string) – функция редактирования данных. По номеру карты находим запись для редактирования (функция SelectCardsNo). Выводим на экран меню редактирования, выбор поля для редактирования определяется цифрой на клавиатуре:

          <1> - Изменить владельца карты.

          <2> - Изменить тип топлива.

          <3> - Изменить тип владельца карты.

          <4> - Изменить пароль.

          <Esc> - Выйти…

      Первые  четыре строки соответствуют вызову функций FEditClient с параметрами: AFileName – файл БД, AFTmpFile – файл с результатом поиска, PoleId – номер поля для редактирования. В зависимости от выбора поля для редактирования предлагается выбрать новый тип или ввести новое значение данного поля (обязательно с проверкой условий ввода). Выполненные изменения записываются во вновь созданный файл Temp.dat, и туда переписываются все данные из файла БД кроме тех, что содержаться в FTmp.dat. После чего файл с БД удаляется, а Temp.dat переименовывается в файл БД - CardsMK.dat.

      1. MSort – открывает меню пользователя «Сортировать». Так же с помощью цифр определяемся с выбором поля по которому будет выполняться сортировка таблицы БД:

          <1> - По клиенту.

          <2> - По номеру карты.

          <3> - По типу топлива.

          <4> - По типу владельца.

          <Esc> - Выйти…

      Типы  сортировки разбиты на свои функции: FSortByClient(FileName), FSortByCardNo(FileName), FSortByGoodType(FileName), FSortByClientType(FileName). По своему алгоритму они ничем не отличаются, разница лишь в поле сортировки.

 

6. Заключение.

        Данная  программа представляет собой работоспособный  модуль по работе с мобильными картами  АЗС. Имеет интуитивно понятный интерфейс  и не должна вызывать затруднений  в работе конечного пользователя. В программе использованы разные методы алгоритмизации похожих процессов (сортировки и редактирования).

 

7. Список литературы.

    1. «Основы алгоритмизации и программирование», Е. Н. Сафьянова, учебное пособие, Томск, 2000 г.

 

        

8. Приложение 1. Листинг программы.

uses Crt;

type TCards = record {Создание  нового типа определенного формата }

     Client : string [34];{Поле Клиент}

     CardNo : string[6];  {Поле №карты}

     GoodType : string [7]; {Поле Тип топлива}

     ClientType : string [10];{Поле Тип Клиент}

     Passwd : string[4]; {Поле Пароль}

     end;

CONST FileName : string = 'CardsMK.dat';{Файл БД}

CONST FileFTmp : string = 'FTmp.dat'; {Временный файл} 

{Функция определяет  существует ли файл с данным  именем}

function FileExists(AFileName : String): boolean;

var t: File of TCards;

begin

FileExists := False;

  Assign (t, AFileName);

  {$I-} Reset (t); {$I+} {отключаем контроль ошибки доступа}

  If IOResult = 0 then begin

    Close (t);

    FileExists:=True

  end;

end; 

{Функция выода  на экран содержимого файла  в виде таблицы}

Function FShowFile (AFileName:string):boolean;

Var

  t, FTmp: File of TCards;

  Cards: TCards;

  n:integer;

begin

FShowFile:=True;

  If NOT FileExists(AFileName) then begin

    FShowFile:=False;

    Exit;

  end;

  Assign(t,AfileName);

  Reset(t);

  n:=1;

  WriteLn('| № |        Владелец карты             |  Карта | Топливо | Юр. / Физ. |Пароль|');

  WriteLn('|---|-----------------------------------|--------|---------|------------|------|');

  While NOT EOF(t) do begin

    Read(t,Cards);

    Writeln('|',n:3,'|',Cards.Client:34,' | ', Cards.CardNo:6,' | ', Cards.GoodType:7,' | ', Cards.ClientType:10,' | ',

    Cards.Passwd:4,' |');

    n:=n+1;

  end;

  WriteLn('--------------------------------------------------------------------------------');

  Close(t);

  WriteLn('Количество записей: ',n-1);

end; 

{Функция контроля:  ввод числа с определенной  длинной символов}

Function FIntTrue (ATCardid:string; ADlina:integer):boolean;

var

code,chislo,dlina: integer;

begin

FIntTrue:=True;

  val(ATCardid,chislo,code);

  dlina:=length(ATCardid);

  if code<>0 then begin

    FIntTrue:=False;

  end

  else begin

    If dlina<>ADlina then FIntTrue:=False;

  end;

end; 

{Функция поиска FSelect(файл БД, файл вывода результата, поле поиска(0-клиент,1-№карты,2-тип  топлива)) }

Function FSelect(AFileName:string; AFileFTmp:string; iskomoe:string; PoleId:integer):boolean;

var

  FTmp, t : file of TCards;

  Cards:TCards;

  kursor: Longint;

  b,n:integer;

  Pole:string;

Begin

FSelect:=False;

  Assign(t,AFileName);

  Reset(t);

  Assign(FTmp,AFileFTmp);

  Rewrite(FTmp);

  kursor:=0;

  n:=1;

  while NOT EOF(t) do begin

    seek(t,kursor);

    Read(t,Cards);

    Case PoleId of

      0: Pole:=Cards.Client;

      1: Pole:=Cards.CardNo;

      2: Pole:=Cards.GoodType;

    end;

    If pos(iskomoe,Pole)=1 then begin

      write(FTmp,Cards);

      FSelect:=True;

      n:=n+1;

    end;

    inc(kursor);

  end;

  Close(FTmp);

  Close(t);

end; 

{Окно поиска  по клиенту}

Function SelectCardsClient(AFileName:string; AFileFTmp:string):boolean;

var

  t : file of TCards;

  FTmp : file of TCards;

  Cards, ftmps : Tcards;

  iskomoe : string;

Begin

SelectCardsClient:=False;

  {Проверка на существование файла БД}

  ClrScr;

  Assign(t,AFileName);

  Reset(t);

  Assign(FTmp,FileFTmp);

  Rewrite(FTmp);

  {Запрашиваем данные для поиска данных}

  Write('Введите полные или начальные параметры для поиска:  ');

  Readln(iskomoe);

  Close(FTmp);

  Close(t);

  {Выполним поиск и запишем результат в файл FTmp.dat}

  FSelect(AFileName, AFileFTmp, iskomoe, 0);

  {Выводим на  экран полученный результат}

  ClrScr;

  FShowFile(AFileFTmp);

  WriteLn('Для выхода  нажмите любую клавишу...');

  ReadKey;

end; 
 

{Окно поиска  по № карты}

Function SelectCardsNo(AFileName:string; AFileFTmp:string):boolean;

var

  FTmp, t : file of TCards;

  Cards, ftmps : Tcards;

  iskomoe: string;

  v : boolean;

Begin

  SelectCardsNo:=False;

  {Проверка на существование файлов}

  If Not FileExists(AFileName) then Exit;

  ClrScr;

  Assign(t,AFileName);

  Reset(t);

  Assign(FTmp,FileFTmp);

  Rewrite(FTmp);

  {Запрашиваем №карты для ее поиска с обязательной проверкой верности введенных данных}

  Repeat

    Write('Введите  точный номер карты (6 цифр):  ');

    Readln(iskomoe);

    v:= FIntTrue (iskomoe,6);

  until v=True;

  Close(FTmp);

  Close(t);

  {Выполним поиск  и запишем результат в файл FTmp.dat}

  FSelect(AFileName, AFileFTmp, iskomoe, 1);

  {Выводим на  экран полученный результат}

  ClrScr;

  FShowFile(AFileFTmp);

  WriteLn('Нажмите  любую клавишу...');

  ReadKey;

end; 

{Окно поиска  данных по типу топлива}

Function SelectCardsGoodType(AFileName:string; AFileFTmp:string):boolean;

var

  t : file of TCards;

  FTmp : file of TCards;

  Cards, ftmps : Tcards;

  kursor, f_size: Longint;

  a:char;

  b,n:integer;

  iskomoe: string;

  v : boolean;

Begin

  SelectCardsGoodType:=False;

  {Проверка на существование файлов}

  If Not FileExists(AFileName) then Exit;

  ClrScr;

  Assign(t,AFileName);

  Reset(t);

  Assign(FTmp,FileFTmp);

  Rewrite(FTmp);

  {Предлогаем выбрать тип топлива}

  repeat

    begin

      ClrScr;

      WriteLn(' Пожалуйста выберите тип  топлива:');

      WriteLn;

      WriteLn ('<1> "АИ-80"');

      WriteLn;

      WriteLn ('<2> "АИ-92"');

      WriteLn;

      WriteLn ('<3> "АИ-95"');

      WriteLn;

      WriteLn ('<4> "Дт"');

      WriteLn;

      WriteLn;

      WriteLn ('<Esc> Выход.');

      a:=ReadKey;

      b:=ord(a);

      case b of

        49 : iskomoe:='"АИ-80"';

        50 : iskomoe:='"АИ-92"';

        51 : iskomoe:='"АИ-95"';

        52 : iskomoe:='"ДТ"';

        27 : Exit;

      end;

    end;

  until (b=49) or (b=50) or (b=51) or (b=52) or (b=27);

  Close(FTmp);

  Close(t);

  {Выполним поиск и запишем результат в файл FTmp.dat}

  FSelect(AFileName, AFileFTmp, iskomoe, 2);

  {Выводим на  экран полученный результат}

  ClrScr;

  FShowFile(AFileFTmp);

  WriteLn('Для выхода  нажмите любую клавишу...');

  ReadKey;

end; 

{Функция удаления  карты из БД}

Function FDelCardsNo(AFileName:string; AFTmp : string):boolean;

Var

  t,FTmp,temp: File of TCards;

  Cards : TCards;

  kursor, n : integer;

  iskomoe1,iskomoe2 : string;

  otvet: char;

begin

FDelCardsNo:=False;

  SelectCardsNO(AFileName, AFTmp);

  Assign(FTmp,FileFTmp);

  Reset(FTmp);

  If FileSize(FTmp)=0 then begin

    WriteLn('Внимание! Нет данных для удаления!!!');

    Close(FTmp);

    ReadKey;

    Exit;

  end

  else begin

    repeat

      Write ('Вы действительно хотите  их удалить? <0>-ДА, <1>-НЕТ :  ');

      readln (otvet);

      if ord(otvet)=49 then EXIT;

    until ord(otvet)=48;

  end;

  Assign(t,AFileName);

  Reset(t);

  Assign(temp,'Temp.dat');

  Rewrite(temp);

  kursor:=0;

  Read(FTmp,Cards);

  iskomoe1:=Cards.CardNo;

  while NOT EOF(t) do begin

    seek(t,kursor);

    Read(t,Cards);

    iskomoe2:=Cards.CardNo;

    If iskomoe2<>iskomoe1 then begin

      write(temp,Cards);

    end;

    inc(kursor);

  end; 

  If FileSize(temp)<>0 then FDelCardsNo:=True;

  Close(t);

  Close(FTmp);

  Close(temp);

  Erase(t);

  Rename(temp, AFileName);

  WriteLn;

  WriteLn ('Запись  успешно удалена');

  WriteLn;

  WriteLn ('Нажмите  любую клавишу...');

  ReadKey;

end; 

{Функция добавления  записи в файл БД, если его  нет, то программа создаст его}

Function FAddCards (AFilename:string):boolean;

var

  t : File of TCards;

Програмирование на языке высокого уровня