计算机二级C语言的注意事项及相应真题-2-程序填空

11.从键盘输入一行字符,统计其中的数字、小写字母、大写字母的个数

下列给定程序中,函数fun的功能是:从键盘输入一行字符,统计其中的数字、小写字

母、大写字母的个数,并通过参数传回主函数。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在文件BLANK1. C中,不得增行或删行,也不得更改程序的结构。

BLANK1. C:

#include   <stdio.h>
#include   <ctype.h>
#pragma warning (disable:4996)
void fun(int *cd, int *cu, int *cs )//用指针接收
{  char  c;
   printf("用回车键结束输入!\n");
   while ((c=getchar()) != '\n')//每次用getchar获取一个字符,当该字符是换行符时,跳出循环
   {
/**********************found***********************/
      if (c>='0' && ____(1)____)  ++*cd;//判断是否为数字
/**********************found***********************/
      if (____(2)____ && c<='Z')  ++*cu;//判断是否为大写字母
/**********************found***********************/
      if (c>='a' && ____(3)____)  ++*cs;//判断是否为小写字母
   }
}

main( )
{  int cd, cu, cs;
   cd = cu = cs = 0;
   fun( &cd, &cu, &cs );//这里传三个变量的地址过去,在fun函数里对三个变量的操作就会影响到main函数里的
   printf("数字的个数: %d\n", cd);
   printf("大写字母的个数: %d\n", cu);
   printf("小写字母的个数: %d\n", cs);
}

解题思路:
这题很简单,讲些题外话,像判断字符有一些好用的函数

这些函数头文件均为#include<ctype.h>

1.判断是否为数字:
int isdigit(char c) //若为数字返回ture,否则返回false

2.判断是否为大写字母:
int isupper(char c) //若为大写字母返回ture,否则返回false

3.判断是否为小写字母:
int islower(char c) //若为小写字母返回ture,否则返回false

答案:

#include   <stdio.h>
#include   <ctype.h>
#pragma warning (disable:4996)
void fun(int *cd, int *cu, int *cs )
{  char  c;
   printf("用回车键结束输入!\n");
   while ((c=getchar()) != '\n')
   {
/**********************found***********************/
      if (c>='0' && c<='9')  ++*cd;
/**********************found***********************/
      if (c>='A' && c<='Z')  ++*cu;
/**********************found***********************/
      if (c>='a' && c<='z')  ++*cs;
   }
}

main( )
{  int cd, cu, cs;
   cd = cu = cs = 0;
   fun( &cd, &cu, &cs );
   printf("数字的个数: %d\n", cd);
   printf("大写字母的个数: %d\n", cu);
   printf("小写字母的个数: %d\n", cs);
}

测试:

输入:

ui2h43ou24u

输出:

用回车键结束输入!
数字的个数: 5
大写字母的个数: 0
小写字母的个数: 6


12.找出链表各结点数据域中的最大值

给定程序中,已建立一个带有头结点的单向链表,链表中的各结点包含数据域(data)和

指针域(next),数据域为整型,函数fun的作用是:找出链表各结点数据域中的最大值,

其最大值由函数值返回。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在文件BLANK1. C中,不得增行或删行,也不得更改程序的结构。

BLANK1. C:

#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
struct list
{   
	int data;
    struct list *next;
};

struct list *createlist(int data[], int n)
{   
	struct list *head = 0, *p, *q;
    int i;

    head = (struct list *) malloc(sizeof(struct list));//创建头节点
    head->data = data[0];//给头节点赋值
    p = q = head;//头节点地址赋给q,q再赋给p
    for(i=1; i<n; i++)
    {   p = (struct list *) malloc(sizeof(struct list));//创建p节点
        p->data = data[i]; q->next = p; q = p;//数组数据在循环中赋给p节点,q节点的下一节点为p节点,再把p节点赋给q
    }
    p->next = NULL;//此时p节点下一节点为空
    return head;//返回指针
}

/**********found**********/
int func(___1___ head)//在main函数里传过来的值是结构体指针,所以这里也该是结构体指针
{   int pmax = head->data;//设最大值初始值为头节点的数据域存放的值
    struct list *p = head->next;//p为头节点的下一节点
    while(p != NULL)
    {   if(p->data > pmax) pmax = p->data;//遍历比较
/**********found**********/
        p = ___2___;//循环中p指针后移
    }
/**********found**********/
    ___3___//返回最大值
}

