编写的是一个学生管理系统,未使用链表存储。直接将数据写入文件。
索引文件作用:将输入的学生信息按照成绩降序排序,将排好的序号存入一个文件中,当需要按照成绩输出学生信息时,读出索引文件中的序号作为学生数组的下标,直接输出该下标所对应的学生信息。
头文件及数据类型定义部分:定义的char *Menu[]为界面内容,目的是为当界面功能有所变化时,对界面能够方便快捷的改动。
#include
#include
#include
#include
#include
#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
学生信息添加:
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
学生信息修改:
调用信息查找函数,利用返回的下标修改信息。
void exchangeFile() {
FILE *fp;
Stu student[50];
char name[21];
char exid[11];
char id[11];
int i=0,k=0;
double g;
fp = fopen("studentMessage.txt","r+");
if(NULL == fp) {
printf("打开文件失败!");
return ;
}
printf("\n\n请输入要修改的学生学号:");
flushall();
gets(exid);
while(fread(&student[k],sizeof(Stu),1,fp)) {
k++;
}
fclose(fp);
fp = fopen("studentMessage.txt","w+");
for(i=0;i
学生信息删除:
学生信息删除时将文件中的数据读取到结构体数组中,根据学号查找到要修改的信息,先进行逻辑删除,修改标志,然后在数组中删除该组数据。由于删除了一组数据,长度不够,写入文件中时最后一组数据无法覆盖,因此选择使用remove()删除原文件,重新生成与原文件同名的新文件,将删除后的数组写入新文件。
void deleteFile() {
FILE *fp;
Stu student[50];
char id[11];
int i=0,k=0;
fp = fopen("studentMessage.txt","rb");
if(NULL == fp) {
printf("打开文件失败!");
return ;
}
while(fread(&student[k],sizeof(Stu),1,fp)) {
k++;
}
printf("\n请输入要删除的学生学号:");
flushall();
gets(id);
//逻辑删除
for(i=0;i
学生信息读取:
void readFile() {
FILE *fp;
int i = 0,k = 0;
Stu student[50];
fp = fopen("studentMessage.txt","rb");
if(NULL == fp) {
printf("打开文件失败!");
return ;
}
while(fread(&student[k],sizeof(Stu),1,fp)) {
k++;
}
for(i=0;i
系统菜单:
void showMainMenu() {
int i=0;
int n;
char ch;
if(!access("studentMessage.txt",0)) {
while(Menu[i]){
showMessageCenter(Menu[i]);
i++;
if(8 == i) {
break;
}
}
printf("请输入选择:");
flushall();
scanf("%c",&ch);
switch(ch) {
case '1':n = writeFile();break;
case 'A':n = writeFile();break;
case '2':exchangeFile();break;
case 'B':exchangeFile();break;
case '3':i = searchFile();break;
case 'C':i = searchFile();break;
case '4':addFile(n);break;
case 'D':addFile(n);break;
case '5':deleteFile();break;
case 'E':deleteFile();break;
case '6':readFile();break;
case 'F':readFile();break;
case '0':break;
case 'G':break;
default:printf("\n没有该选项!请重新输入选择:\n\n");showMainMenu();
}
}
i = 0;
while(i<8){
if(1 == i||7 == i) {
showMessageCenter(Menu[i]);
i++;
}
i++;
}
printf("请输入选择:");
flushall();
scanf("%c",&ch);
switch(ch) {
case '1':n = writeFile();break;
case 'A':n = writeFile();break;
case '0':break;
case 'G':break;
default:printf("\n学生信息未录入!请录入信息\n\n");showMainMenu();
}
}
字符串居中函数:
将菜单的字符屏幕居中输出。
void showMessageCenter(char *str) {
int i;
int lenth;
lenth = (COLS - strlen(str)) / 2;
for(i = 0; i < lenth; i++)
printf(" ");
printf("%s\n", str);
}
排序生成索引文件(!!并未写入系统代码中!!):
void useIndexFile() {
FILE *fp;
int number[50];
int k=0;
int i=0;
Stu student[50];
fp = fopen("indexFile.txt","rb");
if(NULL == fp) {
printf("打开文件失败!");
return ;
}
while(fread(&number[k],sizeof(int),1,fp)) {
k++;
}
fclose(fp);
fp = fopen("orderMessage.txt","rb");
if(NULL == fp) {
printf("打开文件失败!");
return ;
}
printf("\n按索引文件顺序输出!\n");
for(i=0;i
系统代码如下(不包括生成索引文件代码):
#include
#include
#include
#include
#include
#define COLS 80
typedef struct Dex {
int orderid;//序号
char indexid[11];//学号
}Dex;
typedef struct Stu {
int sign;//是否需要删除的标志
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",
};
void showMessageCenter(char *str);
void showMainMenu();
int fwriteFile(FILE *fp);
int writeFile();
void exchangeFile();
int searchFile();
void addFile(int m);
void deleteFile();
void readFile();
void readFile() {
FILE *fp;
int i = 0,k = 0;
Stu student[50];
fp = fopen("studentMessage.txt","rb");
if(NULL == fp) {
printf("打开文件失败!");
return ;
}
while(fread(&student[k],sizeof(Stu),1,fp)) {
k++;
}
for(i=0;i