困难——二维数组

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];
            }
        }
    }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘的企鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值