计算机二级C语言的注意事项及相应真题-3-程序修改

目录:

    • 21.计算n!
    • 22.将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回
    • 23.在字符串的最前端加入n个*号,形成新串,并且覆盖原串
    • 24.依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串
    • 25.对N名学生的学习成绩,按从高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中
    • 26.求出单向链表结点(不包括头结点)数据域中的最大值
    • 27.判断一个整数是否是素数,若是返回1,否则返回0
    • 28.分别统计出形参str所指的字符串中的大写字母和小写字母的个数
    • 29.求三个数的最小公倍数
    • 30.统计字符串中各元音字母(即:A、E、I、O、U)的个数

21.计算n!

给定程序modi1.c中,函数fun的功能是:计算n!

例如,给n输入5,则输出120.000000。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

modi1.c:

#include <stdio.h>

double fun ( int n )
{ double result = 1.0 ;
/************found************/
  if n = = 0//注意双等中间不能有空格,还有if表达式是必须要加括号
    return 1.0 ;
  while( n >1 && n < 170 )
/************found************/
    result *= n--//语句以分号结尾
  return result ;
}

main ( )
{ int n ;
  printf("Input N:") ;
  scanf("%d", &n) ;
  printf("\n\n%d! =%lf\n\n", n, fun(n)) ;
  getchar();
}

解题思路:
其实嘛,我觉得在那个if(n==0)应该是if(n==0||n==1),毕竟1的阶乘也是1,

答案:

#include <stdio.h>

double fun ( int n )
{ double result = 1.0 ;
/************found************/
  if (n==0||n==1)
    return 1.0 ;
  while( n >1 && n < 170 )
/************found************/
    result *= n--;
  return result ;
}

main ( )
{ int n ;
  printf("Input N:") ;
  scanf("%d", &n) ;
  printf("\n\n%d! =%lf\n\n", n, fun(n)) ;
  getchar();
}

测试:

Input N:5


5! =120.000000


22.将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回

给定程序modi1.c是建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

modi1.c:

#include <stdio.h>
#include <stdlib.h>
typedef  struct  aa
{  int  data;  struct  aa  *next; }NODE;
int  fun(NODE  *h)
{ int   sum = 0 ;//sum是统计节点数据域为偶数的值
  NODE  *p;//创建结构体指针p
/***********found**********/
  p=h;//看下面是直接对p进行遍历的,显然p应该是h的下一节点
  while(p)//遍历链表
  {  if(p->data%2==0)//筛出节点数据域的偶数的值
     sum +=p->data;//累加
/***********found**********/
     p=h->next;//这里应该p后移
  }
  return  sum;
}
NODE  *creatlink(int  n)
{  NODE  *h, *p, *s;
   int  i;
   h=p=(NODE *)malloc(sizeof(NODE));//开辟空间
   for(i=1; i<=n; i++)//创建n个节点
   {  s=(NODE *)malloc(sizeof(NODE));
      s->data=rand()%16;//数据在0到15
      s->next=p->next;//把p节点的下一节点接到s节点后
      p->next=s;//再把s节点接在p节点后
      p=p->next;//指针p指向下一节点
   }
   p->next=NULL;//最后一个节点的下一节点赋为空
   return  h;
}
outlink(NODE  *h, FILE  *pf)//输出链表
{  NODE *p;
   p = h->next;//设p为头节点的下一节点
   fprintf(pf ,"\n\nTHE  LIST :\n\n  HEAD " );//fprintf基本和printf一样,只是是用于输出到文件
   while(p)//遍历链表
   {  fprintf(pf ,"->%d ",p->data ); p=p->next; }//指针p后移
      fprintf (pf,"\n");//这里指针pf都是指stdout
}
outresult(int  s, FILE *pf)//输出最终结果
{  fprintf(pf,"\nThe sum of even numbers  :  %d\n",s);}
main()
{  NODE  *head;    int  even;
   head=creatlink(12);//在头节点后面创建12个节点
   head->data=9000;//设置了头节点的数据域,呃,什么用也没有,最后也不输出这个头节点的数据
   outlink(head , stdout);//stdout是一个标准输出流,具体解释写在解题思路里
   even=fun(head);
   printf("\nThe  result  :\n"); outresult(even, stdout);
   getchar();
}

解题思路:
这里仔细讲下stdout这个关键字:
stdout是一个标准输出流,它是C语言标准库中预定义的一个文件指针,也就是在#include<stdio.h>已经定义了,用于表示标准输出设备(通常是显示器),在C语言中,我们可以使用 fprintf() 函数将输出内容写入到 stdout,从而将其显示在屏幕上

在代码中,outlink()和outresult()函数中使用了fprintf()函数,将链表数据和计算结果输出到stdout,即显示到屏幕上,通过将stdout作为文件指针参数传递给fprintf()函数,就可以输出到运行窗口

简而言之,只要记得文件指针是stdout时,其实就是输出到运行窗口,

至于fprintf()函数的用法,通过题目代码差不多可以猜出来

int fprintf(FILE *stream, const char *format, ...);

fprintf()函数可以接受多个参数,stream是指向文件的指针,用于指定要写入的文件,format是要输出的字符串

答案:

#include <stdio.h>
#include <stdlib.h>
typedef  struct  aa
{  int  data;  struct  aa  *next; }NODE;
int  fun(NODE  *h)
{ int   sum = 0 ;
  NODE  *p;
/***********found**********/
  p=h->next;
  while(p)
  {  if(p->data%2==0)
     sum +=p->data;
/***********found**********/
     p=p->next;
  }
  return  sum;
}
NODE  *creatlink(int  n)
{  NODE  *h, *p, *s;
   int  i;
   h=p=(NODE *)malloc(sizeof(NODE));
   for(i=1; i<=n; i++)
   {  s=(NODE *)malloc(sizeof(NODE));
      s->data=rand()%16;
      s->next=p->next;
      p->next=s;
      p=p->next;
   }
   p->next=NULL;
   return  h;
}
outlink(NODE  *h, FILE  *pf)
{  NODE *p;
   p = h->next;
   fprintf(pf ,"\n\nTHE  LIST :\n\n  HEAD " );
   while(p)
   {  fprintf(pf ,"->%d ",p->data ); p=p->next; }
      fprintf (pf,"\n");
}
outresult(int  s, FILE *pf)
{  fprintf(pf,"\nThe sum of even numbers  :  %d\n",s);}
main()
{  NODE  *head;    int  even;
   head=creatlink(12);
   head->data=9000;
   outlink(head , stdout);
   even=fun(head);
   printf("\nThe  result  :\n"); outresult(even, stdout);
   getchar();
}

测试:



THE  LIST :

  HEAD ->7 ->6 ->9 ->3 ->1 ->15 ->10 ->12 ->9 ->13 ->10 ->11 

The  result  :

The sum of even numbers  :  38


23.在字符串的最前端加入n个*号,形成新串,并且覆盖原串

给定程序modi.c中函数fun的功能是:在字符串的最前端加入n个*号,形成新串,并且覆盖原串。

注意:字符串的长度最长允许为79。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

modi.c:

#include <stdio.h>
#include <string.h>
void  fun (  char  s[], int  n )
{
   char  a[80] , *p;
   int  i;//注意i是定义为了fun函数内的全局变量
/**********found***********/
   s=p;//这里显然是想让指针p指向字符串s,=赋值是右赋左
   for(i=0; i<n; i++)  a[i]='*';//使数组前n个字符都是*号
   do
   {  a[i]=*p;//再把字符串s接在字符串a后面
      i++;
   }
/**********found***********/
   while(*p++)//语句以分号;结尾
   a[i]=0;//数组a结尾赋个空,'\0'的ASCII码就是0
   strcpy(s,a);//把字符串a复制给字符串s
}
main()
{  int  n;        char  s[80];
   printf("\nEnter a string  :  "); gets(s);
   printf("\nThe string \"%s\"\n",s);
   printf("\nEnter n ( number of * )  :  ");  scanf("%d",&n);
   fun(s,n);
   printf("\nThe string after insert : \"%s\" \n" ,s);
   getchar();
}

解题思路:
在这道题中可以有疑惑的点是do-while循环的跳出条件(*p++),其实(*p++)等同于(p++&&*p!='\0'),

我们拆分下这个表达式,在此之前,我们要知道后缀自增运算符++的优先级是要高于解引符*,所以在(*p++)是先执行++进行指针后移操作,再执行*对已经后移了的指针进行解引用操作,获取该地址上存储的值,那么表达式执行完后,do-while循环判断中止的表达式是(*p)

答案:

