SCAU 高级程序设计语言 教材习题
【文章有什么不足之处或者错漏的话,可以在评论区提出或者和我私聊哦】
第三章
18041 分期还款(加强版)
Description
从银行贷款金额为
d
d
d,准备每月还款额为
p
p
p,月利率为
r
r
r 。请编写程序输入这三个数值,计算并输出多少个月能够还清贷款,输出时保留
1
1
1 位小数。
如果无法还清,请输出 “God”
计算公式如下:
m
=
log
p
p
−
d
×
r
log
(
1
+
r
)
m = \frac{\log{\frac{p}{p - d \times r}}}{\log{(1+r)}}
m=log(1+r)logp−d×rp
输入格式
三个数,分别为货款金额、每月还款和月利率,以空格分隔,均为非负数,其中 d , p , r > = 0 d,p,r>=0 d,p,r>=0
输出格式
需要还款的月份
输入样例
50 50 0.01
输出样例
1.0
题解
主要是使用 if-else
筛去无法计算或者不符合实际的情况,其余的情况正常计算即可
-
1
+
r
>
0
1 + r \gt 0
1+r>0 时,无法计算,输出
God
-
p
−
d
×
r
=
0
p - d \times r = 0
p−d×r=0 时,该分数无意义,无法计算,输出
God
-
p
p
p 与
p
−
d
×
r
p - d \times r
p−d×r 符号不一致时,
p
p
−
d
×
r
≤
0
\frac{p}{p - d \times r} \le 0
p−d×rp≤0 无法计算,输出
God
(由于题目给出 p 是非负的 ,只需要判断 p p p 是否等于 0 0 0 和 p − d × r p - d \times r p−d×r 是否小于 0 0 0 即可) - 当
d
=
0
d = 0
d=0 时,无需还款,直接输出
0.0
- 其他情况,直接计算即可
代码
#include <stdio.h>
#include <math.h>
int main() {
double d,p,r;
scanf("%lf%lf%lf",&d,&p,&r);
if(d == 0) {
printf("0.0\n");
}
else if(p - d*r <= 0 || p == 0) {
printf("God\n");
}
else{
printf("%.1f", log10(p/(p-d*r))/log10(1+r));
}
return 0;
}
第四章
18042 计算分段函数值
Description
根据如下数学公式,编写程序输入
x
x
x ,计算并输出
y
y
y 的值,保留两位小数
y
=
{
x
,
x
<
1
2
x
−
1
,
1
≤
x
<
10
3
x
−
11
,
x
≥
10
y = \begin{cases} x &, x \lt 1 \\ 2x - 1 &, 1 \le x \lt 10 \\ 3x - 11 &, x \ge 10 \end{cases}
y=⎩
⎨
⎧x2x−13x−11,x<1,1≤x<10,x≥10
输入格式
输入一个实数 x x x
输出格式
输出函数值
输入样例
0
输出样例
0.00
题解
开个 if - else if - else
选择分支结构就好了,分类讨论一下
代码
#include <stdio.h>
int main() {
double x;
scanf("%lf",&x);
double ans;
if(x<1) {
ans = x;
}
else if(x >= 1 && x < 10) {
ans = 2 * x - 1;
}
else {
ans = 3 * x - 11;
}
printf("%.2f",ans);
return 0;
}
18043 找出3个数中最大的数
Description
编写程序,由键盘输入 3 3 3 个整数,输出其中最大的数。
输入格式
三个整数,空格分隔
输出格式
最大的数
输入样例
3 6 4
输出样例
6
题解
用一个变量存储最大的那个数(即答案)
用两个 if-else
,找出最大的数
代码
#include <stdio.h>
int main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
int max = a;
if(b > max) {
max = b;
}
if(c > max) {
max = c;
}
printf("%d",max);
return 0;
}
18044 成绩等级评分
Description
编写程序,由键盘输入一个百分制的整数成绩,要求输出对应的成绩等级。
90
90
90 分以上为
A
A
A ,
80
80
80 到
89
89
89 分为
B
B
B ,
70
70
70 到
79
79
79 分为
C
C
C ,
60
60
60 到
69
69
69 分为
D
D
D ,
60
60
60 分以下为
E
E
E 。成绩不在
0
0
0 到
100
100
100 之间时输出 “error”
输入格式
一个整数成绩
输出格式
输出对应的等级或 error
输入样例
99
输出样例
A
题解
直接来几个 if - else if - else
选择分支结构就好了
搞什么switch
可以,但是没必要(个人看法)(我记得老师上课会讲这种写法的)
代码
#include <stdio.h>
int main() {
int score;
scanf("%d", &score);
if(score>100 || score<0) {
printf("error");
}
else if(score>=90) {
printf("A");
}
else if(score>=80) {
printf("B");
}
else if(score>=70) {
printf("C");
}
else if(score>=60) {
printf("D");
}
else {
printf("E");
}
return 0;
}
18045 前一个和后一个字符
Description
编写程序,输入一个数字字符,输出其前一个和后一个的数字字符,如果输入的是0前一个输出
“first”,9后一个则输出“last”,输入的不是数学字符,输出“error”
输入格式
一个字符
输出格式
输出结果
输入样例
0
输出样例
first 1
题解
依然是直接来几个 if - else
就好了
先判断是不是数字
再判断是不是 0 0 0 或者 9 9 9
代码
#include <stdio.h>
int main() {
int ch = getchar();
if('0'<=ch && ch<='9') {
int num = ch - '0';
if(num == 0) {
printf("first");
} else {
printf("%d",num - 1);
}
printf(" ");
if(num == 9) {
printf("last");
} else {
printf("%d",num + 1);
}
}
else {
printf("error");
}
return 0;
}
18037 20秒后的时间
Description
编写程序,输入三个整数变量
h
o
u
r
hour
hour(小时)、
m
i
n
u
t
e
minute
minute(分钟)、
s
e
c
o
n
d
second
second(秒)代表一个时间,
输出该时间
20
20
20 秒以后的时间。
输入格式
一行三个整数,分别代表小时、分钟、秒,中间使用冒号分隔
输出格式
输出一个时间,数字间用冒号分隔
小时、分钟、秒均占两个数字位,不足位用0补足
输入样例
15:30:41
输出样例
15:31:01
题解
先给秒数加上
20
20
20 ,后面再加几个 if - else
判断是否要进位就可以了
代码
#include <stdio.h>
int main()
{
int h,m,s;
scanf("%d:%d:%d", &h,&m,&s);
s += 20;
if(s >= 60) {
s %= 60;
m++;
}
if(m >= 60) {
m %= 60;
h++;
}
if(h >= 24) {
h %= 24;
}
printf("%02d:%02d:%02d\n", h, m, s);
return 0;
}
第五章
18046 字母分类统计
Description
输入一行以换行符结束的字符,统计并输出其中英文字母、数字、空格和其它字符的个数。
输入格式
一行字符,以换行符结束
输出格式
一行4个数字分别为:英文字母、数字、空格和其它字符的个数,两数据之间以一个空格分隔
输入样例
ABC 456!
输出样例
3 3 1 1
题解
判断字符属于那种类型
使用 if - else
分类进行计数即可
代码
#include <stdio.h>
int main() {
char ch;
int nL=0, nN=0, nS=0, nO=0;
while((ch = getchar()) != '\n')
{
if(ch >= 'a' && ch <= 'z'|| ch >= 'A' && ch <= 'Z') {
nL++;
}
else if (ch >= '0' && ch <= '9') {
nN++;
}
else if (ch == ' ') {
nS++;
}
else {
nO++;
}
}
printf("%d %d %d %d\n", nL, nN, nS, nO);
return 0;
}
18047 水仙花数
Description
输出所有的水仙花数。所谓水仙花数是一个
3
3
3 位的正整数,其各位数字的立方和等于这个数本身。
例如,
153
153
153 是水仙花数,因为
1
3
+
5
3
+
3
3
=
153
1^3+5^3+3^3=153
13+