Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2007, 09:06   #1
forumu
Пользователь
 
Регистрация: 19.11.2007
Сообщений: 36
По умолчанию #Delhpi Одномерный массив

Здравствуйте, уважаемые программисты. Помогите пожалуйста найти ошибку в программе и как ее можно исправить.

Задание:
Дан массив целых чисел из n элементов, заполненный случайным образом числами из промежутка [-50,50]. Вставить значение минимального элемента массива после всех четных элементов.


Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1:TForm1;
  A:array of integer;
  i:integer;
  str:string;
  min:TPoint;
  N:integer;
implementation

{$R *.dfm}
//Заполняем массив А случайными числами [1,20]
procedure TForm1.Button1Click(Sender: TObject);
var
  N:integer;
begin
  Randomize;
  N:=StrToInt(Edit1.Text);
  SetLength(A,N);
  str:='';
  for i:=1 to N do
    begin
      A[i]:=Round(Sin(Random(50))*50);
      str:=str+IntToStr(A[i])+#9;
    end;
      Memo1.Lines.Add(str);
 str:='';
end;
  
procedure TForm1.Button2Click(Sender: TObject);
begin
  N:=StrToInt(Edit1.Text);
  str:='';
  min.X:=1;

  for i:=2 to N do
    if A[min.X]>A[i] then min.X:=i; //находим адрес минимального элемента
  min.Y:=A[min.X];
  //Переставляем минимальный элемент в самый конец
  for i:=min.X+1 to N do
    A[i-1]:=A[i];
  A[N]:=min.Y;
  i:=n-1;
  //переставляем миним. эл. с конца вперед, до тех пор пока не попадется четное
  while (i=1)or(frac(A[i]/2)<>0)do
    begin
      A[i+1]:=A[i];
      A[i]:=min.Y;
      i:=i-1;
    end;
  //выводим результат
  for i:=1 to N do
    str:=str+intToStr(A[i])+#9;
  Memo1.Lines.Add(str);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Form1.Close;
end;

end.
forumu вне форума Ответить с цитированием
Старый 20.12.2007, 12:11   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Первое, что бросилось в глаза:
1. for i:=1 to N do
Индексация в неявно задаваемых массивах - с 0, а не с 1 - вылет за размерность. Соответственно -
for i:=0 to N-1 do...
И так - везде.
Все глюки в программе связаны, в основном, с этим.
2. Странная какая-то конструкция:
while (i=1)or(frac(A[i]/2)<>0)do
begin
A[i+1]:=A[i];
A[i]:=min.Y;
i:=i-1;
end;
Вы о FOR...DOWNTO... не слыхали?
mihali4 вне форума Ответить с цитированием
Старый 20.12.2007, 13:00   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
Дан массив целых чисел из n элементов, заполненный случайным образом числами из промежутка [-50,50].
Причем здесь
Цитата:
//Заполняем массив А случайными числами [1,20]
Цитата:
A[i]:=Round(Sin(Random(50))*50);
puporev вне форума Ответить с цитированием
Старый 20.12.2007, 13:23   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вы о FOR...DOWNTO... не слыхали?
+1 и нужно не забыть в таком цикле использовать break, чтоб не проходить все элементы
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.12.2007, 14:10   #5
north
Пользователь Подтвердите свой е-майл
 
Регистрация: 06.11.2007
Сообщений: 68
По умолчанию

Код:
unit Unit1;   
  
interface   

uses   
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   
  Dialogs, StdCtrls;
  
type   
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);   
    procedure Button3Click(Sender: TObject);
  private   
    { Private declarations }   
  public   
    { Public declarations }
  end;   
  
var   
  Form1:TForm1;   
  A:array [1..20]of integer;
  i,N,min:integer;
  str:string;
implementation

{$R *.dfm}
//Заполняем массив А случайными числами [1,20]
procedure TForm1.Button1Click(Sender: TObject);
begin
    Randomize;
    N:=StrToInt(Edit1.Text);
    str:='';
    min:=100;
    for i:=1 to N do begin
        A[i]:=Round(Sin(Random(50))*50); 
        if min > A[i] then min:=a[i];
        str:=str+IntToStr(A[i])+#9;
        end;
    Memo1.Clear;
    Memo1.Lines.Add(str);
end;

procedure TForm1.Button2Click(Sender: TObject);
var j1,j2,p,x:integer;
begin
    j1:=1;
    while  j1<=n do
    if a[j1] mod 2 = 0 then begin
        p:=a[j1+1];
        a[j1+1]:=min;
        j2:=j1+2;
        inc(n);

        while j2<=n do begin
            x:=a[j2];
            a[j2]:=p;
            p:=x;
            inc(j2);
            end;
            //смещение элементов массива на одну позицию вправо

        j1:=j1+2;
        //Добавление минимального элемента после четного числа
        end else inc(j1);

    str:='';
    for i:=1 to N do
    str:=str+intToStr(A[i])+#9;
    Memo1.Lines.Add(str);
end;   
  
procedure TForm1.Button3Click(Sender: TObject);   
begin   
Form1.Close;   
end;
  
end.

Последний раз редактировалось north; 20.12.2007 в 22:37.
north вне форума Ответить с цитированием
Старый 20.12.2007, 18:03   #6
forumu
Пользователь
 
Регистрация: 19.11.2007
Сообщений: 36
По умолчанию

Хм, прикольно, работает... Огромное спасибо тому человеку, который эту программу исправил!
forumu вне форума Ответить с цитированием
Старый 20.12.2007, 18:14   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от forumu Посмотреть сообщение
Хм, прикольно, работает... Огромное спасибо тому человеку, который эту программу исправил!
Только когда сами будете делать, не пользуйтесь предложенным и работающим вариантом как образцом.
Выделять память для массива нужно разумно. У вас-то именно так и было сделано. А вот в предложенном - аж для тысячи элементов массива (при том, что в Edit может быть введено число, гораздо меньшее).
Для этой простой задачи такая вольность в обращении с ресурсами конечно же, большой роли не сыграет. Главное - чтоб это не стало дурной привычкой.

Последний раз редактировалось mihali4; 20.12.2007 в 22:45.
mihali4 вне форума Ответить с цитированием
Старый 20.12.2007, 22:36   #8
north
Пользователь Подтвердите свой е-майл
 
Регистрация: 06.11.2007
Сообщений: 68
По умолчанию

для массива из 1000 элементов типа integer нужно всего 2КБ памяти, поэтому нельзя сказать, что это так уж неразумно. В любом случае 1000 можно исправить на 20.
north вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
одномерный массив ldx Паскаль, Turbo Pascal, PascalABC.NET 4 06.06.2008 17:45
VBA. Одномерный массив ExMatiss Microsoft Office Excel 9 07.05.2008 05:57
одномерный массив fatdog Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 23.02.2008 10:05
Массив Одномерный flait111 Помощь студентам 3 15.12.2007 14:08
Одномерный массив SkyDreamer Помощь студентам 1 01.12.2007 21:22