分支结构课后习题

7-1 计算个人所得税

假设个人所得税为:税率×(工资−1600)。请编写程序计算应缴的所得税,其中税率定义为:

  • 当工资不超过1600时,税率为0;
  • 当工资在区间(1600, 2500]时,税率为5%;
  • 当工资在区间(2500, 3500]时,税率为10%;
  • 当工资在区间(3500, 4500]时,税率为15%;
  • 当工资超过4500时,税率为20%。
#include <stdio.h>
int main()
{
	int money;
	scanf("%d", &money);

	if (money <= 1600)
		printf("%.2f", 0.00);
	else if (money <= 2500)
		printf("%.2f", 0.05 * (money - 1600));
	else if (money <= 3500)
		printf("%.2f", 0.1 * (money - 1600));
	else if (money <= 4500)
		printf("%.2f", 0.15 * (money - 1600));
	else
		printf("%.2f", 0.2 * (money - 1600));

	return 0;
}

7-2 装睡

你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们中间有可能在装睡的人,即至少一项指标不在正常范围内的人。

#include <stdio.h>

int main()
{
	int n;
	scanf("%d", &n);

	for (int i = 0; i < n; i++)
	{
		char name[4];
		int hx, mb;
		scanf("%s%d%d", name, &hx, &mb);

		if (hx < 15 || hx > 20 || mb < 50 || mb > 70)
			printf("%s\n", name);
	}
}

7-3 算术入门之加减乘除

对于输入的两个整数,按照要求输出其和差积商。

#include <stdio.h>
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);

	printf("%d + %d = %d\n", a, b, a + b);
	printf("%d - %d = %d\n", a, b, a - b);
	printf("%d * %d = %d\n", a, b, a * b);

	if (a % b == 0)							   //如果a能被b整除
		printf("%d / %d = %d\n", a, b, a / b); //整数形式输出
	else
		printf("%d / %d = %.2f\n", a, b, (double)a / b); //带两位小数

	return 0;
}

7-4 统计字符

本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。

#include <stdio.h>
int main()
{
	int letter = 0, 
		blank = 0, 
		digit = 0, 
		other = 0;
	for (int i = 0; i < 10; i++)
	{
		char c = getchar();
		if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))
			letter++; // 是字母

		else if ('0' <= c && c <= '9')
			digit++; // 是数字

		else if (c == ' ' || c == '\n')
			blank++; // 是空白

		else
			other++; // 是其他字符
	}

	printf("letter = %d, blank = %d, digit = %d, other = %d",
		   letter, blank, digit, other);
}

7-5 N个数求和

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

#include <stdio.h>

long ans = 0, afz = 0, afm = 1;

// 输出
void output()
{
	if (ans || !afz) // 整数项不为0 或 分子为0时 均要输出整数项
		printf("%d", ans);
	if (ans && afz) // 整数项和分子均不为0时 要用空格分割
		printf(" ");
	if (afz) // 分子不为0时输出输出分子和分母
		printf("%d/%d", afz, afm);
}

// 求最大公约数
long gcd(long a, long b)
{
	long t;
	if (a < b)
	{
		//交换两个数,使大数放在a上
		t = a;
		a = b;
		b = t;
	}
	while (b)
	{
		//利用辗除法,直到b为0为止
		t = a % b;
		a = b;
		b = t;
	}
	return a;
}

// 求最小公倍数
long lcm(long a, long b)
{
	return a * b / gcd(a, b); //最小公倍数等于两数之积除以其最大公约数
}

// 约分
void simp(long *a, long *b)
{
	long t = gcd(*a, *b);
	*a /= t;
	*b /= t;
}

// 化简
void simplify()
{
	// 提整数
	int t = afz / afm;
	afz -= t * afm;
	ans += t;
	// 约分
	simp(&afz, &afm);
}

// 将a/b加到ans afz/afm上
void add(long a, long b)
{
	simp(&a, &b);

	long l = lcm(b, afm);
	a *= l / b;
	afz *= l / afm;
	afm = l;
	afz += a;

	// 加完之后化简
	simplify();
}

int main()
{
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		long a, b;
		scanf("%ld/%ld", &a, &b);
		add(a, b);
	}
	output();
	printf("\n");
}

7-6 求一元二次方程的根

本题目要求一元二次方程的根,结果保留2位小数。

这题我是用Go语言写的,C语言版答案等大佬做。

package main

import (
	"fmt"
	"math"
	"math/cmplx"
)

func main() {
	var a, b, c float64
	fmt.Scan(&a, &b, &c)

	delta := b*b - 4*a*c

	switch {
	case a == 0 && b == 0 && c == 0:
		fmt.Println("Zero Equation")

	case a == 0 && b == 0:
		fmt.Println("Not An Equation")

	case a == 0:
		x := -c / b
		fmt.Printf("%.2f\n", x)

	case delta > 0:
		x1 := (-b + math.Sqrt(delta)) / (2 * a)
		x2 := (-b - math.Sqrt(delta)) / (2 * a)
		fmt.Printf("%.2f\n%.2f\n", x1, x2)

	case delta < 0:
		x1 := (complex(-b, 0) + cmplx.Sqrt(complex(delta, 0))) / complex(2*a, 0)
		x2 := (complex(-b, 0) - cmplx.Sqrt(complex(delta, 0))) / complex(2*a, 0)
		fmt.Printf("%.2f%+.2fi\n%.2f%+.2fi\n", absZero(real(x1)), imag(x1), absZero(real(x2)), imag(x2))

	case delta == 0:
		x := -b / (2 * a)
		fmt.Printf("%.2f\n", x)
	}
}

func absZero(v float64) float64 {
	if v == 0 {
		return 0
	}
	return v
}

JunDao

1307 Words

2019-10-16 13:29 +0800