#arrays #c #function #matrix
#массивы #c #функция #матрица
Вопрос:
Эту программу я написал для умножения любого вида матрицы, если она удовлетворяет условию
большая часть кода используется для ввода, только та часть, где функция должна принимать входные данные, кажется проблемной, не способной получить правильные результаты, а также получающей значение мусора в результирующей матрице.
#include<stdio.h>
#include<math.h>
void multiply(int,int,int,int,int [][100],int [][100]);
void main()
{
int i,j,e;
int m,n,p,q;
int a[m][n],b[p][q];
printf("n enter m and n");
scanf("%d %d",amp;m,amp;n);
printf("n enter the matrix elements");
for(i=0;i<m;i )
for(j=0;j<n;j )
scanf("%d",amp;a[i][j]);
printf("n enter p and q");
scanf("%d %d",amp;p,amp;q);
printf("n enter the matrix elements");
for(i=0;i<p;i )
for(j=0;j<q;j )
scanf("%d",amp;b[i][j]);
printf("if u want to multliply the matrix enter 1");
scanf("%d",amp;e);
{
printf("a matrix n is columns and m is rows n");
for(int i =0;i<m;i ){
for(int j = 0;j<n;j ){
printf("%d ",a[i][j]);
}
printf("n");
}
printf("a matrix q is columns and p is rows n");
for(int i =0;i<m;i ){
for(int j = 0;j<n;j ){
printf("%d ",b[i][j]);
}
printf("n");
}
printf("nnn");
if(e==1amp;amp;n==p)
multiply(m,n,p,q,a,b);
}
}
void multiply(int m,int n,int p,int q,int a[][100],int b[][100])
{
printf("a matrix n is columns and m is rows n");
for(int i =0;i<m;i ){
for(int j = 0;j<n;j ){
printf("%d ",a[i][j]);
}
printf("n");
}
printf("a matrix q is columns and p is rows n");
for(int i =0;i<m;i ){
for(int j = 0;j<n;j ){
printf("%d ",b[i][j]);
}
printf("n");
}
int s[m][q],sum=0,i,j,k;
for(i=0;i<m;i )
{
for(j=0;j<q;j )
{
s[i][j]=0;
for(k=0;k<n;k )
{
s[i][j]=s[i][j] a[i][k]*b[k][j];
}
printf("t %d",s[i][j]);
}
printf("n");
}
}
Как исправить эту проблему?
Комментарии:
1. Вы устанавливаете
n
значение 1000int a[m][n]
приscanf
запросе ввода? в противном случае вы передаете беспорядок. Компилятор использует арифметику, основанную наsizeof(int) * 1000
inmultiply()
, если вы установите значениеn
на что-то другое, вы получите неправильные значения.2. Как вы можете объявлять размеры
a
иb
массивы, еслиm
,n
,p
иq
еще не имеет значений? C — это последовательный язык, это должно быть сделано после scanf3. Какой язык вы используете
C
илиC
? Это:int m,n,p,q; int a[m][n],b[p][q];
недопустимо C , даже если этиint
переменные инициализированы.4. C и C — очень разные языки. Пожалуйста, не помечайте оба, если вы специально не спрашиваете об их различиях.
5. Используемый язык — c
Ответ №1:
По крайней мере, эта проблема:
Код имеет неопределенный bahvaior (UB), поскольку значение m, n, p, q
не обязательно положительное, как время определения массива a, b
.
int m,n,p,q;
int a[m][n],b[p][q];
Изменить на:
int m,n,p,q;
// int a[m][n],b[p][q];
printf("n enter m and n");
// scanf("%d %d",amp;m,amp;n);
if (scanf("%d %d",amp;m,amp;n) != 2 || m <= 0 || n <= 0) {
puts("Bad input");
return -1;
}
int a[m][n];