《C Primer Plus》第七章 编程习题

目录

7.12.1

7.12.2

7.12.3

7.12.4

7.12.5

7.12.6

7.12.7

7.12.8

7.12.9

7.12.10

7.12.11


7.12.1

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

/*7.12.1. 编写一个程序,读到#字符停止,然后报告读取的空格数,换行符数和所有其
他字符的数量。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	char ch;
	int i = 0;   //空格数
	int n = 0;   //换行符数
	int k = 0;   //其他字符数
	while ((ch = getchar()) != '#')
	{
		if (ch == ' ')
			i++;
		else if (ch == '\n')
			n++;
		else
			k++;
	}
	printf("空格数:%d,换行符数:%d,其他字符数:%d", i, n, k);
	return 0;
}

运行结果:

7.12.2

编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的ASKII码(十进制)。每行打印8个“字符-ASKII码”组合。建议:使用字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。

/*7.12.2. 编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的
ASKII码(十进制)。每行打印8个“字符-ASKII码”组合。建议:使用字符计数和求模运算符
(%)在每8个循环周期时打印一个换行符。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	char ch;
	int n = 0;   //字符数
	while ((ch = getchar()) != '#')
	{
		n++;
		printf("%c:%d  ", ch, ch);
		if (n % 8 == 0)
		{
			printf("\n");
		}
	}
	return 0;
}

运行结果:

7.12.3

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

/*7.12.3. 编写一个程序,读取整数直到用户输入0。输入结束后,程序应报告用户输入的
偶数(不包括0)个数,这些偶数的平均值、输入的奇数个数及其奇数的平均值。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int num;
	int even_n = 0 ;      //偶数个数
	int odd_n = 0;        //奇数个数
	float s_even = 0.0;   //所有偶数的和
	float s_odd = 0.0;    //所有奇数的和

	while (((scanf("%d", &num) == 1)) && num != 0)
	{
		if (num % 2 == 0)
		{
			s_even += num;
			++even_n;
		}
		else
		{
			s_odd += num;
			++odd_n;
		}
	}
	printf("偶数个数 = %d\n奇数个数 = %d\n偶数平均值 = %.1f\n奇数平均值 = %.1f\n",
		even_n, odd_n, s_even / even_n, s_odd / odd_n);
	return 0;
}

运行结果:

7.12.4

使用if else 语句编写一个整数读入,读到#停止。用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进了多少次替换。

/*7.12.4. 使用if else 语句编写一个整数读入,读到#停止。用感叹号替换句号,用两个
感叹号替换原来的感叹号,最后报告进了多少次替换。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	char ch;
	char a = 0;    //转换次数
	while ((ch = getchar()) != '#')
	{
		if (ch == '.')
		{
			ch = '!';
			++a;
		}
		if (ch == '!')
		{
			ch = '!!';
			++a;
		}
	}
	printf("一共转换了:%d 次\n", a);
	return 0;
}

运行结果:

7.12.5

用switch重写练习4。(练习4:使用if else 语句编写一个整数读入,读到#停止。用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进了多少次替换。)

/*7.12.5. 用switch重写练习4。*/
/*7.12.4. 使用if else 语句编写一个整数读入,读到#停止。用感叹号替换句号,用两个
感叹号替换原来的感叹号,最后报告进了多少次替换。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	char ch;
	char a = 0;    //转换次数
	while ((ch = getchar()) != '#')
	{
		switch (ch)
		{
		case '.':
			ch = '!';
			++a;
		case '!':
			ch = '!!';
			++a;
			break;
		default:
			break;
		}
	}
	printf("一共转换了:%d 次\n", a);
	return 0;
}

运行结果:

7.12.6

编写程序读入输入,读到#停止,报告ei出现的次数。注意:该程序要记录前一个字符和当前字符。用"Receive your eieio award"这样的输入来测试。

/*7.12.6. 编写程序读入输入,读到#停止,报告ei出现的次数。注意:该程序要记录前
一个字符和当前字符。用"Receive your eieio award"这样的输入来测试。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#define STOP '#'
int main(void)
{
	char ch;          //当前字符
	char pre_ch = 0;      //前一个字符
	int n = 0;        //计数
	while ((ch = getchar()) != '#')
	{
		//if ((ch == 'i') && (pre_ch == 'e'))    //两种写法都行
		if((pre_ch == 'e') && (ch == 'i'))    
		{
			n++;
		}
		pre_ch = ch;
	}
	printf("ei出现的次数:%d\n", n);
	return 0;
}

运行结果:

7.12.7

编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。
做如下假设:
a.基本工资=10美元/小时
b.加班(超过40小时)= 1.5倍的时间
c.税率:前300美元为15%
       续150美元为20%
       余下的为25%
用#define定义常量符号。不用在意是否符合当前的税法。

/*7.12.7. 编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。
做如下假设:
a.基本工资=10美元/小时
b.加班(超过40小时)= 1.5倍的时间
c.税率:前300美元为15%
       续150美元为20%
       余下的为25%
用#define定义常量符号。不用在意是否符合当前的税法。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define BASE_PAY 10      //基本工资
#define OVERTIME 1.5     //加班时间系数
#define BREAK1   300     //税率的第1个临界点
#define BREAK2   450     //税率的第1个临界点
#define RATE1    0.15    //前300美元的税率
#define RATE2    0.2     //续150美元的税率
#define RATE3    0.25    //大于450美元的税率
int main(void)
{
    double h;           //一周工作的小时数
    double all_pay;     //工资总额
    double over_pay;    //加班费
    double rate;        //税金
    double net_in;      //净收入

    printf("请输入一周工作的小时数:");
    scanf("%lf", &h);
    while (h < 0)    //此循环用来确保输入的小时数大于0
    {
        printf("请输入一周工作的小时数(h>0):");
        scanf("%lf", &h);
    }
    if (h > 40)
    {
        over_pay = ((h - 40) * OVERTIME) * BASE_PAY;
        all_pay = over_pay + 40 * (double)BASE_PAY;
    }
    else
        all_pay = h * BASE_PAY;
   
    if (all_pay <= BREAK1)
        rate = all_pay * RATE1;
        //rate = all_pay * 0.15
    else if ((all_pay > BREAK1) && (all_pay <= BREAK2))
        rate = (BREAK1 * RATE1) + ((all_pay - BREAK1) * RATE2);
       //rate = (300 * 0.15) + ((all_pay - 300) * 0.2)
    else
        rate = (BREAK1 * RATE1) + (((double)BREAK2 - (double)BREAK1) * RATE2) + 
        ((all_pay - BREAK2) * RATE3);
       //rate = (300 * 0.15) + ((450-300)*0.2) + ((all_pay - 450) * 0.25)
    
    net_in = all_pay - rate;
    
    printf("一周工作%.1lf小时,工资总额=%.1lf美元, 税金=%.1lf美元, 净收入=%.1lf美元\n",
        h, all_pay, rate, net_in);
    
    return 0;
}

运行结果:

7.12.8

修改练习7的假设a,让程序可以给出一个供选择的工资等级菜单。使用switch完成工资等级选择。运行程序后,显示的菜单应该类似这样:

    printf("********************************************");
    printf("1) $8.75/hr                 2) $9.33/hr");
    printf("3) $10.00/hr                4) $11.2/hr");
    printf("5) quit");
    printf("********************************************");

如果选择1~4其中的数字,程序应该询问用户工作的小时数。程序要通过循环运行,除非用户输入5。如果输入1~5之外的数字,程序应提醒用户输入正确的选项,然后再重复显示菜单提示用户输入。使用#define创建符号常量表示各工资等级和税率。

/*7.12.8. 修改练习7的假设a,让程序可以给出一个供选择的工资等级菜单。
使用switch完成工资等级选择。运行程序后,显示的菜单应该类似这样:
    printf("********************************************");
    printf("1) $8.75/hr                 2) $9.33/hr");
    printf("3) $10.00/hr                4) $11.2/hr");
    printf("5) quit");
    printf("********************************************");
如果选择1~4其中的数字,程序应该询问用户工作的小时数。程序要通过循环运行,除非用户输入5。
如果输入1~5之外的数字,程序应提醒用户输入正确的选项,然后再重复显示菜单提示用户输入。
使用#define创建符号常量表示各工资等级和税率。*/
/*7.12.7. 编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。
做如下假设:
a.基本工资=10美元/小时
b.加班(超过40小时)= 1.5倍的时间
c.税率:前300美元为15%
       续150美元为20%
       余下的为25%
用#define定义常量符号。不用在意是否符合当前的税法。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#define BASE_PAY 10      //基本工资
#define OVERTIME 1.5     //加班时间系数
#define BREAK1   300     //税率的第1个临界点
#define BREAK2   450     //税率的第1个临界点
#define RATE1    0.15    //前300美元的税率
#define RATE2    0.2     //续150美元的税率
#define RATE3    0.25    //大于450美元的税率
void base_menu();
int main(void)
{
    double h = -1;    //一周工作的时间(初始值设为负数,是为了后面直接进入while循环)
    int lever = 0;          //工资等级
    double base_pay = 0;    //基本工资
    double all_pay;     //工资总额
    double over_pay;    //加班费
    double rate;        //税金
    double net_in;      //净收入

    do
    {
    begin:
        base_menu();
        printf("请选择工资等级(1-4):");
        scanf("%d", &lever);
        while (getchar()!= '\n')   //getchar()用来清空缓冲区
            ;                   //空字符用来占位
        switch (lever)
        {
        case 1: base_pay = 8.75;
            break;
        case 2: base_pay = 9.33;
            break;
        case 3: base_pay = 10.00;
            break;
        case 4: base_pay = 11.2;
            break;
        case 5: printf("结束程序\n");
            goto end;     //输入5,直接程序结束
        default:
            printf("请输入正确的选项!\n");
            goto begin;   //输入1-5以外的,重新打印菜单,选择工资等级
        }
    } while (5 == lever);

    while (h < 0)    //此循环用来确保输入的小时数大于0
    {
        printf("请输入一周工作的小时数(h>0):");
        scanf("%lf", &h);
        while (getchar() != '\n')   //getchar()用来清空缓冲区
            ;             //空字符用来占位
    }
    if (h > 40)
    {
        over_pay = ((h - 40) * OVERTIME) * base_pay;
        all_pay = over_pay + 40 * base_pay;
    }
    else
    {
        all_pay = h * base_pay;
    }
   
    if (all_pay <= BREAK1)
        rate = all_pay * RATE1;
    //rate = all_pay * 0.15
    else if ((all_pay > BREAK1) && (all_pay <= BREAK2))
        rate = (BREAK1 * RATE1) + ((all_pay - BREAK1) * RATE2);
    //rate = (300 * 0.15) + ((all_pay - 300) * 0.2)
    else
        rate = (BREAK1 * RATE1) + (((double)BREAK2 - (double)BREAK1) * RATE2) + 
        ((all_pay - BREAK2) * RATE3);
    //rate = (300 * 0.15) + ((450-300)*0.2) + ((all_pay - 450) * 0.25)

    net_in = all_pay - rate;

    printf("一周工作%.1lf小时,工资总额=%.1lf美元, 税金=%.1lf美元, 净收入=%.1lf美元\n",
        h, all_pay, rate, net_in);
    end:
    return 0;
}
void base_menu()
{
    printf("********************************************\n");
    printf("1) $8.75/hr                 2) $9.33/hr\n");
    printf("3) $10.00/hr                4) $11.2/hr\n");
    printf("5) quit\n");
    printf("********************************************\n");
}

 运行结果:

7.12.9

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

解析:sqrt() 是开平方函数,需要引用头文件#include<math.h>
            m = a * b
            a和b中一定至少有一个数字是 <= 开平方m的
            比如 16开平方等于4,16 = 2*8 = 4*4,所以判断到4就可以不用往后判断了

/*7.12.9. 编写一个程序,只接受正整数输入,然后显示所有小于或等于该数的素数。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int main(void)
{
	int num = 0;
	int i = 0;
	int k = 0;
	int flag = 1;     //假设返回1,是素数,返回0,不是素数
	printf("请输入一个正整数:");
	scanf("%d", &num);
	while (num <= 0)   //0既不是正数也不是负数,所以也不是正整数
	{
		printf("请输入一个正整数:");
		scanf("%d", &num);
	}
	for (i = 2; i <= num; i++)
	{
		for (k = 2; k <= sqrt(i); k++) 
			//sqrt() 是开平方函数,需要引用头文件#include<math.h>
			// m = a * b
			//a和b中一定至少有一个数字是 <= 开平方m的
			//比如 16开平方等于4,16 = 2*8 = 4*4,所以判断到4就可以不用往后判断了
			//此处可写 k<i,但是 k<=sqrt(i) 计算步骤少一些
		{
			if (i % k == 0)
			{
				flag = 0;
				break;
			}
			else
			{
				flag = 1;
			}
		}	
		if (flag == 1)
			printf("%d是素数\n", i);
	}
	return 0;
}

运行结果:

7.12.10

1988年的美国联邦税收计划是近代最简单的税收方案。它分为4个类别,每个类别有两个等级。
下面是该税收计划的摘要(美元数为应征税的收入):
类别                   税金
单身                        17850美元按15%计,超出部分按28%计
户主                         23900美元按15%计,超出部分按28%计
已婚,共有              29750美元按15%计,超出部分按28%计
已婚,离异              14875美元按15%计,超出部分按28%计
例如,一位工资为20000美元的单身纳税人,应缴纳税费为0.15*17850+0.28*(20000-17850)元。编写一个程序,让用户指定缴纳税金的种类和应缴纳收入,然后计算税金。程序应通过循环让用户可以多次输入。

/*7.12.10. 1988年的美国联邦税收计划是近代最简单的税收方案。它分为4个类别,每个类别有两个等级。
下面是该税收计划的摘要(美元数为应征税的收入):
类别                   税金
单身                   17850美元按15%计,超出部分按28%计
户主                   23900美元按15%计,超出部分按28%计
已婚,共有              29750美元按15%计,超出部分按28%计
已婚,离异              14875美元按15%计,超出部分按28%计
例如,一位工资为20000美元的单身纳税人,应缴纳税费为0.15*17850+0.28*(20000-17850)美元。编写
一个程序,让用户指定缴纳税金的种类和应缴纳收入,然后计算税金。程序应通过循环让用户可以多次输入。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define RATE1   0.15      //第1档税率
#define RATE2   0.28      //第2档税率
#define SINGLE   17850    //单身起征点
#define OWNER    23900    //户主起征点
#define COMMON   29750    //已婚共有起征点
#define DEVORCE  14875    //离异起征点
void menu();
int main(void)
{
	int lever;           //交税种类
    double base;         //起征点
    double income = -1;  //收入(初始值设为负数,是为了后面直接进入while循环)
    double taxes;        //缴税
    do
    {
    begin:
        menu();
        printf("请选择缴纳税金的种类:");
        scanf("%d", &lever);
        while (getchar() != '\n')   //getchar()用来清空缓冲区
            ;                   //空字符用来占位
        switch (lever)
        {
        case 1: base = SINGLE;
            break;
        case 2: base = OWNER;
            break;
        case 3: base = COMMON;
            break;
        case 4: base = DEVORCE;
            break;
        case 5: printf("结束程序\n");
            goto end;     //输入5,直接程序结束
        default:
            printf("请输入正确的选项!\n");
            goto begin;   //输入1-5以外的,重新打印菜单,选择税金种类
        }
    } while (5 == lever);
  
    while (income < 0)    //此循环用来确保输入的收入大于0
    {
        printf("请输入您的收入(大于0):");
        scanf("%lf", &income);
        while (getchar() != '\n')   //getchar()用来清空缓冲区
            ;                   //空字符用来占位
    }
    if (income <= base)          //收入小于等于起征点时
        taxes = income * RATE1;  //税金 = 收入 * 0.15;
    else                         //收入大于起征点时
        taxes = base * RATE1 + (income - base) * RATE2;
    //税金 = 起征点 * 0.15 + (收入 - 起征点) * 0.28;
   
    printf("种类%d需要缴纳的税金是:%.1lf", lever, taxes);
    end:
	return 0;
}
void menu()
{
	printf("********************************************\n");
	printf("1) SINGLE 17850                2) OWNER 23900\n");
	printf("3) COMMON 29750                4) DEVORCE 14875\n");
	printf("5) quit\n");
	printf("********************************************\n");
}

运行结果:

7.12.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是退出订购。程序要记录累计的重量。即如果用户输入4磅的甜菜,然后输入5磅的甜菜,程序应报告9磅的甜菜。然后,该程序要计算货物总价、折扣(如果有的话)、运费和包装费。随后,程序应显示所有的购买信息:物品售价、订购的重量(单位:磅)、订购的蔬菜费用、订单的总费用、折扣(如果有的话)、运费和包装费,以及所有的费用总额。

/*7.12.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是退出订购。程序要记录累计的重量。即如果用户输入4磅的甜菜,然后输入5磅
的甜菜,程序应报告9磅的甜菜。然后,该程序要计算货物总价、折扣(如果有的话)、运费和包
装费。随后,程序应显示所有的购买信息:物品售价、订购的重量(单位:磅)、订购的蔬菜费用、
订单的总费用、折扣(如果有的话)、运费和包装费,以及所有的费用总额。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define PRICE1   2.05    //洋蓟的售价
#define PRICE2   1.15    //甜菜的售价
#define PRICE3   1.09    //胡萝卜售价
#define PACK_P1   6.5    //<=5磅订单收的运费和包装费
#define PACK_P2   14     //大于5小于等于20磅订单收的运费和包装费
#define PACK_E   0.5     //14元基础上,大于20磅订单收的运费和包装费
#define DISCOUNT 0.05     //5%的打折优惠
void menu();

int main(void)
{
	char type;           //品种类型
	double weight_a;      //单次订购洋蓟重量
	double weight_b;      //单次订购甜菜重量
	double weight_c;      //单次订购胡萝卜重量
	double sum_a = 0;         //洋蓟总重量
	double sum_b = 0;         //甜菜总重量
	double sum_c = 0;         //胡萝卜总重量
	double sum_total = 0;         //总重量
	double sum_price = 0;         //订购的蔬菜总费用
	double pack = 0;              //包装费和运费
	double total = 0;             //订单总费用
	double discount = 0;          //折扣

	do
	{
		menu();
		printf("请选择需要订购的品种:");
		scanf("%c", &type);
		while (getchar() != '\n')   //getchar()用来清空缓冲区
			;                   //空字符用来占位
		switch (type)
		{
		case 'a': printf("请输入洋蓟的磅数:");
			scanf("%lf", &weight_a);
			while (getchar() != '\n')   //getchar()用来清空缓冲区
				;                   //空字符用来占位
			sum_a += weight_a;
			break;
		case 'b': printf("请输入甜菜的磅数:");
			scanf("%lf", &weight_b);
			while (getchar() != '\n')   //getchar()用来清空缓冲区
				;                   //空字符用来占位
			sum_b += weight_b;
			break;
		case 'c': printf("请输入胡萝卜的磅数:");
			scanf("%lf", &weight_c);
			while (getchar() != '\n')   //getchar()用来清空缓冲区
				;                   //空字符用来占位
			sum_c += weight_c;
			break;
		case 'q': printf("退出订购\n");
			break;
		default: 
			printf("请输入正确的指示!\n");
			break;
		}
	} while (type != 'q');

	sum_total = sum_a + sum_b + sum_c;
	sum_price = sum_a * PRICE1 + sum_b * PRICE2 + sum_c * PRICE3;
	
	if (sum_total <= 5)
		pack = PACK_P1;
	else if (sum_total > 5 && sum_total <= 20)
		pack = PACK_P2;
	else if (sum_total > 20)
		pack = PACK_P2 + (sum_total - 20) * 0.5;
	if (sum_price > 100)
		discount = sum_price * DISCOUNT;
	total = sum_price + pack - discount;

	printf("洋蓟的售价是 %.2lf 美元, 甜菜的售价是 %.2lf 美元, 胡萝卜的售价是 %.2lf 美元\n", 
		PRICE1, PRICE2, PRICE3);
	printf("订购的洋蓟重量是 %.2lf 磅, 订购的甜菜重量是 %.2lf 磅, 订购的胡萝卜重量是 %.2lf 磅\n", 
		sum_a, sum_b, sum_c);
	printf("订购的总重量是 %.2lf 磅,订购的蔬菜费用是 %.2lf 美元\n", 
		sum_total, sum_price);
	printf("运费和包装费是 %.2lf 美元,折扣是 %.2lf 美元\n", 
		pack, sum_price > 100 ? discount : 0);
	printf("费用总额是 %.2lf 美元\n", total);
	return 0;
}
void menu()
{
	printf("*****************************************\n");
	printf("a)洋蓟                             b)甜菜\n");
	printf("c)胡萝卜                           q)退出订购\n");
	printf("*****************************************\n");
}

运行结果:

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值