《C Primer Plus》第8章 编程题 第8题

好久没有写博客了,鄙视自己吧!

抽这个空挡学习C语言,选择的学习书籍是《C Primer Plus》。

因为时间充裕,选择了很慢的方式进行学习:看书、书上所有的例程敲上一遍、所有的课后习题来上一遍……

确实很慢,差不多两周,才整到了第八章的结束。偷笑

第8章编程题第8题,哈哈,看上去很迷信数字啊,不过确实感觉可能是前8章里难度最大的一个题。同时涵盖了前面很多的知识点,特别是第8章稍稍让人有点迷惑的“字节流”的概念,这个概念看上去不复杂,不就是逐字节的读取输入吗?!可用在程序里边还是需要适应一下。

记录下自己的方法吧。

// 显示一个菜单,提供加法、减法、乘法或除法
#include <stdio.h>
#include <ctype.h>

// 函数原型
void menu(void);				// 输出菜单
int get_choice(void);				// 得到一个非空字符
float get_number(void);				// 得到一个浮点数
void calc(char symbol);				// 计算两个数的 + - * /

int main(void){
	int ch;
	
	menu();					// 展现菜单
	while((ch = get_choice()) != 'q'){
		switch(ch){			// 根据输入选择正确的运算符或流程
			case 'a':
				calc('+');
				break;
			case 's':
				calc('-');
				break;
			case 'm':
				calc('*');
				break;
			case 'd':
				calc('/');
				break;
			default:
				printf("Please enter correct option.\n");
				continue;
		}
		menu();
	}
	printf("Bye.\n");
	
	return 0;
}

int get_choice(void){
	int ch;
	ch = getchar();
	while(isspace(ch))			// 得到第一个非空字符
		ch = getchar();
	while(getchar() != '\n')		// 跳过余下的所有字符
		continue;
	return ch;
}

void menu(void){
	printf("Enter the operation of your choice:\n");
	printf("a. add         s. subtract\n");
	printf("m. multiply    d. divide\n");
	printf("q. quit\n");
}

float get_number(void){
	float num;
	char ch;
	
	while(scanf("%f", &num) != 1){		// 要求输入一个浮点数
		while((ch = getchar()) != '\n')	// 抛弃这些非法输入并告知用户
			putchar(ch);
		printf(" is not an number.\n");
		printf("Please enter a number, such as 2.5, -1.78E8, or 3: ");
	}
	while(getchar() != '\n')
		continue;

	return num;
}

void calc(char symbol){
	float one, two, result;

	printf("Enter first number: ");		// 得到运算所需的数字
	one = get_number();
	printf("Enter second number: ");
	two = get_number();

	if(symbol == '+')			// 选择需要的运算
		result = one + two;
	if(symbol == '-')
		result = one - two;
	if(symbol == '*')
		result == one * two;
	if(symbol == '/'){
		while(two == 0){		// 分母不能为 0
			printf("Enter a number other than 0: ");
			two = get_number();
		}
		result = one / two;
	}
	printf("%.2f %c %.2f = %.2f\n", one, symbol, two, result);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值