Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 19.06.2017, 15:46   #1
igra17
Пользователь
 
Регистрация: 19.06.2017
Сообщений: 12
Репутация: 10
По умолчанию [РЕШЕНО][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.


Последний раз редактировалось igra17; 19.06.2017 в 16:24.
igra17 вне форума   Ответить с цитированием
Старый 19.06.2017, 16:11   #2
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 22,796
Репутация: 5078
По умолчанию

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

Цитата:
Сообщение от 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 - мне кажется, так логичней. если не нравится - переставьте наоборот.

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

Спасибо большое!
igra17 вне форума   Ответить с цитированием
Старый 19.06.2017, 16:48   #4
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 22,796
Репутация: 5078
По умолчанию

Цитата:
Сообщение от 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, 17:14   #5
igra17
Пользователь
 
Регистрация: 19.06.2017
Сообщений: 12
Репутация: 10
По умолчанию

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



Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Решено]: Как прикрепить вложенный div к верху родительского элемента div? Женя32 HTML и CSS 2 29.09.2016 14:24
Добавление элемента в treeView Maray C# (си шарп) 6 24.08.2016 21: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 17:35




23:48.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru