Линейный список: картотека абонентов междугородной телефонной станции - 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.
Объяснение кода листинга программы
- Объявлены переменные:
- tm1, tm2, i, n, m, rub, cop, nmb - целочисленные;
- name - строковая массив;
- head, f - указатели на PList;
- b - логический.
- Задается вопрос, сколько абонентов в картотеке.
- В цикле запрашиваются данные (фамилия, номер телефона) и добавляются в начало списка.
- Голова списка указывается на первый элемент списка.
- Выводится шапка таблицы.
- В цикле выводятся данные абонентов в формате таблицы.
- Запрашивается номер абонента для расчета.
- Запрашивается время разговора.
- В цикле запрашиваются данные о времени разговора.
- Рассчитывается стоимость разговора в рублях и копейках.
- В цикле по списку проверяется, совпадает ли номер телефона с номером абонента для расчета.
- Если номер телефона совпадает, выводится сообщение о стоимости разговора.
- Если ни один абонент не подходит под расчет, выводится сообщение, что абонент не зарегистрирован в картотеке.
- Программа ожидает ввода, чтобы пользователь мог увидеть результат.