C语言编程题笔记(一)
- 编程求马鞍数。(马鞍数是指在一个矩阵中,这个数在所在行中最大,所在列中最小)
思路: 找出最大值(下标),判断是否是该列的最小值。
#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初始化
- 请编写一个函数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;
}
}
- 找规律编写一个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;