Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Из Delphi в PascalABC (http://www.tehnari.ru/f41/t31761/)

mary yu 06.01.2010 21:21

Из Delphi в PascalABC
 
Теплого времени суток! Сделала прогу в Delphi 7. Дали задание переделать в PascalABC.
Ввод двумерного массива.Отсортировать с помощью модуля.Вывод.
Цитата:

unit Arrays_Module;
interface

Uses
Windows, SysUtils, classes;

Const
n = 10; // m и n ты можешь менять ...
m = 12; // ... на своё усмотрение

type
TArray = Array of Integer; // Тип массива, в который будут записываться
//отрицательные и положительные числа
TMatrix = Array[0..m, 0..n] of Integer; // тип двумерного массива

procedure CreatMe(var Matrix: TMatrix); // Эта процедура заполняет массив
procedure ChangeMe(Matrix: TMatrix; var Otr, Poloj: TArray); // Эта процедура производит изменения
Function GetResultFunc(Matrix: TMatrix; Otr, Poloj: TArray): TStrings;
// Эта процедура выводит результат в текстовом варианте


implementation

procedure CreatMe(var Matrix: TMatrix);
var
i, j: Integer;
begin
For i := 0 to n do
For j := 0 to m do
begin
Matrix[j, i] := Random(255) + 1; // Во тут добавляем +1, чтобы не попался ноль
If Random(2) = 1 then
Matrix[j, i] := - Matrix[j, i];// а это случайно выбирается знак "+" или "-"
end;
end;

procedure ChangeMe(Matrix: TMatrix; var Otr, Poloj: TArray);
var
i, j: Integer;
begin
SetLength(otr, 0); // делаем в массиве Ort 0 элементов, ибо он может быть не пустой
SetLength(Poloj, 0); // тоже, что и сделали выше
For i := 0 to n do
For j := 0 to m do
begin
If Matrix[j, i] < 0 then
begin
SetLength(otr, High(otr) + 2);
Otr[High(otr)] := Matrix[j, i];
end
Else if Matrix[j, i] > 0 then
begin
SetLength(Poloj, High(Poloj) + 2);
Poloj[High(Poloj)] := Matrix[j, i];
end;
end;
end;

Function GetResultFunc(Matrix: TMatrix; Otr, Poloj: TArray): TStrings;
var
i, j: Integer;
begin
Result := TStringList.Create; // Инициализируем объект
// Не удивляйся, что я сделал не "TStrings.Create", а "TStringList.Create"
// Тут нет никакой разницы, потому что TStrings - наследник от TStringList... вот и всё...
Result.Add('Вот двумерный массив:');
Result.Add(' ');
Result.Add(' ');
// Сначала вывожу двумерный массив
For i := 0 to n do
begin
For j := 0 to m do
Result.Strings[Result.Count-1] := Result.Strings[Result.Count-1] + IntToStr(Matrix[j, i]) + ' ';
Result.Add(' ');
end;
Result.Add(' ');

// Теперь вывожу получившиеся одномерные
Result.Add('Результат сортировки: ');
Result.Add('отрицательные числа:');
Result.Add(' ');
For i := 0 to High(otr) do
Result.Strings[Result.Count-1] := Result.Strings[Result.Count-1] + IntToStr(otr[i]) + ', ';
Result.Add(' ');
Result.Add('положительные числа: ');
Result.Add(' ');
For i := 0 to High(poloj) do
Result.Strings[Result.Count-1] := Result.Strings[Result.Count-1] + IntToStr(poloj[i]) + ', ';
Result.Add(' ');
end;

end.
Помогите, пожалуйста!:confused:

MrSTEP 06.01.2010 21:26

сейчас портирую в обычный Pascal. А ABC Pascal - это программа, причем, по мне несколько криво работающая с языком Pascal

MrSTEP 06.01.2010 21:45

так, не все так просто..
Вот что я смог изменить:
Код:

program Arrays_Module;

Const
n = 10; { m и n ты можешь менять ...}
m = 12; { ... на своё усмотрение}

type
TArray = Array [1..1] of Integer; { Тип массива, в который будут записываться
отрицательные и положительные числа}
TMatrix = Array[0..m, 0..n] of Integer; { тип двумерного массива}

procedure CreatMe(var Matrix: TMatrix); { Эта процедура заполняет массив}
procedure ChangeMe(Matrix: TMatrix; var Otr, Poloj: TArray); { Эта процедура производит изменения}
Function GetResultFunc(Matrix: TMatrix; Otr, Poloj: TArray): TStrings;
{ Эта процедура выводит результат в текстовом варианте}

procedure CreatMe(var Matrix: TMatrix);
var
i, j: Integer;
begin
For i := 0 to n do
For j := 0 to m do
begin
Matrix[j, i] := Random(255) + 1; { Во тут добавляем +1, чтобы не попался ноль}
If Random(2) = 1 then
Matrix[j, i] := - Matrix[j, i]; { а это случайно выбирается знак "+" или "-"}
end;
end;

procedure ChangeMe(Matrix: TMatrix; var Otr, Poloj: TArray);
var
i, j: Integer;
begin
SetLength(otr, 0); { делаем в массиве Ort 0 элементов, ибо он может быть не пустой}
SetLength(Poloj, 0); { тоже, что и сделали выше}
For i := 0 to n do
For j := 0 to m do
begin
If Matrix[j, i] < 0 then
begin
SetLength(otr, High(otr) + 2);
Otr[High(otr)] := Matrix[j, i];
end
Else if Matrix[j, i] > 0 then
begin
SetLength(Poloj, High(Poloj) + 2);
Poloj[High(Poloj)] := Matrix[j, i];
end;
end;
end;

Function GetResultFunc(Matrix: TMatrix; Otr, Poloj: TArray): TStrings;
var
i, j: Integer;
begin
Result := TStringList.Create; { Инициализируем объект}
{ Не удивляйся, что я сделал не "TStrings.Create", а "TStringList.Create"
{ Тут нет никакой разницы, потому что TStrings - наследник от TStringList... вот и всё...}
Result.Add('Вот двумерный массив:');
Result.Add(' ');
Result.Add(' ');
{ Сначала вывожу двумерный массив}
For i := 0 to n do
begin
For j := 0 to m do
Result.Strings[Result.Count-1] := Result.Strings[Result.Count-1] + Str(Matrix[j, i]) + ' ';
Result.Add(' ');
end;
Result.Add(' ');

{ Теперь вывожу получившиеся одномерные}
Result.Add('Результат сортировки: ');
Result.Add('отрицательные числа:');
Result.Add(' ');
For i := 0 to High(otr) do
Result.Strings[Result.Count-1] := Result.Strings[Result.Count-1] + Str(otr[i]) + ', ';
Result.Add(' ');
Result.Add('положительные числа: ');
Result.Add(' ');
For i := 0 to High(poloj) do
Result.Strings[Result.Count-1] := Result.Strings[Result.Count-1] + Str(poloj[i]) + ', ';
Result.Add(' ');
end;

end.

в языке Object Pascal есть некоторые функции, которых нет в обычном Паскале, например: SetLength(); Result.Add(). Еще в Паскале нет типа Tstrings. Так что, всему этому надо искать альтернативы и заменять

mary yu 06.01.2010 21:56

скобочки поменять канеш замечательно....

MrSTEP 06.01.2010 22:05

не только в скобках дело. еще замена функции IntToStr на Str, и вообще, из модуля сделана программа.. Кстати.. Извиняюсь, не полностью... надо понимать программу, что бы ее исправить или модифицировать. а я такой способностью не обладал, так что больше помочь, к сожалению, ничем не могу...

Vladimir_S 06.01.2010 22:14

Цитата:

Сообщение от mary yu (Сообщение 278829)
скобочки поменять канеш замечательно....

Угу. Сарказм, конечно, к месту. Особенно если учесть, что из комментариев в теле Delphi-модуля четко видно, что писали его не Вы.
Ладно. Сформулируйте для начала постановку задачи со всеми подробностями, чтобы не нужно было выуживать ее из программы. Попробуем.

MrSTEP 06.01.2010 22:21

вот Vladimir_S правильный подход выбрал. когда будет задание, будет проще понять суть

mary yu 06.01.2010 22:30

Цитата:

что писали его не Вы.
не для себя делала

"Не удивляйся, что я сделал не "TStrings.Create"" Смешно! Ваш модератор.

mary yu 06.01.2010 22:50

что же,что же мне начиркал профессор.."ВВод 2-х.массив.Сортировать с помощью модуля-вывод".
Поняла так: ввести двумерный массив,отсортировать с помощью модуля.Вывести 2 одномерных(положительный и отрицательный,модуль же).Вот.

Vladimir_S 07.01.2010 12:04

Вложений: 1
Значит, вот. Сделал кое-что на совсем школьном уровне, т.е. без динамических массивов, как в исходном модуле, без преобразования чисел в строки и т.п. Если так не годится - напишите.

Модуль (файл должен называться Arr_Mod.pas):
Код:

unit Arr_Mod;
interface

Const
n =  9; {values can be changed at will}
m = 11;

type
TArray = Array [0..(m+1)*(n+1)-1] of Integer; {Array type for positive and
negative numbers}
TMatrix = Array[0..n, 0..m] of Integer; {Two-dimesional array type}

procedure CreatMe(var Matrix:TMatrix); {Filling the matrix}
procedure ChangeMe(Matrix:TMatrix; var Otr,Poloj:TArray;
var Nneg, Npos:INTEGER); {Changing the matrix}
Procedure ResultOutput(Matrix:TMatrix; Otr,Poloj:TArray;
Nneg, Npos:INTEGER); {Creating output}


implementation

procedure CreatMe(var Matrix:TMatrix);
 var
  i,j: Integer;
 begin
  Randomize;
  For i:=0 to n do
  For j:=0 to m do
    begin
    Matrix[i,j]:= Random(255)+1;{Adding one is to avoid zero value}
    If Random(2)=1 then Matrix[i,j]:=-Matrix[i,j];
    {Radom choosing of "+" or "-" sign}
    end;
end;

procedure ChangeMe(Matrix:TMatrix; var Otr,Poloj:TArray;
var Nneg, Npos:INTEGER);
 var
  i,j: Integer;
 begin
  Nneg:=-1; {Number of negative elements}
  Npos:=-1; {Number of positive elements}
  For i:=0 to n do
  For j:=0 to m do
    begin
    If Matrix[i,j]<0 then
      begin
      Inc(Nneg);
      Otr[Nneg]:=Matrix[i,j];
      end
      Else
      begin
      Inc(Npos);
      Poloj[Npos]:=Matrix[i,j];
      end;
    end;
 end;

Procedure ResultOutput(Matrix:TMatrix; Otr,Poloj:TArray;
Nneg,Npos:INTEGER);
 var
  i,j:Integer;
 begin
  For i:=0 to n do
  begin
    For j:=0 to m do
    Write(Matrix[i,j]:5);
    WriteLn;
  end;
  Writeln;

  For i:=1 to (Nneg div (m+1)) do
  begin
    For j:=0 to m do Write(Otr[(i-1)*(m+1)+j]:5);
    WriteLn;
  end;
  For i:=(Nneg div (m+1))*(m+1) to Nneg do
  Write(Otr[i]:5);
  WriteLn;
  WriteLn;

  For i:=1 to (Npos div (m+1)) do
  begin
    For j:=0 to m do Write(Poloj[(i-1)*(m+1)+j]:5);
    WriteLn;
  end;
  For i:=(Npos div (m+1))*(m+1) to Npos do
  Write(Poloj[i]:5);
  WriteLn;
 end;
end.

Тестирующая программа:
Код:

uses Arr_Mod;
var
 A:TMatrix;
 P,N:TArray;
 Nn,Np:INTEGER;
Begin
 CreatMe(A);
 ChangeMe(A,N,P,Nn,Np);
 ResultOutput(A,N,P,Nn,Np);
 ReadLn;
End.

Результат:Вложение 140049


Часовой пояс GMT +4, время: 03:38.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.