Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2008, 16:48   #1
Anatoliy1984
 
Регистрация: 01.11.2008
Сообщений: 7
Вопрос Помогите студенту Радиотехники

Нужна помощь. Пока препода дождешься сессия пройдет. Вот условие задачи:
Найти минимальные в строках значения компонент вещественной матрицы m(n,k) и записать их в одномерный массив v(n) .
Найти максимальное значение компонент массива v(n). Если максимумов в массиве несколько, то запомнить индекс первого встреченного при переборе из максимумов.
Поменять местами компоненты последней строки матрицы m(n,k) и строки, содержащей первый из встреченных максимумов. Если максимум окажется в последней строке, то оставить матрицу без изменения.
Вычислить сумму компонент матрицы m(n,k) .
На экран вывести исходную матрицу m(n,k), массив v(n) , первую встреченную максимальную компоненту с индексом, изменённую матрицу m(n,k) , сумму компонент матрицы m(n,k).
Anatoliy1984 вне форума Ответить с цитированием
Старый 05.12.2008, 16:49   #2
Anatoliy1984
 
Регистрация: 01.11.2008
Сообщений: 7
По умолчанию

Вот мой исходник:
Program task3;
type matrix=array [1..10, 1..10] of real;
odn=array [1..10] of real;
var m:matrix;
v: odn;
c,x:real;
n,k,y,q:integer;
procedure input_matrix (var m:matrix; var n,k:integer);
var a,b,p1,p2,i,j:integer;
begin
write('vvedite chislo strok n matrici ');
writeln('ne menee 2 i ne bolee 10');
readln(n);
if (n<2) or (n>10) then
begin
write('vvedeno n<2 ili bolshe 10 poetomu budet prinat ');
write('maximalniy razmer n=10');
n:=10;
end;
write('vvedite chislo stolbcov k matrici ');
writeln('oshibka vvoda budet vzyto 10');
readln(k);
if (k<2) or (k>10) then
begin
write('vvedeno chislo menshe 2 ili bolshe 10, poetomu budet prinyat ');
write('maximalniy razmer, k=10');
k:=10;
end;
write('vvedite levuyu a i pravuyu b granicu ');
writeln('diapazon znacheniy matrici');
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;
for i:=1 to n do
for j:= 1 to k do
m[i,j]:=random(p1+1)+p2;
end;
procedure output_matrix (var m:matrix; n,k:integer);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to k do write(m[i,j]:4:2, ' ');
writeln;
end;
end;
procedure form_matrix(var m:matrix; n,k:integer);
var i,j:integer;
begin
x:=0;
for i:=1 to n do begin
v[i]:=m[i,1];
for j:=1 to k do
begin
x:=x+m[i,j];
if m[i,j]<v[i] then v[i]:=m[i,j];
end;
end;
writeln('Massiv V(n)');
for i:=1 to n do
write(v[i]:4:2, ' ');
readln;
end;
function maxzn(var v: odn; var n:integer):integer;
var i:integer;
begin
q:=1;
for i:=1 to n do begin
c:= v[1];
if v[i]>c then
begin
c:=v[i]; q:=i;
end;
end;
maxzn:=q;
end;
procedure perestanovka(var m:matrix; n,k,y:integer);
var i,j:integer;
z:real;
begin
if y=n then output_matrix(m,n,k)
else begin
for j:=1 to k do
begin
z:=m[y,j];
m[y,j]:=m[n,j];
m[n,j]:=z;
end;
writeln('izmenennaya matrica M');
output_matrix(m,n,k);
end;
end;
begin
input_matrix(m,n,k);
writeln('ishodnaya matrica m(n,k):');
output_matrix(m,n,k);
form_matrix(m,n,k);
y:=maxzn(v,n);
writeln('indeks pervogo vstrechnjgo:',y);
writeln('ego znachenie:',c);
perestanovka(m,n,k,y);
write('summa komponentov:',x);
readln;
end.Program task3;
type matrix=array [1..10, 1..10] of real;
odn=array [1..10] of real;
var m:matrix;
v: odn;
c,x:real;
n,k,y,q:integer;
procedure input_matrix (var m:matrix; var n,k:integer);
var a,b,p1,p2,i,j:integer;
begin
write('vvedite chislo strok n matrici ');
writeln('ne menee 2 i ne bolee 10');
readln(n);
if (n<2) or (n>10) then
begin
write('vvedeno n<2 ili bolshe 10 poetomu budet prinat ');
write('maximalniy razmer n=10');
n:=10;
end;
write('vvedite chislo stolbcov k matrici ');
writeln('oshibka vvoda budet vzyto 10');
readln(k);
if (k<2) or (k>10) then
begin
write('vvedeno chislo menshe 2 ili bolshe 10, poetomu budet prinyat ');
write('maximalniy razmer, k=10');
k:=10;
end;
write('vvedite levuyu a i pravuyu b granicu ');
writeln('diapazon znacheniy matrici');
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;
for i:=1 to n do
for j:= 1 to k do
m[i,j]:=random(p1+1)+p2;
end;
procedure output_matrix (var m:matrix; n,k:integer);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to k do write(m[i,j]:4:2, ' ');
writeln;
end;
end;
procedure form_matrix(var m:matrix; n,k:integer);
var i,j:integer;
begin
x:=0;
for i:=1 to n do begin
v[i]:=m[i,1];
for j:=1 to k do
begin
x:=x+m[i,j];
if m[i,j]<v[i] then v[i]:=m[i,j];
end;
end;
writeln('Massiv V(n)');
for i:=1 to n do
write(v[i]:4:2, ' ');
readln;
end;
function maxzn(var v: odn; var n:integer):integer;
var i:integer;
begin
q:=1;
for i:=1 to n do begin
c:= v[1];
if v[i]>c then
begin
c:=v[i]; q:=i;
end;
end;
maxzn:=q;
end;
procedure perestanovka(var m:matrix; n,k,y:integer);
var i,j:integer;
z:real;
begin
if y=n then output_matrix(m,n,k)
else begin
for j:=1 to k do
begin
z:=m[y,j];
m[y,j]:=m[n,j];
m[n,j]:=z;
end;
writeln('izmenennaya matrica M');
output_matrix(m,n,k);
end;
end;
begin
input_matrix(m,n,k);
writeln('ishodnaya matrica m(n,k):');
output_matrix(m,n,k);
form_matrix(m,n,k);
y:=maxzn(v,n);
writeln('indeks pervogo vstrechnjgo:',y);
writeln('ego znachenie:',c);
perestanovka(m,n,k,y);
write('summa komponentov:',x);
readln;
end.{

Проблема с первым встречным индексом (его определяет функция odn), программа не правильно его определяет. В чём ошибка?}
Anatoliy1984 вне форума Ответить с цитированием
Старый 05.12.2008, 17:16   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Первый максимальный или минимальный специально искать не надо. Если мы просматриваем массив или матрицу снfчала, то при условии if a[i,j]>max, максимальным всегда будет первый с таким значением. Аналогично можно найти последний максимальный элемент, надо только массив смотреть с конца
for i :=n downto 1, или для матрицы
for i:=n downto 1 do
for j:= m downto 1 do
puporev вне форума Ответить с цитированием
Старый 05.12.2008, 17:28   #4
Anatoliy1984
 
