• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Подскажите, где ошибка

Павел-14

Ученик
Регистрация
23 Май 2011
Сообщения
4
Реакции
0
Баллы
0
Подскажите, где ошибка

редставить данные о кафедрах института в виде массива записей со структурой :

кафедра
номер кафедры
ЗавКафедры
кол-во сотрудников
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.kaf);
write('zaved_Kaf? ');
readln(m.zav_K);
write('kol_sotr? ');
readln(m.kol_sot);
write('nomer_kaf? ');
readln(m.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;
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;
m:=r
end;
end;
for i:=1 to 3 do
begin
writeln('Êàôåäðà:',m.kaf);
writeln ('Çàâ:',m.zav_K);
writeln ('Êîë-âî:',m.kol_sot);
writeln ('¹',m.num_K);
end;
end;

begin
zap(m);
vivod (m);
end.
 
Вынужден с сожалением констатировать, что процедура упорядочения и вывода содержит грубейшие ошибки:

Что такое n? Чему равно? Эта переменная только объявлена в списке глобальных, но нигде никакое значение ей не присвоено. Вероятно, подразумевается, что n=3? Тогда следовало ее делать не переменной, а константой, и в начале программы написать
Const
n=3;
а потом всюду явные тройки убрать, заменив их на n.
Вот опять - "из рукава" вынимается переменная 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;
 
Назад
Сверху