数据结构上机实践第二周项目2- 程序的多文件组织

来源:互联网 发布:淘宝客一淘活动广场 编辑:程序博客网 时间:2024/06/06 23:57

【项目2 - 程序的多文件组织】

学习数据结构,目标就是要编制出有相当规模的程序的。将所有的代码放在一个文件中的做法,不能适用现阶段的需求了。 

  通过这个项目,确认有能力用多文件组织程序。方便以后各章,我们就某一数据结构定义算法库,并能引用算法库进行实践。 
  最简单的多文件组织,一个项目中有3个文件: 
  (1) .h 头文件:定义数据类型、声明自定义函数、定义宏等 
  (2).cpp 源文件1:用于实现头文件中声明的自定义函数 

  (3).cpp 源文件2:定义main()函数,用于调用相关函数,实现问题求解目标。

初学阶段,我们学习C/C++语言会将全部代码放在一个源文件中,进行编译和运行,但是简单的程序代码可以这样,现在的项目不会拘泥于小量代码中,需要大量的函数和变量等,这样一个源文件包含全部代码会给我们带来很多麻烦,挑错修改的时候也会异常头痛,整个程序看起来没有条理性,繁琐、混乱。

当我们会使用程序的多文件组织时,这些将会变得更加有条理性。

以下代码是在一个源文件中保存的:

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #define MaxStud 50      //学生人数最多为50  
  3. #define MaxCour 300     //学生成绩记录数最多为50*6  
  4. struct stud1  
  5. {  
  6.     int no;         //学号  
  7.     char name[10];  //姓名  
  8.     int bno;        //班号  
  9. };  
  10. struct stud2  
  11. {  
  12.     int no;         //学号  
  13.     int cno;        //课程编号  
  14.     int deg;        //分数  
  15. };  
  16.   
  17. double studavg(struct stud2 s2[],int m,int i)   //求学号为i的学生的平均分  
  18. {  
  19.     int j,n=0;              //n为学号为i的学生选学课程数  
  20.     double sum=0;           //学号为i的学生总分  
  21.     for (j=0; j<m; j++)  
  22.         if (s2[j].no==i)    //学号为i时统计  
  23.         {  
  24.             n++;  
  25.             sum+=s2[j].deg;  
  26.         }  
  27.     return(sum/n);  
  28. }  
  29. double couravg(struct stud2 s2[],int m,int i)   //求编号为i的课程的平均分  
  30. {  
  31.     int j,n=0;              //n为编号为i的课程选修人数  
  32.     double sum=0;           //编号为i的课程总分  
  33.     for (j=0; j<m; j++)  
  34.     {  
  35.         if (s2[j].cno==i)   //课程编号为i时统计  
  36.         {  
  37.             n++;  
  38.             sum+=s2[j].deg;  
  39.         }  
  40.     }  
  41.     return(sum/n);  
  42. }  
  43. void allavg(struct stud1 s1[],int n,struct stud2 s2[],int m)    //求学生平均分和课程平均分  
  44. {  
  45.     int i,j;  
  46.     printf("学生平均分:\n");  
  47.     printf("  学号     姓名 平均分\n");  
  48.     i=0;  
  49.     while (i<n)  
  50.     {  
  51.         j=s1[i].no;  
  52.         printf("%4d %10s %g\n",s1[i].no,s1[i].name,studavg(s2,m,j));  
  53.         i++;  
  54.     }  
  55.     printf("课程平均分:\n");  
  56.     for (i=1; i<=6; i++)  
  57.         printf(" 课程%d:%g\n",i,couravg(s2,m,i));  
  58. }  
  59.   
  60. int main()  
  61. {  
  62.     int n=7;        //学生记录人数  
  63.     int m=21;       //学生成绩记录数  
  64.     struct stud1 s1[MaxStud]=  
  65.     {  
  66.         {1,"张斌",9901},  
  67.         {8,"刘丽",9902},  
  68.         {34,"李英",9901},  
  69.         {20,"陈华",9902},  
  70.         {12,"王奇",9901},  
  71.         {26,"董强",9902},  
  72.         {5,"王萍",9901}  
  73.     };  
  74.     struct stud2 s2[MaxCour]=   //规定课程的编号从1到6,同一学生成绩记录连续存放  
  75.     {  
  76.         {1,1,67},  
  77.         {1,2,98},  
  78.         {1,4,65},  
  79.         {8,1,98},  
  80.         {8,3,90},  
  81.         {8,6,67},  
  82.         {34,2,56},  
  83.         {34,4,65},  
  84.         {34,6,77},  
  85.         {20,1,68},  
  86.         {20,2,92},  
  87.         {20,3,64},  
  88.         {12,4,76},  
  89.         {12,5,75},  
  90.         {12,6,78},  
  91.         {26,1,67},  
  92.         {26,5,78},  
  93.         {26,6,62},  
  94.         {5,1,94},  
  95.         {5,2,92},  
  96.         {5,6,89}  
  97.     };  
  98.     allavg(s1,n,s2,m);  
  99.     return 0;  
  100. }  
