-- 这章的练习要使用重定向,如果不能使用,可以用特殊字符代替EOF
1.统计读到文件结尾之前读取的字符数。
#include<stdio.h> int main(void) { char ch; int char_num = 0; while ((ch = getchar()) != EOF) char_num++; printf("char_num = %d", char_num); return 0; }
2.略
3.读到EOF,报告大写字母和小写字母的字数。
#include<stdio.h> int main(void) { char ch; int Big = 0; int Small = 0; while ((ch = getchar()) != EOF) { if ('a' <= ch && ch <= 'z') Small++; else if ('A' <= ch && ch <= 'Z') Big++; } printf("小写有 %d个, 大写有 %d 个",Small,Big); return 0; }
4.报告读取单词的平均字母数。(简化版)
#include<stdio.h> #include<ctype.h> int main(void) { char ch; int num_words = 0; //单词数量 int num_a = 0; //字母数量 while ((ch = getchar()) != EOF) { if (ch == ' ') num_words++; // 每个单词后面有1个空格 else if(isalpha(ch) ) num_a++; } num_words++; // 最后一个单词后面没有空格,所以在这里+1 printf("一共%d个单词,%d个字母,平均每个单词有%f个字母", num_words, num_a, 1.0*num_a / num_words); getchar(); getchar(); return 0; }
5.二分查找猜数. 比如猜数0~100,先猜50,如果用户说大了, 就猜 0~50的中间值 25.
这道题刚开始犯了个错误,就是字符串直接用 == 比较了,然后一直出错。后来想起来要用strcmp比较字符串。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main(void) { int max; int min; bool bingo = false; char condtion[20]; int answer; printf("输入数字的范围:\n最小值:"); scanf_s("%d", &min); printf("最大值:"); scanf_s("%d", &max); printf("想好一个数字,不要说出来,我要开始猜了\n"); while (!bingo) { printf("我猜是%d\n", (max + min)/2); printf("大了?小了?对了?(请输入这3个之一)"); scanf("%s", condtion); if (strcmp(condtion, "大了") == 0) max = (max + min) / 2; else if (strcmp(condtion, "小了") == 0) min = (max + min) / 2; else if (strcmp(condtion, "对了") == 0) { bingo = true; answer = (max + min) / 2; } } printf("答案是%d,再见",answer); getchar(); getchar(); return 0; }
6,7 略
8.编写简单计算器,提供+-*/的菜单。
一开始写的版本每次选择都会打印两次, 查了资料知道是缓冲区的问题,
选择时,输入a回车,然后a读入,回车还在,但是这个回车最后不影响。
进入 加法,输入第一个数字没问题,输入第二个数字时又多了一个回车。
这时候缓冲区就有一个换行符,然后就直接把'\n'读给choice了,
一个简单的办法就是把输入后面多出来的回车用getchar()读掉。
#include<stdio.h> #include<stdlib.h> int main(void) { char choice ; char ch; double first; double second; do { printf("请选择:\n \ a. 加 add\ts.减 subtract \n \ m. 乘 multiply\td. 除 divide \n \ q. quit\n"); scanf_s("%c",&choice); //getchar(); switch (choice) { case 'a': { printf("输入第一个数字"); scanf_s("%lf", &first); printf("输入第二个数字"); scanf_s("%lf", &second); printf("%g + %g = %g\n", first, second, first + second); getchar(); } break; case 's': { printf("输入第一个数字"); scanf_s("%lf", &first); printf("输入第二个数字"); scanf_s("%lf", &second); printf("%g - %g = %g\n", first, second, first - second); getchar(); } break; case 'm': { printf("输入第一个数字"); scanf_s("%lf", &first); printf("输入第二个数字"); scanf_s("%lf", &second); printf("%g * %g = %g\n", first, second, first * second); getchar(); } break; case 'd': { printf("输入第一个数字"); scanf_s("%lf", &first); printf("输入第二个数字"); scanf_s("%lf", &second); printf("%g / %g = %g\n", first, second, first / second); getchar(); } break; case 'q': printf("Bye"); break; default: printf("%c是无效输入\n",choice); break; } } while (choice != 'q'); return 0; }