2014 dxdy logo

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

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




 
 Двумерные массивы [3] [Delphi]
Сообщение04.01.2015, 00:35 
Аватара пользователя
Хочу, чтобы программа из заданного случайно массива сначала выбрала максимальное и минимальное значение, а потом отрицательные элементы заменила на те же по модулю со знаком плюс, а те, что за знаком плюс- на минус. Последнее работает. Проблема в максимально и минимальном значении. Вот код
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type TMatrix=array [1..100,1..100] of integer;
procedure Mtrx(Var m,n:integer; Var a:TMatrix);
var
    i,j:integer;
begin
  write('kol-vo strok ');
  readln(m);
  write('kol-vo stolbcov ');
  readln(n);
  writeln;
  randomize;
  j:=1;
    while j<=n do
      begin
        i:=1;
          repeat
            a[i,j]:=random (41)-20;
            write (a[i,j]:4);
            i:=i+1;
          until i>m;
          writeln;
          j:=j+1;
      end;
end;
procedure poisk(m,n:integer;a:TMatrix; Var b:TMatrix);
var
    i,j,max:integer;
begin
  max:=a[i,j];
    for j:=1 to n do
      begin
        for i:=1 to m do
          begin
            if a[i,j]>=0 then
              begin
                b[i,j]:=(-1)*a[i,j];
              end
                         else
              begin
                b[i,j]:=(-1)*a[i,j];
              end;
              write (b[i,j]:4);
          end;
          writeln;
      end;
end;
procedure maxi(m,n:integer;a:TMatrix; Var max:integer);
Var
    i,j:integer;
begin
  max:=a[1,1];
    for j:=1 to n do
      begin
        for i:=1 to m do
          begin
            if a[i,j]>=a[1,1] then
              begin
                max:=a[i,j]
              end;
          end;
      end;
  writeln ('max. value= ',max);
end;
procedure mini(m,n:integer; a:TMatrix; Var min:integer);
Var
    i,j:integer;
begin
  min:=a[1,1];
    for j:=1 to n do
      begin
        for i:=1 to m do
          begin
            if a[i,j]<=a[1,1] then
              begin
                min:=a[i,j];
              end;
          end;
      end;
  writeln ('min. value= ', min);
end;

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

Begin
  Mtrx(m,n,a);
  writeln;
  maxi(m,n,a,max);
  writeln;
  mini(m,n,a,min);
  writeln;
  poisk(m,n,a,b);
  readln;
End.

Если не вызывать процедуру mini, то максимальное значение ищет правильно, а если вызвать, то минимальное значение выберет, а максимальное- выберет, но неверное, где у меня ошибка?

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 01:02 
Когда Вы ищете минимум (или максимум), надо сравнивать значение элемента с текущим минимумом или максимумом (соответственно, min и max), а не значением элемента a[1,1].

-- 04.01.2015, 01:03 --

P.S. Кстати, на форуме есть возможность вставлять код с подстветкой синтаксиса - в Вашем случае Delphi или Pascal. Этим стоит пользоваться.

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 01:20 
Аватара пользователя
Pphantom в сообщении #956020 писал(а):
Когда Вы ищете минимум (или максимум), надо сравнивать значение элемента с текущим минимумом или максимумом (соответственно, min и max), а не значением элемента a[1,1].

-- 04.01.2015, 01:03 --

P.S. Кстати, на форуме есть возможность вставлять код с подстветкой синтаксиса - в Вашем случае Delphi или Pascal. Этим стоит пользоваться.

Спасибо большое, сработало, как я мог это упустить.

-- 04.01.2015, 00:22 --

Pphantom, а как подсвечивать синтаксис?

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 01:30 
Аватара пользователя
fronnya в сообщении #956030 писал(а):
как подсвечивать синтаксис?
Тег syntax. В куче кнопочек сверху от поля ввода сообщения есть слова «Подсветка синтаксиса» и рядом можно выбрать язык (сначала выделите часть текста, которая код).

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 01:33 
Аватара пользователя
Поправил. Крутатенюшки.

-- 04.01.2015, 00:35 --

Aritaborian, кстати, в чем смысл редактора notepad++ ? Только в том, что там можно сдвиги делать, как в средах программирования?

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 01:42 
Аватара пользователя
fronnya, был рад помочь. Насчёт Notepad++ не ко мне вопрос. Слышал много хороших отзывов об этом редакторе, но сам не пользовался.

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 02:28 
Аватара пользователя
Не очень поняла насчет смены знака. Его надо для всех элементов делать? Или только для максимальных и минимальных?

Если "плюс" меняется на "минус", а "минус" на "плюс", то это одна операция, $b=-a$. Возникают вопросы.
Первое. Зачем нужен if ... else если в обоих случаях делается одно и то же:
fronnya в сообщении #956015 писал(а):

