2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3
 
 Re: Произведение матриц
Сообщение05.01.2015, 02:33 
Заслуженный участник
Аватара пользователя


18/01/13
12065
Казань
Aritaborian

(Оффтоп)

Учтите мой возраст. Когда нас учили программированию (не помню, Фортран был или Алгол) мы писали программы на бланках, а девочки-операторы набивали их на перфокарты. Естественно, с ошибками. Отдавать на переделку - долго, да и ненадежно, новых ошибок наделают. Так мы перфокарты сами правили: бритвой прорезали дырочки, а лишние затыкали обрезками от перфорирующей машины. Это называлось "мОзги тереть". А уж Паскаль я самостоятельно учила, лет через 10-20 после окончания вуза. До разных "С-ей" дело не дошло. Хотя, конечно, высказываться мне, как мастодонту от программирования, надо осторожнее.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение05.01.2015, 02:34 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
fronnya в сообщении #956593 писал(а):
Хм, а вот правда, зачем ребят учить в лицее языку СИ, если они потом на том же физфаке все равно будут паскаль учить?
Интереснейший вопрос. Не слабо́ вам было бы поднять его, обратившись хотя бы к замдекана? (Если уж на самом деле интересно.)
fronnya в сообщении #956593 писал(а):
Нас лектор говорила, что в общем паскаль сложнее, чем СИ в силу того, что в СИ заранее много чего заложено. Типа хотят, чтобы мы посмотрели, как все на самом деле.
Хотел бы я послушать эту даму.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение05.01.2015, 02:34 
Аватара пользователя


27/03/14
1091
provincialka в сообщении #956567 писал(а):
А делать ввод отдельно нужно, чтобы пользоваться одной процедурой для создания обеих матриц. Например, процедура создания называется sozd и вы вызываете sozd(m,n,a); sozd(n,p,b).

Точно, спасибо. Я как обычно, не пользуюсь всеми преимуществами процедур, потому что обо всех их не знаю. Насколько я знаю, в СИ тоже есть только функции, там это то же самое.

-- 05.01.2015, 01:36 --

Aritaborian в сообщении #956599 писал(а):
Хотел бы я послушать эту даму.

Как лектор она меня вполне устраивает. Объясняет максимально доступно, мне нравится. Может быть, это я сейчас что-то не то ляпнул, может, неправильно понял её. Но, как мне кажется, все прозвучало именно в том духе.

-- 05.01.2015, 01:38 --

Aritaborian в сообщении #956599 писал(а):
Не слабо́ вам было бы поднять его, обратившись хотя бы к замдекана? (Если уж на самом деле интересно.)

Мне интересно и духу у меня хватит так сделать. Но для начала я сдам эту сессию (если сдам).

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение05.01.2015, 06:50 
Заслуженный участник


16/02/13
4196
Владивосток

(Оффтоп)

Aritaborian в сообщении #956575 писал(а):
Ну вот зачем это вообще?
Бросьте. В каждом языке свои тараканы. В каких-то меньше, но это явно не Цэ, хоть с шарпом, хоть с плюсами, и не Питон.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение05.01.2015, 11:15 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
Пара замечаний по коду.
Во-первых, давайте таки осмысленные имена переменным, функциям и процедурам. Вот типу TMatrix дали же осмысленное имя? Теперь тоже самое надо проделать с остальными идентификаторами. Или комментарии хотя бы вставляйте.
Далее. Если после операторов for, while или if у вас идет один оператор, то использовать begin .. end необязательно. Это
fronnya в сообщении #956537 писал(а):
Используется синтаксис Pascal
        for j:=1 to n do
          begin
            c[i,k]:=a[i,j]*b[j,k]+c[i,k];
          end;
 
Можно переписать так:
Используется синтаксис Pascal
        for j:=1 to n do
          c[i,k]:=a[i,j]*b[j,k]+c[i,k];
 

