1.
找出一个二维数组中的鞍点,即该位置上的元素在该行最大,在该列上最小。也可能没有鞍点。
**输入数据格式:
"\n输入行数:"
"%d"
"\n输入列数:"
"%d"
"第%d行?\n"
"%d"
**输出格式要求:
"%5d"
"\n第%d行,第%d列的%d是鞍点\n"
"\n矩阵中无鞍点!\n"
程序的运行示例1如下:
输入行数:3
输入列数:3
第0行?
1 2 3
第1行?
4 5 6
第2行?
7 8 9
1 2 3
4 5 6
7 8 9
第0行,第2列的3是鞍点
程序的运行示例2如下:
输入行数:2
输入列数:2
第0行?
1 2
第1行?
4 1
1 2
4 1
矩阵中无鞍点!
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
void MatrixPrint (int **p, int row, int col);
int main (void)
{
int row;
printf ("\n输入行数:");
scanf ("%d", &row);
int col;
printf ("\n输入列数:");
scanf ("%d", &col);
int **matrix = (int **)malloc (sizeof (int *) * row);
int i, j, m;
for (i = 0; i < row; i ++)
{
printf ("第%d行?\n", i);
matrix[i] = (int *)malloc (sizeof (int) * col);
for (j = 0; j < col; j ++)
{
scanf ("%d", &matrix[i][j]);
}
}
MatrixPrint (matrix, row, col);
int k;
bool bFlag;
int max;
for (i = 0; i < row; i ++)
{
max = matrix[i][0];
k = 0;
for (j = 0; j < col; j ++)
{
if (max < matrix[i][j])
{
max = matrix[i][j];
k = j;
}
}
bFlag = true;
for (m = 0; m < row; m ++)
{
if (max > matrix[m][k])
{
bFlag = false;
}
}
if (bFlag == true)
{
printf ("\n第%d行,第%d列的%d是鞍点\n", i, k, max);
break;
}
}
if (!bFlag)
{
printf ("\n矩阵中无鞍点!\n");
}
for (i = 0; i < row; i ++)
{
free (matrix[i]);
}
free (matrix);
return 0;
}
void
MatrixPrint (int **p, int row, int col)
{
int i, j;
for (i = 0; i < row; i ++)
{
for (j = 0; j < col; j ++)
{
printf ("%5d", p[i][j]);
}
printf ("\n");
}
}
2.
按如下函数原型,用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。
其中,n由用户从键盘输入。已知n值不超过10。
void Transpose(int a[][N], int n);
void InputMatrix(int a[][N], int n);
void PrintMatrix(int a[][N], int n);
**输入提示信息要求:"Input n:\n" "Input %d*%d matrix:\n"
**输入格式:"%d"
**输出提示信息:"The transposed matrix is:\n"
**输出要求:"%d\t"
输出矩阵时,每输出一行就换行
注:不能使用指针、结构体、共用体、文件、goto、枚举类型进行编程。
#include <stdio.h>
#define N 10
void Transpose(int a[][N], int n);
void InputMatrix(int a[][N], int n);
void PrintMatrix(int a[][N], int n);
int main(void)
{
int s[N][N], n;
printf("Input n:\n");
scanf("%d", &n);
InputMatrix(s, n);
Transpose(s, n);
printf("The transposed matrix is:\n");
PrintMatrix(s, n);
}
void Transpose(int a[][N], int n)
{
int i, j, temp;
for (i = 0; i < n; i++)
{
for (j = i; j < n; j++)
{
temp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = temp;
}
}
}
void InputMatrix(int a[][N], int n)
{
int i, j;
printf("Input %d*%d matrix:\n", n, n);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
}
void PrintMatrix(int a[][N], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%d\t", a[i][j]);
}
printf("\n");//1
}
}
3.
输入2个学生5门课的成绩,分别用函数求:(1)每个学生的平均分;(2)每门课的平均分;(3)找出最高的分数所对应的学生和课程;(4)求出平均分方差:
(1/n)(∑xi2) - ((∑xi)/ n)2
输入格式和提示信息:
"\n输入学生%4d的5个成绩:\n"
"%f"
输出格式和提示信息:
"\n 序号 课程1 2 3 4 5 平均分\n"
"\n NO%2d"
"%8.2f"
"\n课平均"
"%8.2f"
"\n\n最高分%8.2f是%d号学生的第%d门课\n"
"\n方差 %8.2f"
#include <stdio.h>
#define N 2
#define M 5
float score[N][M];
float a_stu[N], a_cor[M];
int main (void)
{
int i, j, r, c;
float h;
float s_diff (void);
float highest (int *, int *);
r = 0;
c = 1;
input_stu ();
avr_stu ();
avr_cor ();
printf ("\n 序号 课程1 2 3 4 5 平均分\n");
for (i = 0; i < N; i ++)
{
printf ("\n NO%2d", i + 1);
for (j = 0; j < M; j ++)
{
printf ("%8.2f", score[i][j]);
}
printf ("%8.2f", a_stu[i]);
}
printf ("\n课平均");
for (j = 0; j < M; j ++)
{
printf ("%8.2f", a_cor[j]);
}
h = highest(&r, &c);
printf ("\n\n最高分%8.2f是%d号学生的第%d门课\n", h, r, c);
printf ("\n方差 %8.2f", s_diff());
return 0;
}
void
input_stu(void)
{
int i, j;
for (i = 0; i < N; i ++)
{
printf("\n输入学生%4d的5个成绩:\n", i + 1);
for (j = 0; j < M; j ++)
{
scanf("%f", &score[i][j]);
}
}
}
void
avr_stu(void)
{
int i, j;
float s;
for (i = 0; i < N; i ++)
{
for (j = 0, s = 0; j < M; j ++)
{
s += score[i][j];
}
a_stu[i] = s / 5.0;
}
}
void
avr_cor (void)
{
int i, j;
float s;
for (j = 0; j < M; j ++)
{
s = 0;
for (i = 0; i < N; i ++)
{
s += score[i][j];
}
a_cor[j] = s / (float)N;
}
}
float
highest (int *r, int *c)
{
float high;
int i, j;
high = score[0][0];
for (i = 0; i < N; i ++)
{
for (j = 0; j < M; j ++)
{
if (score[i][j] > high)
{
high = score[i][j];
*r = i + 1;
*c = j + 1;
}
}
}
return high;
}
float
s_diff (void)
{
int i, j;
float sumx, sumxn;
sumx = 0.0;
sumxn = 0.0;
for (i = 0; i < N; i ++)
{
sumx += a_stu[i] * a_stu[i];
sumxn += a_stu[i];
}
return (sumx / N - (sumxn / N) * (sumxn / N));
}
4.
矩阵乘法。编写一个C函数实现M行K列矩阵与K行N列的矩阵的乘积。设A为M行K列的矩阵,B为K行N列的矩阵,则C=A×B的积为M行N列的矩阵。 矩阵乘法的规则是:设A[m,k],B[k,n],则C[m,n]=A[m,k]×B[k,n],其中: C[i,j]=∑kl=1A[i,l]×B[l,j], (i=1,2,…,m j=1,2,…,n) **输出格式要求:"\t%d" "array A=\n" "array B=\n" "array C=\n" 程序运行示例如下: array A= 1 2 3 4 5 6 array B= 1 1 0 2 2 0 array C= 7 5 16 14
#include <stdio.h>
int main (void)
{
static int A[2][3]={1,2,3,4,5,6};
static int B[3][2]={1,1,0,2,2,0};
int C[2][2] = {0};
Mutiply (A, B, C);
int i, j;
printf ("array A=\n");
for (i = 0; i < 2; i ++)
{
for (j = 0; j < 3; j ++)
{
printf ("\t%d", A[i][j]);
}
printf ("\n");
}
printf ("array B=\n");
for (i = 0; i < 3; i ++)
{
for (j = 0; j < 2; j ++)
{
printf ("\t%d", B[i][j]);
}
printf ("\n");
}
printf ("array C=\n");
for (i = 0; i < 2; i ++)
{
for (j = 0; j < 2; j ++)
{
printf ("\t%d", C[i][j]);
}
printf ("\n");
}
}
void
Mutiply (A, B, C)
int A[][3], B[][2], C[][2];
{
int i, j, k;
for (i = 0; i < 2; i ++)
{
for (j = 0; j < 2; j ++)
{
for (k = 0; k < 3; k ++)
{
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
1159

被折叠的 条评论
为什么被折叠?



