Понедельник, 23 Декабря 2024, 18:43

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Задача по 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.

В первом примере выводит только одну строку, но она не упорядочена по правилу "с одной стороны большие, маленькие с другой" happy Там просто числа вразброс). Во втором примере выводит все 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


Огромное спасибо. Наконец-то этот код работает). Спасибо всем за помощь)


*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг