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

目录:

    • 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:55! =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到15s->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码就是0strcpy(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  :  ASCGVThe string "ASCGV"Enter n ( number of * )  :  5The 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数据域为9999for(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();
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

删除.git的影响、git分支切换时注意事项

一、删除.git的影响 master分支文件 dev分支文件 删除.git后 文件为删除.git前分支的文件状态。 二、git分支切换时注意事项 情景&#xff1a;如果我在分支A&#xff0c;想要跳转到分支B。 git的规矩是&#xff0c;在那个分支上进行的提交&#xff0c;就算哪个分支上的工作…

白嫖10款游戏加速器,一年都不用开会员!

过年期间你们是走亲串戚还是窝家玩游戏、追剧&#xff1f;相信很多小伙伴都不会放过这个难得的假期&#xff0c;肯定是会百忙之中来两把的&#xff0c;那么人一多玩游戏肯定就会拥堵&#xff0c;有延迟。解决延迟最好的办法就是用加速器&#xff0c;当你的网络比别人强时&#…

【链表】-Lc83-删除有序链表中的重复元素(快慢双指针,slow,fast)

写在前面 最近想复习一下数据结构与算法相关的内容&#xff0c;找一些题来做一做。如有更好思路&#xff0c;欢迎指正。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.代码 写在后面 一、场景描述 删除有序链表中的重复元素。 示例&#xff1a; 输入&#xff1a;1->2…

避免Arrays.asList陷阱:优雅处理结构性修改的方法

临近年终&#xff0c;项目交付排期比较紧张&#xff0c;导致很多时候&#xff0c;Code Review 往往是走马观花&#xff0c;没有严格执行。最近&#xff0c;一个实习生就产生了一个十分低级的代码BUG。笔者感觉这个问题&#xff0c;对于实习生&#xff0c;尤其是刚入职的 应届 J…

幻兽帕鲁mod安装指南(自用mod)

以下mod仅steam单机安装验证有效&#xff01; 网址&#xff1a;https://www.nexusmods.com/palworld/mods/?BH2 游戏安装路径参考&#xff1a;D:\Steam\steamapps\common\Palworld\Pal\Binaries\Win64\Mods 一、功能性MOD 首先安装mod环境UE4SS xinput UE4SS xinput 安装步骤…

浅谈交换原理(3)——交换网络

一、基本概念 交换网络是由若干个交换单元按照一定的拓扑结构和控制方式构成的网络。交换网络的三个基本要素是&#xff1a;交换单元、不同交换单元间的拓扑连接和控制方式。 1.1 单机交换网络与多级交换网络 交换网络按拓扑连接方式可分为&#xff1a;单级交换网络和多级交换网…

版本控制器Git

目录 背景 图形化界面 下载安装或使用网页版 安装图形化界面 注册账号 创建仓库​ 创建本地仓库 ​创建项目到本地工作目录 三板斧 git add git commit git push 注意 命令行 Git和Gitee/Github的区别&#xff1f; 版本控制器是什么&#xff1f; 本地仓库VS…

综合回溯,剪枝,暴搜

目录 力扣1863.找出所有子集的异或总和再求和 力扣47.全排列II​编辑 力扣17.电话号码的字母组合电话号码的字母组合https://leetcode.cn/problems/letter-combinations-of-a-phone-number/​编辑 力扣22.括号生成 力扣1863.找出所有子集的异或总和再求和 class Solution {in…

第三百一十三回

文章目录 1. 概念介绍2. 实现方法2.1 obscureText属性2.2 decoration属性 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何实现倒计时功能"相关的内容&#xff0c;本章回中将介绍如何实现密码输入框.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍…

GEE入门篇|栅格数据集概述(四):其他卫星产品

目录 1.甲烷数据集 2.天气及气候数据 3.预先分类的土地用途和土地覆盖数据集 3.1ESA WorldCover 3.2 全球森林变化数据集 卫星还可以收集有关气候、天气和大气中存在的各种化合物的信息。这些卫星利用部分电磁频谱&#xff0c;以及不同物体和化合物在不同波长的阳光照射下…

嵌入式C语言学习——基于Linux与GCC

Linux终端创建文件指令&#xff1a; https://blog.csdn.net/xtho62/article/details/118194873 vim编辑器基本指令 1.过vim编辑器打开/创建文件&#xff1a;vim 文件名 2.进入文件&#xff0c;默认在正常模式&#xff0c;按 i 进入编辑模式 3.在编辑模式中&#xff0c;按ESC退出…

golang windows 环境搭建 环境配置

golang windows 环境搭建 环境配置 Golang学习之路一环境搭建 MacBook Linux 树莓派raspberrypi安装Golang环境 官网下载地址: https://go.dev/dl/ https://golang.google.cn/dl/ 下载对应系统版本&#xff0c;例如windows 64位系统&#xff0c;下载&#xff1a;xxx.window…

【Langchain Agent研究】SalesGPT项目介绍(一)

【2024最全最细LangChain教程-13】Agent智能体&#xff08;二&#xff09;-CSDN博客 之前我们介绍了langchain的agent&#xff0c;其实不难看出&#xff0c;agent是更高级的chain&#xff0c;可以进行决策分析、可以使用工具&#xff0c;今天我们开始开启一些更高阶的课程&…

【算法题】95. 不同的二叉搜索树 II

题目 给你一个整数 n &#xff0c;请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3…

【机器学习】单变量线性回归

文章目录 线性回归模型&#xff08;linear regression model&#xff09;损失/代价函数&#xff08;cost function&#xff09;——均方误差&#xff08;mean squared error&#xff09;梯度下降算法&#xff08;gradient descent algorithm&#xff09;参数&#xff08;parame…

鸿蒙开发系列教程(十六)--日志处理

console控制台输出 以格式化输出方式打印调试信息 console.debug&#xff08;&#xff09; console.debug(‘debug。。。’ &#xff09; 以格式化输出方式打印日志信息 console.log&#xff08;&#xff09; console.log(‘info。。。’) 以格式化输出方式打印警告信息 con…

ubuntn20 搭建 redmine

安装数据库 更新包列表&#xff1a;sudo apt update 安装MySQL服务器&#xff1a;sudo apt install mysql-server 运行安全性脚本&#xff1a;MySQL服务器安装后&#xff0c;运行以下命令以加固安装&#xff1a;sudo mysql_secure_installation 这个脚本将引导您完成几个安全选…

Nginx限流设置

1.反向代理(建议先看正向代理,反向代理则是同样你要与对方服务器建立连接,但是,代理服务器和目标服务器在一个LAN下,所以我们需要与代理服务器先建交,再由他获取与目标服务器的交互,好比一个带刀侍卫守护着目标服务器) 屏蔽目标服务器的真实地址&#xff0c;相对安全性较好&am…

为什么在git操作中,要按照commit、pull、push的顺序

在Git操作中&#xff0c;按照commit、pull、push的顺序进行操作的主要原因是为了避免代码冲突和保持代码库的同步。下面是详细的解释&#xff1a; Commit: 首先进行commit操作是为了将本地的代码改动保存到一个清晰的版本历史中。这样做有几个好处&#xff1a; 你可以为这次提交…

ubuntu下修改hosts读写权限

ubuntu下修改hosts文件的操作&#xff1a; 由于需要在hosts文件下添加ip地址信息&#xff0c;但是初始情况下系统该文件为只读权限无法修改&#xff0c;具体操作如下所示&#xff1b; 1.cd到系统etc目录下&#xff0c;执行如下命令,此时会提示输入密码&#xff0c;直接输入回…