IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Паскаль. Соритровка двумерного массива. Где ошибка?, Написал сортировку, но она не работает. Помогите пожалуйстьа найти оши
сообщение
Сообщение #1


Новичек


Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


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

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

Дан список группы в 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 байт ) Кол-во скачиваний: 167


--------------------
We Do What We Must, Because We Can © GLaDOS

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Где ошибка?
Здесь:
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;

То действие, которое я отметил, запрещено. Нельзя менять переменную цикла самостоятельно...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичек


Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


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

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

Почему?


--------------------
We Do What We Must, Because We Can © GLaDOS

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичек


Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


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

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

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

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

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


--------------------
We Do What We Must, Because We Can © GLaDOS

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
Можно попробовать убрать перебор по j, оставив только i (т.е. только по строчкам), но опять же сортировка не работает.
Не надо ничего пробовать просто так... Ты должен делать только то, что понимаешь, как работает. Зайди вот сюда: Методы сортировок , посмотри, как реализуется сортировка "пузырьком", и сравни с тем, что делаешь ты...

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

Добавлено через 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... Все как в примере по ссылке... Теперь понятнее?

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичек


Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


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

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

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

Сообщение отредактировано: Pork6 -


--------------------
We Do What We Must, Because We Can © GLaDOS

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.10.2020 5:11
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name