Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Подскажите, где ошибка (http://www.tehnari.ru/f41/t52367/)

Павел-14 28.05.2011 14:31

Подскажите, где ошибка
 
редставить данные о кафедрах института в виде массива записей со структурой :

кафедра
номер кафедры
ЗавКафедры
кол-во сотрудников
1)напишите процедуры заполнения/вывода содержимого данного массива
2)напишите процедуру вывода сведений о кафедрах на которых работает не более N человек в формате ( номер кафедры : кол-во сотрудников).
список должен быть отсортирован в порядке возрастания числа сотрудников.


задача все делает ,но не по порядку возрастания числа сотрудников. преподаватель сказал одну стоку поменять что то не очень понимаю какую .
type
sot=record
kaf:string;
num_K:integer;
zav_K:string;
kol_sot:integer;
end;
mas=array[1..3] of sot;
var
m:mas;
n:integer;

procedure zap(var m:mas);
var
i:integer;
begin
for i:=1 to 3 do begin
write('kafedra? ');
readln(m[i].kaf);
write('zaved_Kaf? ');
readln(m[i].zav_K);
write('kol_sotr? ');
readln(m[i].kol_sot);
write('nomer_kaf? ');
readln(m[i].num_K);
end;
end;

procedure vivod (var m:mas);
var a:mas;i,k:integer;r:sot;
begin
for i:=1 to n do
begin
a[k]:=m[i];
for i:=1 to n-1 do
if m[i+2].kol_sot<m[i+1].kol_sot then
begin
r:=m[i+1];
m[i+1]:=m[i];
m[i]:=r
end;
end;
for i:=1 to 3 do
begin
writeln('Êàôåäðà:',m[i].kaf);
writeln ('Çàâ:',m[i].zav_K);
writeln ('Êîë-âî:',m[i].kol_sot);
writeln ('¹',m[i].num_K);
end;
end;

begin
zap(m);
vivod (m);
end.

Vladimir_S 28.05.2011 20:02

Вынужден с сожалением констатировать, что процедура упорядочения и вывода содержит грубейшие ошибки:

Цитата:

begin
for i:=1 to n do
Что такое n? Чему равно? Эта переменная только объявлена в списке глобальных, но нигде никакое значение ей не присвоено. Вероятно, подразумевается, что n=3? Тогда следовало ее делать не переменной, а константой, и в начале программы написать
Const
n=3;
а потом всюду явные тройки убрать, заменив их на n.
Цитата:

begin
a[k]:=m[i];
Вот опять - "из рукава" вынимается переменная k с неопределенным значением. И вообще - в чем смысл массива а и приведенной строки? Дальше нигде это a, равно как и k, не используется.
Цитата:

for i:=1 to n-1 do
if m[i+2].kol_sot<m[i+1].kol_sot then
Если n=3, то при i=n-1 m[i+2]=m[4], то есть имеет место выход за границы массива, что неизбежно приведет к ошибке выполнения программы.
Еще ошибка: в процедуре vivod параметр m является входным, а не выходным, а потому var перед ним - не допустим. И вообще, именовать параметры подпрограмм одинаково с глобальными хоть и допустимо, но является дурным тоном и приводит к путанице и ошибкам. В случае процедуры vivod на мой взгляд параметр вообще не нужен, поскольку вы работаете с глобальным массивом m.
Предлагаю вариант грамотной реализации:
Код:

procedure vivod;
var
 i,j:integer;
 r:sot;
begin
 for j:=1 to n do
  for i:=1 to n-j do
  if m[i+1].kol_sot<m[i].kol_sot then
    begin
    r:=m[i+1];
    m[i+1]:=m[i];
    m[i]:=r
    end;
 for i:=1 to n do
  begin
  writeln('Êàôåäð&#224  ;:',m[i].kaf);
  writeln ('Çàâ:',m[i].zav_K);
  writeln ('Êîë-âî:',m[i].kol_sot);
  writeln  ('¹',m[i].num_K);
  end;
end;



Часовой пояс GMT +4, время: 08:02.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.