#include <stdio.h>
#include <string.h>
void  fun (  char  s[], int  n )
{
   char  a[80] , *p;
   int  i;
/**********found***********/
   p=s;
   for(i=0; i<n; i++)  a[i]='*';
   do
   {  a[i]=*p;
      i++;
   }
/**********found***********/
   while(*p++);
   a[i]=0;
   strcpy(s,a);
}
main()
{  int  n;        char  s[80];
   printf("\nEnter a string  :  "); gets(s);
   printf("\nThe string \"%s\"\n",s);
   printf("\nEnter n ( number of * )  :  ");  scanf("%d",&n);
   fun(s,n);
   printf("\nThe string after insert : \"%s\" \n" ,s);
   getchar();
}

测试:


Enter a string  :  ASCGV

The string "ASCGV"

Enter n ( number of * )  :  5

The string after insert : "*****ASCGV" 

24.依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串

给定程序modi1.c中函数fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

modi1.c:

#include <stdio.h>
void  fun(char  *s)
{  int  i,j;
   for(i=0,j=0; s[i]!='\0'; i++)//遍历字符串
        if(s[i]>='0' && s[i]<='9')//筛出数字字符
/**********found**********/
            s[j]=s[i];//j没有作自增处理,如果这样的话那就只是循环对s[0]进行
/**********found**********/
        s[j]="\0";//字符串用双引"",字符用单引'',空是单个字符
}
main()
{  char  item[80];
   printf("\nEnter a string  :  ");gets(item);
   printf("\n\nThe  string  is  : \"%s\"\n",item);
   fun(item);
   printf("\n\nThe string of changing is  : \"%s\"\n",item );
  getchar();
}

解题思路:
这题很简单,也没有什么难的地方φ(* ̄0 ̄)

答案:

#include <stdio.h>
void  fun(char  *s)
{  int  i,j;
   for(i=0,j=0; s[i]!='\0'; i++)
        if(s[i]>='0' && s[i]<='9')
/**********found**********/
            s[j++]=s[i];
/**********found**********/
        s[j]='\0';
}
main()
{  char  item[80];
   printf("\nEnter a string  :  ");gets(item);
   printf("\n\nThe  string  is  : \"%s\"\n",item);
   fun(item);
   printf("\n\nThe string of changing is  : \"%s\"\n",item );
  getchar();
}

测试:
给大伙推荐一个能在线编译的网站,挺好用的

以后就用图片的形式展示测试吧
在这里插入图片描述

25.对N名学生的学习成绩,按从高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中

给定程序modi1.c中函数fun的功能是:对N名学生的学习成绩,按从高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

