一、结构体
数组中的各元素是属于同一个类型的。有时需要将不同类型的数据组合成一个整体,以便于引用。如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项。这些项都与某一学生相联系。如果分别定义为互相独立的简单变量,是难以反映它们之间的内在联系的。应当把它们组织成一个组合项,在一个组合项中包含若干个类型不同(当然也可以相同)的数据项。C语言提供了这样一种数据结构,它称为结构体(structure)。它相当于其它高级语言中的“记录”。
在定义了结构体变量以后,当然可以引用这个变量。
应遵守以下规则:
1·不能将一个结构体变量作为一个整体进行输入和输出。
例如: 已定义:student1和student2为结构体变量并且它们已有值。不能这样引用:
printf(”%d,%s,%c,%d,%f,%s\n,”,student1);
只能对结构体变量中的各个成员分别输出。
引用方式为:结构体变量名.成员名
student1.num
可以对变量的成员赋值,例如: student.num=10010;
赋值语句的作用是将整数10010赋给student1变量中的成员num。
2·如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员.
例如,对上面定义的结构体变量student1,可以这样访问各成员:
student1.num
student1.name
student1.birthday.month
student1.birthday.day
student1.birthday.year
注意:不能用student1.birthday来访问student1变量中的成员birthday,因为birthday本身是一个结构体变量。
3.对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。
例如:
student2.score=student1.score;
sum=student1.score+student2.score;
student1.age++;
++student1.age;
由于'.”运算符的优先级最高,因此student1.age++是对student1.age进行自加运算,而不是先对age进行自加运算。
4.可以引用成员的地址,也可以引用结构体变量的地址。如:
scanf("%d”,&student1.num);
(输入student1.num的值)
printf(”%o”,&student1);
(输出student1的首地址)
但不能用以下语句整体读入结构体变量,如
scanf(“%d,%s,%c,%d,%f,%s”,&student1);
结构体变量的地址主要用于作函数参数,传递结构体的地址。
二、设计:学生考勤系统设计
1.设计方案:
该系统能考察学生的出勤情况,所以包括每个班学生的全部信息。每个学生是一条记录,包括姓名﹑性别﹑学号,对应于某天某门课程的出勤情况等。该系统可模拟考勤过程,记录考勤结果,并能在课程结束后按照设定的考勤评分标准自动给出每个学生的考勤分数。
其中,学生可在本系统在线请假以及查看学期内的上课出勤信息。在线请假中,学生可以随时查看到请假的详细进展情况。同时,学生可以查看本期内上课出勤的详细信息,如:查看某个课程在整个学期内的出勤情况——请假、旷课、迟到、早退了多少次,以及具体的时间、任课老师姓名、第几节可等详细信息。学生还可以查看本人的基本信息,如:所在院系、年级、专业、班级、学号、姓名、性别等,以及修改个人用户密码,查看本班的课表。
对于任课老师,其使用本系统时,管理所教班级学生的上课出勤信息以及查看所教学生的上课出勤信息。老师自动列出还没有在网上公布的学生上课出勤信息,系统依据学生请假系统,决定学生上课出勤的最终结果。并且查看自己所教课程、所教班级学生整个上课出勤统计信息以及详细信息。
2、源程序清单:
#include
#include
#include
#define SIZE 3 /*定义常量SIZE便于以后的修改*/
struct student /*定义一个结构体数组存放学生的信息*/
{
int number; /*学号*/
char name[20];/*名字*/
char xueyuan[20];/*学院*/
int cla;/*班级*/
int score[3];/*分数*/
int sum;/*总分*/
int average;/*平均分*/
}stu[SIZE];
void menu();/*调用菜单函数*/
void write();/*读入信息*/
void save(int x);/*保存stud.dat文件函数*/
void SaveOneStudent(int i);/*保存一个学生信息*/
void SaveAllStudent(int n);/*保存全部学生信息*/
void inturn (struct student c[]);/*用于对学生的信息按学号排序的函数*/
void save2();/*将排序后的信息存入student.dat文件中*/
int AddStudent(int n);/*增加学生信息*/
void InputOnestudent(int i);/*输入一个同学信息*/
int DelStudent(int n);/*删除学生信息*/
void ModifyStudent(int n);/*修改学生信息*/
void OutputOneStudent(int i);/*查询一个学生信息*/
void SearchMenu(int n);/*查询学生信息操作*/
void SearchNumber(int n);/*按学号查询学生信息*/
void SearchName(int n);/*按姓名查询学生信息*/
void SearchXueyuan(int n);/*按所在学院查询学生信息*/
void SearchCla(int n);/*按所在班级查询学生信息*/
void tongji();/*学生信息统计操作*/
void tongji2();/*统计不及格率操作*/
void zfsc();/*总分排序操作*/
void avecz();/*按平均分统计人数操作*/
void avecz();/*按平均分统计人数操作*/
void search();/*查找最高成绩操作*/
void tongji2();/*统计不及格率操作*/
void read();/*读取student.dat文件文件中学生的信息*/
/*主函数************************************************************************************/
int main()
{
int n=SIZE;
int choice;/*用户选择变量*/
printf("*******************************************************************************\n");
printf("* *\n");
printf("* Hwadee &学生成绩文件管理& Hwadee *\n");
printf("* *\n");
printf("*******************************************************************************\n\n\n");
printf("******************************●●欢迎使用●●*********************************");
while (1)
{
menu();/*调用菜单函数形成操作界面*/
printf("请选择:");
scanf("%d", &choice);
if ( choice==0 )
{
printf("\t\t\t\t谢谢使用!!!");
break;
}
switch(choice) /*多重选择实现功能不同的功能*/
{
case 1:
write();
inturn(stu);
save(SIZE);
break;
case 2:
AddStudent(n);
break;
case 3:
DelStudent(n);
break;
case 4:
ModifyStudent(n);
break;
case 5:
SearchMenu(n);
break;
case 6:
tongji();
break;
case 0:
printf("\n谢谢使用!再见!\n");
default:
printf("\n按键错误!请重新选择!\n");
}/*结束switch*/
}/*结束while*/
}
/*菜单函数************