gvozd Опубликовано 5 февраля, 2005 Жалоба Поделиться Опубликовано 5 февраля, 2005 Короче, по информатике задали написать сортировку чисел в массиве. Наваял вот что: program sortirovka;uses crt;varA: array[0..9] of integer;i, temp: integer;begin clrscr; WriteLN('Введите 10 чисел: '); for i:=0 to 9 dobegin Read(A[i]); If A[i] > A[i+1] then begin temp:=A[i]; A[i]:=A[i+1]; A[i+1]:=temp; end;end; Writeln('Упорядочено: '); for i:=0 to 9 doWrite(A[i], ' '); readkey;end. Но эта ерунда не работает :) Помогите, плз. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 5 февраля, 2005 Жалоба Поделиться Опубликовано 5 февраля, 2005 Сортировко не надо делать во време ввода масива а после как его ввели. Да ти же пробуеш сравнят последний елемент, которий польвател написал, со следуещим, которий еще не соществуеть. И по методу, по которий ти начал делат ето, тебе надо масив обхождат много раз.Что небуть такое: program sortirovka;uses crt;varA: array[0..9] of integer;i, temp: integer;begin clrscr; WriteLN('Введите 10 чисел: '); for i:=0 to 9 do Readln(A[i]); for j=0 to 9 do for i:=0 to 9 do begin If A[i] > A[i+1] thenbegin temp:=A[i]; A[i]:=A[i+1]; A[i+1]:=temp;end;end;end; Writeln('Упорядочено: '); for i:=0 to 9 doWrite(A[i], ' '); readkey;end. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
kaat Опубликовано 5 февраля, 2005 Жалоба Поделиться Опубликовано 5 февраля, 2005 Да ти же пробуеш сравнят последний елемент, которий польвател написал, со следуещим, которий еще не соществуеть. и это самая главная ошибка. Если массив небольшой - лучше сортировать методом пузырька. например: program sortirovka; uses crt; var A: array[0..9] of integer; i, j, temp: integer; begin clrscr; WriteLN('Введите 10 чисел: '); for i:=0 to 9 do Readln(A); for i:=0 to 9 do for j:=i to 9 do begin If A[j] > A[j+1] then begin temp:=A[j]; A[j]:=A[j+1]; A[j+1]:=temp; end; end; end; Writeln('Упорядочено: '); for i:=0 to 9 do Write(A, ' '); readkey; end. насчет правильности синтаксиса - не уверена, давно на паскале не писала. Удачи. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gvozd Опубликовано 7 февраля, 2005 Автор Жалоба Поделиться Опубликовано 7 февраля, 2005 Вот что я написал: program sortirovka;uses crt;varA: array[1..10] of integer;i,j, t: integer;begin clrscr; WriteLN('Введите 10 чисел: '); for i:=1 to 10 doRead(A[i]); For i:=1 to 10 do for j:=i to 10 do if A[j] > A[j+1] then begin t:=A[j]; A[j]:=A[j+1]; A[j+1]:=t; end; Writeln('Упорядочено: '); for i:=1 to 10 doWrite(A[i], ' '); readkey;end. Но что-то он не сортирует как надо... ;) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
kaat Опубликовано 7 февраля, 2005 Жалоба Поделиться Опубликовано 7 февраля, 2005 А как надо? ;) Напиши результат для такого массива: 3, 5, 9, 1, 2, 4, 6, 8, 7, 0. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Kuzmich Опубликовано 7 февраля, 2005 Жалоба Поделиться Опубликовано 7 февраля, 2005 Второй цикл по i вообще выкинь... И правильнее делать так: n:=10; for j:=1 to n do begin if A[j] > A[j+1] then begin t:=A[j]; A[j]:=A[j+1]; A[j+1]:=t; end; n:=n-1; end; Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 7 февраля, 2005 Жалоба Поделиться Опубликовано 7 февраля, 2005 gvozd Код Darhazer близок к правильному, но писался, видимо, второпях, есть заметные неточности вроде несоответствия количества begin количеству end, да и вообще end'ы там Darhazer щедрой рукой разбрасывал, но это уже мелочи, компилятор подскажет ошибку, главное, от истины недалеко... Хуже, что во всех программах из этого топика произойдет выход индекса элемента за границы массива. Тоже надо подкорректировать. А вложенность циклов все же нужна, поскольку за один проход внутреннего цикла пузырек в худшем случае всплывает только на одну ступень, так что надо повторить внутренний цикл хотя бы n-1 раз. Да и внутренний цикл должен быть по числу сравнений, а не элементов, тоже на 1 меньше. В программировании такую ошибку называют "ошибкой счета столбов": промежутков между столбами на 1 меньше, чем самих столбов. В общем, так: program sortirovka; uses crt; var A: array[1..10] of integer; i, temp: integer; begin clrscr; WriteLN ('Введите 10 чисел: '); for i:=1 to 10 do Readln (A); for j=1 to 9 do for i:=1 to 9 do If A > A[i+1] then begin temp:=A; A:=A[i+1]; A[i+1]:=temp; end; for i:=1 to 10 do Write (A, ' '); WriteLN; readkey; end. Тоже не проверял. Ну, попытка не пытка. Можно еще немного усовершенствовать программу по Kuzmich, заменив в заголовке внутреннего цикла 9 на j. Немного меньше понятности, но время выполнения вдвое короче. Правда, на 10 элементах много времени в любом случае не уйдет. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gvozd Опубликовано 8 февраля, 2005 Автор Жалоба Поделиться Опубликовано 8 февраля, 2005 All Ничего не работает, работает только если ввожу что-то типа 2 1 3 4 5 6 7 8 9 10, а если вразброс, то получаю что-то типа: 1 1 1 1 1 1 1 0 0 10. :sm(100): Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
yuriks Опубликовано 8 февраля, 2005 Жалоба Поделиться Опубликовано 8 февраля, 2005 В Delphi єсть пример "C:\Program Files\Borland\Delphi\Demos\Threads\" Там есть три разных метода сортировки. Выбирай любой. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Kuzmich Опубликовано 8 февраля, 2005 Жалоба Поделиться Опубликовано 8 февраля, 2005 program sortirovka; uses crt; var A: array[1..10] of integer; i,t,r: integer; begin clrscr; WriteLN ('Введите 10 чисел: '); for i:=1 to 10 do Readln (A); n:=9; repeat r:=1; for j:=1 to n do if A[j] > A[j+1] then begin t:=A[j]; A[j]:=A[j+1]; A[j+1]:=t; r:=0; end; n:=n-1; until r=1; for i:=1 to 10 do Write (A, ' '); WriteLN; readkey; end. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
ZnoY Опубликовано 8 февраля, 2005 Жалоба Поделиться Опубликовано 8 февраля, 2005 вот попробуй метод простого выбора...вроде так называется....по моему самый простой в написании...но не самый лучший.....вроде как метод слияние быстрее(меньше раз цикл обрабатывается) но его щас писать влом..... const n=10; type mas=array[1..n] of integer; var a:mas; i,j,k:integer; begin randomize; for i:=1 to n do begin a:=random(10); write(a:3); end; writeln; for j:=1 to n do for i:=1 to n do If A > A[i+1] then begin k:=a; a:=a[i+1]; a[i+1]:=k; end; for i:=1 to n do Write (a:3); writeln; readln; end. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gvozd Опубликовано 8 февраля, 2005 Автор Жалоба Поделиться Опубликовано 8 февраля, 2005 Kuzmich Спасибо! Заработало! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 8 февраля, 2005 Жалоба Поделиться Опубликовано 8 февраля, 2005 gvozd Попробовал я установить на свою Windows XP SP2 с NTFS Turbo Pascal 5.5 и прогнать свою программку. Как ни странно, Pascal спокойно установился, модуль CRT прямого управления дисплеем, правда, работать отказался, но он мне и не слишком был нужен, я просто убрал относящиеся к нему команды clrscr и readkey. По моему тексту программы компилятор выдал мне две синтаксические ошибки: не объявлена переменная j и в заголовке цикла по j забыто двоеточие в присваивании. После корректировки программа запустилась и нормально отработала несколько тестовых примеров. Не знаю, в чем у тебя было дело, может, при вводе текста у тебя была где-то ошибка? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gvozd Опубликовано 8 февраля, 2005 Автор Жалоба Поделиться Опубликовано 8 февраля, 2005 Тролль Да нет, работала без ошибок... Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Voron Опубликовано 11 февраля, 2005 Жалоба Поделиться Опубликовано 11 февраля, 2005 Не знаю, может это еще будет полезно Program Zamena;{Программа сортирует элементы массива методом замены}Uses Crt;{ Подключение стандартного модуля для вызова стандартной процедуры очистки экрана и установки курсора в левый верхний угол окна}constcount=20;mas: array[1..20] of byte=(12,10,25,96,47,61,3,54,23,51,64,79,43,2,8,47,32,34,74,5);varMin,i,j,k: integer;a: byte;begin ClrScr; writeln('Выведем на экран неотсортированные элементы массива:'); for i:=1 to count do write(' ',mas[i]); writeln; for i:=1 to count do for j:=i+1 to count do while mas[i]<mas[j] do begin k:=mas[i]; mas[i]:=mas[j]; mas[j]:=k; end; writeln; write('Массив отсортирован по убыванию методом замены: '); writeln; for min:=1 to count do write(' ',mas[min]);end. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.