C Primer Plus 第6版 第8章 编程练习

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

猜你喜欢

转载自blog.csdn.net/qq_41068877/article/details/83536751