8.9 KiB
实验目的要求
- 使用
C++语言编写简单的计算机程序,掌握C++程序从编辑、编译到运行的全过程,初步了解C++程序的特点。 - 掌握
C++语言的数据类型(包括对各种数据类型变量的定义、初始化、赋值等)、运算符和表达式的使用。 - 掌握数据的输入输出方法。
- 理解基本的解题技巧,掌握用自顶向下、逐步求精的过程设计算法。
- 熟练掌握
if/else语句和switch语句的使用。 - 熟练掌握
while语句、do/while语句和for语句的使用以及区别。 - 掌握
break和continue程序控制语句的使用。 - 理解并掌握如何模块化的用函数来构建程序。
- 掌握定义函数的方法,了解函数的重载方法,了解内联函数的机制。
- 掌握函数间传递信息的机制。
- 掌握函数的嵌套调用(和递归调用)的方法。
实验设备
- 联想小新 Pro 13 2020 锐龙版笔记本电脑一台
- CPU: AMD Ryzen 7 4800U with Radeon Graphics 1.80 GHz
- RAM: 16 GB
实验内容
(一)、
-
该程序的功能是将输入的大写字符转换为小写、将输入的小写字符转换为大写
-
测试:
输入 输出 100 40 0, 1 2000 3000 1, 0 1000 1000 0, 1 2000 300 1, 1 100 4000 0, 0 分析:
输出的第一个数表示输入的第一个数是否大于 1000
输出的第二个数表示输入的第二个数是否小于第一个数
当输入为
1000 1000时,输出为0, 1,这是因为float类型存在精度损失 -
测试:
输出为输入加一
分析:
由于大于等于
10时输出时所使用的为后缀自减,故输出为原数字加一,这与小于10时的输出相同。 -
使用的为
辗转相减法(更相减损术) -
测试:
输出:
22---10分析:
该程序的功能为对
m和n做整除和取余运算;输出中的k是进行除法运算的整除结果,m是余数 -
当
i为奇数时输出星号和井号 -
测试:
输出:
a=2, b=8分析:
进行了一次循环;若改为
while,则循环将进行0次 -
hfc()函数表示求最大公因数lcd()函数表示求最小公倍数测试:
输入:
1 10输出:
hfc=1 lcd=10 -
fib()函数的功能为求斐波拉契数列的第n项斐波拉契数列的每一项都是前两项之和
-
测试:
(2)A (3)5,6 (1)4,6分析:
(2)中输出的是局部变量k(3)中输出的是全局变量k(1)中输出的是全局变量k -
测试:
subp函数输出: 1 1 0 0 main函数输出: 9 3 6 12 subp函数输出: 2 2 1 1分析:
xy是静态变量,只会创建一次;所以除了在第一次运行subp()函数时,都不再会初始化xy。若把static去除,则运行结果会发生改变。因为此时xy不再是静态变量,每一次调用subp()函数时xy都会重新初始化为0
(二)、
-
第一题(2)、(4)解题分析:
此题较为简单,调用
math.h库即可#include <math.h> #include <stdio.h> double T2(double x) { return sqrt(1 + 1 / (x + 1 / (x + 1))); } double T4(double x, double y) { return exp(x + y) + exp(x - y); } int main() { double x, y; scanf("%lf", &x); printf("%lf\n", T2(x)); scanf("%lf%lf", &x, &y); printf("%lf\n", T3(x, y)); }测试:
输入: 1 1 2 输出: 1.290994 20.453416 -
第二题解题分析:
此题较为简单,考虑读取的是字符,将字符逆向输出即可
#include <stdio.h> int main() { char sep[4] = {'\n', ',', ',', ','}; char theNumber[4]; fread(theNumber, sizeof(char), 4, stdin); for (int i = 3; i >= 0; --i) printf("%c%c ", theNumber[i], sep[i]); }测试:
输入: 1234 输出: 4, 3, 2, 1 -
第三题解题分析:
此题较为简单,调用
math.h库即可#include <math.h> #include <stdio.h> double theZ(double x, double y) { if (x < 0 && y < 0) return exp(x + y); else if (1 <= x + y && x + y < 10) return log(x + y); else return log10(fabs(x + y)); } int main() { double x, y; scanf("%lf%lf", &x, &y); printf("%lf\n", theZ(x, y)); }测试:
输入:1 10 输出:1.041393 -
第五题(1)、(3)解题分析:
此题较为简单,可以使用
for循环,这里使用递归进行求解int T1(int i) { return i == 1 ? i : i + T1(i - 1); } long T3(long i) { return i == 2 ? i * (i - 1) : i * (i - 1) + T3(i - 2); } int main() { printf("%d\n", T1(100)); printf("%ld\n", T3(40)); }测试:
5050 11060分析:
程序如期运行,结果正确
-
第六题解题分析:
比较简单的一道题
#include <stdio.h> #define MAGIC_NUMBER 21 void print_left(int i) { for (int j = 1; j <= i; j += 2) printf(" %d ", j); } void print_right(int i) { for (int j = i - 2; j >= 1; j -= 2) printf(" %d ", j); } void print_space(int i) { for (int j = 1; j <= MAGIC_NUMBER - i - 1; j += 2) { printf(" "); } } int main() { for (int i = 1; i <= MAGIC_NUMBER; i += 2) { print_space(i); print_left(i); print_right(i); printf("\n"); } }测试
1 1 3 1 1 3 5 3 1 1 3 5 7 5 3 1 1 3 5 7 9 7 5 3 1 1 3 5 7 9 11 9 7 5 3 1 1 3 5 7 9 11 13 11 9 7 5 3 1 1 3 5 7 9 11 13 15 13 11 9 7 5 3 1 1 3 5 7 9 11 13 15 17 15 13 11 9 7 5 3 1 1 3 5 7 9 11 13 15 17 19 17 15 13 11 9 7 5 3 1 1 3 5 7 9 11 13 15 17 19 21 19 17 15 13 11 9 7 5 3 1 -
第七题题目解析:
遍历即可
#include <stdio.h> int main() { for (int i = 1; i <= 10; ++i) for (int j = 1; j < i; ++j) printf("<%d, %d>\n", i, j); }测试
<2, 1> <3, 1> <3, 2> ... <10, 7> <10, 8> <10, 9> -
第八题题目解析:
暴力输出即可
#include <stdio.h> int main() { for (int i = 2; i < 10; ++i) for (int j = 1; j < i; ++j) printf("%d\n", j * 10 + i); for (int i = 3; i < 10; ++i) for (int j = 2; j < i; ++j) for (int k = 1; k < j; ++k) printf("%d\n", k * 100 + j * 10 + i); for (int i = 4; i < 10; ++i) for (int j = 3; j < i; ++j) for (int k = 2; k < j; ++k) for (int l = 1; l < k; ++l) printf("%04d\n", l * 1000 + k * 100 + j * 10 + i); }测试:
12 13 23 ... 4789 5789 6789 -
第九题题目解析:
使用递归进行求解较为简单
#include <stdio.h> void find_fact(int n) { int is_fact = 1; for (int i = 2; i < n; ++i) { if (n % i == 0) { printf("%d*", i); find_fact(n / i); is_fact = 0; break; } } if (is_fact) { printf("%d", n); } } int main() { int n; scanf("%d", &n); find_fact(n); }测试:
输入:16 输出:2*2*2*2 输入:15 输出:3*5 输入:200 输出:2*2*2*5*5
(三)、
-
第二题解题分析:
只需反复求出后三位乘以
12的结果即可#include <stdio.h> int main() { int n = 12; for (int i = 0; i < 100; ++i) n = n % 1000 * 12; printf("%d\n", n % 1000); }测试:
512
实验总结
在完成 T10 时,本地编译出现了错误;经排错发现为报告代码出现问题。将代码中 int fun(int) 的声明修改为 void fun(int) 后编译通过。通过此测试了解到了 C++ 语言中声明应与实现一致。
参考资料
- 参考了
C17标准 - C Plus Plus Reference