Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2017, 14:46   #1
igra17
Пользователь
 
Регистрация: 19.06.2017
Сообщений: 12
По умолчанию [РЕШЕНО][Pascal] Добавление элемента в списках

Здравствуйте! у меня такая задача:
Структура элемента однонаправленного списка SPI: Фамилия И.,О., табельный номер, стаж работы, оклад, специальность, указатель.

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

Не могу понять как сделать добавление элемента в начало списка и как найти среднее значение

Код:
uses crt;
type
Student=Record fio:string[50];
 tab_n:string[10];st:string[2];okl:string[10];spec:string[30];end;
list=^elem;
elem=record;
inf:Student;
next:list;
end;
var
a_head, a_last : list; sposob: integer; t:boolean; s:string;

//СОЗДАНИЕ СПИСКА
procedure create(var last:list; var head:list);
var
p:list;
y : char;
begin
head:=nil;
repeat
new(p);
write('Введите фамилию ИО: '); readln(p^.inf.fio);
write('Введите табельный №: '); readln(p^.inf.tab_n);
write('Введите стаж работы: '); readln(p^.inf.st);
write('Введите оклад: '); readln(p^.inf.okl);
write('Введите специальность: '); readln(p^.inf.spec);
if head=nil then begin
head:=p;
last:=p;
end
else begin
last^.next:=p;
last:=p;
end;
writeln('Это всё? (y/...) ');readln(y);
until y = 'y';
end;

//ВЫВОД СПИСКА
procedure print( var head:list);
var
p:list;
begin
if head=nil then writeln('Списка нет')
else begin
p:=head;
while p<>nil do begin
      write('Фамилия ИО: ',p^.inf.fio);write(' Табельный №: ',p^.inf.tab_n);write(' Стаж работы: ',p^.inf.st);
write(' Оклад: ',p^.inf.okl);writeln(' Специальность: ',p^.inf.spec);
p:=p^.next;
end;
end;
end;

 //ПЕЧАТЬ ФАМИЛИЙ И ОКЛАДОВ
procedure pechat( var head:list);
var
p:list;
begin
if head=nil then writeln('Списка нет')
else begin
p:=head;
while p<>nil do begin
      write('Фамилия ИО: ',p^.inf.fio);
write(' Оклад: ',p^.inf.okl);
p:=p^.next;
end;
end;
end;

//УДАЛЕНИЕ ПО ТАБЕЛЬНОМУ НОМЕРУ
procedure del_t(var last:list; var head:list);
var
p,d:list;
begin
p:=head;

if (head^.inf.tab_n=s) and (head^.next=nil)  then
begin
dispose(head);
t:=false;
end
else begin
if head^.next=nil then t:=false;
if head^.next<>nil then begin

if head^.inf.tab_n=s  then
begin
head:=p^.next;
dispose(p);
t:=true;
end
else begin
repeat
if p^.next^.inf.tab_n=s then
begin t:=true;d:=p^.next;
p^.next:=d^.next;
dispose(d);
end
else p:=p^.next;
until (p^.next=last) or (p=last) or (p^.next=nil) ; t:=false;
if p=head then last:=p;
if (last^.inf.tab_n=s) and (p<>last) then
begin
p^.next:=nil;dispose(last); last:=p; t:=false;
end;
if (p^.inf.tab_n=s) and (p<>last) then
begin
d:=p^.next;d^.next:=nil;dispose(p); last:=d; t:=false;
end;
end;
end;
end;
end;

