Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Массивы. Ввод параметра для строк и столбцов с клавиатуры,а заполнение матрицы random (http://forum.oszone.net/showthread.php?t=225500)

lenaustkz84 17-01-2012 17:27 1838075

Массивы. Ввод параметра для строк и столбцов с клавиатуры,а заполнение матрицы random
 
Здравствуйте!

Нужно сделать так, чтобы параметры для строк и столбцов вводились с клавиатуры,
а сама матрица заполнялась случайным образом. При чем реализация ввода матрицы
должна быть в одной процедуре. А вывод матрицы на экран в другой процедуре.

Делаю пока что для ввода матрицы. Но не совсем получается.
Ошибка: "Error 20: Variable identifier expected".
И указывает на переменную a в процедуре.
Так понимаю, что и для переменной b будет та же ситуация.

Думаю, что const нужно убрать, потому что это все таки константы, а мне нужно переменное значение. Но тогда выходит ошибка в строке

type mass = array [1..a,1..b] of integer;

Потому что a и b не определены.

Подскажите, пожалуйста, что нужно сделать. Как правильно написать?

Буду ОЧЕНЬ благодарна, если напишите пример:)

Вот, что получилось у меня.



Код:

    const a=10;
              b=10;

              type mass = array [1..a,1..b] of integer;
              var matr : mass;

              procedure zapolnenie_matricij;

              begin

            var i,j:integer;
 
            writeln('Введите параметр для строк: ');
            readln(a);
 
            writeln('Введите параметр для столбцов: ');
            readln(b);

            randomize;
            for i:=1 to a do
              begin
                  for j:=1 to b do
                    begin
                        matr[i,j]=random(15);
                  end;
              end;

        end;

Если пробую прописать a и b как переменные в процедуре, то появляется ошибка "Error 113: Error in statement".

Если просто переменные a и b записываю как:

var a : integer;
b : integer;

то появляется другая ошибка "Error 133: Cannot evaluate this expression".

Tonny_Bennet 17-01-2012 18:01 1838114

Цитата:

Цитата lenaustkz84
Нужно сделать так, чтобы параметры для строк и столбцов вводились с клавиатуры, »

Судя по коду это называется размерностью массива.

Судя по синтаксису вы пишете на Pascal или Delphi. И по моему ни там ни там то, что вы пытаетесь сделать, сделать не получится.

P.S. В C# это реализуется точно:


Код:

int [,] mass;
Readln(a);
Readln(b)
 mass = new int[a,b];


lenaustkz84 17-01-2012 18:12 1838128

Цитата:

Цитата Tonny_Bennet
Судя по синтаксису вы пишете на Pascal или Delphi. »

Да, Tonny_Bennet, это Pascal.

Еще мне не совсем понятно, что Вы хотели показать этим кодом.
Объясните, пожалуйста.

ferget 17-01-2012 18:19 1838137

здесь ошибка
Код:

matr[i,j]=random(15);
надо

Код:

matr[i,j]:=random(15);
и пишите

Код:

var a : integer;
b : integer;


lenaustkz84 17-01-2012 19:40 1838229

ferget, эту ошибку

Цитата:

Цитата ferget
matr[i,j]:=random(15); »

я сделала здесь на форуме. В программе проверила - без ошибки.

ferget 17-01-2012 20:15 1838278

Код:

type Matrix = array of array of integer;

function CreateMatrix(m,n: integer): Matrix;
begin
  SetLength(Result,m);
  for var i:=0 to m-1 do
    SetLength(Result[i],n);
end;

procedure FillMatrByRandom(matr: Matrix);
begin
  for var i:=0 to matr.Length-1 do
  for var j:=0 to matr[0].Length-1 do
    matr[i][j] := Random(100); 
end;

var matr: Matrix;

begin
  var a :integer;
  var b :integer;
 
  writeln('Введите параметр для строк: ');
            readln(a);
 
            writeln('Введите параметр для столбцов: ');
            readln(b);
  matr := CreateMatrix(a,b);
 
  FillMatrByRandom(matr);
  end.


lenaustkz84 17-01-2012 22:03 1838386

ferget, здорово!
Еще бы теперь в коде разобраться:)

Drongo 17-01-2012 23:40 1838466

