基本情况
对应课程:程序设计与算法基础I
考试时间:3小时
题型:函数题+编程题
考试年纪:2022级
函数题只需要完成期中一些(个)函数即可
编程题需要自己手动写main函数
说明:题目从icoding看的,不确定是不是真的是2022级的题,可以供学弟学妹练习
题目
-
三角形面积
题目编号:188
一. 已知条件
-
秦九韶公式 给定三个边长a、b、c。如果这三条边能构成一个三角形,那么该三角形的面积可以由秦九韶公式求出:
s = (a + b + c) / 2.0
area = sqrt(s * (s - a) * (s - b) * (s - c))
三角形任意两边之和大于第三边。
-
求平方根函数sqrt 该函数的原型如下:
double sqrt(double x);
其功能是:求数x的平方根。你可以在程序中直接调用它。
二. 任务
请补全函数area。该函数的原型如下:
double area(double a, double b, double c);
此函数的功能是:判断给定的边长a、b、c是否能构成三角形。
-
如果能,计算并返回三角形的面积。
-
如果不能,返回任意负值。
三. 测试用例
-
测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:
-
从键盘输入三条边长。各输入项间用空格隔开。
-
调用你补全的函数area,得到结果。
-
如果结果是正值,则按%.2lf格式输出面积;否则输出invalid。
-
测试用例举例
-
用例1 输入 3 4 5 输出 6.00
-
用例2 输入 1 2 3 输出 invalid
四. 要求
-
请在框架文件中完成任务。
-
请将你的代码写在//TODO和//END OF TODO这对标记之间。
-
请勿修改框架中的任何已有内容。
#include <math.h>
#include <stdio.h>
/*
* 求三角形面积函数area
* 参数说明:
* - a、b、c都是三角形的边长。
* 返回值说明:
* - 如果a、b、c能构成三角形,则返回面积。
* - 否则,返回任意负值。
*/
double area(double a, double b, double c) {
//TODO
//END OF TODO
}
int main(){
float a, b, c;
scanf("%f %f %f", &a, &b, &c);
double res = area(a, b, c);
if(res < 0)
printf("invalid");
else
printf("%.2lf", res);
}
-
找出闭区间内所有完全数
题目编号:189
一. 已知条件
-
真因子 有正整数f和m,且f < m。如果m能被f整除,那么f是m的真因子。显然,1是任意大于1的正整数的真因子;m不是它本身的真因子。
-
完全数 如果一个正整数m,其所有真因子之和等于m,那么它就是一个完全数。例如完全数6和28:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
二. 任务
请补全函数is_perfect。该函数的原型如下:
bool is_perfect(unsigned m);
此函数的功能是:
-
判断m是否是一个完全数。
-
如果是,则返回真true;否则返回假false。
注:你可以将bool类型看作是int类型,true视为1,false视为0。
提示:如果判断i是m的真因子?
三. 测试用例
-
测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:
-
从键盘输入两个正整数a和b并保证3 < a < b <= 10000。
-
调用你补全的函数is_perfect,找出区间内的所有完全数,并按如下格式输出结果: (完全数1)(完全数2)...(完全数n) 如果区间内没有完全数,则输出为: ()
-
测试用例举例
-
示例1 输入 1 30 输出 (6)(28)
-
示例2 输入 7 27 输出 ()
四. 要求
-
请在框架文件中完成任务。
-
请将你的代码写在//TODO和//END OF TODO这对标记之间。
-
请勿修改框架中的任何已有内容。
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
/*
* 判断m是否为完全数
* 参数说明:
* - m:unsigned,待判断的正整数
* 返回值说明:
* - bool,如果m是完全数,返回true;否则返回false。
*/
bool is_perfect(unsigned m) {
//TODO
//END OF TODO
}
static void print_perfect(unsigned a, unsigned b) {
int c = 0;
for (unsigned i = a; i <= b; ++i)
if (is_perfect(i)) {
++c;
printf("(%d)", i);
}
if (!c) printf("()");
putchar('\n');
}
int main() {
unsigned a, b;
scanf("%u%u", &a, &b);
print_perfect(a, b);
return 0;
}
-
利用斐波那契数列求黄金分割比例
题目编号:190
一. 已知条件
-
斐波那契数列 斐波那契数列的定义为:第1、2项都是1;第n项是前两项之和。递推公式如下: Fn = 1, 当n=1,2时 Fn = Fn-1 + Fn-2, 当n>2时
-
黄金分割比例 黄金分割比例phi约等于0.618,可以用斐波那契数列中的相邻两项求得: phi = Fn-1 / Fn n越大,得到得结果就越精确。
二. 任务
请补全函数phi的编码。该函数的原型如下:
double phi(int n);
此函数的功能是:
-
根据递推公式计算出斐波那契数列的第n-1项和第n项
-
计算并返回二者的商。
注意:不能也不需要用递归方法
三. 测试用例
-
测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:
-
从键盘输入正整数n(3 <= n <= 20)。
-
调用你补全的函数phi,计算并用格式"%.5lf"输出结果。
-
测试用例举例
-
用例1 输入 3 输出 0.50000
-
用例2 输入 8 输出 0.61905
-
用例3 输入 20 输出 0.61803
四. 要求
-
请在框架文件中完成任务。
-
请将你的代码写在//TODO和//END OF TODO这对标记之间。
-
请勿修改框架中的任何已有内容。
#include <stdio.h>
/*
* 利用斐波那契数列求黄金分割比例
*
* 参数说明:
* - n:int, 斐波那契数列的项数
* 返回值说明:
* - double,黄金分割比例
*
* 提示:斐波那契数列每项的值都是整数
* 注意:不能也不需要用递归方法
*/
double phi(int n) {
//TODO
//END OF TODO
}
int main() {
int n;
scanf("%d", &n);
printf("%.5lf\n", phi(n));
return 0;
}
-
还原压缩的三角方阵
题目编号:191
一. 已知条件
-
三角方阵压缩 有这样的一种方阵(行列数相同的矩阵),左上三角地带所有值都是0,右下三角地带全是无规律的非0值。 例如,以下是这样的一个4阶方阵:
0 0 0 7
0 0 2 4
0 9 6 3
8 5 1 10
因为存在大量的0元素,所以常把它压缩存储到一个一维序列中:
7 2 4 9 6 3 8 5 1 10
假设方阵是n阶的,其非0元素个数为m,则有:m=n(n+1)/2;那么反推过来,n就接近于2m的平方根。提示:是向上取整还是向下取整?
-
数据结构 在C语言实现上,方阵可以用一个二维数组表示,压缩成的一维序列可以用一个一维数组表示。
二. 任务
请补全函数restore_matrix的编码。该函数的原型如下:
int restore_matrix(int a[], int b[][MAXN]); //#define MAXN 512
此函数的功能是:
-
将一维数组a中的压缩数据还原到方阵b中,返回方阵的阶数。
三. 测试用例
-
测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:
-
从键盘依次输入压缩一维数组的值,最后一个数据是0值,表示输入结束。输入数值间用空格隔开。
-
调用你补全的函数restore_matrix,得到结果,并按行依次输出还原的二维方阵的所有元素,元素间用空格隔开。
-
测试用例举例
-
用例 输入 7 2 4 9 6 3 8 5 1 10 0 输出 0 0 0 7 0 0 2 4 0 9 6 3 8 5 1 10
四. 要求
-
请在框架文件中完成任务。
-
请将你的代码写在//TODO和//END OF TODO这对标记之间。
-
请勿修改框架中的任何已有内容。
/*
1. 本题需要的数据较多。因此,为了避免你在本地调试时反复输入,已将测试用例写在了一个数据文件q4.in中,其内容如下:
7 2 4 9 6 3 8 5 1 10 0
上述数据产生的输出是:
0 0 0 7 0 0 2 4 0 9 6 3 8 5 1 10
2. 如果这个文件不存在,那么你就要从键盘手动输入。
3. 如果你的程序编译后是a.out,那在命令行里,你可以这样运行程序 a.out < q4.in ,避免重复从键盘输入
*/
#include <stdio.h>
#include <math.h>
#define MAXN 512
int a[MAXN];
int b[MAXN][MAXN];
/*
* 将压缩到一维数组的二维方阵还原
* 首先要根据一维数组的非0元素个数m,计算二维方阵的阶数n。
* 提示:n接近于sqrt(2m)
*
* 参数说明:
* - a:int[],存储压缩数据的一维数组。其中的第一个0值只表示结尾,不是压缩数据。
* - b:int[][MAXN],待还原的方阵。
* 返回值说明:
* - int。方阵的阶数。
*/
int restore_matrix(int a[], int b[][MAXN]) {
//TODO
//END OF TODO
}
int main() {
int i, j;
i = 0;
while (1) {
scanf("%d", &a[i]);
if (a[i] == 0) break;
++i;
}
int n = restore_matrix(a, b);
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
printf("%d ", b[i][j]);
putchar('\n');
return 0;
}
-
去除字符串首尾的所有空格
题目编号:192
一. 已知条件
-
首尾空格去除 一个字符串的首尾可能存在多个无用的空格。例如:
" this is a test. "
现在需要将这个字符串首尾所有的空格去除,但字符串中间的空格要原样保留。结果是这样的:
"this is a test."
这个结果将保存到另一个字符串中。
-
思路 对于原始字符串s和结果字符串t:
-
指针p从s开头向后,找到第一个非空格字符;
-
指针q从s尾部向前,找到第一个非空格字符;
-
将指针p、q之间的字符复制到t中;
-
字符串t封尾。
提示:如何找到字符串的尾部?
二. 任务
请补全函数trim的编码。该函数的原型如下:
void trim(char *s, char *t);
此函数的功能是:
-
去除字符串s首尾所有空格,但s中间的空格原样保留。
-
结果保存到字符串t中。
三. 测试用例
-
测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:
-
从键盘输入首尾、中间可能带有空格的字符串,去掉行尾的'\n',用'\0'封尾。测试程序保证没有全是空格的输入。
-
调用你补全的函数trim,得到结果,并按如下格式输出: (去掉首尾空格的字符串)
加上()的作用是为了让结果一目了然。
-
测试用例举例
-
用例 输入 this is a test. 输出 this is a test. 注:输入输出背景加深是为了能看清两端空格的存在。
四. 要求
-
请在框架文件中完成任务。
-
请将你的代码写在//TODO和//END OF TODO这对标记之间。
-
请勿修改框架中的任何已有内容。
#include <stdio.h>
#include <string.h>
/*
对于原始字符串s和结果字符串t:
- 指针p从s开头向后,找到第一个非空格字符;
- 指针q从s尾部向前,找到第一个非空格字符;
- 将指针p、q之间的字符复制到t中;
- 字符串t封尾。
*/
/*
* 去除字符串两端空格的函数trim
* 将字符串开头和末尾的所有空格字符去除
*
* 参数说明:
* - s:char*,原始字符串
* - t:char*,去掉所有首尾空格后的字符串
* 返回值说明:
* - 无
*
*/
void trim(char *s, char *t) {
//TODO
//END OF TODO
}
#define MAXN 512
extern void trim(char *s, char *t);
int main() {
char s[MAXN + 1], t[MAXN + 1];
fgets(s, MAXN, stdin);
char *p = strchr(s, '\n');
if (p) *p = '\0';
trim(s, t);
printf("(%s)\n", t);
return 0;
}
-
键值对数组排序
一. 已知条件
-
键值对的数据结构 键值对(key-value pair)可以用C语言的结构来描述:
typedef struct {
char key[30]; //用字符串表示的键
int value; //基于简化的目的,数值的类型是int
} pair;
在此基础上,用键值对数组来存储更多的数据。
pair kv[128]; //kv是键值对类型的数组。元素的键无重复。
-
字符串比较函数 两个字符串进行值比较的标准库函数原型如下:
int strcmp(const char *s, const char *t);
这个函数的功能是:比较两个字符串的字典序大小。如果s>t,函数返回正值;如果s<t,返回负值;如果相等,返回0。
二. 任务
请补全排序函数sort_kv的编码。该函数的原型如下:
void sort_kv(pair kv[], int n);
此函数的功能是:
-
利用冒泡排序法,按照键值(注:是个字符串)的大小对长度为n的数组kv进行升序排序。
三. 测试用例
-
测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:
-
先读入键值对数组长度,然后依次读入键值对。
-
调用你补全的函数sort_kv,然后如下格式输出排序结果: (键1=>值1)(键2=>值2)...(键n=>值n)
-
测试用例举例
-
用例 输入
5
pear 30
apple 100
pineapple 20
orange 80
durian 10
输出
(apple=>100)(durian=>10)(orange=>80)(pear=>30)(pineapple=>20)
四. 要求
-
请在框架文件中完成任务。
-
请将你的代码写在//TODO和//END OF TODO这对标记之间。
-
请勿修改框架中的任何已有内容。
/*
1. 本题需要的数据较多。因此,为了避免你在本地调试时反复输入,已将测试用例写在了一个数据文件q6.in中,其内容如下:
5
pear 30
apple 100
pineapple 20
orange 80
durian 10
上述数据产生的输出是:
(apple=>100)(durian=>10)(orange=>80)(pear=>30)(pineapple=>20)
2. 如果这个文件不存在,那么你就要从键盘手动输入。
3. 如果你的程序编译后是a.out,那在命令行里,你可以这样运行程序 a.out < q6.in ,避免重复从键盘输入
*/
#include <stdio.h>
#include <string.h>
typedef struct {
char key[30]; //用字符串表示的键
int value; //基于简化的目的,数值的类型是int
} pair;
/*
* 用冒泡排序法对键值对数组按键进行排序(升序)
*
* 参数说明:
* - kv:int[],键值对数组
* - n:int,数组长度
* 返回值说明:
* - 无
*/
void sort_kv(pair kv[], int n) {
//TODO
//END OF TODO
}
pair kv[128]; //kv是键值对类型的数组
static void print_kv(pair kv[], int n) {
for (int i = 0; i < n; ++i)
printf("(%s=>%d)", kv[i].key, kv[i].value);
putchar('\n');
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i)
scanf("%s%d", kv[i].key, &kv[i].value);
sort_kv(kv, n);
print_kv(kv, n);
return 0;
}
声明
本文章仅供学习使用。严禁作其他用途。
更多真题可参考https://blog.csdn.net/jjq15008419406/category_11960847.html