2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Двумерные массивы [3] [Delphi]
Сообщение04.01.2015, 00:35 
Аватара пользователя


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


09/05/12
25179
Когда Вы ищете минимум (или максимум), надо сравнивать значение элемента с текущим минимумом или максимумом (соответственно, min и max), а не значением элемента a[1,1].

-- 04.01.2015, 01:03 --

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

 Профиль  
                  
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 01:20 
Аватара пользователя


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


11/06/12
10390
стихия.вздох.мюсли
fronnya в сообщении #956030 писал(а):
как подсвечивать синтаксис?
Тег syntax. В куче кнопочек сверху от поля ввода сообщения есть слова «Подсветка синтаксиса» и рядом можно выбрать язык (сначала выделите часть текста, которая код).

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


27/03/14
1091
Поправил. Крутатенюшки.

-- 04.01.2015, 00:35 --

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

 Профиль  
                  
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 01:42 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
fronnya, был рад помочь. Насчёт Notepad++ не ко мне вопрос. Слышал много хороших отзывов об этом редакторе, но сам не пользовался.

 Профиль  
                  
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 02:28 
Заслуженный участник
Аватара пользователя


18/01/13
12044
Казань
Не очень поняла насчет смены знака. Его надо для всех элементов делать? Или только для максимальных и минимальных?

Если "плюс" меняется на "минус", а "минус" на "плюс", то это одна операция, $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 
Заслуженный участник
Аватара пользователя


18/01/13
12044
Казань
А зачем в первой процедуре разные циклы: while, repeat? В обоих случаях удобнее простой for.
Кроме того, зачем две процедуры, отдельно для максимума, отдельно для минимума? двойной перебор. Разве нельзя и то и другое в одном цикле найти?

 Профиль  
                  
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 03:34 
Аватара пользователя


27/03/14
1091
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 
Заслуженный участник
Аватара пользователя


18/01/13
12044
Казань
fronnya в сообщении #956082 писал(а):
скажите мне пожалуйста случай, когда программа не будет работать, я попробую исправить.

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

 Профиль  
                  
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 03:50 
Аватара пользователя


27/03/14
1091
provincialka в сообщении #956084 писал(а):
fronnya в сообщении #956082 писал(а):
скажите мне пожалуйста случай, когда программа не будет работать, я попробую исправить.

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

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

 Профиль  
                  
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 03:54 
Заслуженный участник
Аватара пользователя


18/01/13
12044
Казань
Еще вопрос: зачем вам нужна вторая матрица, $b$? Если матрица $a$ дальше не используется, то измененное значение можно присвоить прямо ей же: $a[ i , j] :=-a[i,j]$. Если вы работаете с $a$ как с параметром, не указывая $var$, то массив вообще не изменится.

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

 Профиль  
                  
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 04:02 
Аватара пользователя


27/03/14
1091
provincialka в сообщении #956088 писал(а):
Впрочем, это зависит от наличия последующих заданий.

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

 Профиль  
                  
 
 Re: Двумерные массивы [3]
Сообщение04.01.2015, 06:18 


30/08/10
159
fronnya, редактор Notepad++ имеет много полезных функций. Из простых: подсветка синтаксиса, несколько вкладок, сохранение/загрузка сессий, возможность сворачивать/разворачивать блоки программ (скажем, функции), удобная работа табуляции, поиск/замена, в т.ч. по регулярным выражениям (скажем, можно найти все номера мобильных телефонов в файле). Ещё подсветка имён (при выделении имени переменной my_var подсветит все её вхождения), автоподстановка, если включить (забыл, как называется, выводит список всех функций, когда начинаешь писать имя функции), другие мелочи. Также имеет много разных расширений, позволяет писать свои скрипты, если не ошибаюсь, можно сделать запуск своей программы в окне Notepad++, а это уже делает его похожим на среду разработки.

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

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



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

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


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

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