Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 06.01.2010, 21:21   #1 (permalink)
mary yu
Member
 
Регистрация: 06.01.2010
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Smile Из 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.
Помогите, пожалуйста!
mary yu вне форума   Ответить с цитированием

Старый 06.01.2010, 21:21
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Посоветую вам прочитать содержимое данных топиков

DELPHI
Проблема с Delphi
Гуманитарий и Delphi
Delphi. Массивы

Старый 06.01.2010, 21:26   #2 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

сейчас портирую в обычный Pascal. А ABC Pascal - это программа, причем, по мне несколько криво работающая с языком Pascal
MrSTEP вне форума   Ответить с цитированием
Старый 06.01.2010, 21:45   #3 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

так, не все так просто..
Вот что я смог изменить:
Код:
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. Так что, всему этому надо искать альтернативы и заменять
MrSTEP вне форума   Ответить с цитированием
Старый 06.01.2010, 21:56   #4 (permalink)
mary yu
Member
 
Регистрация: 06.01.2010
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

скобочки поменять канеш замечательно....
mary yu вне форума   Ответить с цитированием
Старый 06.01.2010, 22:05   #5 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

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

Последний раз редактировалось MrSTEP; 06.01.2010 в 22:12
MrSTEP вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 06.01.2010, 22:14   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от mary yu Посмотреть сообщение
скобочки поменять канеш замечательно....
Угу. Сарказм, конечно, к месту. Особенно если учесть, что из комментариев в теле Delphi-модуля четко видно, что писали его не Вы.
Ладно. Сформулируйте для начала постановку задачи со всеми подробностями, чтобы не нужно было выуживать ее из программы. Попробуем.
Vladimir_S вне форума   Ответить с цитированием
Старый 06.01.2010, 22:21   #7 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

вот Vladimir_S правильный подход выбрал. когда будет задание, будет проще понять суть
MrSTEP вне форума   Ответить с цитированием
Старый 06.01.2010, 22:30   #8 (permalink)
mary yu
Member
 
Регистрация: 06.01.2010
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

"Не удивляйся, что я сделал не "TStrings.Create"" Смешно! Ваш модератор.
mary yu вне форума   Ответить с цитированием
Старый 06.01.2010, 22:50   #9 (permalink)
mary yu
Member
 
Регистрация: 06.01.2010
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

что же,что же мне начиркал профессор.."ВВод 2-х.массив.Сортировать с помощью модуля-вывод".
Поняла так: ввести двумерный массив,отсортировать с помощью модуля.Вывести 2 одномерных(положительный и отрицательный,модуль же).Вот.
mary yu вне форума   Ответить с цитированием
Старый 07.01.2010, 12:04   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Модуль (файл должен называться 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.jpg
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.