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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2008, 19:03   #1
vAdiM_Kubski
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 16
По умолчанию Сортировка,функции.

Сразу хочу сказать, что задача простая, и что без использования функции ее очень легко решить, но у меня конкретное задание - решить эту задачу с использованием функции.

Условие: Даны массивы фамилий - Fam[n] и номеров бригад - Nbr[n] и матрица зарплат за 12 месяцев - Zrp[n,m].
Задание: Напечатать список сотрудников в порядке убывания их среднемесячных зарплат, используя для вычисления среднемесячной з/п функцию.

Если не использовать функцию, то правильное решение это -

program lab6v1;
uses crt;
const
n=5;
m=12;
var
Fam:array [1..n] of string[10];
Nbr:array [1..n] of integer;
Z:array [1..n,1..m] of real;
SR:array [1..n] of real;
i,j,l,Nmin,nb:integer;
sum,s:real;
fm:string;
begin
clrscr;
for i:=1 to n do
begin
write('vvedite familiu:');readln(Fam[i]);
write('vvedite nomer brigadi:');readln(Nbr[i]);
writeln('vvedite ',m,' z/p');
for j:=1 to m do read(Z[i,j]);readln;
end;
for i:=1 to n do
begin
sum:=0;
for j:=1 to m do sum:=sum+Z[i,j];
SR[i]:=sum/m;
end;
for i:=1 to n-1 do
begin
Nmin:=i;
for l:=i+1 to n do
if SR[l]>SR[Nmin] then Nmin:=l;
s:=SR[i];SR[i]:=SR[Nmin];SR[Nmin]:=s;
fm:=Fam[i];Fam[i]:=Fam[Nmin];Fam[Nmin]:=fm;
nb:=Nbr[i];Nbr[i]:=Nbr[Nmin];Nbr[Nmin]:=nb;
end;
for i:=1 to n do
writeln(Nbr[i],' ',Fam[i]:10,' ',SR[i]:9:2);
readkey
end.

С использованием функции я дошел только до такого:

program lab8v1;
uses crt;
const n=5;m=12;
var
Fam:array [1..n] of string[10];
Nbr:array [1..n] of integer;
Zrp:array [1..n,1..m] of real;
l,Nmin,i,j,nb:integer;
fm:string;
function SRED(i:integer):real;
var j:integer;sum:real;
begin
sum:=0;
for j:=1 to m do sum:=sum+Zrp[i,j];
SRED:=sum/m;
end;
BEGIN
clrscr;
for i:=1 to n do
begin
write('vvedite familiu:');readln(Fam[i]);
write('vvedite nomer brigadi:');readln(Nbr[i]);
writeln('vvedite ',m,' z/p');
for j:=1 to m do read(Zrp[i,j]);readln;
end;
for i:=1 to n-1 do
begin
Nmin:=i;
for l:=i+1 to n do
if SRED(l)>SRED(Nmin) then Nmin:=l;
fm:=Fam[i];Fam[i]:=Fam[Nmin];Fam[Nmin]:=fm;
nb:=Nbr[i];Nbr[i]:=Nbr[Nmin];Nbr[Nmin]:=nb;
end;
for i:=1 to n do writeln(Nbr[i],' ',Fam[i]);
readkey
end.

Но очевидно, что это неправильно т.к. в результате у меня он сортирует только первых двух сотрудников...

