一、实验目的
1、熟悉Linux常用命令。
2、掌握gcc编译器、gdb调试器的使用方法。
3、会编写多文件的C程序,并使用gcc编译。
4、熟悉makefile的结构和编制,利用make命令编译程序。
二、实验内容
1、编写包含多个文件的.c源码,通过调用自定义函数,实现功能:用户输入一个正整数N(3≤N≤7),计算所有N位水仙花数并按递增顺序输出。注:水仙花数是指对于一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。
2、直接使用gcc命令行编译程序源文件,并查看运行结果。
3、编写Makefile文件,在Makefile中需要编写语句将自定义函数编译生成为动态链接库lib***.so,并进行链接。完成后在终端窗口通过make命令编译、运行程序,查看结果。
注意:Makefile文件编写过程应符合惯例,即,让编译器知道编译一个目标需要依赖哪些文件,即体现出文件间的依赖层次关系。
选做部分:通过~/.vimrc文件对Vim进行个性化配置,包括但不限于:设置行号、语法高亮、符号匹配等。也可考虑安装如vim-plug或vundle等插件管理器后,在~/.vimrc中声明相应插件并进行安装,以实现自动补全等其他功能。
三、实验具体分工
独立完成实验。
四、实验步骤、源程序及结果截图
1.编写代码:
>>>function.h:
1 #include <math.h>
2 #include <stdio.h>
3 #include<math.h>
4 void printDaffodils(int N);
>>>function.c:
1 #include "function.h"
2 #include <math.h>
3 int power(int base, int exponent);
4 void printDaffodils(int N) {
5 int start = power(10, N - 1);
6 int end = power(10, N) - 1;
7 for (int i = start; i <= end; i++) {
8 int num = i;
9 int sum = 0;
10 while (num > 0) {
11 int digit = num % 10;
12 sum += power(digit, N);
13 num /= 10;
14 }
15 if (sum == i) {
16 printf("%d\n", i);
17 }
18 }
19 }
>>>lin_1.c:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "function.h"
4 int power(int base, int exponent);
5 int power(int base, int exponent) {
6 int result = 1;
7 for (int i = 0; i < exponent; i++) {
8 result *= base;
9 }
10 return result;
11 }
12
13 void rintDaffodils(int N) {
14 int start = power(10, N - 1);
15 int end = power(10, N) - 1;
16
17 for (int i = start; i <= end; i++) {
18 int num = i;
19 int sum = 0;
20
21
22 while (num > 0) {
23 int digit = num % 10;
24 sum += power(digit, N);
25 num /= 10;
26 }
27
28
29 if (sum == i) {
30 printf("%d\n", i);
31 }
32 }
33 }
34
35 int main() {
36 int N;
37
38 printf("请输入一个正整数N(3≤N≤7):");
39 scanf("%d", &N);
40
41 if (N < 3 || N > 7) {
42 printf("输入的N不符合要求\n");
43 return 0;
44 }
45
46 printf("%d位水仙花数有:\n", N);
47 printDaffodils(N);
48
49 return 0;
50 }
2.编译;
3.运行结果如下:
4.动态链接库:
5.运行及结果:
6.编写makefile:
7.扩展实验:
设置结束重启Ubuntu:
五、实验问题总结
整体还是比较简单的,但是要注意的是,在编写makefile时一定要注意编写的格式,不然会报错!