Используется синтаксис Pascal
if a[i,j]>=0 then
begin
b[i,j]:=(-1)*a[i,j];
end
else
begin
b[i,j]:=(-1)*a[i,j];
end;

И второе: чем умножение $a$ на (-1) лучше, чем просто $-a$? Разве что что-то с типами данных?
Чисто зрительно begin и end здесь мешают: ведь внутри по одному оператору. Я бы записала так:
Используется синтаксис Pascal
if a[i,j]>=0 then b[i,j]:=-a[i,j]
   else b[i,j]:=-2*a[i,j];
Ну, при условии, что были бы нужны именно такие действия. Но это чисто "для красоты", если не будут добавляться другие операторы.

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 03:33 
Аватара пользователя
А зачем в первой процедуре разные циклы: while, repeat? В обоих случаях удобнее простой for.
Кроме того, зачем две процедуры, отдельно для максимума, отдельно для минимума? двойной перебор. Разве нельзя и то и другое в одном цикле найти?

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 03:34 
Аватара пользователя
provincialka в сообщении #956062 писал(а):
Не очень поняла насчет смены знака. Его надо для всех элементов делать? Или только для максимальных и минимальных?

Если "плюс" меняется на "минус", а "минус" на "плюс", то это одна операция, $b=-a$. Возникают вопросы.
Первое. Зачем нужен if ... else если в обоих случаях делается одно и то же:
fronnya в сообщении #956015 писал(а):

Используется синтаксис Pascal
if a[i,j]>=0 then
begin
b[i,j]:=(-1)*a[i,j];
end
else
begin
b[i,j]:=(-1)*a[i,j];
end;

И второе: чем умножение $a$ на (-1) лучше, чем просто $-a$? Разве что что-то с типами данных?

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

-- 04.01.2015, 02:35 --

provincialka в сообщении #956081 писал(а):
А зачем в первой процедуре разные циклы: while, repeat? В обоих случаях удобнее простой for.
Кроме того, зачем две процедуры, отдельно для максимума, отдельно для минимума? двойной перебор. Разве нельзя и то и другое в одном цикле найти?

Все, не только на форуме, задают подобные вопросы. Дело в том, что нас пытаются научить работать с циклами,хотят, чтобы мы одинаково хорошо владели ими всеми. Ясное дело, что в данном случае цикл for подходит лучше остальных. Зачем две процедуры? Не суть. Можно и одну. Я все поправлю.

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 03:40 
Аватара пользователя
fronnya в сообщении #956082 писал(а):
скажите мне пожалуйста случай, когда программа не будет работать, я попробую исправить.

Ясно, что будет работать. Только зачем? Про оптимизацию кода слышали?
В данном случае никакого "если" не надо, все в одну строчку пишется. Может, все-таки, задание было несколько другое?

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 03:50 
Аватара пользователя
provincialka в сообщении #956084 писал(а):
fronnya в сообщении #956082 писал(а):
скажите мне пожалуйста случай, когда программа не будет работать, я попробую исправить.

Ясно, что будет работать. Только зачем? Про оптимизацию кода слышали?
В данном случае никакого "если" не надо, все в одну строчку пишется. Может, все-таки, задание было несколько другое?

Было именно таким, я его сам придумал :oops: Про оптимизацию кода я слышал. Позже оптимизирую, насколько смогу. Я знаю, как это сделать, но целью было, чтобы программа заработала.

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 03:54 
Аватара пользователя
Еще вопрос: зачем вам нужна вторая матрица, $b$? Если матрица $a$ дальше не используется, то измененное значение можно присвоить прямо ей же: $a[ i , j] :=-a[i,j]$. Если вы работаете с $a$ как с параметром, не указывая $var$, то массив вообще не изменится.

Более того, если вам нужен только вывод на печать, вот и выводите $-a[i,j]$, зачем ее чему-то присваивать? Впрочем, это зависит от наличия последующих заданий.

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 04:02 
Аватара пользователя
provincialka в сообщении #956088 писал(а):
Впрочем, это зависит от наличия последующих заданий.

Вот-вот. Я ещё придумаю так, чтобы матрица $b$ понадобилась. Стараюсь писать в общем случае.

 
 
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 06:18 
fronnya, редактор Notepad++ имеет много полезных функций. Из простых: подсветка синтаксиса, несколько вкладок, сохранение/загрузка сессий, возможность сворачивать/разворачивать блоки программ (скажем, функции), удобная работа табуляции, поиск/замена, в т.ч. по регулярным выражениям (скажем, можно найти все номера мобильных телефонов в файле). Ещё подсветка имён (при выделении имени переменной my_var подсветит все её вхождения), автоподстановка, если включить (забыл, как называется, выводит список всех функций, когда начинаешь писать имя функции), другие мелочи. Также имеет много разных расширений, позволяет писать свои скрипты, если не ошибаюсь, можно сделать запуск своей программы в окне Notepad++, а это уже делает его похожим на среду разработки.

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


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