C Primer Plus(第六版)第七章编程练习

7.1

编写一个程序读取输入,读到#字符停止,然后报告空格数、换行符数和其他字符的数量

#include <stdio.h>
#define STOP '#'

int main(void)
{
	int space = 0; //空格数量
	int line = 0; //换行符数量
	int ch = 0; //其他字符数量
	char c; //输入的字符

	printf("Enter text( '#' to Stop ):>");
	while ((c = getchar()) != STOP)
	{
		ch++; //先计算所有字符数量
		if (c == '\n')
			line++;
		if (c == ' ')
			space++;
	}
	ch = ch - space - line; //所有字符数 - 空格数 - 换行数 = 其他字符数
	printf("Spaces = %d, Lines = %d, Others = %d\n", space, line, ch);

	return 0;
}

7.2

编写一个程序,读到#为止,程序打印每个输入的字符和所对应的ASCII码(十进制),每行打印8个“字符 - ASCII码”组合

#include <stdio.h>
#define STOP '#'

int main(void)
{
	int i = 0;
	char c = 0;

	printf("Enter text( '#' to STOP ):>");
	while ((c = getchar()) != STOP)
	{
		if (i % 8 == 0 && i != 0)
			printf("\n");
		i++;
		printf("%c-%d\t", c, c);
	}

	return 0;
}

7.3

编写一个程序,读取整数直到用户输入0,输入结束后,程序报告用户输入的偶数个数(不包括0)、这些偶数的平均值、输入的奇数个数、这些奇数的平均值

#include <stdio.h>

int main(void)
{
	int num = 0; //输入的数
	int evens = 0; //偶数个数
	float average_even = 0; //偶数平均值
	int odds = 0; //奇数个数
	float average_odd = 0; //奇数平均值

	printf("Enter the numbers( 0 to STOP):>");
	while (scanf_s("%d", &num) == 1)
	{
		if (num == 0)
			break;
		if ((num % 2) == 0)
		{
			evens++;
			average_even += num; //先计算偶数的和
		}
		if ((num + 1) % 2 == 0)
		{
			odds++;
			average_odd += num;
		}
	}
	printf("The evens are: %d\tThe average of even is: %f\nThe  odds are: %d\tThe average of  odd is: %f\n", evens, (average_even / evens), odds, (average_odd / odds));

	return 0;
}

7.4

使用 if else 编写一个程序读取输入,读到#为止,用感叹号代替句号,用两个感叹号代替原本的感叹号,输出替换后的文本,最后报告替换了多少次

#include <stdio.h>
#define STOP '#'

int main(void)
{
	int replacements = 0;
	char c;

	printf("Enter text( '#' to STOP):>");
	while ((c = getchar()) != STOP)
	{
		if (c == '.')
		{
			replacements++;
			printf("!");
			continue;
		}
		if (c == '!')
		{
			replacements++;
			printf("!!");
			continue;
		}
		printf("%c", c);
	}
	printf("\nReplacements are: %d\n", replacements);

	return 0;
}

7.5

用switch编写7.4

#include <stdio.h>
#define STOP '#'

int main(void)
{
	int replacements = 0;
	char c;

	printf("Enter text( '#' to STOP):>");
	while ((c = getchar()) != STOP)
	{
		switch (c)
		{
		case '.':
			replacements++;
			printf("!");
			break;
		case '!':
			replacements++;
			printf("!!");
			break;
		default:
			printf("%c", c);
			break;
		}
	}
	printf("\nReplacements are: %d\n", replacements);

	return 0;
}

7.6

编写程序读取输入,读到#为止,报告ei出现的次数

#include <stdio.h>
#define STOP '#'

int main(void)
{
	int ei = 0;
	char c = 0;

	printf("Enter text( '#' to STOP):>");
	while ((c = getchar()) != STOP)
	{
		if (c == 'e')
		{
			c = getchar();
			if (c == STOP) //此处再做判断,避免读取到‘e#’无法停止
				break;
			if (c == 'i')
				ei++;
		}
	}
	printf("The number of 'ei' is %d\n", ei);

	return 0;
}

7.7

编写一个程序,输入一周的小时数,打印工资总额、税金、净收入

a.基本工资 = 10元/小时

b.加班(超过40小时) = 1.5倍的时间

c.税率:<300元 = 15%;300< <450 = 20%;>450 = 25%

#include <stdio.h>

#define WAGE 10 //基本工资
#define RATE1 0.15
#define RATE2 0.2
#define RATE3 0.25

