-- 这章的练习要使用重定向,如果不能使用,可以用特殊字符代替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;
}