Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Паскаль. Соритровка двумерного массива. Где ошибка?

Автор: Pork6 8.10.2008 1:52

Доброго вам времени суток!

Сейчас работаю над заданием, которое выглядит так:

Дан список группы в 10 человек в виде:

ФАМИЛИЯ: 14 символов (13+1 пробел)
ПОЛ: 2 символа (1+1 пробел)
РЕЗУЛЬТАТЫ_СЕССИИ: 4 символа

Всего в строке 20 символов.

Данные в одной строке отделяются друг от друга пробелами. Например:
Иванов________м_4455
Петрова_______ж_3554
………………………….
Отсортировать по убыванию среднего балла мужчин и женщин по отдельности. Список брать из файла и сохранить в файл. Процедуры, функции и string-и не использовать. Реализовать программу через сортировку двумерного массива.


Вот что я написал:



program Zachet1;

type massC=array[1..10,1..20] of char;

var A:massC;
C:massC;
my1,my2,i,j:integer;
myin,myout:text;

begin

assign (myin, 'INPUT.TXT');
assign (myout, 'OUTPUT.TXT');
reset (myin);
rewrite (myout);

for i:=1 to 10 do
begin
for j:=1 to 20 do
read(myin,A[i,j]);
readln(myin);
end;

for i:=1 to 10 do {перевожу 4 цифры в числовой тип и сортирую по убыванию}
for j:=1 to 20 do
begin
my1:= (ord(A[i,17])-48)+(ord(A[i,18])-48)+(ord(A[i,19])-48)+(ord(A[i,20])-48);
my2:= (ord(A[i+1,17])-48)+(ord(A[i+1,18])-48)+(ord(A[i+1,19])-48)+(ord(A[i+1,20])-48);
if my1<my2
then
begin
C[i,j]:=A[i,j];
A[i,j]:=A[i+1,j];
A[i+1,j]:=C[i,j];
i:=i+1;
end;
end;

for i:=1 to 10 do {вывожу мужской пол}
begin
if (A[i,15]='м') then
begin
for j:=1 to 20 do
write(myout,A[i,j]);
writeln(myout)
end;
end;

for i:=1 to 10 do {вывожу женский пол}
begin
if (A[i,15]='ж') then
begin
for j:=1 to 20 do
write(myout,A[i,j]);
writeln(myout);
end;
end;

close(myin);
close(myout);

end.




Но программа не работает.

Пожалуйста, помогите исправить ошибку. Заранее спасибо.

P.S. Файл "INPUT.TXT" приложил, "OUTPUT.TXT" программа создаст сама.


Прикрепленные файлы
Прикрепленный файл  INPUT.TXT ( 218 байт ) Кол-во скачиваний: 280

Автор: volvo 8.10.2008 2:02

Цитата
Где ошибка?
Здесь:
for i:=1 to 10 do
for j:=1 to 20 do
begin
my1:= (ord(A[i,17])-48)+(ord(A[i,18])-48)+(ord(A[i,19])-48)+(ord(A[i,20])-48);
my2:= (ord(A[i+1,17])-48)+(ord(A[i+1,18])-48)+(ord(A[i+1,19])-48)+(ord(A[i+1,20])-48);
if my1<my2
then
begin
C[i,j]:=A[i,j];
A[i,j]:=A[i+1,j];
A[i+1,j]:=C[i,j];
i:=i+1; { <--- Можно объяснить на словах, чего ты хочешь добиться этим??? }
end;
end;

То действие, которое я отметил, запрещено. Нельзя менять переменную цикла самостоятельно...

Автор: Pork6 8.10.2008 2:07

Ой, это я так ловко на следующую строчку хотел перейти... Но для этого есть Цикл for. Согласен.

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

Почему?

Автор: мисс_граффити 8.10.2008 2:10

Зачем переменную цикла (i) внутри цикла меняешь?
И вообще обмен неправильно реализован.
Попробуй сам понять, ЗАЧЕМ нужны 2 цикла при обмене. И как они работают.

Автор: Pork6 8.10.2008 2:25

Я не очень глупый человек, и, естественно, перед тем, как постить что-то на форум, не раз менял и изменял код.

Изучал, анализировал.

Ну и наконец пришел к мертвой точке, когда вроде все правильно, а ничего не работает.

Ну и за помощью я сюда и пришел. Так что можете мне конкретно показать ошибку, которую я найти, увы, не могу.

2 мисс_граффити: Можно попробовать убрать перебор по j, оставив только i (т.е. только по строчкам), но опять же сортировка не работает.

Автор: volvo 8.10.2008 2:36

Цитата
Можно попробовать убрать перебор по j, оставив только i (т.е. только по строчкам), но опять же сортировка не работает.
Не надо ничего пробовать просто так... Ты должен делать только то, что понимаешь, как работает. Зайди вот сюда: http://forum.pascal.net.ru/index.php?s=&showtopic=3065&view=findpost&p=27328 , посмотри, как реализуется сортировка "пузырьком", и сравни с тем, что делаешь ты...

Хинт: тебе надо отсортировать строки... Все, больше ничего... Условие, при котором строки меняются местами, у тебя почти правильное ("почти" - потому, что с твоим условием это будет сортировка по возрастанию, а не по убыванию)... Над остальным - подумай...

Добавлено через 9 мин.
P.S. Хинт №2: не считай массив A двумерным. Его можно сделать одномерным быстрее, чем ты думаешь...

Смотри:
type
massC=array[1..20] of char;
massA=array[1..10] of massC;

var
A:massA;
C:massC;
... Теперь тебе надо отсортировать одномерный массив A (неважно, элементы какого типа он содержит, это не играет никакой роли, сортировка будет совершенно идентична при любом типе элементов...) при помощи дополнительной переменной типа massC... Все как в примере по ссылке... Теперь понятнее?

Автор: Pork6 8.10.2008 2:51

1) Хинт №2. Я в Паскале не очень, отсюда и вопрос - как загнать файл в 2 массива? Или его уже готовый нужно будет разбить на 2 части?

2) А на каком языке, я извиняюсь, написан пример в FAQ? Я таких операторов раньше не видел, сам пишу на Turbo Pascal (извиняюсь, что забыл сие уточнить).

P.S. Спасибо за помощь.

Автор: volvo 8.10.2008 4:29

Цитата
как загнать файл в 2 массива? Или его уже готовый нужно будет разбить на 2 части?
Работа с тем массивом A, который описал я, ничем не отличается от того, что описал ты. Это совершенно идентичные массивы, просто с моим описанием легче воспринять то, что с A можно работать и как с одномерным... Так что код заполнения массива данными из файла не будет меняться вообще...

Цитата
А на каком языке, я извиняюсь, написан пример в FAQ? Я таких операторов раньше не видел, сам пишу на Turbo Pascal
На Паскале он написан... Проверялось и на Турбо Паскале тоже. Что именно ты не видел? Функцию Pred? Ну, замени Pred(j) на (j - 1)... Так будет понятнее?