int main(void)
{
	float salary = 0; //总工资(含税收
	int hour = 0; //工作时间
	float tax = 0; //税收
	float income = 0; //收入

	printf("Enter work-hours:>");
	scanf_s("%d", &hour);
	if (hour > 40)
		salary = hour * WAGE + (hour - 40) * 1.5 * WAGE;
	else
		salary = hour * WAGE;
	if (salary <= 300)
		tax = salary * RATE1;
	else if (salary >= 300 && salary <= 450)
		tax = 300 * RATE1 + (salary - 300) * RATE2;
	else
		tax = 300 * RATE1 + 150 * RATE2 + (salary - 450) * RATE3;
	income = salary - tax;
	printf("SALARY: %f\n   TAX: %f\nINCOME: %f\n", salary, tax, income);

	return 0;
}

7.8 ( 暂时解法

修改7.7的假设a,改为显示菜单让用户自己选择,用switch完成工资等级选择,菜单如下:

××××××××××××××××××××××××××××××××××××××××××××××××××

Enter the number corresponding to the desired pay rate or action:

1) $8.75/hr                                          2) $9.33/hr

3) $10.00/hr                                        4) $11.20/hr

5) quit

××××××××××××××××××××××××××××××××××××××××××××××××××

输入5退出,输入其他数字提醒重新输入

#include <stdio.h>

#define RATE1 0.15
#define RATE2 0.2
#define RATE3 0.25

int main(void)
{
	float salary = 0; //总工资(含税收
	int hour = 0; //工作小时数
	float tax = 0; //税收
	float income = 0; //收入
	float wage = 0; //基本工资
	int option = 0; //基本工资选项
	char choice; //“是否重新计算”选项


	while (1)
	{
		printf("*****************************************************************\n");
		printf("Enter the number corresponding to the desired pay rate or action:\n");
		printf("1) $8.75/hr			2) $9.33/hr\n");
		printf("3) $10.00/hr			4) $11.20/hr\n");
		printf("5) quit\n");
		printf("*****************************************************************\n\n");
		printf("Enter your option:>");
		scanf_s("%d", &option);
		switch (option)
		{
		case 1:
			wage = 8.75;
			break;
		case 2:
			wage = 9.33;
			break;
		case 3:
			wage = 10.00;
			break;
		case 4:
			wage = 11.20;
			break;
		case 5:
			return 0;
		default:
			printf("Please enter the correct options\n\n");
			continue;
		}
		printf("Enter work-hours:>");
		scanf_s("%d", &hour);
		if (hour > 40)
			salary = hour * wage + (hour - 40) * 1.5 * wage;
		else
			salary = hour * wage;
		if (salary <= 300)
			tax = salary * RATE1;
		else if (salary >= 300 && salary <= 450)
			tax = 300 * RATE1 + (salary - 300) * RATE2;
		else
			tax = 300 * RATE1 + 150 * RATE2 + (salary - 450) * RATE3;
		income = salary - tax;
		printf("SALARY: %f\n   TAX: %f\nINCOME: %f\n\n", salary, tax, income);
		while (1)
		{   //判断是否还要重新计算
            //此处会有错误,不运行scanf_s就直接进行下一步,可以把这个循环删去
			printf("Whether to recalculate<Y/N>:>");
			scanf_s("%c", &choice, 1);
			if (choice == 'N' || choice == 'n')
				return 0;
			else if (choice == 'Y' || choice == 'y')
				break;
			else
				printf("Please enter the correct options\n\n");
		}
	}

	return 0;
}

7.9

编写一个程序,只接受正整数输入,然后显示所有小于或等于该数的素数

#include <stdio.h>

int main(void)
{
	int num; //用户输入的数
	int i; // <= num的数
	int j; // <= i的数(除数)

	while (1)
	{
		printf("Enter a number( >0 ):>");
		scanf_s("%d", &num);
		if (num > 0)
			break;
		printf("Please re-enter\n");
	}
	for (i = 1; i < num + 1; i++)
	{
		for (j = 2; j < i + 1; j++)
		{
			if (j == i)
				printf("%d ", i);
                //此时的 i 没有被除了1和 i 自身整除,为素数
			if (i % j == 0)
				break;
                //i 被整除,若除数 < i,则 i 不是素数
		}
	}

	return 0;
}

7.10

美国税收有4种类型,如下:

单身:17850美元及以内按15%计算,超出部分按28%计算

户主:23900美元及以内按15%计算,超出部分按28%计算

已婚,共有:29750美元及以内按15%计算,超出部分按28%计算

已婚,离异:14875美元及以内按15%计算,超出部分按28%计算

编写一个程序,让用户指定缴纳税金的种类和收入,然后计算税金

#include <stdio.h>

