Войти

Показать полную графическую версию : [решено] Массивы. Ввод параметра для строк и столбцов с клавиатуры,а заполнение матрицы random


lenaustkz84
17-01-2012, 17:27
Здравствуйте!

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

Делаю пока что для ввода матрицы. Но не совсем получается.
Ошибка: "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
Нужно сделать так, чтобы параметры для строк и столбцов вводились с клавиатуры, »
Судя по коду это называется размерностью массива.

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

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



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

lenaustkz84
17-01-2012, 18:12
Судя по синтаксису вы пишете на Pascal или Delphi. »

Да, Tonny_Bennet, это Pascal.

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

ferget
17-01-2012, 18:19
здесь ошибка
matr[i,j]=random(15);

надо

matr[i,j]:=random(15);

и пишите

var a : integer;
b : integer;

lenaustkz84
17-01-2012, 19:40
ferget, эту ошибку

matr[i,j]:=random(15); »

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

ferget
17-01-2012, 20:15
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
ferget, здорово!
Еще бы теперь в коде разобраться:)

Drongo
17-01-2012, 23:40
lenaustkz84, Вы же учитесь, значит должны разбираться, иначе глупо учить программирование.

lenaustkz84
18-01-2012, 06:21
Вы же учитесь, значит должны разбираться, иначе глупо учить программирование. »

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

lenaustkz84
18-01-2012, 06:38
Вот я сделала. Правда не так виртуозно, как у 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
Как бы теперь сделать, чтобы матрица заполнялась не только положительными,
но и отрицательными числами? »

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



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

Tonny_Bennet
18-01-2012, 09:17
SetLength(Result,m); »

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

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

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

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

AlexVol
18-01-2012, 10:22
Если честно то думал, что паскаль этого не умеет делать »
А Паскаль этого и не умеет :)
Это умеет Дельфи, начиная с 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
AlexVol,

Судя по синтаксису вы пишете на Pascal или Delphi. »
Да, Tonny_Bennet, это Pascal. »
Вот я сделала. Правда не так виртуозно, как у ferget Но работает »
в коде видно что массив не динамический...




© OSzone.net 2001-2012