课后习题第三波来了,到第三章之后代码之类的稍微变长了一些,所以我把这一章的答案分为几部分。这一章重点是字符串的处理,对于字符串问题,通常只要细心就没有问题了,下面不多说了直接上详解。
习题3-1 分数统计(stat)
任务1:这个比较简单就直接上代码了:
#include <stdlib.h> #include <stdio.h> #include <string.h> #define MAXN 100 + 10 int cmp(const void*a,const void*b){ return *(int*)a - *(int*)b; } int main() { int i,j,n,max,p; int Stu[MAXN],a[MAXN]; memset(a,0,sizeof(a)); scanf("%d",&n); for(i = 0; i < n; i++){ scanf("%d",&p); a[p]++; } max=a[0]; for( i = 1; i < MAXN; i++){ if(a[i]>=max){ max=a[i]; } } for( i = 0, j = 0; i < MAXN; i++){ if(a[i]==max){ Stu[j++] = i; } } qsort(Stu,j,sizeof(Stu[0]),cmp); for( i = 0; i < j; i++){ if(i) printf(" "); printf("%d",Stu[i]); } printf("\n"); return 0; }
任务2:这个相对任务1难度就加大许多了,其中这一题,在使用 qsort 函数时还有一个小细节要注意,就是在return 时,对于double型的要使用 三元运算符,如果按照之前的处理方法会造成错误,错误来自于浮点数的误差。这一题我的处理方法与第一题类似,但是要与第一题整数类似,就必须做出一点牺牲,然而我牺牲了内存。代码如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXN 10000 + 100 int cmp(const void*a,const void*b){ return *(double*)a>*(double*)b?1:-1; } int main() { int i,j,a[MAXN],n,max,temp; double p,Stu[101]; memset(a,0,sizeof(a)); scanf("%d",&n); for(i = 0; i < n; i++){ scanf("%lf",&p); temp = 100*p; a[temp]++; } max=a[0]; for( i = 1; i < MAXN; i++){ if(a[i] > max){ max = a[i]; } } for( i = 0, j = 0; i < MAXN; i++){ if(a[i]==max){ Stu[j++] = (double)i/100; } } qsort(Stu,j,sizeof(Stu[0]),cmp); for( i = 0; i < j; i++){ if(i) printf(" "); printf("%.2lf",Stu[i]); } printf("\n"); return 0; }
习题3-2 单词长度(word)
这一题比较简单,只需要注意 数单词 数的时候小心一些就好了
#include <stdio.h> #include <ctype.h> #define MAXN 10000 + 100 char str[MAXN]; int main(){ int i,sum = 0,count = 0; //count用于记录空格数,sum用于记录字母的总数 gets(str); if(str[0]!=' ') count = 1; for(i = 0; str[i]!='\0';i++){ if(str[i]==' '&&isalpha(str[i+1])) count++; if(isalpha(str[i])) sum++; } printf("count = %d,sum = %d\n",count,sum); printf("%.2lf\n",1.0*sum/count); return 0; }
习题3-3 乘积的末三位(product)
这一题的分两步,第一步将含有大小写字母的字符串舍弃,第二部分将纯数字的字符串转化为数字进行运算。这样一来问题就清晰了,代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int isNum(char *a,int len){ int i; for( i = 0; i < len; i++){ if(a[i]<'0'||a[i]>'9') return 0; } return 1; } int main(){ char str[20]; int i,n,p,tmp; //n表示输入整数的个数,p表示那些整数乘积的后三位 while(scanf("%d",&n) == 1){ p = 1; for(i = 0; i < n; i++){ scanf("%s",str); getchar(); if(isNum(str,strlen(str))){ tmp = atoi(str); p *= tmp; p %= 1000; } } printf("%03d\n",p); } return 0; }
对于【第三章】的其他习题,会在后面的文章继续
【第一章】课后习题详解:传送门
【第二章】课后习题详解:传送门
【第三章】第二部分:传送门
(如有错误,欢迎指正,转载请注明出处)