一、简介
包含学生信息的添加、删除、查找、修改、统计功能。
二、实现源代码
1、头文件
# ifndef __PUBLIC_H
# define __PUBLIC_H
typedef struct student
{
int no;
int age;
char name[10];
char sex[5];
float chinese;
float math;
float english;
}Student; //定义存储一个学生信息的结构体
int add(Student *stu, int *len);
int print(Student *stu, int *len);
int del(Student *stu, int *len);
int read (Student *stu, int *len);
int modify(Student *stu, int *len);
int write(Student *stu, int *len);
int seek(Student *stu, int *len);
int read(Student *stu, int *len);
int sort(Student *stu, int *len); //系列函数声明
#endif
2、主函数
# include <stdio.h>
# include "public.h"
Student stu[100]; //定义存储学生数据的数组
int len = 0;
int main(void)
{
read(stu,&len); //将文件读入数组stu[]中
meun(); //打印菜单
int number;
while(1)
{
printf("请选择您要执行的操作:\n");
scanf("%d",&number);
switch(number)
{
case 1: add(stu, &len); break; //添加学生信息函数
case 2: del(stu, &len); break; //删除学生信息函数
case 3: seek(stu, &len); break; //查询学生信息函数
case 4: sort(stu, &len); break; //统计学生信息函数
case 5: modify(stu, &len); break; //修改学生信息函数
case 6: print(stu, &len); break; //打印学生信息函数
case 0: meun(); break; //打印菜单函数
case 9: return 0; //退出程序
default:
{
printf("您输入的数据不合法,请重新输入!\n");
fflush(stdin);
break;
}
}
}
return 0;
}
3、信息添加
# include <stdio.h>
# include "public.h"
int add(Student *stu, int *len)
{
int count;
Student std;
printf("您需要添加几个学生信息:");
scanf("%d",&count);
int i;
for(i = 0; i < count; i++)
{
printf("请输入第 %d 个学生的信息\n",i+1);
printf("学号(1000):");
scanf("%d",&std.no);
fflush(stdin);
printf("姓名:");
scanf("%s",std.name);
fflush(stdin);
printf("性别:");
scanf("%s",&std.sex);
fflush(stdin);
printf("年龄:");
scanf("%d",&std.age);
fflush(stdin);
printf("英语成绩:");
scanf("%f",&std.english);
fflush(stdin);
printf("语文成绩:");
scanf("%f",&std.chinese);
fflush(stdin);
printf("数学成绩:");
scanf("%f",&std.math);
fflush(stdin);
if(*len < 100) //100为数组长度
{
stu[*len] = std; //将添加的学生信息存储到数组中,长度加一
(*len)++;
}
}
FILE *fp = fopen("D:/data.txt","ab+"); //文件的写入
if(fp == NULL)
{
printf("打开或创建文件失败\n");
return -1;
}
int j;
for(j = *len-count; j < *len; j++)
{
fwrite(&stu[j], sizeof(Student), 1, fp);
if(ferror(fp))
{
printf("文件写入失败\n");
return -1;
}
}
fclose(fp); //文件写入完成
//附加:这里之所以没有直接用写好的write函数是因为这里文件的写入方式为“ab+”,而write函数中写入方式为“wb+”,前者为添加,后者为覆盖,所以这里区分开来。
return 0;
}
4、信息删除
# include <stdio.h>
# include "public.h"
# include <string.h>
int del(Student *stu, int *len)
{
while(1)
{
printf("----------------删除学生信息方式选择---------------\n\n");
printf("\t\t1 通过学生编号删除\n");
printf("\t\t2 通过学生姓名删除\n");
printf("---------------------------------------------------\n");
printf("请选择你要使用的方式(1/2):");
int i;
scanf("%d",&i);
fflush(stdin);
if(i == 1)
{
int no;
printf("请输入要删除学生的编号:\n");
scanf("%d",&no);
int j,m = *len+10;
for(j = 0; j < *len; j++)
{
if(stu[j].no == no)
{
m = j;
for(m; m < *len-1; m++)
{
stu[m] = stu[m+1];
j--;
}
(*len)--;
write(stu,len);
}
}
if(m > *len)
{
printf("学号输入错误,未查找到学号[ %d ]\n",no);
}
else
{
break;
}
}
else if(i == 2)
{
printf("请输入你要删除的学生姓名:\n");
char name[10];
scanf("%s",name);
int i,m = *len+10;
for(i = 0; i < *len; i++)
{
if(strcmp(name, stu[i].name) == 0)
{
m = i;
for(m; m < *len-1; m++)
{
stu[m] = stu[m+1];
i--;
}
(*len)--;
write(stu,len);
}
}
if(m > *len)
{
printf("姓名输入错误,未查找到姓名[ %s ]\n",name);
}
else
{
break;
}
}
else
{
printf("输入数据不合法,请重新选择:\n");
fflush(stdin);
}
}
return 0;
}
5、信息查找
# include <stdio.h>
# include "public.h"
# include <string.h>
int seek(Student *stu, int *len)
{
printf("请输入你要查询的方式\n");
printf("-----1.按姓名查询------\n");
printf("-----2.按学号查询------\n");
int number;
scanf("%d",&number);
switch(number)
{
case 1:
{
printf("按姓名查询\n");
printf("请输入你要查询的学生姓名\n");
char name[10];
scanf("%s",name);
int i;
for(i = 0; i < *len; i++)
{
if(strcmp(stu[i].name, name) == 0)
{
printf("学号\t姓名\t性别\t年龄\t英语\t语文\t数学\n");
printf("%d\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\n",stu[i].no, stu[i].name,
stu[i].sex, stu[i].age, stu[i].english, stu[i].chinese, stu[i].math);
break;
}
}
break;
}
case 2:
{
printf("按学号查询\n");
printf("请输入你要查询的学生学号\n");
int no;
scanf("%d",&no);
int i;
for(i = 0; i < *len; i++)
{
if(stu[i].no == no)
{
printf("学号\t姓名\t性别\t年龄\t英语\t语文\t数学\n");
printf("%d\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\n",stu[i].no, stu[i].name,
stu[i].sex, stu[i].age, stu[i].english, stu[i].chinese, stu[i].math);
break;
}
}
break;
}
}
return 0;
}
6、信息修改
# include <stdio.h>
# include "public.h"
int modify(Student *stu, int *len)
{
printf("-----------修改菜单信息----------\n");
printf("---------1.按学生学号修改---------\n");
printf("---------2.按学生姓名修改---------\n");
printf("请选择修改编号(1/2):\n");
int number;
scanf("%d",&number);
switch(number)
{
case 1:
{
printf("按学生学号修改\n");
printf("请输入你要修改学生的学号:\n");
int no;
scanf("%d",&no);
fflush(stdin);
int i;
for(i = 0; i < *len; i++)
{
if(no == stu[i].no)
{
printf("请选择你要修改的选项:\n");
printf("1.姓名\t2.学号\t3.性别\t4.年龄\t5.语文成绩\t6.数学成绩\t7.英语成绩\n");
int n;
scanf("%d",&n);
switch(n)
{
case 1:
{
char name[10];
printf("需要被修改的名字为%s",stu[i].name);
printf("请输入新的名字:\n");
scanf("%s",name);
strcpy(stu[i].name, name);
printf("修改成功!");
break;
}
case 2:
{
int no;
printf("需要被修改的学号为%d",stu[i].no);
printf("请输入新的学号:\n");
scanf("%d",&no);
stu[i].no = no;
printf("修改成功!");
break;
}
case 3:
{
char sex[10];
printf("需要被修改的性别为%s",stu[i].sex);
printf("请输入新的性别:\n");
scanf("%s",sex);
strcpy(stu[i].sex, sex);
printf("修改成功!");
break;
}
case 4:
{
int age;
printf("需要被修改的年龄为%d",stu[i].age);
printf("请输入新的年龄:\n");
scanf("%d",&age);
stu[i].age = age;
printf("修改成功!");
break;
}
case 5:
{
double chinese;
printf("需要被修改的语文成绩为%2.lf",stu[i].chinese);
printf("请输入新的语文成绩:\n");
scanf("%lf",&chinese);
stu[i].chinese = chinese;
printf("修改成功!");
break;
}
case 6:
{
double math;
printf("需要被修改的数学成绩为%2.lf",stu[i].math);
printf("请输入新的数学成绩:\n");
scanf("%lf",&math);
stu[i].math = math;
printf("修改成功!");
break;
}
case 7:
{
double english;
printf("需要被修改的英语成绩为%2.lf",stu[i].english);
printf("请输入新的英语成绩:\n");
scanf("%lf",&english);
stu[i].english = english;
printf("修改成功!");
break;
}
}
break;
}
}
write(stu, len);
break;
}
case 2:
{
printf("按学生姓名修改\n");
printf("请输入你要修改学生的姓名:\n");
char name[10];
scanf("%s",name);
fflush(stdin);
int i;
for(i = 0; i < *len; i++)
{
if(strcmp(name, stu[i].name) == 0)
{
printf("请选择你要修改的选项:\n");
printf("1.姓名\t2.学号\t3.性别\t4.年龄\t5.语文成绩\t6.数学成绩\t7.英语成绩\n");
int n;
scanf("%d",&n);
switch(n)
{
case 1:
{
char name[10];
printf("需要被修改的名字为%s",stu[i].name);
printf("请输入新的名字:\n");
scanf("%s",name);
strcpy(stu[i].name, name);
printf("修改成功!");
break;
}
case 2:
{
int no;
printf("需要被修改的学号为%d",stu[i].no);
printf("请输入新的学号:\n");
scanf("%d",&no);
stu[i].no = no;
printf("修改成功!");
break;
}
case 3:
{
char sex[10];
printf("需要被修改的性别为%s",stu[i].sex);
printf("请输入新的性别:\n");
scanf("%s",sex);
strcpy(stu[i].sex, sex);
printf("修改成功!");
break;
}
case 4:
{
int age;
printf("需要被修改的年龄为%d",stu[i].age);
printf("请输入新的年龄:\n");
scanf("%d",&age);
stu[i].age = age;
printf("修改成功!");
break;
}
case 5:
{
double chinese;
printf("需要被修改的语文成绩为%2.lf",stu[i].chinese);
printf("请输入新的语文成绩:\n");
scanf("%lf",&chinese);
stu[i].chinese = chinese;
printf("修改成功!");
break;
}
case 6:
{
double math;
printf("需要被修改的数学成绩为%2.lf",stu[i].math);
printf("请输入新的数学成绩:\n");
scanf("%lf",&math);
stu[i].math = math;
printf("修改成功!");
break;
}
case 7:
{
double english;
printf("需要被修改的英语成绩为%2.lf",stu[i].english);
printf("请输入新的英语成绩:\n");
scanf("%lf",&english);
stu[i].english = english;
printf("修改成功!");
break;
}
}
write(stu, len);
break;
}
}
break;
default:
printf("数据输入错误\n");
fflush(stdin);
break;
}
}
return 0;
}
7、信息统计
# include <stdio.h>
# include "public.h"
int sort(Student *stu, int *len)
{
printf("--------------------按总分统计排名--------------------\n");
int i, j;
for(i = 0; i < *len-1; i++)
{
for(j = 0; j < *len-i-1; j++)
{
if((stu[j].chinese + stu[j].math + stu[j].english) < (stu[j+1].chinese + stu[j+1].math + stu[j+1].english))
{
Student std;
std = stu[j];
stu[j] = stu[j+1];
stu[j+1] = std;
}
}
}
print(stu, len);
}
8、文件写入函数
# include <stdio.h>
# include "public.h"
int write(Student *stu, int *len)
{
FILE *fp = fopen("D:/data.txt","wb");
if(fp == NULL)
{
printf("打开或创建文件失败\n");
return -1;
}
int j;
for(j = 0; j < *len ; j++)
{
fwrite(&stu[j], sizeof(Student), 1, fp);
if(ferror(fp))
{
printf("文件写入失败\n");
return -1;
}
}
fclose(fp);
}
9、文件读取函数
# include <stdio.h>
# include "public.h"
int read (Student *stu, int *len)
{
FILE *fp = fopen("D:/data.txt","ab+");
if(fp == NULL)
{
printf("文件打开失败\n");
return -1;
}
fread(&stu[0], sizeof(Student), 1, fp);
while(!feof(fp))
{
(*len)++;
fread(&stu[*len], sizeof(Student), 1, fp);
if(ferror(fp))
{
printf("文件写入失败\n");
return -1;
}
}
return 0;
}