ZISUOJ 2023-2024学年第一学期《高级语言程序设计》期末试题(20240122)

文章讲述了作者在考完C语言后,分享了五道编程题目的解题思路和参考题解,涉及基础算术、贪心算法、字符串处理、排序以及结构体的使用。
摘要由CSDN通过智能技术生成

说明:

        早上考完C语言,趁着做题环境还在,赶紧复现写一下题解和思路。对于我个人来说,这次考试发挥中规中矩吧,如果考试的时候冷静一点,可能错的次数会少一点,最后一题知道是用贪心做,但是当时没写出来,挺可惜的。

排名:

根据老师说的,期末成绩只根据做出题目的数量来给赋分,那我也算是年级段并列第一吧。

题目列表:

问题 A: Simple Calculator 

思路:

        当时直接看的输入输出写的答案,压根没看题目,猜到了分别是输出a+b,a-b,a*b,直接写即可。

参考题解:

#include <bits/stdc++.h>
using namespace std;
//using ll = long long;
//using PII = pair<int,int>;
//const int N = 1e4+5;
int main(){
	//问题 A: Simple Calculator
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int a,b;cin >> a >> b;
	cout << a+b << '\n';
	cout << a-b << '\n';
	cout << a*b << '\n';
	return 0;
}

问题 B: Segmented Linear Function

思路:

        之前写过的原题,用if判断一下x即可,然后根据不同情况进行输出。

参考题解:

#include <bits/stdc++.h>
using namespace std;
//using ll = long long;
//using PII = pair<int,int>;
//const int N = 1e4+5;
int main(){
	//问题 B: Segmented Linear Function
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int x;cin >> x;
	if(x<1) cout << x;
	else if(x<10) cout << 2*x-1;
	else cout << 3*x-11;
	return 0;
}

问题 C: Scholarship 

思路:

        此题重点在于读懂题目的(1)、(2)、(3)的判断,注意不要漏掉两个数都小于90输出0的情况。写if判断然后输出即可。

参考题解:

#include <bits/stdc++.h>
using namespace std;
//using ll = long long;
//using PII = pair<int,int>;
//const int N = 1e4+5;
int main(){
	//问题 C: Scholarship
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int a,b;cin >> a >> b;
	int minn = min(a,b);
	int maxn = max(a,b);
	if(minn>=95) cout << 500;
	else if(minn>=90&&maxn>=95) cout << 200;
	else if(minn>=90)cout << 100;
	else cout << 0;
	return 0;
}

问题 D: Acceleration of a Spaceship

 思路:

        根据题意模拟一下即可,注意设置初始值为8。

参考题解:

#include <bits/stdc++.h>
using namespace std;
//using ll = long long;
//using PII = pair<int,int>;
//const int N = 1e4+5;
int main(){
	//问题 D: Acceleration of a Spaceship
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;cin >> n;
	int ans = 0;
	int beginnum = 8;
	for(int i = 1;i<=n;i++){
		if(i==1) ans = beginnum*(i+1);
		else ans*=(i+1);
	}
	cout << ans;
	return 0;
}

问题 E: Mean Score and Maximum Score Difference

 思路:

        读题知道题目要求我们输出n个数的平均值和n个数中最大的差值。平均值的计算通过一个double类型的变量来累加所有数,最后输出的时候再除以n即可。而n个数的最大差值通过找到这些数中的最大值和最小值然后作差输出即可,当然,找最大最小值就通过最常用的打擂台的方式找即可。

参考题解:

#include <bits/stdc++.h>
using namespace std;
//using ll = long long;
//using PII = pair<int,int>;
const int N = 1e2+5;
int a[N];
int main(){
	//问题 E: Mean Score and Maximum Score Difference
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;cin >> n;
	for(int i = 1;i<=n;i++) cin >> a[i];
	int maxn = INT_MIN;
	int minn = INT_MAX;
    double ans = 0;
	for(int i = 1;i<=n;i++){
		if(a[i]>maxn) maxn = a[i];
		if(a[i]<minn) minn = a[i];
		ans+=a[i];
	}
	cout << fixed << setprecision(2) << ans/n << '\n';
	cout << maxn-minn << '\n';
	return 0;
}

问题 F: Draw a House

思路:

        很经典的题,考察的二重循环,最重要的是确认每个循环的次数和跳出循环的条件。确认好后按输出的格式输出即可。

参考题解:

#include <bits/stdc++.h>
using namespace std;
//using ll = long long;
//using PII = pair<int,int>;
const int N = 1e2+5;
int a[N];
int main(){
	//问题 F: Draw a House
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;cin >> n;
	for(int i = 1;i<=n-1;i++){
		for(int j = 1;j<=n-i;j++) cout << ' ';
		for(int j = 1;j<=2*i-1;j++) cout << '*';
		cout << '\n';
	}
	for(int i = 1;i<=n;i++){
		for(int j = 1;j<=2*n-1;j++) cout << '*';
		cout << '\n'; 
	}
	return 0;
}

问题 G: String Abbreviation

 

思路:

        读进char s[]数组中,或者使用string接收,然后模拟遍历,如果是连续的,先输出首个字符,遇到中间的字符则不输出,到了不连续的位置,则输出'-'和截止字符,我这里下面的写法需要考虑最后一个字符的状态,所以加了一个if判断。

参考题解:

