将较长的程序分割成若干个短小程序文件编译运行,从而使程序结构更加清晰,方便日后修改。

最简单的多文件组织,一个项目中有3个文件:
  (1) .h 头文件:定义数据类型、声明自定义函数、定义宏等
  (2).cpp 源文件1:用于实现头文件中声明的自定义函数
  (3).cpp 源文件2:定义main()函数,用于调用相关函数,实问题求解目标。

原程序:

#include <stdio.h>
#define MaxStud 50      //学生人数最多为50
#define MaxCour 300     //学生成绩记录数最多为50*6
struct stud1
{
int no;         //学号
char name[10];  //姓名
int bno;        //班号
};
struct stud2
{
int no;         //学号
int cno;        //课程编号
int deg;        //分数
};
double studavg(struct stud2 s2[],int m,int i)   //求学号为i的学生的平均分
{
int j,n=0;              //n为学号为i的学生选学课程数
double sum=0;           //学号为i的学生总分
for (j=0; j<m; j++)
if (s2[j].no==i)    //学号为i时统计
{
n++;
sum+=s2[j].deg;
}
return(sum/n);
}
double couravg(struct stud2 s2[],int m,int i)   //求编号为i的课程的平均分
{
int j,n=0;              //n为编号为i的课程选修人数
double sum=0;           //编号为i的课程总分
for (j=0; j<m; j++)
{
if (s2[j].cno==i)   //课程编号为i时统计
{
n++;
sum+=s2[j].deg;
}
}
return(sum/n);
}
void allavg(struct stud1 s1[],int n,struct stud2 s2[],int m)    //求学生平均分和课程平均分
{
int i,j;
printf("学生平均分:\n");
printf("  学号     姓名 平均分\n");
i=0;
while (i<n)
{
j=s1[i].no;
printf("%4d %10s %g\n",s1[i].no,s1[i].name,studavg(s2,m,j));
i++;
}
printf("课程平均分:\n");
for (i=1; i<=6; i++)
printf(" 课程%d:%g\n",i,couravg(s2,m,i));
}
int main()
{
int n=7;        //学生记录人数
int m=21;       //学生成绩记录数
struct stud1 s1[MaxStud]=
{
{1,"张斌",9901},
{8,"刘丽",9902},
{34,"李英",9901},
{20,"陈华",9902},
{12,"王奇",9901},
{26,"董强",9902},
{5,"王萍",9901}
};
struct stud2 s2[MaxCour]=   //规定课程的编号从1到6,同一学生成绩记录连续存放
{
{1,1,67},
{1,2,98},
{1,4,65},
{8,1,98},
{8,3,90},
{8,6,67},
{34,2,56},
{34,4,65},
{34,6,77},
{20,1,68},
{20,2,92},
{20,3,64},
{12,4,76},
{12,5,75},
{12,6,78},
{26,1,67},
{26,5,78},
{26,6,62},
{5,1,94},
{5,2,92},
{5,6,89}
};
allavg(s1,n,s2,m);
return 0;
}

由此可见,当所有程序写在一个文件中时,程序显得十分冗长,没有明显的结构感,后期编译修改也会造成不小的困难,那么我们选择采用多文件系统的方式,分割程序,将头文件、自定义函数、main函数分别放在一个文件里。

头文件函数:主要包含各种头文件以及结构体的定义

/*
Copyright (c) 2015,烟台大学计算机与控制工程学院
All righs reserved
文件名称:stuhead.h.
作者: 李哲
完成日期:2015年9月11日
*/
#ifndef STUHEAD_H_INCLUDED
#define STUHEAD_H_INCLUDED
#define MaxStud 50      //学生人数最多为50
#define MaxCour 300     //学生成绩记录数最多为50*6
struct stud1
{
int no;         //学号
char name[10];  //姓名
int bno;        //班号
};
struct stud2
{
int no;         //学号
int cno;        //课程编号
int deg;        //分数
};
void allavg(struct stud1 s1[],int n,struct stud2 s2[],int m);
double studavg(struct stud2 s2[],int m,int i)  ;
double couravg(struct stud2 s2[],int m,int i);
#endif // STUHEAD_H_INCLUDED

自定义函数:主要包含自己定义的函数,记得要包含头文件,包括函数声明以及stdio.h,不然程序会无法编译。

/*
Copyright (c) 2015,烟台大学计算机与控制工程学院
All righs reserved
文件名称:stu0.c.
作者: 李哲
完成日期:2015年9月11日
*/
#include <stdio.h>
#include "stuhead.h"
double studavg(struct stud2 s2[],int m,int i)   //求学号为i的学生的平均分
{
int j,n=0;              //n为学号为i的学生选学课程数
double sum=0;           //学号为i的学生总分
for (j=0; j<m; j++)
if (s2[j].no==i)    //学号为i时统计
{
n++;
sum+=s2[j].deg;
}
return(sum/n);
}
double couravg(struct stud2 s2[],int m,int i)   //求编号为i的课程的平均分
{
int j,n=0;              //n为编号为i的课程选修人数
double sum=0;           //编号为i的课程总分
for (j=0; j<m; j++)
{
if (s2[j].cno==i)   //课程编号为i时统计
{
n++;
sum+=s2[j].deg;
}
}
return(sum/n);
}
void allavg(struct stud1 s1[],int n,struct stud2 s2[],int m)    //求学生平均分和课程平均分
{
int i,j;
printf("学生平均分:\n");
printf("  学号     姓名 平均分\n");
i=0;
while (i<n)
{
j=s1[i].no;
printf("%4d %10s %g\n",s1[i].no,s1[i].name,studavg(s2,m,j));
i++;
}
printf("课程平均分:\n");
for (i=1; i<=6; i++)
printf(" 课程%d:%g\n",i,couravg(s2,m,i));
}

