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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2013, 18:13   #1
Heng
Форумчанин
 
Регистрация: 27.02.2012
Сообщений: 117
По умолчанию Работа с динамическими массивами

Добрый вечер, тут проблемка у меня немогу понять почему вылезает ошибка "invalid pointer operation" вот задание,

Задана полоска длиной 2k клеток и шириной в одну клетку. Полоску сгибают пополам так, чтобы правая половинка оказалась под левой. Сгибание продолжают до тех пор, пока сверху находится больше одной клетки. Необходимо пронумеровать клетки таким образом, чтобы после окончания сгибания полосы номера клеток в получившейся колонке были расположены в порядке 1,2,3,4,...,2k.

Алгоритм: Сначала задаем динамический массив устанавливаем длинну строки 2^n и 1 столбец забиваем туда цифры от 1 до n, далее расширяем массив(столбцы) в 2 раза и в последний столбик закидываем ровно половину строк первого(в перевернутом виде). Ну и далее также Столбцы*2 и начиная с последнего двигаемся к середине и записываем половину строк противоположного от середины столбца.

Вот код, если у кого есть идея упростить код, учту любое предложение.
Код:
unit Kurs;

interface

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

type
  TForm1 = class(TForm)
    sd1: TStringGrid;
    btn1: TButton;
    mm1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    edt1: TEdit;
    lbl1: TLabel;
    btn2: TButton;
    procedure Init_Mas(Num:Integer);
    procedure Shared_Mas();
    procedure btn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  num_s,p:Integer;
  Num_Mas:array of array of Integer;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Init_Mas(Num: Integer);
var i:Integer;
begin
  SetLength(Num_Mas,Num,2);   //Устанавливаем длину массива
  sd1.ColCount:=num;
  sd1.Rowcount:=num;
  for i:=1 to Num-1 do begin
    Num_Mas[i,1]:=i;               //Запролняем первый столбец массива
    sd1.Cells[0,i-1]:=IntToStr(num_mas[i,1]);   //Çàïîëíÿåì òàáëèöó
    end;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  num_s:=sqr(StrToInt(edt1.text))+1;
  Init_Mas(num_s);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 sd1.DefaultColWidth:=25;
 sd1.DefaultRowHeight:=25;
 p:=1;
end;

procedure TForm1.Shared_Mas;// Процедура деления столбца и записи в                      противоположный от центра столбец в обратном порядке
var i,k,n,q:Integer;
begin
  p:=p*2;
  q:=1;
  n:=p;
  setlength(Num_Mas,num_s,p); //чисто столбцов уже в 2 раза больше
  k:=(Num_s-1) div 2;              //середина столбца
  ShowMessage(IntToStr(k));
  while n>p div 2 do begin        //пока не дошол с конца до середины  
  for i:=num_s-1 downto p do   //начиная с конца первого до середины столбца
       Num_Mas[Num_s-i,p]:=Num_Mas[i,q]; //записываю в обратном порядке

   Inc(q); //ïåðåõîäèì íà 1 ñòîëáåö â ïðàâî ñ íà÷àëà
   Dec(n); //ïåðåõîäèì íà 1 ñòîëáåö â ëåãâî ñ êîíöà
   end;
 num_s:=k;
end;

procedure TForm1.btn2Click(Sender: TObject);
var i,j:Integer;
begin
 Shared_Mas;
 ShowMessage('p='+IntToStr(p));
for j:=(p div 2)+1 to p do               /////А ВОТ СЮДА И ПОКАЗЫВАЕТ "invalid pointer operation" после второго прогона процедуры -  Shared_Mas;
 For i:=1 to Num_s do
   sd1.Cells[j-1,i-1]:=IntToStr(Num_mas[i,j]);
end;

end.

Последний раз редактировалось Heng; 08.10.2013 в 18:15.
Heng вне форума Ответить с цитированием
Старый 08.10.2013, 21:18   #2
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию

Там где:
Код:
procedure TForm1.Shared_Mas;
добавьте следующее
Код:
procedure TForm1.Shared_Mas(Sender: TObject);
возможно поможет
Начинающий програм вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lazarus (Работа с динамическими массивами) Dionis46 Lazarus, Free Pascal, CodeTyphon 2 15.02.2012 21:26
Работа с динамическими массивами типа record Олвин Общие вопросы Delphi 8 14.07.2011 01:13