Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Количество компонент матрицы совпадающих по абсолютному значению с максимумом (http://www.tehnari.ru/f43/t86132/)

maksi 09.03.2013 14:41

Количество компонент матрицы совпадающих по абсолютному значению с максимумом
 
Ребята помогите найти: 1. Количество компонент матрицы совпадающих по абсолютному значению с максимумом
2. Записать в одномерный массив значения:-1, если сумма индексов максимальной по абсолютному значению компоненты матрицы m[n,k] является нечетным числом, и 1-если четным числом.
Код:

Program zadanie; 
Uses crt; 
const
 digits=1; 
Type
 matrix = Array [1..10, 1..10] of real; 
 massiv = Array [1..10] of Integer; 
Var
 m: matrix; 
 max:real; 
 v: massiv; 
 imax,n, k, i, j, a, b,p1, p2, min,imin,s,t: Integer; 
Begin 
 Write ('Введите количество строк матрицы n'); 
 WriteLN (' не менее 2 и не более 10'); 
 ReadLN (n); 
 If (n<2) Or (n>10) Then 
  Begin 
  Write ('Вы ввели неправильное количество строк меньше 2 или'); 
  Write (' больше 10, поэтому принят'); 
  WriteLN (' максимальный размер, т.е. n=10'); 
  n:=10; 
  End; 
 Write ('Введите количество столбцов матрицы k'); 
 WriteLN (' не менее 2 и не более 10'); 
 ReadLN (k); 
 If (k<2) Or (k>10) Then 
  Begin 
  Write ('Вы ввели неправильное количество столбцов меньше 2 или'); 
  Write (' больше 10, поэтому принят'); 
  WriteLN (' максимальный размер, т.е. k=10'); 
  k:=10; 
  End; 
 Write ('Введите левую а и правую b границы диапазона'); 
 WriteLN (' значений компонент матрицы'); 
 Write ('a=');
 ReadLN (a); 
 Write ('b=');
 ReadLN (b); 
 If a>b Then 
  Begin 
  p1:=a;
  a:=b;
  b:=p1; 
  End; 
 If a=b Then 
  Begin 
  p1:=0;
  p2:=b; 
  End 
 Else
  If b=0 Then 
  Begin 
    p1:=a;
    p2:=0; 
  End 
 Else 
  Begin 
  p1:=b-a;
  p2:=a; 
  End; 
 Randomize; 
 s:=0; 
 For j:=1 To k Do 
  For i:=1 To n Do 
  Begin 
    m[i,j]:=p2+random(p1+1); 
  End; 
 begin 
  For i:=1 To n Do 
  Begin 
    For j:=1 To k Do Write (m[i,j]:6:digits); 
    WriteLN; 
  End;   
 writeln;   
 imax:=1;   
 max:=m[i,j];   
 for i:=1 to N do     
  for j:=1 to k do   
  if max<abs(m[i,j]) then   
    begin   
    max:=abs(m[i,j]);   
    imax:=i;   
    imax:=j;   
    end;   
 writeln('Максимальное абсолютное значение:  max=',max:5:digits);   
 write('Индекс max ');   
 For i:=1 to n do   
  For j:=1 to k do   
  If abs(m[i,j])=max Then Write('[',i,';',j,']');   
 end; 
end.


Vladimir_S 09.03.2013 17:24

Да... программа работает, но она, если так можно выразиться, весьма далека от совершенства. Давайте разберем:
Код:

Uses crt;
Покажите мне в Вашей программе хоть одну команду CRT. Нету? Значит и модуль цеплять ни к чему. Строку убрать.
Код:

Write ('Введите количество строк матрицы n'); 
 WriteLN (' не менее 2 и не более 10'); 
 ReadLN (n); 
 If (n<2) Or (n>10) Then 
  Begin 
  Write ('Вы ввели неправильное количество строк меньше 2 или'); 
  Write (' больше 10, поэтому принят'); 
  WriteLN (' максимальный размер, т.е. n=10'); 
  n:=10; 
  End; 
 Write ('Введите количество столбцов матрицы k'); 
 WriteLN (' не менее 2 и не более 10'); 
 ReadLN (k); 
 If (k<2) Or (k>10) Then 
  Begin 
  Write ('Вы ввели неправильное количество столбцов меньше 2 или'); 
  Write (' больше 10, поэтому принят'); 
  WriteLN (' максимальный размер, т.е. k=10'); 
  k:=10; 
  End;

Странный подход, ну да Вам виднее. Я бы воспользовался оператором Repeat..Until с тем, чтобы зациклить вводы до тех пор, пока вводимые параметры не попадут в указанные диапазоны.
Код:

If a>b Then 
  Begin 
  p1:=a;
  a:=b;
  b:=p1; 
  End; 
 If a=b Then 
  Begin 
  p1:=0;
  p2:=b; 
  End 
 Else
  If b=0 Then 
  Begin 
    p1:=a;
    p2:=0; 
  End 
 Else 
  Begin 
  p1:=b-a;
  p2:=a; 
  End;

Что-то уж-жасно путаное и сложное, ну да вроде работает. Ладно, пропустим.
Код:

For j:=1 To k Do 
  For i:=1 To n Do 
  Begin 
    m[i,j]:=p2+random(p1+1); 
  End;

Если операнд всего один, то окружать его операторными скобками (begin..end) - лишнее. Можно, но не нужно.
Код:

  End; 
 begin 
  For i:=1 To n Do

Здесь открывающий begin, равно как и закрывающий end в предпоследней строчке программы - АБСОЛЮТНО лишние. То, что между ними, не является телом какого бы то ни было оператора либо подпрограммы, так зачем они всунуты?
Далее. Вот это:
Код:

imax:=1;
равно как и это:
Код:

    imax:=i;   
    imax:=j;

- абсолютно бессмысленные записи непонятно чего и зачем. Цикл поиска максимума следует организовать так:
Код:

writeln;     
 max:=m[i,j];   
 for i:=1 to N do     
  for j:=1 to k do   
  if max<abs(m[i,j]) then  max:=abs(m[i,j]);   
 writeln('Максимальное абсолютное значение:  max=',max:5:digits)

Пропущен поиск количества совпадений. Раз в условии требуется, то нужно подсчитать. Тут так. Вместо
Код:

For i:=1 to n do   
  For j:=1 to k do   
  If abs(m[i,j])=max Then Write('[',i,';',j,']');

ставим
Код:

For i:=1 to n do   
  For j:=1 to k do   
  If abs(m[i,j])=max then
    begin
    Write('[',i,';',j,']');
    s:=s+1;
    end;
  Writeln('Количество совпадений - ',s);

В самом конце программы перед закрывающим "end." очень желательно поставить опрератор
Код:

Readln;
Тогда программа остановится и позволит рассмотреть выведенный на экран результат.

Теперь по второй части задания (насчет одномерного массива). Там явно что-то пропущено, типа поиска локальных максимумов по строкам либо по столбцам матрицы. Иначе из чего же формировать массив? Уточните.

maksi 09.03.2013 18:03

Vladimir_S спасибо, что уделили внимание моей теме. По поводу второго задания- это продолжение первого. Там одномерный массив сформировывается из максимальных по абсолютному значению компонентов матрицы. Для наглядности: допустим если наша матрица m[i,j] имеет пять максимумов с индексами [1,1],[1,3],[2,1],[2,3],[2,4] то одномерный массив должен выглядеть вот так v[i]=1 1 -1 -1 1

Vladimir_S 09.03.2013 20:04

Цитата:

Сообщение от maksi (Сообщение 878041)
Vladimir_S спасибо, что уделили внимание моей теме. По поводу второго задания- это продолжение первого. Там одномерный массив сформировывается из максимальных по абсолютному значению компонентов матрицы. Для наглядности: допустим если наша матрица m[i,j] имеет пять максимумов с индексами [1,1],[1,3],[2,1],[2,3],[2,4] то одномерный массив должен выглядеть вот так v[i]=1 1 -1 -1 1

Понятно. Так что - какие-то проблемы?
Тут так. В определении типов нужно поставить
Код:

massiv = Array [1..100] of Integer;
т.е. в пределе совпасть могут все элементы матрицы, а их n*k, по максимуму - 100. Дальше так:
Код:

For i:=1 to n do   
  For j:=1 to k do   
  If abs(m[i,j])=max then
    begin
    Write('[',i,';',j,']');
    s:=s+1;
    if ((i+j) mod 2)=0 then v[s]:=1 else v[s]:=-1;
    end;
 Writeln;
 Writeln('Количество совпадений - ',s);
 For i:=1 to s do write(v[i]:3);


maksi 09.03.2013 22:18

Vladimir_S огромное человеческое СПАСИБО!!! :respect:


Часовой пояс GMT +4, время: 09:23.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.