分支结构课后习题
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
}