int main(void)
{
	int option;
	int boundary; //税率变化的界限
	float salary; //收入
	float tax; //税收

	while (1)
	{
		printf("1)单身----------17850美元及以内按 15% 计算,超出部分按 28% 计算\n");
		printf("2)户主----------23900美元及以内按 15% 计算,超出部分按 28% 计算\n");
		printf("3)已婚,共有----29750美元及以内按 15% 计算,超出部分按 28% 计算\n");
		printf("4)已婚,离异----14875美元及以内按 15% 计算,超出部分按 28% 计算\n");
		printf("5)退出-----------------------------------------------------\n");
		printf("Enter your option:>");
		scanf_s("%d", &option);
		switch (option)
		{
		case 1:
			boundary = 17850;
			break;
		case 2:
			boundary = 23900;
			break;
		case 3:
			boundary = 29750;
			break;
		case 4:
			boundary = 14875;
			break;
		case 5:
			return 0;
		default:
			printf("Please re-enter\n\n");
			continue;
		}
		printf("Enter your salary:>");
		scanf_s("%f", &salary);
		if (salary > boundary)
		{
			tax = boundary * 0.15 + (salary - boundary) * 0.28;
			printf("Your tax are: %f\n\n", tax);
			continue;
		}
		tax = boundary * 0.15;
		printf("Your tax are: %f\n\n", tax);
	}

	return 0;
}

7.11

ABC杂货店出售的洋蓟售价为$2.05/磅;甜菜售价为$1.15/磅;胡萝卜售价为$1.09/磅。在添加运费前,100美元的订单有5%的打折优惠。少于或等于5磅的订单收取6.5美元运费;5到20磅的订单收取14美元运费;超过20美元的订单在14美元的基础上每续重1磅增加0.5美元。编写一个程序,在循环中用switch函数实现用户输入不同的字母时有不同的响应,即输入a的响应是让用户输入洋蓟的磅数;b是甜菜的磅数;c是胡萝卜的磅数;q是退出订购。程序要记录累积的磅数,然后要计算货物的总价、折扣、运费,随后打印出所有购买信息:物品售价、订购的磅数、订购的蔬菜费用、订单的总费用、折扣、运费、及最后需要支付的价格

#include <stdio.h>
#include <Windows.h>

int main(void)
{
	int m; //任意一种蔬菜磅数
	int m_arti = 0, m_beet = 0, m_carr = 0; //每种蔬菜的磅数
	int pounds = 0; //总磅数
	float dis = 0; //折扣
	int fre = 0; //运费
	float vege = 0; //订购蔬菜的总费用
	float cost = 0; //总费用
	float c_arti = 0, c_beet = 0, c_carr = 0; //每种蔬菜的费用
	char option = 1;

	while (option != 'q')
	{
		system("cls"); //清屏
		printf("---------------ABC---------------\n");
		printf("  a)洋蓟               $2.05/LB\n");
		printf("  b)甜菜               $1.15/LB\n");
		printf("  c)胡萝卜             $1.09/LB\n");
		printf("  q)下单\n");
		printf("---------------ABC---------------\n\n");
		printf("输入你要购买的蔬菜:>");
		scanf_s("%c", &option, 1);
		switch (option)
		{
		case 'a':
			printf("输入购买磅数:>");
			scanf_s("%d", &m);
			m_arti += m;
			pounds += m;
			c_arti += (m * 2.05);
			continue;
		case 'b':
			printf("输入购买磅数:>");
			scanf_s("%d", &m);
			m_beet += m;
			pounds += m;
			c_beet += (m * 1.15);
			continue;
		case 'c':
			printf("输入购买磅数:>");
			scanf_s("%d", &m);
			m_carr += m;
			pounds += m;
			c_carr += (m * 1.09);
			continue;
		case 'q':
			continue;
		default:
			printf("出错,请重新输入正确选项\n");
			continue;
		}
	}
	system("cls");
	vege = c_arti + c_beet + c_carr;
	if (vege >= 100)
		dis = vege * 0.05;
	if (pounds <= 5)
		fre = 6.5;
	else if (pounds > 5 && pounds <= 20)
		fre = 14;
	else
		fre = 14 + fre - 20;
	cost = vege + fre - dis;
	printf("--------------ABC--------------\n");
	printf("  洋蓟     LB %-5d    $ %-5.2f\n", m_arti, c_arti);
	printf("  甜菜     LB %-5d    $ %-5.2f\n", m_beet, c_beet);
	printf("  胡萝卜   LB %-5d    $ %-5.2f\n", m_carr, c_carr);
	printf("-------------------------------\n");
	printf("  总计     LB %-5d    $ %-5.2f\n", pounds, vege);
	printf("-------------------------------\n");
	printf("  折扣     $ %-5.2f\n", dis);
	printf("  运费     $ %-5d\n", fre);
	printf("-------------------------------\n");
	printf("  支付     $ %-5.2f\n", cost);
	printf("--------------ABC--------------\n");

	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值