• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Из Delphi в PascalABC

  • Автор темы Автор темы mary yu
  • Дата начала Дата начала

mary yu

Новые
Регистрация
6 Янв 2010
Сообщения
14
Реакции
0
Баллы
0
Из 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) + ', ';
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) + ', ';
Result.Add(' ');
end;

end.

Помогите, пожалуйста!:confused:
 
сейчас портирую в обычный Pascal. А ABC Pascal - это программа, причем, по мне несколько криво работающая с языком Pascal
 
так, не все так просто..
Вот что я смог изменить:
Код:
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. Так что, всему этому надо искать альтернативы и заменять
 
скобочки поменять канеш замечательно....
 
не только в скобках дело. еще замена функции IntToStr на Str, и вообще, из модуля сделана программа.. Кстати.. Извиняюсь, не полностью... надо понимать программу, что бы ее исправить или модифицировать. а я такой способностью не обладал, так что больше помочь, к сожалению, ничем не могу...
 
Последнее редактирование:
скобочки поменять канеш замечательно....

Угу. Сарказм, конечно, к месту. Особенно если учесть, что из комментариев в теле Delphi-модуля четко видно, что писали его не Вы.
Ладно. Сформулируйте для начала постановку задачи со всеми подробностями, чтобы не нужно было выуживать ее из программы. Попробуем.
 
вот Vladimir_S правильный подход выбрал. когда будет задание, будет проще понять суть
 
что же,что же мне начиркал профессор.."ВВод 2-х.массив.Сортировать с помощью модуля-вывод".
Поняла так: ввести двумерный массив,отсортировать с помощью модуля.Вывести 2 одномерных(положительный и отрицательный,модуль же).Вот.
 
Значит, вот. Сделал кое-что на совсем школьном уровне, т.е. без динамических массивов, как в исходном модуле, без преобразования чисел в строки и т.п. Если так не годится - напишите.

Модуль (файл должен называться 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.

Результат:27a5342efa08.webp
 
Назад
Сверху