#include <bits/stdc++.h>
using namespace std;
//using ll = long long;
//using PII = pair<int,int>;
const int N = 1e2+5;
//int a[N];
//string s;
char s[N];
int main(){
	//问题 G: String Abbreviation
//	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin >> s;
	int len = strlen(s);
	int type = 0;
	char beginc;
	int i;
	for(i = 0;i<len-1;i++){
		if(s[i+1]==s[i]+1&&type == 0){
			beginc = s[i];
			type = 1;
		}else if(s[i+1]!=s[i]+1&&type==1){
			printf("%c-%c",beginc,s[i]);
			type = 0;
		}else if(type==0) printf("%c",s[i]);
	}
	if(type == 1) printf("%c-%c",beginc,s[i]);
	else printf("%c",s[len-1]);
	return 0;
}

问题 H: Substring Statistics

思路:

        读代码知道考察的是指针。知道ptr是出现子串的第一个字符的相对下标,ans是子串出现的次数。因为src是char类型的指针,所以第一个选项选A,用于动态分配其内存。其他都是基本题。

参考题解:

#include <bits/stdc++.h>
using namespace std;
//using ll = long long;
//using PII = pair<int,int>;
int main(){
	//问题 H: Substring Statistics
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cout << "A\n";
	cout << "B\n";
	cout << "A\n";
	cout << "A\n";
	cout << "D\n";
	cout << "D\n";
	return 0;
}

 问题 I: Joe's Toy Store

思路:

        之前有写过类似的题。写一个结构体,然后通过两个字符串的字典序排序,排序好然后统计好数字并按照要求输出即可。这个题用map也可以更快地做出来。

参考题解:

#include <bits/stdc++.h>
using namespace std;
//using ll = long long;
//using PII = pair<int,int>;
const int N = 1e2+5;
struct node{
	string s1;
	string s2;
	int num;
}a[N];
bool cmp(node a1,node a2){
	if(a1.s2!=a2.s2) return a1.s2<a2.s2;
	else return a1.s1<a2.s1;
}
int main(){
	//问题 I: Joe's Toy Store
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;cin >> n;
	while(n--){
		int m;cin >> m;
		for(int i = 1;i<=m;i++) cin >> a[i].s1 >> a[i].s2 >> a[i].num;
		sort(a+1,a+1+m,cmp);
		int ans;
		int i = 1,j;
		int type = 0;
		while(i<=m){
			if(type==0){
				cout << a[i].s2 << '\n';
				type = 1;
			}
			ans = a[i].num;
			for(j = i+1;a[j].s1==a[j-1].s1&&a[j].s2==a[j-1].s2;j++) ans+=a[j].num;
			cout << "   |----" << a[i].s1 << '(' << ans << ")\n";
			i = j;
			if(a[i].s2!=a[i-1].s2) type = 0;
		}
		cout << '\n';
	}
	return 0;
}

问题 J: Win a Prize

思路:

        主要思想还是贪心,读入数据后,对结构体数组根据reward从大到小排序,然后遍历0~n-1,根据limit限制使用贪心先把能完成的mini-game先完成掉并对ans累加对应的reward,最后输出ans即可。

参考题解:

#include <bits/stdc++.h>
using namespace std;
//using ll = long long;
//using PII = pair<int,int>;
const int N = 5e2+5;
int n = 0;
struct tinygame{
	int T,R;
}games[N];
bool arrange[N];
bool cmp(tinygame games1,tinygame games2){
	return games1.R>games2.R;
}
int main(){
	//问题 J: Win a Prize
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin >> n;
	for(int i = 0;i<n;i++) arrange[i] = false;
	for(int i = 0;i<n;i++) cin >> games[i].T;
	for(int i = 0;i<n;i++) cin >> games[i].R;
	sort(games,games+n,cmp);
	int ans = 0;
	for(int i = 0;i<n;i++){
		for(int t = games[i].T-1;t>=0;t--){
			if(!arrange[t]){
				arrange[t] = true;
				ans+=games[i].R;
				break;
			}
		}
	}
	cout << ans << '\n';
	return 0;
}
  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
高级程序设计语言(a)课程是山东大学2015-2016学年1学期的一门重要课程,旨在帮助学生掌握高级程序设计语言的基本原理和应用技巧。在这门课程中,我们不仅学习了高级程序设计语言的基本概念和语法规则,还深入了解了面向对象的程序设计思想和方法。通过学习,我们不仅可以掌握高级程序设计语言的编程技巧,还可以培养解决问题和创新思维的能力。 在课程学习过程中,我们通过理论学习和实际操作相结合的方式,深入理解了高级程序设计语言的核心知识。通过课堂讲解和实践练习,我们逐渐掌握了面向对象的程序设计方法,并且学会了如何利用高级程序设计语言进行程序开发和调试。同时,我们对常用的数据结构算法也有了更深入的了解和掌握。 在课程的学习过程中,老师们不仅传授了知识,还引导我们进行实际的编程练习,培养了我们的动手能力和解决问题的能力。通过大量的编程实践,我们逐渐掌握了高级程序设计语言的应用技巧,能够独立完成一些小型的程序开发项目。 总的来说,这门高级程序设计语言(a)课程不仅帮助我们掌握了高级程序设计语言的基本知识和技能,还培养了我们的动手能力和解决问题的能力。通过这门课程的学习,我们在程序设计方面得到了很大的提升,为以后的学习和工作打下了坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Beau_Will

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值