以往我们都是把所有函数放在一个源文件中,而通过模块化,我们可以将程序拆分成多个部分,每个部分实现不同的功能,每个模块可以是一个函数、一个源文件或者一个头文件。
假设我们要创建一个程序,实现对学生信息的录入、显示和排序功能。
首先,建立文件,其中包含了:
源文件:录入函数,显示函数,排序函数,主函数。
头文件:用于声明结构体和声明函数。
codeblocks:
先来写各个函数:
首先在头文件中定义结构体,方便在后面每个源文件中引用:
#ifndef STUDENT_H //如果没有定义这个结构体
#define STUDENT_H //定义结构体
struct student {
int number;
char name[20];
int grade;
};
#endif //结束标志
输入函数input:
#include <stdio.h>
#include "student.h" //C语言自带的用<>,自己编写的用""
void input(struct student* s)
{
printf("输入学号,姓名,成绩\n");
scanf("%d %[^\n] %d", &s->number, s->name, &s->grade);
}
显示函数display:
#include <stdio.h>
#include "student.h"
void display(struct student s)
{
printf("显示学生信息:\n");
printf("%d\n", s.number);
printf("%s\n", s.name);
printf("%d\n", s.grade);
}
排序函数sort:
#include <stdio.h>
#include "student.h"
void sort(struct student students[], int n)//用选择法排序结构体数组
{
int i, j, maxindex;
for (i = 0;i<n-1;i++)
{
maxindex = i;//从大到小排序,定义最大结构体数组编号
for (j = i+1;j<n;j++)
{
if (students[maxindex].grade < students[j].grade)
{
maxindex = j;
}
struct student temp;
temp = students[maxindex];
students[maxindex] = students[i];
students[i] = temp;
}
}
}
主函数:
#include<stdio.h>
#include "student.h"
#include <unistd.h>
int main()//在主函数中调用其他函数
{
struct student students[100];
int n;
printf("输入学生个数:\n");
scanf("%d", &n);
for (int i = 0;i<n;i++)
{
input(&students[i]);
}
printf("已经输入的信息如下:\n");
for (int i = 0; i < n; i++)
{
display(students[i]);
}
sort(students, n);
sleep(2);
printf("排序后的信息如下:\n");
sleep(2);
for (int i = 0; i < n; i++)
{
display(students[i]);
}
return 0;
}
由于主函数中用函数前要声明,我们在头文件中增加声明即可,这样可以使主函数更加简洁。
修改过的头文件如下:
#ifndef STUDENT_H
#define STUDENT_H
struct student {
int number;
char name[20];
int grade;
};
void input(struct student* s);
void display(struct student s);
void sort(struct student students[], int n);
#endif
具体函数还有待优化,这篇博客仅供参考思路。