Регистрация: 01.11.2008
Сообщений: 7
По умолчанию

а всё таки может функцию мою поправить както можно?
Anatoliy1984 вне форума Ответить с цитированием
Старый 05.12.2008, 17:45   #5
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Код:
uses crt;
const m=5;
      k=5;
var a:array[1..m,1..k] of integer;
    v:array[1..m] of integer;
    temp:array[1..k] of integer;
    i,j,
    max,sum:integer;

begin
clrscr;
randomize;
for i:=1 to m do
 begin
  for j:=1 to k do
   begin
    a[i,j]:=random(50);
    write(a[i,j]:3);
   end;
  writeln;
 end;
writeln('===========');
for i:=1 to m do
 begin
  v[i]:=a[i,1];
   for j:=2 to k do
    if v[i]>a[i,j] then v[i]:=a[i,j];
 write(v[i]:3);
 end;
writeln;
writeln('===========');
max:=1;
for i:=2 to m do
 if v[max]<v[i] then max:=i;
writeln(v[max]);
writeln('============');
sum:=0;
for i:=1 to m do
  for j:=1 to k do
    sum:=sum+a[i,j];
writeln('Summa=',sum);
writeln('============');
if max<> m then begin
                 for j:=1 to k do
                 temp[j]:=a[m,j];
                 for j:=1 to k do
                  a[m,j]:=a[max,j];
                 for j:=1 to k do
                  a[max,j]:=temp[j];
                end;
