编写的是一个学生管理系统,未使用链表存储。直接将数据写入文件。
索引文件作用:将输入的学生信息按照成绩降序排序,将排好的序号存入一个文件中,当需要按照成绩输出学生信息时,读出索引文件中的序号作为学生数组的下标,直接输出该下标所对应的学生信息。
头文件及数据类型定义部分:定义的char *Menu[]为界面内容,目的是为当界面功能有所变化时,对界面能够方便快捷的改动。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#include<io.h>
#define COLS 80
typedef struct Dex {
int orderid;//序号
char indexid[11];//学号
}Dex;
typedef struct Stu {
int sign;//是否需要删除的标志
/*
该标志为逻辑删除标志。当学生信息存在时,该标志为1,当需要删除一学生信息时,先不进行物理删除(物理删除即从文件中真正删除该学生信息),应根据删除条件找到需要删除的学生信息,将该标志该为0。之后的操作(增删改查,打印学生信息)照常进行,当遇到标志==0时(该学生信息已进行逻辑删除),跳过该信息。
*/
char name[21];
int sex;//1为男生,0为女生
char id[11];
double grade;
}Stu;
char *Menu[] = {
"--------学生管理系统--------\n",
"1.信息录入 (A)\n",
"2.信息修改 (B)\n",
"3.信息查询 (C)\n",
"4.添加信息 (D)\n",
"5.删除信息 (E)\n",
"6.学生信息打印 (F)\n",
"0.退出 (G)\n",
};
学生信息录入:
学生信息录入编写了两个函数,因为我将学生信息录入分为两个部分,一个为信息初始化录入(即在文件中什么都没有时录入信息),另一个是当信息已初始化录入后再次添加信息,信息从键盘录入这一部分没有必要重复书写,因此把它整体写成一个函数调用。
学生信息录入功能:将学生信息存入结构体数组中,当录入完成时将整个数组写入文件
int writeFile() {
FILE *fp;
int n;
fp = fopen("studentMessage.txt","w+");
if(NULL == fp) {
printf("打开文件失败!");
return 0;
}
n = fwriteFile(fp);
printf("\n\n录入完成!\n");
fclose(fp);
//system("cls");
showMainMenu();
return n;
}
返回学生人数。
int fwriteFile(FILE *fp) {
Stu student[50];
int n;
int i;
char name[21];
char id[11];
double g;
printf("输入信息的学生个数:");
scanf("%d",&n);
printf("\n请输入学生信息:\n");
for(i=0;i<n;i++) {
student[i].sign = 1;
}
for(i=0;i<n;i++) {
printf("\n请输入第%d位同学信息:\n",i+1);
printf("\n姓名:");
flushall();
gets(name);
strcpy(student[i].name,name);
printf("\n性别(1位男生,0为女生):");
scanf("%d",&student[i].sex);
printf("\n学号:");
flushall();
gets(id);
strcpy(student[i].id,id);
printf("\n成绩:");
scanf("%lf",&g);
student[i].grade = g;
}
for(i=0;i<n;i++) {
fwrite(&student[i],sizeof(Stu),1,fp);
}
system("cls");
showMainMenu();
return n;
}
学生信息添加:
void addFile(int m) {
FILE *fp;
int n;
int s;
fp = fopen("studentMessage.txt","a");
if(NULL == fp) {
printf("打开文件失败!");
return;
}
printf("\n请输入要加入的学生信息:\n\n");
n = fwriteFile(fp);
s = n+m;
printf("\n\n添加学生信息成功!\n");
fclose(fp);
//system("cls");
showMainMenu();
}
学生信息查询:利用学号查询学生信息,返回位置下标。
int searchFile() {
FILE *fp;
Stu student[50];
int i=0,k=0;
char id[11];
fp = fopen("studentMessage.txt","rb");
if(NULL == fp) {
printf("打开文件失败!");
return 0;
}
while(fread(&student[k],sizeof(Stu),1,fp)) {
k++;
}
printf("\n请输入要查找的学生学号:");
flushall();
gets(id);
for(i=0;i<k;i++) {
if(!strcmp(student[i].id,id))
break;
}
printf("\n查找成功!\n");
printf("\n\n所查找的学生信息:\n");
pri