2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Двумерные массивы [2] [Delphi]
Сообщение02.01.2015, 03:50 
Аватара пользователя


27/03/14
1091
Хочу, чтобы каждый элемент заданного двумерного массива умножился на два, но не понимаю, что сделал не так.
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Заслуженный участник


04/05/09
4587
Размеры массива m и n остаются неинициализированными в главной функции и таковыми передаются в функцию умножения. Если вы хотите проинициализировать их в функции ввода, эти параметры должны быть объявлены var.

 Профиль  
                  
 
 Re: Двумерные массивы [2]
Сообщение02.01.2015, 11:44 
Аватара пользователя


27/03/14
1091
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 
Аватара пользователя


31/10/08
1244
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 
Аватара пользователя


27/03/14
1091
Pavia, ввод и генерация у меня ведь правильно написаны? Ну кроме того write (это я пытался вывести)

 Профиль  
                  
 
 Re: Двумерные массивы [2]
Сообщение02.01.2015, 14:57 
Заслуженный участник


09/05/12
25179
fronnya в сообщении #955404 писал(а):
ввод и генерация у меня ведь правильно написаны?

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

 Профиль  
                  
 
 Re: Двумерные массивы [2]
Сообщение02.01.2015, 20:44 
Заслуженный участник


27/04/09
28128
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 


24/05/09

2054
fronnya в сообщении #955404 писал(а):
Pavia, ввод и генерация у меня ведь правильно написаны? Ну кроме того write (это я пытался вывести)

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

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

 Профиль  
                  
 
 Re: Двумерные массивы [2]
Сообщение03.01.2015, 14:17 
Аватара пользователя


27/03/14
1091
Alexu007 в сообщении #955682 писал(а):
fronnya в сообщении #955404 писал(а):
Pavia, ввод и генерация у меня ведь правильно написаны? Ну кроме того write (это я пытался вывести)

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

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

 Профиль  
                  
 
 Re: Двумерные массивы [2]
Сообщение03.01.2015, 17:39 


24/05/09

2054
Вложенные циклы идеально подходят для работы с двумерными массивами. Это "псевдокод", фигурные скобки аналоги паскалевских "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 
Заслуженный участник


27/04/09
28128

(Оффтоп)

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

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

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


24/05/09

2054

(Оффтоп)

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

 Профиль  
                  
 
 Re: Двумерные массивы [2]
Сообщение11.01.2015, 17:17 
Заслуженный участник


27/04/09
28128

(Оффтоп)

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

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

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group