for i:=1 to m do
 begin
  for j:=1 to k do
    write(a[i,j]:3);
  writeln; 
 end;
end.
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 05.12.2008, 18:51   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Вот хотел поправить твое, но там столько ошибок, что почти переделал, стиль сохранил, все с процедурами и функциями.
Код:
Program task3;
uses crt;
type matrix=array [1..10, 1..10] of real;
     odn=array [1..10] of real;

procedure input_matrix (n,k:integer;var m:matrix);{обычно сначала входные параметры(размеры), потом выходные-матрица}
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to k do
m[i,j]:=20*random;
end;
procedure output_matrix (n,k:integer;var m:matrix);{то же}
var i,j:integer;
begin
for i:=1 to n do
   begin
     for j:=1 to k do
     write(m[i,j]:6:2);
     writeln;
   end;
end;
procedure form_mass(n,k:integer; m:matrix;var v:odn);{создание массива}
var i,j:integer;
    min:real;
begin
for i:=1 to n do
  begin
    min:=m[i,1];
    for j:=1 to k do
    if m[i,j]<min then
    min:=m[i,j];
    v[i]:=min;
    write(v[i]:6:2);
  end;
writeln;
end;
procedure Nommax(n:integer;v:odn; var nmax:integer);{поиск первого максимального}
var i:integer;
    max:real;
begin
max:=v[1];nmax:=1;
for i:=1 to n do
if v[i]>max then
   begin
     max:=v[i];
     nmax:=i; {нужный нам номер}
   end;
end;
procedure perestanovka(n,k,nmax:integer;var m:matrix);
var i,j:integer;
    z:real;
begin
for j:=1 to k do
   begin
     z:=m[nmax,j];
     m[nmax,j]:=m[n,j];
     m[n,j]:=z;
   end;
end;
function Summ(n,k:integer;m:matrix):real;
var i,j:integer;
    sm:real;
begin
sm:=0;
for i:=1 to n do
for j:=1 to k do
sm:=sm+m[i,j];
Summ:=sm;
end;

var m:matrix; {раздел переменных программы}
    v: odn;
    c,x:real;
    n,k,y,q,nmax:integer;
begin  {начало программы}
clrscr;
randomize;
repeat  {в цикле вводим размеры с проверкой диапазона}
write('vvedite chislo strok matrici n=');
readln(n);
until (n>=2) and (n<=10);
repeat
write('vvedite chislo stolbcov matrici k=');
readln(k);
until (k>=2) and (k<=10);
input_matrix(n,k,m);  {дальше все по порядку, как в условии}
writeln('ishodnaya matrica M:');
output_matrix(n,k,m);
writeln('Massiv V:');
form_mass(n,k,m,v);
Nommax(n,v,nmax);
writeln('Max=',v[nmax]:0:2,' nomer=',nmax);
perestanovka(n,k,nmax,m);
writeln('Izmenennaja matrica:');
output_matrix(n,k,m);
writeln('Summa=',Summ(n,k,m):0:2);
readln
end.
puporev вне форума Ответить с цитированием
Старый 07.12.2008, 10:10   #7
Anatoliy1984
 
Регистрация: 01.11.2008
Сообщений: 7
Хорошо

Спасибо! буду разбираться.
Anatoliy1984 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
!!!Помогите студенту с темой!!! dedans Помощь студентам 4 20.08.2008 02:17
Помогите, пожалуйста, студенту =(( Fezz Общие вопросы C/C++ 2 29.11.2007 12:38
Помогите студенту... Vitaliyg_radio Помощь студентам 1 04.11.2007 18:16