void main()
{
    int data[] = {123, 21, 65, 789, 32, 310, 671, 651, 81, 101}, pmax;
 
    struct list *head;//创建结构体指针
    head = createlist(data, 10);//构建链表,存入数据
    pmax = func(head);//遍历出最大值
    printf("Max=%d\n", pmax);
}

解题思路:
还是看看前方的注释吧(^-^

答案:

#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
struct list
{   
	int data;
    struct list *next;
};

struct list *createlist(int data[], int n)
{   
	struct list *head = 0, *p, *q;
    int i;

    head = (struct list *) malloc(sizeof(struct list));
    head->data = data[0];
    p = q = head;
    for(i=1; i<n; i++)
    {   p = (struct list *) malloc(sizeof(struct list));
        p->data = data[i]; q->next = p; q = p;
    }
    p->next = NULL;
    return head;
}

/**********found**********/
int func(struct list* head)
{   int pmax = head->data;
    struct list *p = head->next;
    while(p != NULL)
    {   if(p->data > pmax) pmax = p->data;
/**********found**********/
        p = p->next;
    }
/**********found**********/
    return pmax;
}

void main()
{
    int data[] = {123, 21, 65, 789, 32, 310, 671, 651, 81, 101}, pmax;
 
    struct list *head;
    head = createlist(data, 10);
    pmax = func(head);
    printf("Max=%d\n", pmax);
}

测试:

输出:

Max=789


13.将形参n中,各位上为偶数的数取出,并按原来从高位到低位的顺序组成一个新的数

给定程序中,函数fun的功能是:将形参n中,各位上为偶数的数取出,并按原来从高位到低位的顺序组成一个新的数,并作为函数值返回。

例如,从主函数输入一个整数:27638496,函数返回值为:26846。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
unsigned long fun(unsigned long  n)
{  unsigned long  x=0, s, i;   int  t;
   s=n;//把n的值赋给s了
/**********found**********/
   i=__1__;//i表示是什么位,是个位,还是十位,还是.....
/**********found**********/
   while(__2__)//看后面的s=s/10随循环变化,就知道这里该填什么了
   {  t=s%10;//t为各个位上的数
      if(t%2==0){//为偶数时
/**********found**********/
         x=x+t*i;  i=__3__;//题目要求的从高位到低位,i就是对应的权,
      }
       s=s/10;
   }
   return  x;
}
main()
{  unsigned long  n=-1;
   while(n>99999999||n<0)
  { printf("Please input(0<n<100000000): ");  scanf("%ld",&n);  }
  printf("\nThe result is: %ld\n",fun(n));
  getchar();
}

解题思路:
main函数里的输入给了点迷惑性,其实就是当scanf收取到的n为0到100000000之间,跳出循环,n的值就为该值了,
权的意思就是比如个位的权就是1,十位的权就是10,百位的权就是100…

答案:

#include  <stdio.h>
unsigned long fun(unsigned long  n)
{  unsigned long  x=0, s, i;   int  t;
   s=n;
/**********found**********/
   i=1;
/**********found**********/
   while(s)
   {  t=s%10;
      if(t%2==0){
/**********found**********/
         x=x+t*i;  i=i*10;
      }
       s=s/10;
   }
   return  x;
}
main()
{  unsigned long  n=-1;
   while(n>99999999||n<0)
  { printf("Please input(0<n<100000000): ");  scanf("%ld",&n);  }
  printf("\nThe result is: %ld\n",fun(n));
  getchar();
}

测试:

输入:

27638496

输出:

Please input(0<n<100000000): 
The result is: 26846


14.计算下式直到并把结果作为函数值返回

给定程序中,函数fun的功能是计算下式

直到并把结果作为函数值返回。

例如 在这里插入图片描述直到在这里插入图片描述

,若形参e的值为1e-3,函数的返回值2.985678。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
double fun(double  e)
{ int  i;    double  s, x;
/**********found**********/
  s=0;  i=__1__;//填了第三个空可以看出,i也就是充当题目公式中的n
  x=1.0;
  while(x>e){
/**********found**********/
    __2__;//在while循环中还差i的值没有变化,i的变化可以看出是自增的,那么i的初值就要从0开始
/**********found**********/
    x=(2.0*i-1)/((__3__)*(2.0*i));//第三个空时最好填的,从题目图中公式可看出分母时平方的,
    s=s+x;
  }
  return  s;
}
main()
{ double  e=1e-3;
  printf("\nThe result is: %f\n",fun(e));
  getchar();
}

解题思路:
这个e可能会有迷惑性,e是用科学计数法的形式,
1e-3也就是10-3,1e-1就是10-1

答案:

#include  <stdio.h>
double fun(double  e)
{ int  i;    double  s, x;
/**********found**********/
  s=0;  i=0;
  x=1.0;
  while(x>e){
/**********found**********/
    i++;
/**********found**********/
    x=(2.0*i-1)/((2.0*i)*(2.0*i));
    s=s+x;
  }
  return  s;
}
main()
{ double  e=1e-3;
  printf("\nThe result is: %f\n",fun(e));
  getchar();
}

测试:

输入:

27638496

输出:


The result is: 2.985678


15.把形参s所指字符串中最右边的n个字符复制到形参t所指字符数组中,形成一个新串。若s所指字符串的长度小于n,则将整个字符串复制到形参t所指字符数组中

给定程序中,函数fun的功能是:把形参s所指字符串中最右

边的n个字符复制到形参t所指字符数组中,形成一个新串。若s所指字符串的长度小于n,则将整个字符串复制到形参t所指字符数组中。

例如,形参s所指的字符串为: abcdefgh,n的值为5,程序执行后t所指字符数组中的字符串应为: defgh。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
#include  <string.h>
#define   N   80
void fun(char  *s, int  n, char  *t)
{ int len,i,j=0;
  len=strlen(s);
/**********found**********/
  if(n>=len) strcpy(__1__);//这就是s字符串长度小于n的情况
  else {
/**********found**********/
     for(i=len-n; i<=len-1; i++)  t[j++]= __2__ ;//复制字符串
/**********found**********/
     t[j]= __3__ ;//main函数里最后用的puts()输出,puts()输出遇到空才停止,不然会输出乱码
  }
}
main()
{ char  s[N],t[N];    int  n;
  printf("Enter a string:  ");gets(s);
  printf( "Enter n:");  scanf("%d",&n);
  fun(s,n,t);
  printf("The string t :  ");  puts(t);
  getchar();
}

解题思路:
考了一个strcpy()函数运用的知识,所需头文件为#include<string.h>
strcpy(t,s) //将字符串s复制给t
举个详细的例子吧

char a[7]="abcdefg";
char b[4]="ABCD";
strcpy(a,b);
puts(a);
//结果会是ABCDefg

答案:

#include  <stdio.h>
#include  <string.h>
#define   N   80
void fun(char  *s, int  n, char  *t)
{ int len,i,j=0;
  len=strlen(s);
/**********found**********/
  if(n>=len) strcpy(t,s);
  else {
/**********found**********/
     for(i=len-n; i<=len-1; i++)  t[j++]= s[i] ;
/**********found**********/
     t[j]= '\0' ;
  }
}
main()
{ char  s[N],t[N];    int  n;
  printf("Enter a string:  ");gets(s);
  printf( "Enter n:");  scanf("%d",&n);
  fun(s,n,t);
  printf("The string t :  ");  puts(t);
  getchar();
}

测试:

输入:

abcdefgh
5

输出:

Enter a string:  Enter n:The string t :  defgh


16.判定形参a所指的NXN(规定N为奇数〉的矩阵是否是"幻方",若是,函数返回值为1;不是,函数返回值为0。"幻方"的判定条件是:矩阵每行、每列、主对角线及反对角线上元素之和都相等

给定程序中,函数fun的功能是:判定形参a所指的NXN(规定N为奇数〉的矩阵是否是"幻方",若是,函数返回值为1;不是,函数返回值为0。"幻方"的判定条件是:矩阵每行、每列、主对角线及反对角线上元素之和都相等。

例如,以下3×3的矩阵就是一个"幻方":

4 9 2

3 5 7

8 1 6

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
#define   N   3
int fun(int  (*a)[N])
{ int  i,j,m1,m2,row,colum;
  m1=m2=0;
  for(i=0; i<N; i++)
  { j=N-i-1;  m1+=a[i][i];  m2+=a[i][j];  }//可以看出m1是主对角线的和,m2是反对角线的和,
  if(m1!=m2) return  0;
  for(i=0; i<N; i++) {//上面主对角线和反对角线和相等时,就会进入到下面的语句
/**********found**********/
     row=colum= __1__;//row是每行之和,column是每列之和,每次循环开始置0
     for(j=0; j<N; j++)
     {  row+=a[i][j];  colum+=a[j][i];  }
/**********found**********/
     if( (row!=colum) __2__ (row!=m1) ) return 0;//每行之和不等于每列之和或每行之和不等于主对角线和都不是幻方
  }
/**********found**********/
  return  __3__;//上面都通过那么该矩阵是幻方
}
main()
{ int  x[N][N],i,j;
  printf("Enter number for array:\n");
  for(i=0; i<N; i++)
    for(j=0; j<N; j++)  scanf("%d",&x[i][j]);
  printf("Array:\n");
  for(i=0; i<N; i++)
  {  for(j=0; j<N; j++)  printf("%3d",x[i][j]);
     printf("\n");
  }
  if(fun(x)) printf("The Array is a magic square.\n");
  else printf("The Array isn't a magic square.\n");
  getchar();
}

解题思路:
对二维数组熟悉的话,做起来应该很轻松

答案:

#include  <stdio.h>
#define   N   3
int fun(int  (*a)[N])
{ int  i,j,m1,m2,row,colum;
  m1=m2=0;
  for(i=0; i<N; i++)
  { j=N-i-1;  m1+=a[i][i];  m2+=a[i][j];  }
  if(m1!=m2) return  0;
  for(i=0; i<N; i++) {
/**********found**********/
     row=colum= 0;
     for(j=0; j<N; j++)
     {  row+=a[i][j];  colum+=a[j][i];  }
/**********found**********/
     if( (row!=colum) || (row!=m1) ) return 0;
  }
/**********found**********/
  return  1;
}
main()
{ int  x[N][N],i,j;
  printf("Enter number for array:\n");
  for(i=0; i<N; i++)
    for(j=0; j<N; j++)  scanf("%d",&x[i][j]);
  printf("Array:\n");
  for(i=0; i<N; i++)
  {  for(j=0; j<N; j++)  printf("%3d",x[i][j]);
     printf("\n");
  }
  if(fun(x)) printf("The Array is a magic square.\n");
  else printf("The Array isn't a magic square.\n");
  getchar();
}

测试:

输入:

4 9 2
3 5 7
8 1 6

输出:

Enter number for array:
Array:
  4  9  2
  3  5  7
  8  1  6
The Array is a magic square.


17.将形参s所指字符串中的所有数字字符顺序前移,其它字符顺序后移,处理后新字符串的首地址作为函数值返回

给定程序中,函数fun的功能是:将形参s所指字符串中的所有数字字符顺序前移,其它字符顺序后移,处理后新字符串的首地址作为函数值返回。

例如,s所指字符串为: asd123fgh5##43df,处理后新字符串为:123543asdfgh##df。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
#include  <string.h>
#include  <stdlib.h>
#include  <ctype.h>
char *fun(char  *s)
{
    int  i, j, k, n;
    char  *p, *t;
    n=strlen(s)+1;//可能是怕小了,加了个1
    t=(char*)malloc(n*sizeof(char));
    p=(char*)malloc(n*sizeof(char));
    j=0;
    k=0;
    for(i=0; i<n; i++)
    {
        if(isdigit(s[i]))//判断是否为数字
        {
            /**********found**********/
            p[__1__]=s[i];//p是新字符串,把字符串s中的为数字的元素存入p中,指针p从开头往后移,
            j++;
        }
        else
        {
            t[k]=s[i];//把除了数字的字符都存入数组t中
            k++;
        }
    }
    /**********found**********/
    for(i=0; i<__2__; i++) p[j+i]= t[i];//把数组p和数组t拼凑起来,t接在p后面
    p[j+k]=0;
    /**********found**********/
    return __3__;//返回指针
}
main()
{
    char  s[80];
    printf("Please input: ");
    scanf("%s",s);
    printf("\nThe result is: %s\n",fun(s));
    getchar();
}

解题思路:
这题给的代码采取的思路是先把数字和其他字符分别提取出来成两个数组,存取数字的数组在前,其他字符在后连接起来,结果就是题目要的新字符串

答案:

#include  <stdio.h>
#include  <string.h>
#include  <stdlib.h>
#include  <ctype.h>
char *fun(char  *s)
{
    int  i, j, k, n;
    char  *p, *t;
    n=strlen(s)+1;
    t=(char*)malloc(n*sizeof(char));
    p=(char*)malloc(n*sizeof(char));
    j=0;
    k=0;
    for(i=0; i<n; i++)
    {
        if(isdigit(s[i]))
        {
            /**********found**********/
            p[j]=s[i];
            j++;
        }
        else
        {
            t[k]=s[i];
            k++;
        }
    }
    /**********found**********/
    for(i=0; i<k; i++) p[j+i]= t[i];
    p[j+k]=0;
    /**********found**********/
    return p;
}
main()
{
    char  s[80];
    printf("Please input: ");
    scanf("%s",s);
    printf("\nThe result is: %s\n",fun(s));
    getchar();
}

测试:

输入:

asd123fgh5##43df

输出:

Please input: 
The result is: 123543asdfgh##df


18.计算下式

给定程序中,函数fun的功能是计算下式
直到
,并把计算结果作为函数值返回。

例如:若形参e的值为1e-3,函数的返回值为0.551690。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
double fun(double  e)//整个函数一遍看下来,可以看出i是题目公式中的n,因为只有i在自增
{ int  i, k;    double  s, t, x;//x是每一项的值
  s=0;  k=1;  i=2;
/**********found**********/
  x=__1__/4;//这里也就是第一项,注意这个空要填浮点型,不然就是0了
/**********found**********/
  while(x __2__ e)//当当前项的值小于e时,跳出循环
  { s=s+k*x;
    k=k* (-1);//(-1)的n-1次方其实就是为奇数项时为正,偶数项时为负
    t=2*i;
/**********found**********/
    x=__3__/(t*t);//看题目应该能看出来2*n+1,不就是t+1
    i++;
  }
  return  s;
}
main()
{ double  e=1e-3;//也就是10的负三次方
  printf("\nThe result is: %f\n",fun(e));
  getchar();
}

解题思路:
这题考了对数据类型的理解,
在没有确定结果的类型时,整数类型和浮点类型的加减乘除运算结果都会是浮点类型

答案:

#include  <stdio.h>
double fun(double  e)
{ int  i, k;    double  s, t, x;
  s=0;  k=1;  i=2;
/**********found**********/
  x=(i+1.0)/4;//这里也可以填3.0
/**********found**********/
  while(x > e)
  { s=s+k*x;
    k=k* (-1);
    t=2*i;
/**********found**********/
    x=(t+1)/(t*t);//也可以填2*i+1,
    i++;
  }
  return  s;
}
main()
{ double  e=1e-3;
  printf("\nThe result is: %f\n",fun(e));
  getchar();
}

测试:

输出:


The result is: 0.551690


19.输出经过n次这样洗牌后的结果

函数fun的功能是:将一副扑克牌编号为1, 2, 3,…53, 54,以某种特定的方式洗牌,

这种方式是将这副牌分成两半,然后将它们交叉,并始终保持编号为1的牌在最上方,

譬如:第一次这样洗牌后的结果为: 1, 28, 2, 29, …53, 27, 54。

两次洗牌后的结果为: 1, 41, 28, 15, 2, 42…53, 40, 27, 14, 54。

程序的功能是:输出经过n次这样洗牌后的结果。

请在程序的下划线处填入正确的内容,并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1. C中。不得增行或删行,也不得更改程序的结构!

BLANK1. C:

#include  <stdio.h>
void  fun( int  a[55], int  n )
{  int  i, k  ;
/**********found**********/
   int  __(1)__[55];//在后面用了数组b
   for (i=0; i<n; i++) //n次循环也就是洗牌
   {  for (k=1; k<= 27; k++)
      {  b[ 2*k-1 ] = a[k];//数组前一半的元素占据奇数项的位置
/**********found**********/
         b[ __[2]___* k ] = a[k+27];//数组后一半的元素占据偶数项的位置
     }
     for (k=1; k<=54; k++)
/**********found**********/
       a[k]=___(3)___;//把数组b的元素赋给数组a,
   }
}
main( )
{  int  m, a[55],i;
   for (i=1; i<55; i++)   a[i]= i;//数组元素是从第一项存起的
   printf("请输入洗牌次数 :    ");   scanf("%d", &m);
   fun(a, m);
   for (i=1; i<55; i++)   printf("%d,",a[i]);
   printf("\n");
  getchar();
}

解题思路:
第一眼看到这题,以为题目会用归并排序的思路,实质是个奇数项和偶数项的问题

答案:

#include  <stdio.h>
void  fun( int  a[55], int  n )
{  int  i, k  ;
/**********found**********/
   int  b[55];
   for (i=0; i<n; i++) 
   {  for (k=1; k<= 27; k++) 
      {  b[ 2*k-1 ] = a[k];
/**********found**********/
         b[ 2* k ] = a[k+27];
     }
     for (k=1; k<=54; k++)
/**********found**********/
       a[k]=b[k];
   }
}
main( )
{  int  m, a[55],i;
   for (i=1; i<55; i++)   a[i]= i;
   printf("请输入洗牌次数 :    ");   scanf("%d", &m);
   fun(a, m);
   for (i=1; i<55; i++)   printf("%d,",a[i]);
   printf("\n");
  getchar();
}

测试:

输入:

2

输出:

请输入洗牌次数 :    1,41,28,15,2,42,29,16,3,43,30,17,4,44,31,18,5,45,32,19,6,46,33,20,7,47,34,21,8,48,35,22,9,49,36,23,10,50,37,24,11,51,38,25,12,52,39,26,13,53,40,27,14,54,

20.在3×4的矩阵中找出在行上最大、在列上最小的那个元素,若没有符合条件的元素则输出相应信息

给定程序中,函数fun的功能是:在3×4的矩阵中找出在行上最大、在列上最小的那个元素,若没有符合条件的元素则输出相应信息。

例如,有下列矩阵:

1 2 13 4

7 8 10 6

3 5 9 7

程序执行结果为: find:a[2][2]=9

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
#define   M   3
#define   N   4
void fun(int  (*a)[N])
{ int  i=0,j,find=0,rmax,c,k;
  while( (i<M) && (!find))//行在正常范围内且find等于0时进入循环
  {  rmax=a[i][0];  c=0;
     for(j=1; j<N; j++)
       if(rmax<a[i][j]) {//得出行最大值
/**********found**********/
         rmax=a[i][j]; c= __1__ ; }//c为行最大值的列
     find=1; k=0;
     while(k<M && find) {//遍历比较上面得出的行最大值是否该列最小值
/**********found**********/
       if (k!=i && a[k][c]<=rmax)  find= __2__ ;//若进入这个if分支也就意味着,上面得出行最大值不是该列的最小值,不符合
       k++;
     }
     if(find) printf("find: a[%d][%d]=%d\n",i,c,a[i][c]);
/**********found**********/
      __3__ ;//能跑到这里了,也就是当前行没有符合的数,要遍历下一行
  }
  if(!find) printf("not found!\n");
}
main()
{ int  x[M][N],i,j;
  printf("Enter number for array:\n");
  for(i=0; i<M; i++)
    for(j=0; j<N; j++) scanf("%d",&x[i][j]);
  printf("The array:\n");
  for(i=0; i<M; i++)
  {  for(j=0; j<N; j++) printf("%3d",x[i][j]);
     printf("\n\n");
  }
  fun(x);
  getchar();
}

解题思路:
出的几个空基本都围绕着find这个用于判断的变量,只要读懂了find的作用,就很好理解了

答案:

#include  <stdio.h>
#define   M   3
#define   N   4
void fun(int  (*a)[N])
{ int  i=0,j,find=0,rmax,c,k;
  while( (i<M) && (!find))
  {  rmax=a[i][0];  c=0;
     for(j=1; j<N; j++)
       if(rmax<a[i][j]) {
/**********found**********/
         rmax=a[i][j]; c= j ; }
     find=1; k=0;
     while(k<M && find) {
/**********found**********/
       if (k!=i && a[k][c]<=rmax)  find= 0 ;
       k++;
     }
     if(find) printf("find: a[%d][%d]=%d\n",i,c,a[i][c]);
/**********found**********/
      i++ ;
  }
  if(!find) printf("not found!\n");
}
main()
{ int  x[M][N],i,j;
  printf("Enter number for array:\n");
  for(i=0; i<M; i++)
    for(j=0; j<N; j++) scanf("%d",&x[i][j]);
  printf("The array:\n");
  for(i=0; i<M; i++)
  {  for(j=0; j<N; j++) printf("%3d",x[i][j]);
     printf("\n\n");
  }
  fun(x);
  getchar();
}

测试:

输入:

1 2 13 4
7 8 10 6
3 5 9 7

输出:

Enter number for array:
The array:
  1  2 13  4

  7  8 10  6

  3  5  9  7

find: a[2][2]=9


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值