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