Доброго вам времени суток!
Сейчас работаю над заданием, которое выглядит так:
Дан список группы в 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.
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;
Ой, это я так ловко на следующую строчку хотел перейти... Но для этого есть Цикл for. Согласен.
Но если эту строку удалить, то сортировка все равно не происходит.
Почему?
Зачем переменную цикла (i) внутри цикла меняешь?
И вообще обмен неправильно реализован.
Попробуй сам понять, ЗАЧЕМ нужны 2 цикла при обмене. И как они работают.
Я не очень глупый человек, и, естественно, перед тем, как постить что-то на форум, не раз менял и изменял код.
Изучал, анализировал.
Ну и наконец пришел к мертвой точке, когда вроде все правильно, а ничего не работает.
Ну и за помощью я сюда и пришел. Так что можете мне конкретно показать ошибку, которую я найти, увы, не могу.
2 мисс_граффити: Можно попробовать убрать перебор по j, оставив только i (т.е. только по строчкам), но опять же сортировка не работает.
type... Теперь тебе надо отсортировать одномерный массив A (неважно, элементы какого типа он содержит, это не играет никакой роли, сортировка будет совершенно идентична при любом типе элементов...) при помощи дополнительной переменной типа massC... Все как в примере по ссылке... Теперь понятнее?
massC=array[1..20] of char;
massA=array[1..10] of massC;
var
A:massA;
C:massC;
1) Хинт №2. Я в Паскале не очень, отсюда и вопрос - как загнать файл в 2 массива? Или его уже готовый нужно будет разбить на 2 части?
2) А на каком языке, я извиняюсь, написан пример в FAQ? Я таких операторов раньше не видел, сам пишу на Turbo Pascal (извиняюсь, что забыл сие уточнить).
P.S. Спасибо за помощь.