Если число итераций цикла определено заранее и в самом цикле не изменяется, я бы рекомендовал использовать for. В данном куске кода
fronnya в сообщении #956537 писал(а):
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
procedure TM(Var m,n:integer; Var a:TMatrix);
var
    i,j:integer;
begin
  randomize;
  writeln ('kol-vo strok: ');
  readln(m);
  writeln ('kol-vo stolbcov: ');
  readln(n);
  i:=1;
    while i<=m do
      begin
        j:=1;
          repeat
            a[i,j]:=random(6)-1;
            write(a[i,j]:3);
            j:=j+1;
          until j>n;
        writeln;
        i:=i+1;
      end;
end;

У вас идет сначала while, потом repeat .. until, хотя имхо проще так (тем более что при использовании for счетчик цикла сбрасывается автоматически):
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
procedure TM(Var m,n:integer; Var a:TMatrix);
var
    i,j:integer;
begin
  randomize;
  writeln ('kol-vo strok: ');
  readln(m);
  writeln ('kol-vo stolbcov: ');
  readln(n);
  for i:=1 to m do
    begin
      for j:=1 to n do
        begin
          a[i,j]:=random(6)-1;
          write(a[i,j]:3);
        end;
      writeln;
    end;
end;
На выполнении программы это никак не отразится, но сэкономит некоторое количество времени тому, кто будет этот код читать (даже если это будете вы, через подгода вы уже все забудете, что делал этот код, и начнете разбираться в нем заново).

Далее, как уже рекомендовала provincialka, имеет смысл разделить инициализацию (задание размера массивов), заполнение данными и вывод на экран. В этом случае, когда вы отладите код (или размер массива станет слишком большим для вывода на экран), вывод массива будет проще отключить (закомментировать всего одну строку). А еще вам будут не нужны две процедуры (TM и TM1), потому что их работу можно выполнить одной, более универсальной. То есть у вас получится что-то вроде такого:
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type TMatrix=array[1..100,1..100] of integer;


procedure init_array(Var m,n:integer; Var a:TMatrix);
var
    i,j: integer;
begin
  randomize;
  for i:=1 to m do
    for j:=1 to n do
      a[i,j]:=random(6)-1;
end;

procedure print_array(m, n: integer; a:TMatrix);
var
    i,j: integer;
begin
  for i:=1 to m do
    begin
      for j:=1 to n do
        write(a[i,j]);
      writeln;
    end;
end;
 
Var
    m,n,p: integer;
    a,b,c: TMatrix;

Begin
  writeln ('Rows: ');
  readln(m);
  writeln ('Columns: ');
  readln(n);
  writeln ('Columns in second array: ');
  readln(p);
 
  init_array(m, n, a);
  init_array(n, p, b);

  print_array(m, n, a);
  print_array(n, p, b);

  writeln;
  ymnog(m,n,p,a,b,c);
readln;
End.

Теперь о преимуществах динамических массивов. Создавая статический массив, вы резервируете заранее большой объем памяти, который иногда не нужен, а иногда - недостаточен. В случае динамических массивов:
1) Экономия памяти в первом случае
2) Отсутствие необходимости перекомпиляции во втором
3) Не нужно передавать в фунции информацию о фактическом размере массивов. То есть в нашем случае код будет выглядеть так:
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type TMatrix=array of array of integer;


procedure init_array(Var a:TMatrix);
var
    i,j: integer;
begin
  randomize;
  for i:=0 to high(a) do
    for j:=0 to high(a[i]) do
      a[i,j]:=random(6)-1;
end;

procedure print_array(a:TMatrix);
var
    i,j: integer;
begin
  for i:=0 to high(a) do
    begin
      for j:=0 to high(a[i]) do
        write(a[i,j]);
      writeln;
    end;
end;
 
Var
    m,n,p: integer;
    a,b,c: TMatrix;

Begin
  writeln ('Rows: ');
  readln(m);
  writeln ('Columns: ');
  readln(n);
  writeln ('Columns in second array: ');
  readln(p);
 
  setlength(a, m, n);
  setlength(b, n, p);
 
  init_array(a);
  init_array(b);

  print_array(a);
  print_array(b);

  writeln;
  ymnog(m,n,p,a,b,c);
