C语言编程题笔记(一)

2022-02-09 Views C | 笔记957字6 min read
  1. 编程求马鞍数。(马鞍数是指在一个矩阵中,这个数在所在行中最大,所在列中最小)

思路: 找出最大值(下标),判断是否是该列的最小值。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define M 3
#define N 4
int main() {
    int a[M][N],i,j,min_i,max_j,flag; //max_j是第i行的最大元素列下标
    srand(time(NULL));
    for(i=0; i<M; i++){
        for(j=0; j<N; j++)
            printf("%5d",a[i][j]=rand()%11+20);
        printf("\n");
    }
    for (i=0; i<M; i++) {
        max_j=0;
        for (j=1; j<N; j++) {
            if (a[i][j]>a[i][max_j])
                max_j=j;
            flag=1;
        }
        for (min_i=0; min_i<M; min_i++) {
            if (a[min_i][max_j]<a[i][max_j])
                flag=0;
        }
        if (flag == 1) {
            printf("第%d行,%d列的数是马鞍数\n",i+1,max_j+1);
        }
    }
}

尽管本程序可以正常运行,但是在第25行会出现如下编译警告:

Variable 'flag' may be uninitialized when used here
警告:变量"flag"在这里使用时未初始化。

这里单独拿出来看一下:

int flag;
if (flag == 1) {  // 由于变量未确定初始值,则值不确定会导致判断有时会不进入。
    ... }

建议:养成给变量初始化的好习惯。

对第7行代码修改如下:

int a[M][N],i,j,min_i,max_j,flag;
int a[M][N],i,j,min_i,max_j,flag = 0;  //对flag初始化
  1. 请编写一个函数fun,功能是将主函数中的二维数组t中每列中的小元素,依次放入一维数组p中。二维数组中的数已在主函数中赋予。
#include <stdio.h>
#define M 3
#define N 4
//此处请填写函数的声明,并将函数的定义写在main()后面

int main() {
    int t[M][N] = {{22,45,56,30},{19,33,45,38},{20,22,66,40}};
    int p[N],i,j,k;
    printf("The original data is: \n");
    for (i=0; i<M; i++) {
        for (j=0; j<N; j++) {
            printf("%6d",t[i][j]);
        }
        printf("\n");
    }
    fun(t,p);
    printf("\nThe result is:\n");
    for (k=0; k<N; k++) {
        printf("%4d",p[k]);
    }
    printf("\n");
}

参考代码:

void fun(int t[][N],int p[]); //void fun(int (*t)[N],int *p);

void fun(int t[][N],int p[]) {
    int i,j,min;
    for (j=0; j<N; j++) {
        min=t[0][j];
        for (i=1; i<M; i++) {
            if (t[i][j]<min) {
                min=t[i][j];
            }
        }
        p[j]=min;
    }
}

完整代码:

#include <stdio.h>
#define M 3
#define N 4
//此处请填写函数的声明,并将函数的定义写在main()后面
void fun(int t[][N],int p[]); //void fun(int (*t)[N],int *p);
int main() {
    int t[M][N] = {{22,45,56,30},{19,33,45,38},{20,22,66,40}};
    int p[N],i,j,k;
    printf("The original data is: \n");
    for (i=0; i<M; i++) {
        for (j=0; j<N; j++) {
            printf("%6d",t[i][j]);
        }
        printf("\n");
    }
    fun(t,p);
    printf("\nThe result is:\n");
    for (k=0; k<N; k++) {
        printf("%4d",p[k]);
    }
    printf("\n");
}
void fun(int t[][N],int p[]) {
    int i,j,min;
    for (j=0; j<N; j++) {
        min=t[0][j];
        for (i=1; i<M; i++) {
            if (t[i][j]<min) {
                min=t[i][j];
            }
        }
        p[j]=min;
    }
}

  1. 找规律编写一个N*N方阵。如N=时,其方阵如下图所示。
1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 1
1 2 3 3 3 3 2 1
1 2 3 4 4 3 2 1
1 2 3 4 4 3 2 1
1 2 3 3 3 3 2 1
1 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1

参考代码:

#include <stdio.h>
#define N 8
int main() {
    int a[N+1][N+1],i=0,j,k;
    for (k=1; i<=N/2; k++) {
        for (i=0; i<=N+1-k; i++)
            for (j=0; j<=N+1-k; j++)
                a[i][j]=k;
    }
    
    for (i=1; i<=N; i++) {
        for (j=1; j<=N; j++)
            printf("%3d",a[i][j]);
    printf("\n");
    }
}

注意,当N=9或奇数时,打印出的图形会有点问题,此时在第10行增加如下代码即可:

if(N%2==1)
    a[N/2+1][N/2+1]=N/2+1;
EOF