2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Двумерные массивы [2] [Delphi]
Сообщение02.01.2015, 03:50 
Аватара пользователя
Хочу, чтобы каждый элемент заданного двумерного массива умножился на два, но не понимаю, что сделал не так.
код: [ скачать ] [ спрятать ]
Используется синтаксис Delphi
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type Tmatrix=array [1..31,1..44] of integer;
procedure Tm (m,n:integer;Var a:TMatrix);
  var
      i,j:integer;
  begin
    writeln ('skolko strok? ');
    readln (m);
    writeln (' skolko stolbcov? ');
    readln (n);
    i:=1;
      while i<=m do begin
        j:=1;
          repeat
              a[i,j]:=random (5);
              write(a[i,j]:4);
             j:=j+1;
         until j>n;
         writeln;
        i:=i+1;
    end;
  end;
  procedure ymnoj (m,n:integer;a:TMatrix; Var b:TMatrix);
    Var
       i,j:integer;
    begin
        for j:=1 to n do
            for i:=1 to m do
              begin
                b[i,j]:=a[i,j]*2;
                write (b[i,j]:2);
              end;
    end;

Var m,n:integer;
    a,b:TMatrix;

Begin
  Tm(m,n,a);
  ymnoj (m,n,a,b);

readln;
End.

 
 
 
 Re: Двумерные массивы [2]
Сообщение02.01.2015, 06:50 
Размеры массива m и n остаются неинициализированными в главной функции и таковыми передаются в функцию умножения. Если вы хотите проинициализировать их в функции ввода, эти параметры должны быть объявлены var.

 
 
 
 Re: Двумерные массивы [2]
Сообщение02.01.2015, 11:44 
Аватара пользователя
venco в сообщении #955343 писал(а):
Размеры массива m и n остаются неинициализированными в главной функции и таковыми передаются в функцию умножения. Если вы хотите проинициализировать их в функции ввода, эти параметры должны быть объявлены var.

Так и сделал
код: [ скачать ] [ спрятать ]
Используется синтаксис Delphi
procedure Tm (Var a:TMatrix;Var m,n:integer);
  var
      i,j:integer;
  begin
    writeln ('skolko strok? ');
    readln (m);
    writeln (' skolko stolbcov? ');
    readln (n);
    i:=1;
      while i<=m do begin
        j:=1;
          repeat
              a[i,j]:=random (5);
              write(a[i,j]:4);
             j:=j+1;
         until j>n;
         writeln;
        i:=i+1;
    end;
  end;
  procedure ymnoj (m,n:integer;a:TMatrix; Var b:TMatrix);
    Var
       i,j:integer;
    begin
        for j:=1 to n do
            for i:=1 to m do
              begin
                b[i,j]:=a[i,j]*2;
                write (b[i,j]:2);
              end;

    end;

Теперь мне выводит массив $a$ (ну это как надо), а массив $b$ мало того, что в строчку, так ещё и не те элементы, которые я хотел задать, я хотел, чтобы он имел удвоенные элементы массива $a$.

 
 
 
 Re: Двумерные массивы [2]
Сообщение02.01.2015, 12:52 
Аватара пользователя
fronnya
1) Разделите ввод, вывод и генерацию на разные функции.
2) Скобки при написании функции следует писать слитно.
"write (b[i,j]:2)" - неправильно
"write(b[i,j]:2)" - правильно
3)
fronnya в сообщении #955371 писал(а):
Теперь мне выводит массив $a$ (ну это как надо), а массив $b$ мало того, что в строчку, так ещё и не те элементы, которые я хотел задать, я хотел, чтобы он имел удвоенные элементы массива $a$.

Программа делает ровно, то что вы написали. Для разделения строчек есть WriteLn;

 
 
 
 Re: Двумерные массивы [2]
Сообщение02.01.2015, 14:08 
Аватара пользователя
Pavia, ввод и генерация у меня ведь правильно написаны? Ну кроме того write (это я пытался вывести)

 
 
 
 Re: Двумерные массивы [2]
Сообщение02.01.2015, 14:57 
fronnya в сообщении #955404 писал(а):
ввод и генерация у меня ведь правильно написаны?

У Вас в выводе массива a внутренним циклом является цикл по j (как бы он не реализовывался), а в выводе b - по i, поэтому в конечном счете Вы получите массив, умноженный на 2 и транспонированный по отношению к исходному. Транспонирование, по-видимому, в желаемые планы не входило.

 
 
 
 Re: Двумерные массивы [2]