readln;
End.
На простых задачах вроде этой преимущества всего вышеперечисленного может и не так хорошо видны, но если вам доведется писать что-то более сложное, чем просто перемножение двух матриц, вы убедитесь в этом.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение06.01.2015, 20:38 
Аватара пользователя


27/03/14
1091
rockclimber, большое спасибо за замечания. На счет циклов while и repeat- таково условие задачи.

 Профиль  
                  
 
 Re: Произведение матриц
Сообщение06.01.2015, 23:07 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
fronnya в сообщении #957545 писал(а):
На счет циклов while и repeat- таково условие задачи.
Я уже видел в другом вашем топике, что так вас заставляют писать, чтобы вы "научились пользоваться всеми типами циклов". Только проблема вся в том, что у каждого типа циклов есть своя специфика, и чтобы научить вас пользоваться ими совсем правильно, по-хорошему надо эту специфику давать в виде разных задач. Чтобы вы, глядя на задачу, сами определяли, какой цикл больше походит в данном случае.

-- 07.01.2015, 01:05 --

Munin написал мне сообщение в ЛС, по договоренности с ним копирую переписку сюда.

Munin писал(а):
rockclimber в сообщении #956649 писал(а):
Далее. Если после операторов for, while или if у вас идет один оператор, то использовать begin .. end необязательно. Это
Можно переписать так:

Во-первых, это не обязательно хорошо для новичка. (Позабудет добавить скобки при расширении тела цикла.)
Во-вторых, это вообще не факт, что good habit. При интенсивных правках кода лучше держать скобки включёнными.
Я бы рекомендовал даже если хочется скобки убрать, то только в финальной отлаженно-вылизанной версии.
И даже если так, знаю только один аргумент за убирание скобок: чтобы текст функции стал короче в строках и обозримее (принцип "функция должна умещаться на один экран").
Да, возможно, вы правы. Потенциально это источник ошибок, и источников подобного рода быть не должно. Но, как мне кажется, именно в этом случае проблема решается просто. Во всех книгах, которые я читал, язык был хорошо и систематически описан. Конструкции for, if и while выполняют ровно один оператор, конструкция begin .. end - это тоже "один оператор". Лично мне (и большинству моих знакомых) этого было достаточно, чтобы никогда не ошибаться. Ну и по ощущениям (от вопросов на форумах) по этой причине проблем почти не возникает.
Во время отладки я тоже часто оставляю эти скобки. А вот когда они очень бы мешали - это если надо выполнить цикл for, в котором один if - then - else, и везде по одному оператору. 3 строки или 11 - существенная разница.

-- 07.01.2015, 01:05 --

Munin писал(а):
rockclimber писал(а):
Да, возможно, вы правы. Потенциально это источник ошибок, и источников подобного рода быть не должно. Но, как мне кажется, именно в этом случае проблема решается просто. Во всех книгах, которые я читал, язык был хорошо и систематически описан. Конструкции for, if и while выполняют ровно один оператор, конструкция begin .. end - это тоже "один оператор". Лично мне (и большинству моих знакомых) этого было достаточно, чтобы никогда не ошибаться. Ну и по ощущениям (от вопросов на форумах) по этой причине проблем почти не возникает.
Во время отладки я тоже часто оставляю эти скобки. А вот когда они очень бы мешали - это если надо выполнить цикл for, в котором один if - then - else, и везде по одному оператору. 3 строки или 11 - существенная разница.
По поводу if - then - else - вот у меня железное правило никогда не писать оператор в одну строчку с условием. Так что для меня уже один он занял бы 4 строки (даже без скобочек), итого всего 5. Хотя, конечно, не 11.
Я настолько железно не придерживаюсь, но обычно тоже в 4 строки пишу. Только если совсем уж короткие выражения (в том числе условие в if), пишу в две.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу Пред.  1, 2, 3

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



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

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


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

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