这样的程序代码看上去就感觉很繁琐,给人一种杂乱无章的感觉。

接下来我们就把这段程序代码改成多文件关联的项目,看起来会简洁、明了。

step1

首先,我们要先创建一个工程:



创建一个空工程,就像是为需要的各类文件盖好了房子,之后让他们依次住进去就好了

step2  分析代码

代码中有各类计算函数和两个包含学生信息的结构体,我们可以将各类函数各自放入单个源文件中,主函数声明引用他们,完成源文件之间的关联,这样,编译报错时我们可以有目的性的去找出问题的函数源文件,含有学生信息的结构体可以定义到一个头文件中,因为这个结构体几乎在每个函数中都会涉及,只需要在每个源文件中把这个头文件包含进去即可,分析完毕,下面开始实施。

step 3  创建头文件与源文件

创建所需要的头文件



创建完成后写入相应代码  (小编这里是stu.h)

[cpp] view plain copy
  1. <span style="font-size:18px;">#include <stdio.h>  
  2. struct stud1  
  3. {  
  4.     int no;         //学号  
  5.     char name[10];  //姓名  
  6.     int bno;        //班号  
  7. };  
  8. struct stud2  
  9. {  
  10.     int no;         //学号  
  11.     int cno;        //课程编号  
  12.     int deg;        //分数  
  13. };  
  14. </span>  
再创建所需要的源文件



(mian.cpp)

[cpp] view plain copy
  1. <span style="font-size:18px;">#include<iostream>  
  2. #include<cstdio>  
  3. #include"stu.h"  
  4. using namespace std;  
  5. #define MaxStud 50      //学生人数最多为50  
  6. #define MaxCour 300     //学生成绩记录数最多为50*6  
  7. extern void allavg(struct stud1 s1[],int n,struct stud2 s2[],int m);  
  8. extern double studavg(struct stud2 s2[],int m,int i);  
  9. extern double couravg(struct stud2 s2[],int m,int i);  
  10. int main()  
  11. {  
  12.     int n=7;        //学生记录人数  
  13.     int m=21;       //学生成绩记录数  
  14.     struct stud1 s1[MaxStud]=  
  15.     {  
  16.         {1,"张斌",9901},  
  17.         {8,"刘丽",9902},  
  18.         {34,"李英",9901},  
  19.         {20,"陈华",9902},  
  20.         {12,"王奇",9901},  
  21.         {26,"董强",9902},  
  22.         {5,"王萍",9901}  
  23.     };  
  24.     struct stud2 s2[MaxCour]=   //规定课程的编号从1到6,同一学生成绩记录连续存放  
  25.     {  
  26.         {1,1,67},  
  27.         {1,2,98},  
  28.         {1,4,65},  
  29.         {8,1,98},  
  30.         {8,3,90},  
  31.         {8,6,67},  
  32.         {34,2,56},  
  33.         {34,4,65},  
  34.         {34,6,77},  
  35.         {20,1,68},  
  36.         {20,2,92},  
  37.         {20,3,64},  
  38.         {12,4,76},  
  39.         {12,5,75},  
  40.         {12,6,78},  
  41.         {26,1,67},  
  42.         {26,5,78},  
  43.         {26,6,62},  
  44.         {5,1,94},  
  45.         {5,2,92},  
  46.         {5,6,89}  
  47.     };  
  48.     allavg(s1,n,s2,m);  
  49.     return 0;  
  50. }</span>  


