Задача по Pascal
|
|
Stalker_Shooter | Дата: Среда, 11 Января 2012, 12:56 | Сообщение # 1 |
3D XNA'шник
Сейчас нет на сайте
| Здравствуйте уважаемые пользователи GcUp.Ru. У меня такой вопрос. Я учу Паскаль только около трех дней, но уже возникают проблемы ^_^ . Решил сделать простую задачу, но увы, ничего не получается. Вот условие:
Написать программу, в которой для массива из 20-ти элементов (заполненного случайными числами от -20 до +20, 20 раз выполняется следующая процедура:
Слева направо по порядку сравниваются все соседние элементы и, если первый элемент в паре оказался больше второго, элементы меняются местами. В конце процедуры элемент выводится на экран в строку. В результате должно получиться 20 строк, в которых постепенно большие элементы сдвигаются вправо, а меньшие - влево.
У меня они не сдвигаются никак, а строка выводится только 10 раз ^_^ . Вот мой код:
Code program pr;
const N = 20;
type mas = array[1..N] of integer; int = integer;//привычка из C#
var Ar: mas; i: int; procedure Rand;
var i: int;
begin randomize;
for i:= 1 to N do begin Ar[i] := -20 + Random(41);
end;
end;
procedure Wrt;
var i: int;
begin
writeln; for i:= 1 to N do begin
write(Ar[i]:5);
end;
writeln;
end;
procedure Main;
var i, x: int;
begin
i := 1; writeln; while i < N do begin
if Ar[i] > Ar[i+1] then begin x := Ar[i]; Ar[i] := Ar[i+1]; Ar[i+1] := x; end; Wrt;
i := i + 2; end;
end;
begin rand; Wrt; Main; Wrt;
end.
*Не убегай от снайпера, умрешь уставшим. *Мои статьи...
|
|
| |
LunarPixel | Дата: Среда, 11 Января 2012, 13:23 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Если тебе нужно упорядочить массив, то вот так: Code procedure Main; var i, x, up: int; begin i := 1; repeat up := 0; for i:= 1 to N do begin if Ar[i] < Ar[i+1] then begin up := 1; x := Ar[i]; Ar[i] := Ar[i+1]; Ar[i+1] := x; end; end; Wrt; writeln; until up = 0; end;
begin rand; Wrt; writeln; Main; Wrt; readln; end.
Если нужно чтобы просто было единоразовое смещение, то вот так: Code procedure Main; var i, x: int; begin i := 1; for i:= 1 to N do begin if Ar[i] < Ar[i+1] then begin x := Ar[i]; Ar[i] := Ar[i+1]; Ar[i+1] := x; end; Wrt; writeln; end; end;
begin rand; Wrt; writeln; Main; Wrt; readln; end.
|
|
| |
Stalker_Shooter | Дата: Среда, 11 Января 2012, 17:10 | Сообщение # 3 |
3D XNA'шник
Сейчас нет на сайте
| Увы, но не работает. В обоих случаях выбивает ошибку
Quote 21 - выход за границы диапазона изменения индекса 1..20
Хотя я пытался сделать условие
Code if (Ar[i] < Ar[i+1]) and (i < n) then
Но все равно выбивает ошибку. Собственно, именно из-за этой ошибки я и использовал while.
В первом примере выводит только одну строку, но она не упорядочена по правилу "с одной стороны большие, маленькие с другой" Там просто числа вразброс). Во втором примере выводит все 20 строк, но результат тот же: нет упорядоченности по правилу.
Может есть варианты, как это исправить
P.S. Пользуюсь программой ABC
*Не убегай от снайпера, умрешь уставшим. *Мои статьи...
|
|
| |
Vinchensoo | Дата: Среда, 11 Января 2012, 17:13 | Сообщение # 4 |
Злобный социопат с комплексом Бога
Сейчас нет на сайте
| Quote (Stalker_Shooter) Но все равно выбивает ошибку. Собственно, именно из-за этой ошибки я и использовал while. Сделать цикл до N-1 запрещено религией?)
Quote (Stalker_Shooter) Но все равно выбивает ошибку. Собственно, именно из-за этой ошибки я и использовал while. Приведенный код не поможет. Т.к. в конъюнкции сравниваются выражения по-порядку. Поменяй местами, должно работать.
А так у тебя сначала идет вылет за границу диапазона, программа завершается, недоходя до проверки i Код мне писать некогда. Код лунара похож на правду.
|
|
| |
LunarPixel | Дата: Среда, 11 Января 2012, 17:18 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Stalker_Shooter, Попробуй поставить в маине for i:= 1 to N-1 do
А вообще, вот запихал в Делфи, всё работает без ошибок в консольке, хотя АВС может ругаться, там при проверке выход за границу есть, конечно.
Code program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;
const N = 20;
type mas = array[1..N] of integer; int = integer;//привычка из C#
var Ar: mas; i: int; procedure Rand;
var i: int;
begin randomize;
for i:= 1 to N do begin Ar[i] := -20 + Random(41);
end;
end;
procedure Wrt;
var i: int;
begin
writeln; for i:= 1 to N do begin
write(Ar[i]:5);
end;
writeln;
end;
procedure Main; var i, x, up: int; begin i := 1; repeat up := 0; for i:= 1 to N do begin if Ar[i] < Ar[i+1] then begin up := 1; x := Ar[i]; Ar[i] := Ar[i+1]; Ar[i+1] := x; end; end; Wrt; writeln; until up = 0; end;
begin rand; Wrt; writeln; Main; Wrt; readln; end.
|
|
| |
Stalker_Shooter | Дата: Среда, 11 Января 2012, 17:26 | Сообщение # 6 |
3D XNA'шник
Сейчас нет на сайте
| Quote (LunarPixel) for i:= 1 to N-1 do
Огромное спасибо. Наконец-то этот код работает). Спасибо всем за помощь)
*Не убегай от снайпера, умрешь уставшим. *Мои статьи...
|
|
| |