main函数:程序的主函数,要包含头文件。

/*
Copyright (c) 2015,烟台大学计算机与控制工程学院
All righs reserved
文件名称:stumain.c.
作者: 李哲
完成日期:2015年9月11日
*/
#include "stuhead.h"
int main()
{
int n=7;        //学生记录人数
int m=21;       //学生成绩记录数
struct stud1 s1[MaxStud]=
{
{1,"张斌",9901},
{8,"刘丽",9902},
{34,"李英",9901},
{20,"陈华",9902},
{12,"王奇",9901},
{26,"董强",9902},
{5,"王萍",9901}
};
struct stud2 s2[MaxCour]=   //规定课程的编号从1到6,同一学生成绩记录连续存放
{
{1,1,67},
{1,2,98},
{1,4,65},
{8,1,98},
{8,3,90},
{8,6,67},
{34,2,56},
{34,4,65},
{34,6,77},
{20,1,68},
{20,2,92},
{20,3,64},
{12,4,76},
{12,5,75},
{12,6,78},
{26,1,67},
{26,5,78},
{26,6,62},
{5,1,94},
{5,2,92},
{5,6,89}
};
allavg(s1,n,s2,m);
return 0;
}

运行结果:

*第二周*数据结构实践项目二【多文件系统】相关推荐

  1. # 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod

    20155337 2017-2018-1 <信息安全系统设计基础>第二周课堂实践+myod 因为在课上已经提交了四个实验,还欠缺最后一个实验,反省一下自己还是操作不熟练,平时在课下应该多多 ...

  2. [数据结构实践项目]变态的停车场管理系统

    [数据结构实践项目]变态的停车场管理系统 项目简介 设停车场是一个可以停放 n 辆汽车的南北方向的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在 ...

  3. 数据结构实践项目——图的基本运算及遍历操作

    本文是针对[数据结构基础系列(7):图]中第1-9课时的实践项目. 0701 图结构导学 0702 图的定义 0703 图的基本术语 0704 图的邻接矩阵存储结构及算法 0705 图的邻接表存储结构 ...

  4. c++第二次上机实验项目二

    /* * 文件名称: c++第二次上机实验项目2 * 作 者: 谢文锐* 完成日期: 2016 年 3 月 24 日 * 版 本 号:v1.0 * 对任务及求解方法的描述部分:* 输入描述: 输入一个 ...

  5. 第十二周上机实践项目 项目1-实现复数类中的运算符重载 (2)

    问题及代码: [项目-实现复数类中的运算符重载] (1)请用类的成员函数,定义复数类重载运算符+.-.*./,使之能用于复数的加减乘除 class Complex { public:Complex() ...

  6. 第16周实践项目二——学生成绩处理(2)

    问题及代码 #include <stdio.h> #define N 100 /*N表示最多允许的学生人数*/ struct Student {int num; //学号int c; // ...

  7. 数据结构 实践项目——数据结构、算法、程序设计

    [项目1 - C/C++语言中函数参数传递的三种方式] C语言提供了两种函数参数传递的方式:传值和传地址.在C++中,又拓展了引用方式.通过本项目,确认自己已经掌握了这三种方式的原理,为后续学习做好准 ...

  8. 第十六周上机实践—项目2—大数据集上排序算法性能的体验

    /* *Copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:test.cpp *作者:林莉 *完成日期:2015年12月18日 *版本:v1 ...

  9. 第8周上机实践项目5——定期存款利息计算器

    问题及代码: /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:辛彬 * 完成日期:201 ...

  10. python实践项目(二)

    练习1:逗号代码 假定有下面这样的列表: spam = ['apples', 'bananas', 'tofu', 'cats'] 编写一个函数,它以一个列表值作为参数,返回一个字符串.该字符串包含所 ...

最新文章

  1. thinkPHP5.0 URL路由优化
  2. Repeater鼠标经过变色
  3. 使用 RequireJS 优化 Web 应用前端
  4. Visual basic 6读写ini文件
  5. MyBatis collection的两种形式——MyBatis学习笔记之九
  6. HTML用户点击新建按钮,html – 需要点击按钮
  7. web前端基础(01html基本标签)
  8. 数据结构笔记(三十四)二叉排序树的删除
  9. centen os7 安装并配置Nexus3.9.0
  10. __FILE__ 与 $_SERVER['SCRIPT_FILENAME']的区别
  11. Linux系统高级编程系列教程
  12. 通用计算机实习周记,实习周记100篇通用版|绘图员实习周记范文
  13. 移动软件开发-设计app首页
  14. 【Hive】Hive练习题(一)
  15. IISscanner暴力破解IIS网站目录
  16. matlab程序模拟微信抢红包,js仿微信抢红包功能
  17. LENOVO ERAZER Z51 安装固态指南
  18. 霸王别姬——一个时代变迁的眼泪
  19. react中CodeMirror (代码编辑器)
  20. android.intent.action.MAIN和singleTask模式 的奇怪问题

热门文章

  1. js中如何判断按钮是否被点击了
  2. 「leetcode」486. 预测赢家:【三种递归+动态规划】由浅入深,步步到位
  3. git 操作 中文文件名的时候,显示乱码 ,解决方法
  4. MacBook常用快捷键一览
  5. 如何在 Mac 上的程序坞中使用文件夹?
  6. Mac OS 常用终端命令(附代码)
  7. 玛雅三维动画制作Maya 2022 for Mac
  8. DMG Canvas for mac(DMG打包工具)
  9. 如何安装 macOS Monterey Public Beta?
  10. 在苹果Mac上如何将zsh用作默认Shell?