Просто не знаю как применить сортировку к функции, наверняка это легко - кто знает подскажите (=

Последний раз редактировалось vAdiM_Kubski; 28.12.2008 в 19:09.
vAdiM_Kubski вне форума Ответить с цитированием
Старый 28.12.2008, 20:57   #2
vAdiM_Kubski
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 16
По умолчанию

что, никто не знает ?
vAdiM_Kubski вне форума Ответить с цитированием
Старый 28.12.2008, 22:00   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Попробуйте так:
Код:
program lab8v1;
uses crt;
const n=5;m=12;
var
Fam:array [1..n] of string[10];
Nbr:array [1..n] of integer;
Zrp:array [1..n,1..m] of real;
l,Nmin,i,j,nb:integer;
fm:string;

function SRED(i:integer):real;
var j:integer;
 sum:real;
 begin
 sum:=0;
 for j:=1 to m do sum:=sum+Zrp[i,j];
 SRED:=sum/m;
 end;

BEGIN
clrscr;
for i:=1 to n do
 begin
 write('vvedite familiu:');readln(Fam[i]);
 write('vvedite nomer brigadi:');readln(Nbr[i]);
 writeln('vvedite ',m,' z/p');
 for j:=1 to m do read(Zrp[i,j]);readln;
 end;

{ randomize;
  for i:=1 to n do
  begin
  str(i,Fam[i]);
  Nbr[i] := i;
  writeln(Fam[i]);
  for j:=1 to m do
   begin
   Zrp[i,j] := random(100);
   write(zrp[i,j]:5:1);
   end;
   writeln;
  end;
writeln;    }

{for i:=1 to n do
 writeln(Fam[i],'   ',SRED(i):5:2);
 writeln;        }

for i:=1 to n-1 do
 begin
 Nmin:=i;
  for l:=i+1 to n do
   if SRED(l)>SRED(i) then
    begin
   fm:=Fam[i];
   Fam[i]:=Fam[l];
   Fam[l]:=fm;
   nb:=Nbr[i];
   Nbr[i]:=Nbr[l];
   Nbr[l]:=nb;
    end;
 end;
for i:=1 to n do writeln(Nbr[i],' ',Fam[i]);
readkey
end.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 28.12.2008, 22:10   #4
vAdiM_Kubski
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 16
По умолчанию

не понял, если просто скопировать это в паскаль то получится тоже самое что и было, что логично потому что стоят {} но если их убрать то результата не получается
vAdiM_Kubski вне форума Ответить с цитированием
Старый 28.12.2008, 22:16   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
не понял, если просто скопировать это в паскаль то получится тоже самое что и было, что логично потому что стоят {}
Вы бы сначала посмотрели, что я изменил.
То, что закомменчено - код для проверки. Как-то не очень хочется вбивать 12 чисел для 5 имен, когда этот процесс можно автоматизировать.
Могу даже подсказать, где искать то, что я имзенил:
Код:
for i:=1 to n-1 do
 begin
 Nmin:=i;
  for l:=i+1 to n do
   if SRED(l)>SRED(i) then
    begin
   fm:=Fam[i];
   Fam[i]:=Fam[l];
   Fam[l]:=fm;
   nb:=Nbr[i];
   Nbr[i]:=Nbr[l];
   Nbr[l]:=nb;
    end;
 end;
И еще:
Цитата:
но если их убрать то результата не получается
А вы запускали программу в том виде, в котором я выложил? У меня, например, все работает.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 28.12.2008, 22:24   #6
vAdiM_Kubski
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 16
По умолчанию

я так понимаю следует убрать тогда Nmin:=i
после того как я это убрал - заработало
сейчас проверю еще разок
vAdiM_Kubski вне форума Ответить с цитированием
Старый 28.12.2008, 22:29   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
я так понимаю следует убрать тогда Nmin:=i
Да, это можно убрать. Но на результат это никак не повлияет.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 28.12.2008, 22:30   #8
vAdiM_Kubski
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 16
По умолчанию

глюк какой-то
всё верно если средняя зарплата и номер бригады не совпадают
но если ввести так, что номер бригады и среднее значение будут совпадать, то сортируется только часть
vAdiM_Kubski вне форума Ответить с цитированием
Старый 28.12.2008, 22:36   #9
vAdiM_Kubski
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 16
По умолчанию

всё равно огромное спасибо!
vAdiM_Kubski вне форума Ответить с цитированием
Старый 28.12.2008, 22:57   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
всё верно если средняя зарплата и номер бригады не совпадают
но если ввести так, что номер бригады и среднее значение будут совпадать, то сортируется только часть
Странно.. Не должно быть такого..
Сейчас потестил (используя генератор) - действительно, иногда работает некорректно (номера бригад там от 1 до 5, со сред. з/п не совпадало). Но причину пока не нашел. Если разберусь - напишу.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка Шелла и Шейкер-сортировка AleksandrMakarov Паскаль, Turbo Pascal, PascalABC.NET 11 11.03.2012 12:18
Сортировка fedya Помощь студентам 3 26.11.2007 18:24
1. Сортировка Шелла по убыванию 2. Сортировка вставками по убыванию Arkuz Помощь студентам 1 25.09.2007 17:16