Сообщение02.01.2015, 20:44 
Pavia в сообщении #955381 писал(а):
2) Скобки при написании функции следует писать слитно.
"write (b[i,j]:2)" - неправильно
"write(b[i,j]:2)" - правильно
Почему же, оба варианта правильны с точки зрения грамматики языка. Но некоторые считают первый вариант или непоследовательное использование обоих некрасивым. (Я тоже.)

fronnya
Ещё стоило бы размеры массивов из type Tmatrix=array [1..31,1..44] of integer; выделить, написав что-то такое:
Используется синтаксис Delphi
const
  MaxM: Integer = 31;
  MaxN: Integer = 44; // в типах этих констант я не уверен

type
  TMatrix = array[1..MaxM, 1..MaxN] of Integer;

Но ещё лучше использовать динамические массивы, когда узнаете.

 
 
 
 Re: Двумерные массивы [2]
Сообщение03.01.2015, 09:03 
fronnya в сообщении #955404 писал(а):
Pavia, ввод и генерация у меня ведь правильно написаны? Ну кроме того write (это я пытался вывести)

Странно вы как то программы пишете. Написать сразу большой кусок (практически всю вашу программу) и потом долго думать, что же там не работает - это не есть хорошо. Ну до какого-то момента помогут, а потом надоедите вы - и перестанут помогать.

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

 
 
 
 Re: Двумерные массивы [2]
Сообщение03.01.2015, 14:17 
Аватара пользователя
Alexu007 в сообщении #955682 писал(а):
fronnya в сообщении #955404 писал(а):
Pavia, ввод и генерация у меня ведь правильно написаны? Ну кроме того write (это я пытался вывести)

Странно вы как то программы пишете. Написать сразу большой кусок (практически всю вашу программу) и потом долго думать, что же там не работает - это не есть хорошо. Ну до какого-то момента помогут, а потом надоедите вы - и перестанут помогать.

Вообще- то я очень начинающий (такого выражения нет, но все таки). Мне никто особо не рассказывал, как мне поступать. Ну или я не слушал..В общем, у меня получилось сделать так, что все работает, если массив задавать с клавиатуры. Только почему- то новый массив мне выводит в строчку.

 
 
 
 Re: Двумерные массивы [2]
Сообщение03.01.2015, 17:39 
Вложенные циклы идеально подходят для работы с двумерными массивами. Это "псевдокод", фигурные скобки аналоги паскалевских "begin-end", write(enter) должна выполнять перевод строки. Так понятно?


код: [ скачать ] [ спрятать ]
Используется синтаксис C
заполнение массива
for(i = 0; i < n; i++)
{
    for(j = 0; j < m; j++)
    {
     a[i][j] = random(5)
    }
}

вывод на экран
for(i = 0; i < n; i++)
{

    for(j = 0; j < m; j++)
    {
     write(a[i][j])
     write(' ')
    }

write(enter)
}

 
 
 
 Re: Двумерные массивы [2]
Сообщение11.01.2015, 03:38 

(Оффтоп)

Alexu007 в сообщении #955839 писал(а):
Это "псевдокод"
Кавычки зачем?

Хотя да, write(enter) заслуживает того, чтобы псевдокод стал псевдопсевдокодом. :mrgreen:

 
 
 
 Re: Двумерные массивы [2]
Сообщение11.01.2015, 09:39 

(Оффтоп)

Я мог бы написать write("\n"); но будет ли это понятно человеку, пишушему на паскале?

 
 
 
 Re: Двумерные массивы [2]
Сообщение11.01.2015, 17:17 

(Оффтоп)

Коли у вас псевдокод, вы могли бы написать и write(line feed)* **, write(перевод строки) или даже перейти на новую строку. Или я не прав?

Вообще, тут целый кусок (псевдо)кода не нужен, а нужна только идея, что вывод строки надо завершать выводом LF — ну так её можно было и написать прямым текстом. :wink:

* enter за имя символа ну никак нельзя считать. Ни в ASCII, ни в Unicode таких символов нет, и, очевидно, клавиши с символами тоже путать не стоит. Потому enter нельзя, а LF или там CR — можно. Хотя псевдокод получится специфичным, потому лучше использовать в нём второй или третий вариант.

** Кстати, раз уж вы взяли write из паскаля, могли бы утащить оттуда и writeln — та без параметров как раз оно самое.

 
 
 [ Сообщений: 13 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group