lenaustkz84, Вы же учитесь, значит должны разбираться, иначе глупо учить программирование.

lenaustkz84 18-01-2012 06:21 1838548

Цитата:

Цитата Drongo
Вы же учитесь, значит должны разбираться, иначе глупо учить программирование. »

Drongo, да я учусь, но учусь недавно. Есть в коде ferget то, что я вижу в первый раз. Все когда-то начинали. И никто не обязан быть семи пядей во лбу.

lenaustkz84 18-01-2012 06:38 1838553

Вот я сделала. Правда не так виртуозно, как у ferget:) Но работает:)

Как бы теперь сделать, чтобы матрица заполнялась не только положительными,
но и отрицательными числами?

Что нужно изменить?

Код:

program zadanie_30;

uses crt;


const a = 10; {dlya zadaniya strok matricij}
      b = 10; {dlya zadaniya stolbcov matricij}

type  mass = array [1..a, 1..b] of integer;

var  matr : mass; {dlya obsheij matricij}
      a1,b1  : integer; {dlya opredeleniya parametrov matricij}

{*********************************************************************}

procedure vvod_matricij; {procedyra dlya vivoda matricij na ekran}

var i,j:integer;

begin
  writeln('Vvedite a: ');
  readln(a1);

  writeln('Vvedite b: ');
  readln(b1);

  randomize;
  for i:=1 to a do
  begin
      for j:=1 to b do
        begin
            matr[i,j]:=random(10);
        end;
  end;

end;

{*********************************************************************}

procedure matrica_na_ekrane;

  var i,j : integer;

      begin
        for i:=1 to a1 do
            begin
              for j:=1 to b1 do
              begin
                  write(matr[i,j]:5);
              end;
              writeln;writeln;
            end;
      end;
{*********************************************************************}

BEGIN
  clrscr;

  vvod_matricij;
  matrica_na_ekrane;

  readln;
END.


ferget 18-01-2012 07:08 1838556

Цитата:

Цитата lenaustkz84
Как бы теперь сделать, чтобы матрица заполнялась не только положительными,
но и отрицательными числами? »

например от -10 до 10


Код:

matr[i,j]:=random(20)-10;

Tonny_Bennet 18-01-2012 09:17 1838600

Цитата:

Цитата ferget
SetLength(Result,m); »

Если честно то думал, что паскаль этого не умеет делать :)....

Цитата:

Цитата lenaustkz84
Еще мне не совсем понятно, что Вы хотели показать этим кодом.
Объясните, пожалуйста. »

Вот оказалось, что паскаль умеет работать с динамическими массивами. И когда вы пишете на паскале то видите всю "кухню" этого (да и впрочем любого) действия. Я считаю данный факт основополагающим в развитии навыков программирования и алгоритмизации в целом. Языки которые используют API позволяют сократить многие манипуляции. Это удобно когда вы понимаете и знаете как это работает. Это удобно в больших проектах. Код из 30 строк может быть заменён на код из 3 строк.

Я считаю, что языки использующие API могут быть не удобны лишь в том случае, когда для работы программы с кодом 3 КБ требуется набор библиотек в 300 МБ ... и некоторые проблемы кросплатформенности...

AlexVol 18-01-2012 10:22 1838635

Цитата:

Цитата Tonny_Bennet
Если честно то думал, что паскаль этого не умеет делать »

А Паскаль этого и не умеет :)
Это умеет Дельфи, начиная с 5 версии.
На паскале надо делать как то так (массив из 100):
Код:

type
  arr: array[1,1] of Integer;

var
  a : arr;
  pa:^a;

begin
  getmem(pa,sizeof(integer)*100);
  pa^[80]:=100;
  и т.д. и т.п.

  freemem(pa,sizeof(integer)*100);
end.


Tonny_Bennet 19-01-2012 09:03 1839367

AlexVol,

Цитата:

Цитата Tonny_Bennet
Судя по синтаксису вы пишете на Pascal или Delphi. »

Цитата:

Цитата lenaustkz84
Да, Tonny_Bennet, это Pascal. »

Цитата:

Цитата lenaustkz84
Вот я сделала. Правда не так виртуозно, как у ferget Но работает »

в коде видно что массив не динамический...


Время: 17:22.

Время: 17:22.
© OSzone.net 2001-