目录:
- 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();
}
测试: