程序简单易操作,有相应的提示信息
实现了输入,查找,修改,删除和学生全部信息的输出
- 正在增加添加学生信息的自定义函数,有些问题还没有解决,希望大家给出宝贵意见。
第一次发博客,希望大家多多指教如果想看我未实现功能的代码可私聊我,然后发给你,看看问题出在哪里,共同探讨,共同进步。
*我们的C语言作业是ATM机和学生信息管理系统二选一*
**建议了解好各种语句、函数的作用。** __在设计程序的时候先做一个蓝图,比如要什么功能,怎么扩展,如何才能达到要求。__
下面是我的代码:
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>
#define N 3 //定义N为学生人数,直接在这修改学生的人数即可 ,然后再设置一个n,把N的值赋给n让代码更加灵活
struct Student
{
char studentID[20];
char studentName[20];
int scoreChinese;
int scoreMath;
int scoreEnglish;
}stu[N]; //定义一个结构体名为stu,里面包含学生学号、姓名、语文、数学和英语成绩
int i;
int n=N; //把N赋给n,起到可以修改n的值的作用
void data_input_save();
void print_message();
void swi(int x);
void data_search();
void data_correction();
void data_delete();
void data_display(); //定义一个全局变量i,不需要在局部再次定义。对上面的几个自定义函数的进行声明。
int main()
{
int num,num1,inspect;
print_message();
scanf("%d",&num);
swi(num); //选择你要进行的操作
while(num!=0){
printf("请问你还需要操作什么吗?\n");
print_message();
scanf("%d",&inspect);
num=inspect;
system("cls"); //将你前面输出的信息进行清屏
swi(num);
} //当你没有选择0退出操作系统的时候,依然提示你需要进行什么操作,直到你退出为止
return 0 ;
}
void print_message(){
printf("*****学生成绩管理系统*****\n");
printf(" \n");
printf("1.学生成绩输入\n");
printf("2.学生成绩信息查询\n");
printf("3.学生成绩信息更改\n");
printf("4.学生成绩信息删除:\n");
printf("5.将全部学生的信息输出\n");
printf("0.退出\n");
printf(" \n");
printf("******************\n");
printf("请选择<0~5>");
} //提示信息
void data_input_save(){
printf("请输入学生的成绩:");
for(i=0;i<n;i++)
scanf("%s %s %d %d %d",stu[i].studentID,stu[i].studentName,&stu[i].scoreChinese,&stu[i].scoreMath,&stu[i].scoreEnglish); //进行学生成绩的输入,并存到结构体stu[i]中,此时数据在缓冲区
printf("成功输入学生信息!\n"); //提示输入信息完成
FILE *fp; //这是一个文件指针,在#include<stdio.h>已经定于了的,直接拿来用即可
if((fp=fopen("C:\\stu.txt","wb+"))==NULL){ //用读写的方式打开一个二进制文件,这里采用了wb+(如果指定文件不存在将会建立新的文件)
printf("cannot open file \n");
exit(0);
}
for(i=0;i<n;i++)
if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1) //利用循环把你上面输入的数据一一写到文件中
printf("file write error\n");
fclose(fp);
}
void data_search(){
FILE *fp;
if((fp=fopen("C:\\stu.txt","rb+"))==NULL){ //采用读写的方式打开指定文件
printf("cannot open file \n");
exit(0);
}
char in[20];
int k;
int flag=0; //这里定义的flag是检查你是否输入学号错误
printf("请输入要查询学生成绩的学号:\n");
scanf("%s",in);
for(i=0;i<N;i++)
fread(&stu[i],sizeof(struct Student),1,fp); //将文件中的数据一一读到结构体数组中
for(i=0;i<N;i++)
if(strcmp(in,stu[i].studentID)==0) { //把输入的学号一一与数组里的学号进行对比,找到则输出学生的对应信息,若找不到则输出学号不存在!
k=i;
flag=1;
printf("学号:%-6s 姓名:%-6s 语文成绩:%-6d 数学成绩:%-6d 英语成绩:%-6d\n",stu[k].studentID,stu[k].studentName,stu[k].scoreChinese,stu[k].scoreMath,stu[k].scoreEnglish);
}
if(flag==0)
printf("学号不存在!\n");
fclose(fp);
}
void data_correction(){
printf("请输入要修改学生成绩所对应的学号:\n");
FILE *fp;
if((fp=fopen("C:\\stu.txt","rb+"))==NULL){
printf("cannot open file \n");
exit(0);
}
char in[20];
int k,flag=0;
char studentID[20],studentName[20];
int scoreChinese,scoreMath,scoreEnglish;
scanf("%s",in);
for(i=0;i<n;i++)
fread(&stu[i],sizeof(struct Student),1,fp);
for(i=0;i<n;i++)
if(strcmp(in,stu[i].studentID)==0){ //把输入的学号一一与数组里的学号进行对比,找到则要修改学生的对应信息,若找不到则输出学号不存在!
k=i;
flag=1; }
if(flag==1){
printf("请输入所要修改的学生的对应信息:\n");
scanf("%s%s%d%d%d",studentID,studentName,&scoreChinese,&scoreMath,&scoreEnglish); //输入修改后的学生信息
strcpy(stu[k].studentID,studentID);
strcpy(stu[k].studentName,studentName);
stu[k].scoreChinese=scoreChinese;
stu[k].scoreMath=scoreMath;
stu[k].scoreEnglish=scoreEnglish; //把输入的信息就行覆盖,此时原有信息已经更改为现输入信息
if((fp=fopen("C:\\stu.txt","rb+"))==NULL){
printf("cannot open file \n");
exit(0);
}
for(i=0;i<n;i++)
fwrite(&stu[i],sizeof(struct Student),1,fp); //把输入的信息一一写回文件中
printf("信息修改成功!\n");
}
if(flag==0)
printf("学号不存在!\n");
fclose(fp);
}
void data_delete(){
FILE *fp;
if((fp=fopen("C:\\stu.txt","rb+"))==NULL){
printf("cannot open file \n");
exit(0);
}
char in[20];
printf("请输入你要删除学生成绩信息的学号\n");
int k,flag=0,n=N;
scanf("%s",in);
for(i=0;i<n;i++)
fread(&stu[i],sizeof(struct Student),1,fp);
for(i=0;i<n;i++)
if(strcmp(in,stu[i].studentID)==0){ //把输入的学号一一与数组里的学号进行对比,找到要删除学生,若找不到则输出学号不存在!
char in[20];
k=i;
flag=1;
for(k=i;k<n-1;k++)
stu[k]=stu[k+1]; //找到该学生的对应数组的元素几,然后把后面的数组元素信息覆盖的前一个,此时是n个学生信息在里面,倒数第一和第二是一样的信息,前往下看,会解决这个问题
if((fp=fopen("C:\\stu.txt","rb+"))==NULL){
printf("cannot open file \n");
exit(0);
}
for(i=0;i<n-1;i++)
fwrite(&stu[i],sizeof(struct Student),1,fp); //把上面的n个学生信息写到文件中
fflush(stdin);
for(i=0;i<n-1;i++)
fread(&stu[i],sizeof(struct Student),1,fp); //这里采用for循环只把n-1个学生的信息重新覆盖写回文件中,达到删除学生信息的要求
for(i=0;i<n-1;i++)
fwrite(&stu[i],sizeof(struct Student),1,fp);
}
if(flag==1){
printf("删除成功!\n");
}
if(flag==0)
printf("学号不存在!\n");
fclose(fp);
}
void data_display(){
FILE *fp;
if((fp=fopen("C:\\stu.txt","rb+"))==NULL){
printf("cannot open file \n");
exit(0);
}
for(i=0;i<n;i++){
fread(&stu[i],sizeof(struct Student),1,fp); //从文件中读取所以学生的信息到缓冲区,然后把学生信息全部输出
printf("学号:%-6s 姓名:%-6s 语文成绩:%-6d 数学成绩:%-6d 英语成绩:%-6d\n",stu[i].studentID,stu[i].studentName,stu[i].scoreChinese,stu[i].scoreMath,stu[i].scoreEnglish);
}
fclose(fp); //记得用完文件后记得关闭,避免造成缓冲区堵塞
}
void swi(int x){
switch(x){
case 0: printf("你已退出学生信息管理系统!欢迎再次使用!\n");break;
case 1: data_input_save();break;
case 2: data_search();break;
case 3: data_correction();break;
case 4: data_delete();break;
case 5: data_display();break;
default:break;
}
}