Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 09.03.2013, 14:41   #1 (permalink)
maksi
Новичок
 
Регистрация: 09.03.2013
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Количество компонент матрицы совпадающих по абсолютному значению с максимумом

Ребята помогите найти: 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.
maksi вне форума   Ответить с цитированием

Старый 09.03.2013, 14:41
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Интересующие вас ответы могут содержаться в этих темах

Повредил компонент LED гирлянды, нужна помощь
Найти количество нулей на С#
Количество гласных букв в тексте

Старый 09.03.2013, 17:24   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Да... программа работает, но она, если так можно выразиться, весьма далека от совершенства. Давайте разберем:
Код:
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 вне форума   Ответить с цитированием
Старый 09.03.2013, 18:03   #3 (permalink)
maksi
Новичок
 
Регистрация: 09.03.2013
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Vladimir_S спасибо, что уделили внимание моей теме. По поводу второго задания- это продолжение первого. Там одномерный массив сформировывается из максимальных по абсолютному значению компонентов матрицы. Для наглядности: допустим если наша матрица m[i,j] имеет пять максимумов с индексами [1,1],[1,3],[2,1],[2,3],[2,4] то одномерный массив должен выглядеть вот так v[i]=1 1 -1 -1 1
maksi вне форума   Ответить с цитированием
Старый 09.03.2013, 20:04   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от maksi Посмотреть сообщение
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);
Vladimir_S вне форума   Ответить с цитированием
Старый 09.03.2013, 22:18   #5 (permalink)
maksi
Новичок
 
Регистрация: 09.03.2013
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Vladimir_S огромное человеческое СПАСИБО!!!
maksi вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.