(couragv.cpp)
[cpp] view plain copy
  1. <span style="font-size:18px;">#include<iostream>  
  2. #include<cstdio>  
  3. #include"stu.h"  
  4. using namespace std;  
  5. double couravg(struct stud2 s2[],int m,int i)   //求编号为i的课程的平均分  
  6. {  
  7.     int j,n=0;              //n为编号为i的课程选修人数  
  8.     double sum=0;           //编号为i的课程总分  
  9.     for (j=0; j<m; j++)  
  10.     {  
  11.         if (s2[j].cno==i)   //课程编号为i时统计  
  12.         {  
  13.             n++;  
  14.             sum+=s2[j].deg;  
  15.         }  
  16.     }  
  17.     return(sum/n);  
  18. }</span>  

(stuavg.cpp)

[cpp] view plain copy
  1. <span style="font-size:18px;">//*Copyright  (c)2017,烟台大学计算机与控制工程学院*     
  2. //*All rights reservrd.*     
  3. //*文件名称 :stuavg.cpp*     
  4. //*作者:田长航*  
  5. //*完成时间:2017年9月7日*      
  6. //*版本号:v1.0*  
  7. //*问题描述:求学号为i的学生平均分*     
  8. //*输入描述:无*     
  9. //*程序输出:无*     
  10. </span>  
[cpp] view plain copy
  1. <span style="font-size:18px;">#include<iostream>  
  2. #include<cstdio>  
  3. #include"stu.h"  
  4. using namespace std;  
  5. double studavg(struct stud2 s2[],int m,int i)   //求学号为i的学生的平均分  
  6. {  
  7.     int j,n=0;              //n为学号为i的学生选学课程数  
  8.     double sum=0;           //学号为i的学生总分  
  9.     for (j=0; j<m; j++)  
  10.         if (s2[j].no==i)    //学号为i时统计  
  11.         {  
  12.             n++;  
  13.             sum+=s2[j].deg;  
  14.         }  
  15.     return(sum/n);  
  16. }</span>  


(allavg.cpp)

[cpp] view plain copy
  1. <span style="font-size:18px;">#include<iostream>  
  2. #include<cstdio>  
  3. #include"stu.h"  
  4. using namespace std;  
  5. extern double studavg(struct stud2 s2[],int m,int i) ;  
  6. extern double couravg(struct stud2 s2[],int m,int i);  
  7. void allavg(struct stud1 s1[],int n,struct stud2 s2[],int m)    //求学生平均分和课程平均分  
  8. {  
  9.     int i,j;  
  10.     printf("学生平均分:\n");  
  11.     printf("  学号     姓名 平均分\n");  
  12.     i=0;  
  13.     while (i<n)  
  14.     {  
  15.         j=s1[i].no;  
  16.         printf("%4d %10s %g\n",s1[i].no,s1[i].name,studavg(s2,m,j));  
  17.         i++;  
  18.     }  
  19.     printf("课程平均分:\n");  
  20.     for (i=1; i<=6; i++)  
  21.         printf(" 课程%d:%g\n",i,couravg(s2,m,i));  
  22. }  
  23. </span>  
这样多文件组织就创建完成了,文件视角结构如下:


step 4  编译,运行



这样,一个多文件组织就创建好了。
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 恩吉拉早教怎么样 恩吉拉国际早教中心 哥屋恩 哥屋恩什么意思 恩嘉琪护肤品怎么样 恩坦华 妻主给夫奴上规矩 恩尼诺 恩尼诺奶瓶 销售心理学 博恩崔西 恩平市第一中学 孤恩负德 300780德恩精工 伊恩萨默海尔德老婆 恩必普软胶囊 恩必普胶囊价格 恩必普药业有限公司 丁苯酞软胶囊 恩必普 恩恩噜tzy 温州肯恩豪华宿舍 诚恩01 法恩莎瓷砖是几线品牌 中国恩菲是不是很难进 恩恩熊 姜恩惠三级 姜恩惠法利赛人第几分 慈恩天下 唐长安城慈恩 恩拼音 恩的拼音 恩字拼音 恩拼音怎么读 恩的拼音和组词 恩的拼音怎么写 恩的拼音怎么写拼 恩怎么读拼音 恩字的拼音 恩斯克 恩斯迈 恩斯迈电子深圳有限公司 深圳恩斯迈电子有限公司