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

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

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

 
 Ответить  Открыть новую тему 
> Паскаль. Соритровка двумерного массива. Где ошибка?, Написал сортировку, но она не работает. Помогите пожалуйстьа найти оши
Pork6
сообщение 7.10.2008 21:52
Сообщение #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 байт ) Кол-во скачиваний: 185


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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.10.2008 22:02
Сообщение #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;

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


Новичек


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

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


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

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

Почему?


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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 7.10.2008 22:10
Сообщение #4


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

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

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


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


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


Новичек


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

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


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

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

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

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

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


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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.10.2008 22:36
Сообщение #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.10.2008 22:37
 К началу страницы 
+ Ответить 
Pork6
сообщение 7.10.2008 22:51
Сообщение #7


Новичек


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

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


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

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

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

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


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

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


Гость






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

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

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

 



- Текстовая версия 20.07.2025 2:58
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"