• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Количество компонент матрицы совпадающих по абсолютному значению с максимумом

  • Автор темы Автор темы maksi
  • Дата начала Дата начала

maksi

Ученик
Регистрация
9 Мар 2013
Сообщения
4
Реакции
0
Баллы
0
Количество компонент матрицы совпадающих по абсолютному значению с максимумом

Ребята помогите найти: 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.
 
Да... программа работает, но она, если так можно выразиться, весьма далека от совершенства. Давайте разберем:
Код:
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;
Тогда программа остановится и позволит рассмотреть выведенный на экран результат.

Теперь по второй части задания (насчет одномерного массива). Там явно что-то пропущено, типа поиска локальных максимумов по строкам либо по столбцам матрицы. Иначе из чего же формировать массив? Уточните.
 
Vladimir_S спасибо, что уделили внимание моей теме. По поводу второго задания- это продолжение первого. Там одномерный массив сформировывается из максимальных по абсолютному значению компонентов матрицы. Для наглядности: допустим если наша матрица m[i,j] имеет пять максимумов с индексами [1,1],[1,3],[2,1],[2,3],[2,4] то одномерный массив должен выглядеть вот так v=1 1 -1 -1 1
 
Vladimir_S спасибо, что уделили внимание моей теме. По поводу второго задания- это продолжение первого. Там одномерный массив сформировывается из максимальных по абсолютному значению компонентов матрицы. Для наглядности: допустим если наша матрица m[i,j] имеет пять максимумов с индексами [1,1],[1,3],[2,1],[2,3],[2,4] то одномерный массив должен выглядеть вот так v=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);
 
Vladimir_S огромное человеческое СПАСИБО!!! :respect:
 
Назад
Сверху