//ГЛАВНЫЙ
begin
clrscr;
create (a_last, a_head);
Writeln ('Ваш список:');
print(a_head);
Repeat
Repeat
Writeln ('Что вы хотите сделать?:', #10, #13 ,'1.Добавить элементы', #10, #13 ,'2.Удалить элементы по табельному номеру', #10, #13 ,'3.Вывести на печать фамилии и оклады', #10, #13,'4.Ничего');
readln(sposob);
until (sposob>=1) and (sposob<= 5);
Case sposob of

2: begin
Writeln ('Удаление элементов по табельному номеру:');
write('Введите табельный номер: '); readln(s); repeat del_t (a_last, a_head); until t=false;
Writeln ('Новый список:');
print(a_head);
end;
3: begin
Writeln ('Вывод фамилий и окладов :');
pechat(a_head);
end;
end;
readln;
until sposob=4;
readln;
end.
Решения:
http://www.programmersforum.ru/showp...11&postcount=2

И

http://www.programmersforum.ru/showp...21&postcount=4

Последний раз редактировалось Вадим Мошев; 11.05.2018 в 19:18.
igra17 вне форума Ответить с цитированием
Старый 19.06.2017, 15:11   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

перед копированием текста в буфер обмена включите русскую раскладку на клавиатуре, чтобы русский текст не терялся.

Цитата:
Сообщение от igra17 Посмотреть сообщение
Не могу понять как сделать добавление элемента в начало списка
я бы так попробовал:
Код:
// Добавление в начало списка
procedure add_to_head(var head, last:list);
var
  p:list;
begin
    new(p);
    write('Введите фамилию ИО: '); readln(p^.inf.fio);
    write('Введите табельный є: '); readln(p^.inf.tab_n);
    write('Введите стаж работы: '); readln(p^.inf.st);
    write('Введите оклад: '); readln(p^.inf.okl);
    write('Введите специальность: '); readln(p^.inf.spec);
    if head = nil then begin
      head := p;
      last := p;
    end
    else begin
      p^.next := head;
      head := p;
    end;
end;
P.s. обратите внимание, в параметрах процедуры сначала HEAD, потом LAST - мне кажется, так логичней. если не нравится - переставьте наоборот.

Последний раз редактировалось Вадим Мошев; 19.06.2017 в 23:22.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.06.2017, 15:41   #3
igra17
Пользователь
 
Регистрация: 19.06.2017
Сообщений: 12
По умолчанию

Спасибо большое!
igra17 вне форума Ответить с цитированием
Старый 19.06.2017, 15:48   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от igra17 Посмотреть сообщение
найти среднее значение оклада для лиц со стажем 12 лет
Цитата:
Код:
    st: string[2];
    okl: string[10];
а чего у Вас стаж и оклад строковые поля?
там может быть записано стаж ХЗ и оклад "МНОГО" ?
или для чего так сделано?
это должны быть числовые поля.

а по сути - среднее посчитать легко:
Код:
//ВЫВОД среднее значение оклада для лиц со стажем 12 лет
procedure print(var head: list);
var
  p: list;
  sum : real;
  count:integer;
begin
  if head = nil then writeln('Cписка нет')
  else begin
    p := head;
    sum := 0.0;
    count := 0;
    while p <> nil do begin
      if StrToInt(p^.inf.st)=12 then begin inc(count); sum:= sum+StrToFloat(p^.inf.okl); end;
      p := p^.next;
    end;
    if count=0 then WriteLn('Нет никого со стажем 12 лет ровно')
    else WriteLn('Средний оклад работников со стажем 12 лет равен', sum/count:0:2)
  end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.06.2017, 16:14   #5
igra17
Пользователь
 
Регистрация: 19.06.2017
Сообщений: 12
По умолчанию

Огромное Вам спасибо, вы мне очень помогли!
igra17 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Решено]: Как прикрепить вложенный div к верху родительского элемента div? Женя32 HTML и CSS 2 29.09.2016 13:24
Добавление элемента в treeView Maray C# (си шарп) 6 24.08.2016 20:17
Добавление нового элемента Вероника99 Помощь студентам 7 24.12.2013 17:12
Добавление элемента в массив. Prin53 Общие вопросы по Java, Java SE, Kotlin 1 21.12.2012 01:56
комплексные числа в списках на pascal world12_tk Помощь студентам 1 27.03.2009 16:35