modi1.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define    N  10
typedef  struct  ss
{  char  num[10];//学号
   int  s;//成绩
} STU;
STU *fun(STU  a[], int  m)
{  STU  b[N], *t;
   int  i,j,k;
/**********found**********/
   t=(STU *)calloc(sizeof(STU),m)//这里开辟了多个连续的空间,也就是建了个数组,具体在解题思路讲解
   for(i=0; i<N; i++)  b[i]=a[i];//把结构体数组a复制给结构体数组b,不得不说这结构体变量的封装是真方便
      for(k=0; k<m; k++)
      {  for(i=j=0; i<N; i++)
         if(b[i].s > b[j].s)  j=i;//下面这三句的意思是陆续筛出成绩最高的同学,然后复制给结构体指针t开辟的空间,再把这个筛出的最高分设为0,方便找出第二高成绩的学生
/**********found**********/
         t(k)=b(j);
         b[j].s=0;
      }
      return  t;//返回结构体指针t
}
outresult(STU  a[], FILE  *pf)//输出结构体数组
{  int  i;
   for(i=0; i<N; i++)
   fprintf(pf,"No = %s  Mark = %d\n", a[i].num,a[i].s);//与printf基本一样,只不过多了个文件指针,会输出在指向的地方
   fprintf(pf,"\n\n");
}
main()
{  STU  a[N]={ {"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77},
               {"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71} };
   STU  *pOrder;
   int  i, m;
   printf("***** The Original data *****\n");
   outresult(a, stdout);//stdout表示输出流,是指向标准输出设备的文件指针,实际上的意思就是在运行窗口输出 
   printf("\nGive the number of the students who have better score:  ");
   scanf("%d",&m);
   while( m>10 )//只有当输入的m小于或等于10时,才会跳出循环
   { printf("\nGive the number of the students who have better score:  ");
     scanf("%d",&m);
   }
   pOrder=fun(a,m);//指针的赋值其实也就是地址的赋值,也就是让pOrder指向了t开辟的空间
   printf("***** THE  RESULT *****\n");
   printf("The top  :\n");
   for(i=0; i<m; i++)
      printf("   %s    %d\n",pOrder[i].num , pOrder[i].s);
   free(pOrder);//开辟了空间,自然是要释放的,但是是要在你输出之后释放,不然数据可就没了
  getchar();
}

解题思路:

void *calloc(size_t nitems, size_t size)//nitems和size这两个参数没有顺序要求,谁前谁后都可以

nitems – 要被分配的元素个数。
size – 元素的大小。

用的话题目里的这句 t=(STU *)calloc(sizeof(STU),m)用法没错,只是没加分号
我用文字形容一遍 指针=(数据类型*)calloc(size,nitems);,如果没有填size,那就是默认只开辟一个元素空间,函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。

既然说到calloc,那就不得不说malloc,malloc与calloc用法是一样的,就你把前面对calloc的介绍改成malloc是一样的

说下malloc和calloc的不同点:
malloc 不会设置内存为零,而 calloc 会设置分配的内存为零
意思就是用calloc开辟的数组空间,数组元素都会初始化为0,而用malloc开辟的数组空间,数组元素不会初始化

stdout是一个标准输出流,它是C语言标准库中预定义的一个文件指针,也就是在#include<stdio.h>已经定义了,用于表示标准输出设备(通常是显示器),在C语言中,我们可以使用 fprintf() 函数将输出内容写入到 stdout,从而将其显示在屏幕上

测试:
在这里插入图片描述

26.求出单向链表结点(不包括头结点)数据域中的最大值

给定程序modi1.c是建立一个带头结点的单向链表,并用随机函数为各结点数据域赋值。函数fun的作用是求出单向链表结点(不包括头结点)数据域中的最大值,并且作为函数值返回。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

modi1.c:

#include <stdio.h>
#include <stdlib.h>
typedef  struct  aa
{  int  data;
   struct  aa  *next;
} NODE;
int fun (  NODE  *h )
{ int  max=-1;
  NODE  *p;
/***********found**********/
  p=h ;//该链表是含有头节点的,头节点并没有存入数据,所以p应该指向头节点的下一节点
  while(p)//遍历链表
  {  if(p->data>max )//筛出最大值
              max=p->data;
/***********found**********/
     p=h->next ;//要遍历链表,指针p应该后移,指向下一个节点
  }
  return  max;
}
outresult(int  s, FILE *pf)//输出最终结果
{  fprintf(pf,"\nThe max in link  :  %d\n",s);}

NODE  *creatlink(int  n, int  m)
{  NODE  *h, *p, *s;
   int  i;
   h=p=(NODE *)malloc(sizeof(NODE));h->data=9999;//开辟空间,初始化头节点h数据域为9999
   for(i=1; i<=n; i++)//接着创建n个节点
   {  s=(NODE *)malloc(sizeof(NODE));//开辟节点空间
      s->data=rand()%m;  s->next=p->next;//节点s的数据域取在0~99的随机数,p之后的节点接在s节点后面
      p->next=s;         p=p->next;//节点s接在节点p后面,指针p后移指向下一个节点
   }
   p->next=NULL;//最后p指向最后一个节点,后面没有节点了
   return  h;//返回指向头节点的指针
}
outlink(NODE  *h, FILE  *pf)
{  NODE  *p;
   p=h->next;//设p为头节点h的下一个节点
   fprintf(pf,"\nTHE  LIST :\n\n  HEAD ");
   while(p)//遍历链表
   {  fprintf(pf,"->%d ",p->data); p=p->next; }//指针p后移,输出p指向节点的数据
      fprintf(pf,"\n");
   }
main()
{  NODE  *head;  int  m;
   head=creatlink(12, 100);//12是创建12个节点,100是随机数范围
   outlink(head , stdout);//输出链表,stdout是输出流,其实就是在运行窗口输出
   m=fun(head);
   printf("\nTHE  RESULT  :\n"); outresult(m, stdout);
   getchar();
}

解题思路:
stdout好像在程序修改这类题中,出现非常频繁,

答案:

#include <stdio.h>
#include <stdlib.h>
typedef  struct  aa
{  int  data;
   struct  aa  *next;
} NODE;
int fun (  NODE  *h )
{ int  max=-1;
  NODE  *p;
/***********found**********/
  p=h->next ;
  while(p)
  {  if(p->data>max )
              max=p->data;
/***********found**********/
     p=p->next ;
  }
  return  max;
}
outresult(int  s, FILE *pf)
{  fprintf(pf,"\nThe max in link  :  %d\n",s);}

NODE  *creatlink(int  n, int  m)
{  NODE  *h, *p, *s;
   int  i;
   h=p=(NODE *)malloc(sizeof(NODE));h->data=9999;
   for(i=1; i<=n; i++)
   {  s=(NODE *)malloc(sizeof(NODE));
      s->data=rand()%m;  s->next=p->next;
      p->next=s;         p=p->next;
   }
   p->next=NULL;
   return  h;
}
outlink(NODE  *h, FILE  *pf)
{  NODE  *p;
   p=h->next;
   fprintf(pf,"\nTHE  LIST :\n\n  HEAD ");
   while(p)
   {  fprintf(pf,"->%d ",p->data); p=p->next; }
      fprintf(pf,"\n");
   }
main()
{  NODE  *head;  int  m;
   head=creatlink(12, 100);
   outlink(head , stdout);
   m=fun(head);
   printf("\nTHE  RESULT  :\n"); outresult(m, stdout);
   getchar();
}

测试:
这次推荐另外一个在线编译的网站,这个个人觉得更快一些
在这里插入图片描述

27.判断一个整数是否是素数,若是返回1,否则返回0

给定程序modi1.c中函数fun的功能是:判断一个整数是否是素数,若是返回1,否则返回0。在main()函数中,若fun返回1输出YES,若fun返回0输出NO!。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数。不得增行或删行,也不得更改程序的结构!

modi1.c:

#include <stdio.h>

int  fun ( int m )
{  int k = 2;
   while ( k <= m && (m%k))//k就是在[2,m]区间寻找是否有m的因子,如果m是1,不进入循环,1不是素数
/************found************/
     k++//k自增,遍历[2,m]区间,但是语句要以分号结尾
/************found************/
   if (m = k )//单等=是赋值,双等==是等于
     return 1;
   else   return  0;
}

main( )
{  int  n;
   printf( "\nPlease enter n: " );   scanf(  "%d", &n );
   if (  fun (  n ) )  printf( "YES\n" );
   else printf( "NO!\n" );
  getchar();
}

解题思路:
1不是素数,素数就是因子只有1和自己的数

答案:

#include <stdio.h>

int  fun ( int m )
{  int k = 2;
   while ( k <= m && (m%k))
/************found************/
     k++;
/************found************/
   if (m == k )
     return 1;
   else   return  0;
}

main( )
{  int  n;
   printf( "\nPlease enter n: " );   scanf(  "%d", &n );
   if (  fun (  n ) )  printf( "YES\n" );
   else printf( "NO!\n" );
  getchar();
}

测试:
在这里插入图片描述

28.分别统计出形参str所指的字符串中的大写字母和小写字母的个数

给定程序MODI1. C中,函数fun的功能是:分别统计出形参str所指的字符串中的大写字母

和小写字母的个数,并传递回主函数输出。

例如:若str所指的内容为”BAY23Kill",其中大写字母数为4,小写字母数为3,

则应输出: c0=4, c1=3。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

MODI1. C:

#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
void fun(char* str, int *c0, int *c1) {  
	int k;
/**********found**********/
	c0 = c1 = 0;//没加解引符*,所以这里只是对地址进行赋值,没有改变指针指向的数据
/**********found**********/
	for (k=1; k<strlen(str); k++) {//数组下标应该从0开始
/**********found**********/
		if ( (str[k] >= 'A') && (str[k] <= 'Z') ) *c0++;//应该用括号这样括起来(*c0)++,先运算解印符*
		if ( (str[k] >= 'a') && (str[k] <= 'z') ) (*c1)++;
	}
}

main()
{ char str[100]; int c0,c1;
  printf("input string:");
  scanf("%s", str);
  fun(str, &c0, &c1);
  printf("c0=%d,c1=%d\n", c0, c1);
}

解题思路:
对于*c0++,我们要知道自增运算符++的优先级是要高于解引符*,如果就这样运算,就会先运算自增运算符++,指针c0指向的地址就会自增,指向一个新的数,然后运算解印符*,所以我们需要用括号改变优先级,使其先运算解引符,再运算自增运算符

答案:

#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
void fun(char* str, int *c0, int *c1) {  
	int k;
/**********found**********/
	*c0 = *c1 = 0;
/**********found**********/
	for (k=0; k<strlen(str); k++) {
/**********found**********/
		if ( (str[k] >= 'A') && (str[k] <= 'Z') ) (*c0)++;
		if ( (str[k] >= 'a') && (str[k] <= 'z') ) (*c1)++;
	}
}

main()
{ char str[100]; int c0,c1;
  printf("input string:");
  scanf("%s", str);
  fun(str, &c0, &c1);
  printf("c0=%d,c1=%d\n", c0, c1);
}

测试:
在这里插入图片描述

29.求三个数的最小公倍数

给定程序modi1.c中,函数fun的功能是:求三个数的最小公倍数。

例如,给变量x1、x2、x3分别输入15 11 2,则输出结果应当是:330。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

modi1.c:

#include <stdio.h>
/************found************/
fun(int  x, y, z )//函数参数声明时,不可以这样共一个数据类型
{  int  j,t ,n ,m;
   j = 1 ;//后面可以看到j是被除数,被除数不能是0,初始化应该从1开始
   t=j%x;
   m=j%y ;
   n=j%z;
   while(t!=0||m!=0||n!=0)//也就是当j能整除t,m,n时,j也就是这三个数的公倍数了
   {  j = j+1;
      t=j%x;
      m=j%y;
      n=j%z;
   }
/************found************/
   return i;//这函数根本就没有i,这里应该返回公倍数j
}
main( )
{  int   x1,x2,x3,j ;
   printf("Input x1  x2  x3:  ");  scanf("%d%d%d",&x1,&x2,&x3);
   printf("x1=%d, x2=%d, x3=%d \n",x1,x2,x3);
   j=fun(x1,x2,x3);
   printf("The minimal common multiple is : %d\n",j);
  getchar();
}

解题思路:
粗暴简单的解法,是对于求解公倍数最直接的解法了(o゜▽゜)o☆

答案:

#include <stdio.h>
/************found************/
fun(int  x,int y,int z )
{  int  j,t ,n ,m;
   j = 1 ;
   t=j%x;
   m=j%y ;
   n=j%z;
   while(t!=0||m!=0||n!=0)
   {  j = j+1;
      t=j%x;
      m=j%y;
      n=j%z;
   }
/************found************/
   return j;
}
main( )
{  int   x1,x2,x3,j ;
   printf("Input x1  x2  x3:  ");  scanf("%d%d%d",&x1,&x2,&x3);
   printf("x1=%d, x2=%d, x3=%d \n",x1,x2,x3);
   j=fun(x1,x2,x3);
   printf("The minimal common multiple is : %d\n",j);
  getchar();
}

测试:
在这里插入图片描述

30.统计字符串中各元音字母(即:A、E、I、O、U)的个数

给定程序modi1.c中,函数fun的功能是:统计字符串中各元音字母(即:A、E、I、O、U)的个数。注意:字母不分大、小写。

例如:若输入:THIs is a boot,则输出应该是:1、0、2、2、0。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

modi1.c:

#include <stdio.h>
void fun ( char   *s,  int   num[5] )
{  int  k, i=5;
   for ( k = 0; k<i; k++ )
/**********found**********/
     num[i]=0;//i是定值,这样做,那就始终只对一个元素初始化了
   for (; *s; s++)//*s=='\0'时跳出循环
   { i = -1;
/**********found**********/
    switch ( s )//指针没加解引符
    { case 'a': case 'A': {i=0; break;}
      case 'e': case 'E': {i=1; break;}
      case 'i': case 'I': {i=2; break;}
      case 'o': case 'O': {i=3; break;}
      case 'u': case 'U': {i=4; break;}
    }
    if (i >= 0)
      num[i]++;
   }
}

main( )
{  char  s1[81];    int  num1[5], i;
   printf( "\nPlease enter a string: " );  gets( s1 );
   fun ( s1, num1 );
   for ( i=0; i < 5; i++  ) printf ("%d ",num1[i]); printf ("\n");
   getchar();
}

解题思路:
这类题对指针的考查都极为频繁,这道题没什么难点

答案:

#include <stdio.h>
void fun ( char   *s,  int   num[5] )
{  int  k, i=5;
   for ( k = 0; k<i; k++ )
/**********found**********/
     num[k]=0;
   for (; *s; s++)
   { i = -1;
/**********found**********/
    switch ( *s )
    { case 'a': case 'A': {i=0; break;}
      case 'e': case 'E': {i=1; break;}
      case 'i': case 'I': {i=2; break;}
      case 'o': case 'O': {i=3; break;}
      case 'u': case 'U': {i=4; break;}
    }
    if (i >= 0)
      num[i]++;
   }
}

main( )
{  char  s1[81];    int  num1[5], i;
   printf( "\nPlease enter a string: " );  gets( s1 );
   fun ( s1, num1 );
   for ( i=0; i < 5; i++  ) printf ("%d ",num1[i]); printf ("\n");
   getchar();
}

测试:
在这里插入图片描述

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值