Матрица. Функция.
У меня такая задача на Pascal:
Сформировать две квадратные матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l), вводом элементов с клавиатуры. Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы вводить с клавиатуры. Создать функцию, определяющую сумму элементов строки матрицы, имеющей первый минимальный элемент. Вывести на экран матрицы, сумму матриц и максимальную из них.
Не могли бы мне разжевать, что тут требуется? Если сложить две матрицы и вывести третью, то что делать с этой функцией? Заранее спасибо =)
Писать.
З.Ы. Лучше всего - спросить у препода.
#include <conio.h>
#include <locale.h>
#include <iomanip>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
void Show(int n,int m, int **a);
void Sum(int n, int m, int **a);
void matrixSum(int n, int m, int k, int l,int **a, int **b);
void sMatrix(int n, int m, int k, int l,int **a, int **b);
int n, m;
int i, j;
cout<<"Введите размерность первой матрицы:\n";
cout<<"Введите n\n";
cin>>n;
cout<<"Введите m\n";
cin>>m;
int **mas1 = new int* [n];
cout<<"Заполните матрицу:\n";
for (i=0; i<n;i++)
{
mas1=new int[m];
for (j=0;j<m;j++)
{
cin>>mas1[j];
}
}
int k, l;
cout<<"Введите размерность второй матрицы:\n";
cout<<"Введите k\n";
cin>>k;
cout<<"Введите l\n";
cin>>l;
int **mas2 = new int* [k];
cout<<"Заполните матрицу:\n";
for (i=0; i<k;i++)
{
mas2=new int[l];
for (j=0;j<l;j++)
{
cin>>mas2[j];
}
}
cout<<"Первая матрица: \n";
Show(n,m,mas1);
cout<<"Вторая матрица: \n";
Show(k,l,mas2);
cout<<"Первая матрица: \n";
Sum(n,m,mas1);
cout<<"Вторая матрица: \n";
Sum(k,l,mas2);
matrixSum(n, m, k, l, mas1, mas2);
sMatrix(n, m, k, l, mas1, mas2);
getch();
}
// ф-ция вывода матриц
void Show(int n, int m, int **a)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<setw(5)<<*(*(a+i)+j)<<ends;
cout<<endl;
}
}
// сумма элементов строки
void Sum(int n, int m, int **a)
{
int sum=0;
int min;
int index;
int i,j;
//определение минимального элемента строки
for (i=0; i<n; i++)
{
min=a[0];
index=0;
sum=0;
for (j=0; j<m;j++)
{
if (a[j]<min)
{
min = a[j];
index=j;
}
if (index==0)
{
sum +=a[j];
}
}
cout<<"Cтрока: "<<i<<" Cумма: "<<sum<<endl;
}
}
// сумма матриц
void matrixSum(int n, int m, int k, int l,int **a, int **b)
{
int **sumM = new int* [n];
if (n==k && m==l)
{
for (int i=0; i<n;i++)
{
sumM=new int[m];
for (int j=0; j<m; j++)
{
sumM[j]=a[j]+b[j];
}
}
cout<<"Сумма матриц: \n";
Show(n,m,sumM);
}
else
{
cout<<"Нельзя сложить\n";
}
}
// сравнение матриц
void sMatrix(int n, int m, int k, int l,int **a, int **b)
{
int count1=0;
int count2=0;
if (n==k && m==l)
{
for (int i=0; i<n;i++)
{
for (int j=0; j<m; j++)
{
if (a[j]>b[j])
{
count1++;
}
if (a[j]<b[j])
{
count2++;
}
}
}
if (count1==m*n)
{
cout<<"Матрица 1 больше\n";
}
if (count2==m*n)
{
cout<<"Матрица 2 больше\n";
}
if (count1!=m*n && count2!=m*n)
{
cout<<"Нельзя сравнить\n";
}
}
else
{
cout<<"Нельзя сравнить\n";
}
}
Я так понял твое задание, может этот код тебе как-то поможет=)
+ работает не только с квадратными матрицами =)
#include <conio.h>
#include <locale.h>
#include <iomanip>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
void Show(int n,int m, int **a);
void Sum(int n, int m, int **a);
void matrixSum(int n, int m, int k, int l,int **a, int **b);
void sMatrix(int n, int m, int k, int l,int **a, int **b);
int n, m;
int i, j;
cout<<"Введите размерность первой матрицы:\n";
cout<<"Введите n\n";
cin>>n;
cout<<"Введите m\n";
cin>>m;
int **mas1 = new int* [n];
cout<<"Заполните матрицу:\n";
for (i=0; i<n;i++)
{
mas1=new int[m];
for (j=0;j<m;j++)
{
cin>>mas1[j];
}
}
int k, l;
cout<<"Введите размерность второй матрицы:\n";
cout<<"Введите k\n";
cin>>k;
cout<<"Введите l\n";
cin>>l;
int **mas2 = new int* [k];
cout<<"Заполните матрицу:\n";
for (i=0; i<k;i++)
{
mas2=new int[l];
for (j=0;j<l;j++)
{
cin>>mas2[j];
}
}
cout<<"Первая матрица: \n";
Show(n,m,mas1);
cout<<"Вторая матрица: \n";
Show(k,l,mas2);
cout<<"Первая матрица: \n";
Sum(n,m,mas1);
cout<<"Вторая матрица: \n";
Sum(k,l,mas2);
matrixSum(n, m, k, l, mas1, mas2);
sMatrix(n, m, k, l, mas1, mas2);
getch();
}
// ф-ция вывода матриц
void Show(int n, int m, int **a)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<setw(5)<<*(*(a+i)+j)<<ends;
cout<<endl;
}
}
// сумма элементов строки
void Sum(int n, int m, int **a)
{
int sum=0;
int min;
int index;
int i,j;
//определение минимального элемента строки
for (i=0; i<n; i++)
{
min=a[0];
index=0;
sum=0;
for (j=0; j<m;j++)
{
if (a[j]<min)
{
min = a[j];
index=j;
}
if (index==0)
{
sum +=a[j];
}
}
cout<<"Cтрока: "<<i<<" Cумма: "<<sum<<endl;
}
}
// сумма матриц
void matrixSum(int n, int m, int k, int l,int **a, int **b)
{
int **sumM = new int* [n];
if (n==k && m==l)
{
for (int i=0; i<n;i++)
{
sumM=new int[m];
for (int j=0; j<m; j++)
{
sumM[j]=a[j]+b[j];
}
}
cout<<"Сумма матриц: \n";
Show(n,m,sumM);
}
else
{
cout<<"Нельзя сложить\n";
}
}
// сравнение матриц
void sMatrix(int n, int m, int k, int l,int **a, int **b)
{
int count1=0;
int count2=0;
if (n==k && m==l)
{
for (int i=0; i<n;i++)
{
for (int j=0; j<m; j++)
{
if (a[j]>b[j])
{
count1++;
}
if (a[j]<b[j])
{
count2++;
}
}
}
if (count1==m*n)
{
cout<<"Матрица 1 больше\n";
}
if (count2==m*n)
{
cout<<"Матрица 2 больше\n";
}
if (count1!=m*n && count2!=m*n)
{
cout<<"Нельзя сравнить\n";
}
}
else
{
cout<<"Нельзя сравнить\n";
}
}
Я так понял твое задание, может этот код тебе как-то поможет=)
+ работает не только с квадратными матрицами =)
Спасибо большое! =)
И чтобы было полное ЦПП - <clocale> вместо <locale.h>
<conio.h> и getch() тоже не место в коде C++.
P.S. переменная l (строчная L) слишком похожа на единицу - лучше не использовать такие имена - тяжелее читать код.
И чтобы было полное ЦПП - <clocale> вместо <locale.h>
<conio.h> и getch() тоже не место в коде C++.
на С++ практически не пишу, в основном на C#, но спасибо за совет, учту=)
P.S. переменная l (строчная L) слишком похожа на единицу - лучше не использовать такие имена - тяжелее читать код.
просто в задании была эта переменная
не за что, рад что помог=)
Исправьте, пожалуйста, что не так.
Код:
var s, i,j,min: integer ;
begin
min:=x[1,1];
For i:=1 to row do
For j:=1 to col do
begin
If min>x[i,j] then
begin
min:=x[i,j];
end;
end;
s:=0;
for i:=1 to n do
s:=s+x[i,j];
writeln (s);
end;
повторюсь, что паскаль не изучал, но попробуй так
спасибо )) короче прога чет неправильно работает. Гляньте весь код, пожалуйста ))
uses crt;
const max=10;
type mas=array[1..max,1..max] of integer;
var a,b:mas; n,m,k,l,g,u:integer;
procedure matrixin(var x:mas; row,col:integer);
var i,j:integer;
begin
writeln('Vvod elementov matricy');
for i:=1 to row do begin
writeln('Vvod elementov ',i,' stroki matricy');
for j:=1 to col do
readln(x[i,j]);
end;
end;
procedure matrixout(var x:mas; row,col:integer);
var i,j:integer;
begin
for i:=1 to row do begin
writeln;
for j:=1 to col do
write(x[i,j], ' ');
end;
end;
function sum(var x:mas;row,col:integer):integer;
var s, i,j,min, index: integer ;
begin
For i:=1 to row do
index:=0;
s:=0;
min:= x[i,1];
For j:=1 to col do
begin
If x[i,j]<min then
begin
min:=x[i,j];
index:=j;
end;
If index=0 then
begin
s:=s+x[i,j];
end;
end;
writeln (s);
end;
begin
clrscr;
writeln('Vvedite razmernost matricy A');
readln(n,m);
writeln('Vvedite razmernost matricy B');
readln(k,l);
matrixin(A,n,m);
matrixin(B,k,l);
writeln('*********__MATRIX_A__*********');
matrixout(A,n,m);
writeln;
writeln('*********__MATRIX_B__*********');
matrixout(B,k,l);
writeln;
writeln;
writeln('*********__MATRIX_A*__**********');
matrixout(A,n,m);
writeln;
writeln('*********__MATRIX_B*__**********');
matrixout(B,k,l);
g:=sum(a,n,m);
u:=sum (b,k,l);
if g > u then begin
writeln('Naibolshaa matrica A');
end
else begin
writeln('Naibolshaa matrica B');end;
readln;
end.
uses crt;
const max=10;
type mas=array[1..max,1..max] of integer;
var a,b:mas; n,m,k,l,g,u:integer;
procedure matrixin(var x:mas; row,col:integer);
var i,j:integer;
begin
writeln('Vvod elementov matricy');
for i:=1 to row do begin
writeln('Vvod elementov ',i,' stroki matricy');
for j:=1 to col do
readln(x[i,j]);
end;
end;
procedure matrixout(var x:mas; row,col:integer);
var i,j:integer;
begin
for i:=1 to row do begin
writeln;
for j:=1 to col do
write(x[i,j], ' ');
end;
end;
function sum(var x:mas;row,col:integer):integer;
var s, i,j,min, index: integer ;
begin
For i:=1 to row do
[COLOR="Red"]наверное здесь должен быть begin[/COLOR]
index:=0;
s:=0;
min:= x[i,1];
For j:=1 to col do
begin
If x[i,j]<min then
begin
min:=x[i,j];
index:=j;
end;
If [COLOR="Red"]index=1[/COLOR] then
begin
s:=s+x[i,j];
end;
end;
writeln (s);
end;
begin
clrscr;
writeln('Vvedite razmernost matricy A');
readln(n,m);
writeln('Vvedite razmernost matricy B');
readln(k,l);
matrixin(A,n,m);
matrixin(B,k,l);
writeln('*********__MATRIX_A__*********');
matrixout(A,n,m);
writeln;
writeln('*********__MATRIX_B__*********');
matrixout(B,k,l);
writeln;
writeln;
writeln('*********__MATRIX_A*__**********');
matrixout(A,n,m);
writeln;
writeln('*********__MATRIX_B*__**********');
matrixout(B,k,l);
[COLOR="Red"]g:=sum(A,n,m);
u:=sum (B,k,l);[/COLOR]
if g > u then begin
writeln('Naibolshaa matrica A');
end
else begin
writeln('Naibolshaa matrica B');end;
readln;
end.
я красным выделил, где по моему мнению ошибки (хотя может я ошибаюсь), а так я даж не знаю как помочь =(
u:=sum (B,k,l);
if g > u then begin
writeln('Naibolshaa matrica A');
end
else begin
writeln('Naibolshaa matrica B');end;
Я не совсем понял что ты хотел сделать, function sum - по идее вычисляет сумму элементов строки, если в строке минимальный элемент на первом месте, поэтому
u:=sum (B,k,l);
1 2 3 сумма = 6
-4 5 3 сумма = 4
4 2 4 не считаем, т.к. 4 - не минимальный элемент строки
в g запишется 4.
матрица 1:
1 2 3 сумма 6
4 2 1 -
0 2 5 сумма 7
g=6+7
матрица 2:
4 2 3 -
1 5 2 сумма 8
1 2 5 сумма 8
u=8+8
а потом сравнивать эти значения?
матрица 1:
1 2 3 сумма 6
4 2 1 -
0 2 5 сумма 7
g=6+7
матрица 2:
4 2 3 -
1 5 2 сумма 8
1 2 5 сумма 8
u=8+8
а потом сравнивать эти значения?
насколько я понял задание, то мне надо так:
1. Найти в матрице минимальный элемент, если их несколько, брать первый из них
2. Посчитать сумму элементов этой строки матрицы - где нашелся первый минимальный.
всё это делает функция. А в конце сравнить.
var s, i,j,min, index: integer ;
begin
s := 0;
index:=0;
min:=x[1,1];
For i:=1 to row do
begin
For j:=1 to col do
begin
If x[i,j]<=min then
begin
min:=x[i,j];
index:=i;
end;
end;
end;
writeln ('element',min);
writeln ('stroka',index);
For i:=1 to row do
begin
For j:=1 to col do
begin
if i=index then
begin
s:=s+x[index, j];
end;
end;
end;
writeln ('summa',s);
end;
вроде работает
вроде работает
Да, спасибо! =)
uses crt;
const max=10;
type mas=array[1..max,1..max] of integer;
var a,b:mas; n,m,k,l,s,v,z,g,h:integer;
procedure matrixin(var x:mas; row,col:integer);
var i,j:integer;
begin
writeln('______VVOD ELEMENTOV______');
writeln('');
for i:=1 to row do begin
writeln('VVOD ELEMENTOV ',i,' STROKI');
for j:=1 to col do
readln(x[i,j]); end;
end;
procedure matrixout(var x:mas; row,col:integer);
var i,j:integer;
begin
for i:=1 to row do begin
writeln;
for j:=1 to col do
write(x[i,j], ' ');
end;
end;
procedure zamena(var x:mas; row,col:integer);
var i:integer;
begin
for i:=1 to row do
if x[i,i]=0 then x[i,i]:=1;
end;
function sum(var x:mas;row,col:integer):integer;
var s, i,j,min, index: integer ;
begin
s := 0;
index:=0;
min:=x[1,1];
For i:=1 to row do
begin
For j:=1 to col do
begin
If x[i,j]<=min then
begin
min:=x[i,j];
index:=i;
end;
end;
end;
writeln ('min. element - ',min);
writeln ('stroka - ',index);
For i:=1 to row do
begin
For j:=1 to col do
begin
if i=index then
begin
s:=s+x[index, j];
end;
end;
end;
writeln ('summa elementov stroki - ',s);
h:=s;
g:=s;
end;
begin
clrscr;
writeln('VVEDITE RAZMERNOST MATRIX A');
readln(n,m);
writeln('VVEDITE RAZMERNOST MATRIX B');
readln(k,l);
matrixin(A,n,m);
matrixin(B,k,l);
clrscr;
writeln('_____MATRIX_A_INT_____');
matrixout(A,n,m);
writeln ('');
writeln('_____MATRIX_B_INT_____');
matrixout(B,k,l);
writeln ('');
writeln;
writeln('_____MATRIX_A_OUT_____');
matrixout(A,n,m);
writeln('');
sum(a,n,m);
writeln (h);
v:=h;
writeln('_____MATRIX_B_OUT_____');
matrixout(B,k,l);
writeln ('');
sum(b,k,l);
writeln(g);
z:=g;
if v>z then
begin
writeln ('max - MATRIX A');
end
else
begin
writeln ('max - MATRIX B');
end;
readln;
end.
Нормально? =)
вроде хорошо работает =) спасибо =)
есть начало проги,нужно "Посчитать сумму всех элементов матрицы."
program p1;
uses wincrt;
type TArray=Array[1..10,1..10] of real;
var A, B, C, D:TArray; n,k,l,m:Byte; h:char; min, max:real;
procedure InMarth(Var x:TArray; row,col:Byte);
var i,j:Byte;
Begin
Randomize;
For i:=1 to row do begin
For j:=1 to col do begin
X[i,j]:=Random*200-100;
White(x[i,j]:7:2,' ');
End;
Writeln;
End;
End;
begin
Procedure InMarth1 (var:TArray; row,col:Byte);
begin
writeln ('введите кол-во строк - n, столбцов - m');
readln (n,m);
For i:=1 to n do
For j:1 to m do
readln (x[i,j]);
if [[i,j]=min then x[i,j]=max;
if [[i,j]=max then x[i,j]=min;
end;
есть начало проги,нужно "Посчитать сумму всех элементов матрицы."
program p1;
uses wincrt;
type TArray=Array[1..10,1..10] of real;
var A, B, C, D:TArray; n,k,l,m:Byte; h:char; min, max:real;
procedure InMarth(Var x:TArray; row,col:Byte);
var i,j:Byte;
Begin
Randomize;
For i:=1 to row do begin
For j:=1 to col do begin
X[i,j]:=Random*200-100;
White(x[i,j]:7:2,' ');
End;
Writeln;
End;
End;
begin
Procedure InMarth1 (var:TArray; row,col:Byte);
begin
writeln ('введите кол-во строк - n, столбцов - m');
readln (n,m);
For i:=1 to n do
For j:1 to m do
readln (x[i,j]);
if [[i,j]=min then x[i,j]=max;
if [[i,j]=max then x[i,j]=min;
end;
оформляйте в теги код, а решение примерно такое:
sum:=0
For i:=1 to row do begin
For j:=1 to col do begin
sum=sum+x[i,j]
End;
End;
White(sum);
sum:=0
For i:=1 to row do begin
For j:=1 to col do begin
sum=sum+x[i,j]
End;
End;
White(sum);
Большое спасибо)
да не за что)