Линейный список: картотека абонентов междугородной телефонной станции - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Здавствуйте помогите с решением!? На междугородной телефонной станции картотека абонентов,содержащая сведения о телефонах и их владельцах,организована как линейный список. составить программу, которая:
  • обеспечивает начальное формирование картотеки в виде линейного списка;
  • производит вывод всей картотеки;
  • водит номер телефона и время разговора;
  • выводит извещение на оплату телефонного разговора.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.

Решение задачи: «Линейный список: картотека абонентов междугородной телефонной станции»

textual
Листинг программы
uses crt;
type  PList = ^TList;
  TList = record
    nmb: integer;
    name: string[20];
    next: PList;
  end;
  
procedure addAb(var head: plist; dob: integer;n: string[20]);
var
  cur: plist;
begin
  new(cur);
  cur^.next := head;
  cur^.nmb := dob;
  cur^.name:=n;
  head := cur;
end;
 
var
  tm1,tm2,i,n,m,rub,cop,nmb: integer;
  name: string[20];
  head,f: PList;
  b: boolean;
begin
  b:=false;
  write('Сколько абонентов в картотеке? ');
  readln(n);
  for i:=1 to n do
      begin
      write('Введите фамилию абонента: ');
      readln(name);
      write('Введите 6-ти значный номер телефона абонента: ');
      readln(nmb);
      addab(head,nmb,name);
    end;
  f:=head;
  writeln;
  writeln('|-----------------------------------------------|');
  writeln('|             КАРТОТЕКА  АБОНЕНТОВ              |');
  writeln('|-----------------------------------------------|');
  writeln('|     Ф. И. О.                |     Телефон     |');
  writeln('|-----------------------------------------------|');
  for i:=1 to n do
    begin
      write('|  ',f^.name,' ':20-length(f^.name));
      writeln('       | ',f^.nmb:13,'   |');
      writeln('|-----------------------------------------------|');
   f:=f^.next;
   end;
  writeln;
  
  write('Введите номер расчитываемого абонента: ');
  readln(m);
  write('Введите время разговора (минуты, секунды через пробел): ');
  repeat
    readln(tm1,tm2);
  until (tm1 in [1..59])and(tm2 in [1..59]);
  writeln('Секунда разговора стоит 5 копеек');
  tm1:=tm1*60+tm2;
  rub:=tm1*5 div 100;
  cop:=tm1*5 mod 100;
  for i:=1 to n do
   begin 
    if head^.nmb=m then
     begin
     writeln('С абонента ',head^.name,' взимается плата ',rub,' руб. ',cop,' коп.');
      b:=true;
     end;
    head:=head^.next;
    end;
  if b=false then
   writeln('Данный абонент не зарегистрирован в картотеке');
  readln;
end.

Объяснение кода листинга программы

  1. Объявлены переменные:
    • tm1, tm2, i, n, m, rub, cop, nmb - целочисленные;
    • name - строковая массив;
    • head, f - указатели на PList;
    • b - логический.
  2. Задается вопрос, сколько абонентов в картотеке.
  3. В цикле запрашиваются данные (фамилия, номер телефона) и добавляются в начало списка.
  4. Голова списка указывается на первый элемент списка.
  5. Выводится шапка таблицы.
  6. В цикле выводятся данные абонентов в формате таблицы.
  7. Запрашивается номер абонента для расчета.
  8. Запрашивается время разговора.
  9. В цикле запрашиваются данные о времени разговора.
  10. Рассчитывается стоимость разговора в рублях и копейках.
  11. В цикле по списку проверяется, совпадает ли номер телефона с номером абонента для расчета.
  12. Если номер телефона совпадает, выводится сообщение о стоимости разговора.
  13. Если ни один абонент не подходит под расчет, выводится сообщение, что абонент не зарегистрирован в картотеке.
  14. Программа ожидает ввода, чтобы пользователь мог увидеть результат.

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы