SCAU 高级程序设计语言(C语言) 教材习题

时间:2024-11-10 20:14:16

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)logpd×rp

输入格式

三个数,分别为货款金额、每月还款和月利率,以空格分隔,均为非负数,其中 d , p , r > = 0 d,p,r>=0 dpr>=0

输出格式

需要还款的月份

输入样例
50 50 0.01
输出样例
1.0
题解

主要是使用 if-else筛去无法计算或者不符合实际的情况,其余的情况正常计算即可

  1. 1 + r > 0 1 + r \gt 0 1+r>0 时,无法计算,输出 God
  2. p − d × r = 0 p - d \times r = 0 pd×r=0 时,该分数无意义,无法计算,输出 God
  3. p p p p − d × r p - d \times r pd×r 符号不一致时, p p − d × r ≤ 0 \frac{p}{p - d \times r} \le 0 pd×rp0 无法计算,输出 God (由于题目给出 p 是非负的 ,只需要判断 p p p 是否等于 0 0 0 p − d × r p - d \times r pd×r 是否小于 0 0 0 即可)
  4. d = 0 d = 0 d=0 时,无需还款,直接输出 0.0
  5. 其他情况,直接计算即可
代码
#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= x2x13x11,x<1,1x<10,x10

输入格式

输入一个实数 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+