C语言大作业——学生信息管理系统(结构体,文件操作)

这个是上个学期期末的C语言大作业了,基本实现了一个学生信息管理系统以及一个基本管理系统所需的增删改查等功能,由于上个学期刚刚刚开始学习C语言,没有什么实际开发管理系统的经验,系统中还有较多考虑不周的地方,现对全部代码开源,仅供大家参考。
顺便一提,感觉在CSDN上放代码很容易崩啊,每一次都小心翼翼一点一点贴上去


#include
#include
#include
#define max 300 
struct STUDENT{              //建立关于学生信息的结构体 
 int id;
 char name[10];
 char sex[5];
 int dormitory;
 char phone[20];
}student[max]; 


void quit(int n)    //退出模块,判断用户是否需要保存学生信息 
{
 printf("是否需要保存系统中的学生信息到本地(1:YES 2:NO)\n");
 int p,i=0;
 scanf("%d",&p);
 if(p==1)
 {
  printf("是否将学生信息保存到当前目录下:(1:YES 2:NO)\n");
  int o;
  scanf("%d",&o);
  while(1){        //建立while循环,考虑用户输入错误,增强用户体验 
  if(o==1)
  {
   char filename[50];
   printf("请输入保存的文件名(例如students.txt)\n");
   scanf("%s",&filename);
   FILE *fp=fopen(filename,"w+");   //定义文件指针 
   if(fp!=NULL)
   {
    while(i<n&&student[i].id!=-1){   //while循环输出学生信息 
    fprintf(fp,"%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
    i++;         
     } 
     printf("保存学生信息成功!\n");
    
   }else{
    printf("学生信息保存失败!\n");
   }
   fclose(fp);        //解除对文件指针的引用 
   break;
   }
   else if(o==2){        //用户需要自主定义保存文件位置的情况 
    char path[75];
    printf("请输入完整的保存路径:(例如:C:\\User\\DELL\\Desktop\\students.txt)\n");
    scanf("%s",&path);      
   FILE *fp=fopen(path,"w+");
   if(fp!=NULL)
   {
    while(i<n&&student[i].id!=-1){
    fprintf(fp,"%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
    i++;
    }
    printf("保存学生信息成功!\n");
   }
   else {
    printf("保存学生信息失败!\n");
   }
   fclose(fp);
   break;
   } 
   else {
    printf("输入错误!请重新输入(1:YES 2:NO)\n");  //输入错误可以立刻重新输入,增强用户体验 
  }
  }  
 }
}  

void change(int n)
{
 while(1){       //在每个模块都加入了while循环,用户输入错误不必退出模块,可以立刻重新输入 
 printf("请输入需要修改的学生学号:");
 int changeid,i;
 scanf("%d",&changeid);
 for(i=0;i<n;i++)
 {
  if(student[i].id==changeid&&changeid!=-1)  //找到了需修改学生信息的学号 
  {
   printf("查询到的学生信息如下:\n");
   printf("学号   姓名   性别   寝室号     联系方式\n");
   printf("%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
   printf("请输入您要修改的选项:1.修改学号 2.修改姓名 3.修改性别 4.修改寝室号 5.修改联系方式\n");  //快速修改学生信息 
   int p;
   scanf("%d",&p);
   switch (p)
   {
    case 1:printf("请输入修改后的学号:"); 
           int changeid;
           scanf("%d",&changeid);
           student[i].id=changeid;
           printf("修改学生学号成功!\n");
           break;
    case 2:printf("请输入修改后的姓名:");
           char changename[10];
           scanf("%s",&changename);
           strcpy(student[i].name,changename);
           printf("修改学生姓名成功!\n");
           break;
    case 3:printf("请输入修改后的性别:");
        char changesex[5];
        scanf("%s",&changesex);
        strcpy(student[i].sex,changesex);
        printf("修改学生性别成功!\n");
        break;
    case 4:printf("请输入修改后的寝室号:");
           int changedormitory;
        scanf("%d",&changedormitory);
        student[i].dormitory;
        printf("修改学生寝室号成功!\n");
        break;
    case 5:printf("请输入修改后的联系方式:");
        char changephone[20];
        scanf("%s",&changephone);
        strcpy(student[i].phone,changephone);
        printf("修改学生联系方式成功!\n"); 
        break;   
    default:
      printf("输入错误!\n");
      break;
   }
   
  }
 } 
 printf("是否需要继续修改学生信息(1:YES 2:NO)\n");  
 int p; scanf("%d",&p);
 if(p==2)
 break;
 }
 printf("输入回车以继续......\n");
 getchar();
 getchar();
}
void help()
{ printf("您是否需要打开帮助文件readme.txt(1:YES 2:NO):\n");  //引入文件操作,可以使用户直接打开readme.txt,增强用户体验 
 int p;
 scanf("%d",&p);
 if(p==1)
 {
  system("start readme.txt");
 }
 else{               //也可以直接在本程序中显示帮助内容 
  printf("欢迎使用学生信息管理系统2.2.8\n");
  printf("本系统为学生信息管理系统2.2.8,主要用于实现对学生信息的管理。\n");
  printf("本系统提供有1.增添学生信息、2.删除学生信息、3.修改学生信息、4.查询学生信息、5.查看学生信息、\n");
  printf("6.导入本地txt学生信息库、7.保存系学生信息等功能。8.退出帮助\n");  //快速查询帮助信息 
  printf("请输入您要查询的功能序号:"); 
  int p;
  while(1){              //可以循环执行帮助供能直到用户希望退出 
  scanf("%d",&p);
  switch(p)
  {
   case 1: printf("在使用增添学生信息功能时,请按照屏幕提示,依次输入学生的相应信息,输入后的学生信息将临时储存\n");
           printf("于本系统中,并没有存储到您的计算机系统,若需要保存学生信息到本地,请选择7.保存学生信息功能\n");
           printf("并根据提示操作\n"); 
          break;
   case 2: printf("在使用删除学生信息功能时,请输入需删除的学生学号,按照提示进行相应操作。删除的信息仅为本系统\n");
        printf("中临时储存的学生信息,并不影响您本地的学生信息\n");
        break;
   case 3: printf("在使用修改学生信息时,您需要提供待修改的学生学号,并根据提示选择和输入修改的内容,修改的学生\n");
        printf("信息为本系统中临时储存的学生信息,若您需要长期保存,请选择在开始菜单选择7.保存学生信息功能\n");
        printf("并根据提示操作\n"); 
        break;
   case 4: printf("在使用查询学生信息功能的功能时,您可以根据提示按照不同的方式进行查询,请注意:您只能查询到本系统中临时储存的学生信息,\n");
        printf("请在菜单中选择6.导入学生信息并按照提示操作\n");
        break;
   case 5: printf("在使用查看学生信息时,您只能查看本系统中临时储存的学生信息,如需导入您本地的学生信息,请在开始菜单中\n");
        printf("本系统中临时储存的学生信息,如需导入您本地的学生信息,选择6.导入学生信息并按照提示操作\n");
        break;
   case 6: printf("在使用导入本地txt学生信息时,请按照提示输入正确的txt储存路径和文件名,请注意,在您本地的学生信息txt文件中\n");
           printf("请确保您保存的学生信息的格式为:学号 姓名 性别 寝室号 联系方式,每两项信息间以空格分隔,每行仅保存一个学生\n");
           printf("信息,否则将可能导致系统无法正确的导入学生信息!!!\n");
           break;
   case 7: printf("在使用保存学生信息的功能时,若您需要保存于其他文件夹,请确保输入正确的文件路径,否则将可能导致系统无法为您保存\n");
        printf("学生信息至您本地!!!\n");
        break;
   case 8: goto end;  
   default:printf("输入序号有误!\n");
     break;
  }
  printf("请输入您要查询的功能序号:"); 
  }
 }
 end:
 printf("输入回车以继续......\n");
 getchar();
 getchar();
}
void about()
{
 printf("非常感谢您使用本产品!\n");
 printf("您正在使用的是学生信息管理系统2.2.8\n"); //关于本系统的版本,开发者人员,版权解释 
 printf("开发者名单如下:\n");
 printf("");
 printf("");
 printf("");
 printf("如果有任何疑问,欢迎联系以上开发人员,开发团队对本系统保留最终解释权,未经允许严禁用于任何商业用途!!!\n"); 
 printf("请输入回车继续......\n");
 getchar();
 getchar(); 
}
void save(int n)    //保存学生信息模块 
{
 
 int i;
 printf("系统中已储存的学生信息如下:\n");
 printf("学号   姓名   性别   寝室号     联系方式\n");
 for(i=0;i<n;i++)
 {
  if(student[i].id!=-1)   //筛选没有被删除的学生信息 
  printf("%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone); 
 }
 printf("是否要保存在当前系统cpp文件目录下?(1:YES 2:NO)\n");
 int choice;   
 scanf("%d",&choice);
 if(choice==2){
 
  printf("请输入完整的txt数据库保存路径:例如(C:\\User\\DELL\\Desktop\\students.txt)");
  char path[50];
  scanf("%s",&path);
  FILE *fp=fopen(path,"w+");
  if(fp!=NULL)  //若成功打开文件指针,保存信息 
  {
   for(i=0;i<n;i++)
   {
    if(student[i].id!=-1)
    fprintf(fp,"%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
   }
   printf("保存学生信息成功!\n");
   printf("输入回车以继续......\n");
   getchar();
   getchar();
  } 
  else  //若打开文件指针失败,反映给用户 
  {
   printf("创建txt文本失败!请检查当前路径是否正确!\n");
   printf("输入回车以继续......\n");
   getchar();
   getchar();
  }
 }else if(choice==1)
 {
  char filename[50];
  printf("请输入完整的保存文件名(例如:students.txt):\n");
  scanf("%s",&filename);
  FILE *fp=fopen(filename,"w+");
  if(fp!=NULL)
  {
   for(i=0;i<n;i++)
   {
    if(student[i].id!=-1)
    fprintf(fp,"%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
   }
   printf("保存学生信息成功!\n");
   printf("输入回车以继续......\n");
   getchar();
   getchar();
  }else {        //若打开文件指针失败,反映给用户  
   printf("保存学生信息失败!\n");
   printf("输入回车以继续......\n");
   getchar();
   getchar();
  }
  fclose(fp);
 }else         //若输入序号错误,反映给用户
 {
  printf("输入序号有误!请重新输入:");
  scanf("%d",&choice);
 }
}
int leading(int n)    //导入txt文件信息模块 
{
 struct LSTUDENT{   //建立新的结构体以储存本地txt文件中的学生信息 
    int leading_id;
    char leading_name[10];
    char leading_sex[5];
    int leading_dormitory;
    char leading_phone[20];
   }lstudent[max];
 int choice;
 printf("请注意,导入文件必须按照规定格式,否则将导入失败\n");
 printf("需要导入的txt数据库是于系统cpp程序位于同一文件夹下:(1:YES 2:NO)");
 scanf("%d",&choice);
 if(choice==1)
 {
  char filename[50],ch; 
  printf("请输入完整的txt文件名:");
  scanf("%s",&filename);
  FILE *fp=NULL;
  fp=fopen(filename,"r");
  if(fp!=NULL)
  {
   int  p,i,m=0;
   printf("打开文件成功\n");
   ch=fgetc(fp);
   if(feof(fp))
   {
    printf("未检测到学生信息!\n");
    printf("输入回车以继续......");
    getchar();
    getchar(); 
   }
   else{
   printf("已检测到如下数据,是否导入系统:(1:YES 2:NO):\n");
   printf("学号   姓名   性别   寝室号     联系方式\n");
   while(!feof(fp))
   {
    fscanf(fp,"%d%s%s%d%s\n",&lstudent[i].leading_id,&lstudent[i].leading_name,&lstudent[i].leading_sex,&lstudent[i].leading_dormitory,&lstudent[i].leading_phone);
    printf("%04d   %-7s%-7s%-11d%s\n",lstudent[i].leading_id,lstudent[i].leading_name,lstudent[i].leading_sex,lstudent[i].leading_dormitory,lstudent[i].leading_phone);
    m++;
    i++;
   }
   scanf("%d",&p);
   if(p==1)
   {
    for(i=0;i<m;i++)
    {
     student[n].id=lstudent[i].leading_id;
     student[n].dormitory=lstudent[i].leading_dormitory;
     strcpy(student[n].phone,lstudent[i].leading_phone);
     strcpy(student[n].name,lstudent[i].leading_name);
     strcpy(student[n].sex,lstudent[i].leading_sex);
     n++;
    }
    printf("导入新学生信息成功!\n");
    printf("输入回车以继续.....");
    getchar();
    getchar();
    return n; 
    } 
   else{
    printf("放弃导入学生信息!\n");
    printf("输入回车以继续....."); 
    getchar();
    getchar();
    return n; 
   }
  }
  }
  else 
  {
   printf("未找到该txt文件,请检查文件名是否正确!\n");
   printf("放弃导入学生信息!\n");
   printf("输入回车以继续....."); 
   getchar();
   getchar();
   return n; 
  } 
 }
 else if (choice==2)
 {
  char path[50];
  printf("请输入完整的txt数据库路径:例如(C:\\User\\DELL\\Desktop\\students.txt)\n");
  scanf("%s",&path);
  FILE *fp=fopen(path,"r+");
  if(fp!=NULL)
  {
   int  p,i,m=0;
   printf("打开文件成功\n");
   printf("已检测到如下数据,是否导入系统:(1:YES 2:NO):\n");
   printf("学号   姓名   性别   寝室号     联系方式\n");
   while(!feof(fp))
   {
    fscanf(fp,"%d%s%s%d%s\n",&lstudent[i].leading_id,&lstudent[i].leading_name,&lstudent[i].leading_sex,&lstudent[i].leading_dormitory,&lstudent[i].leading_phone);
    printf("%04d   %-7s%-7s%-11d%s\n",lstudent[i].leading_id,lstudent[i].leading_name,lstudent[i].leading_sex,lstudent[i].leading_dormitory,lstudent[i].leading_phone);
    m++;
    i++;
   }
   scanf("%d",&p);
   if(p==1)
   {
    for(i=0;i<m;i++)
    {
     student[n].id=lstudent[i].leading_id;
     student[n].dormitory=lstudent[i].leading_dormitory;
     strcpy(student[n].phone,lstudent[i].leading_phone);
     strcpy(student[n].name,lstudent[i].leading_name);
     strcpy(student[n].sex,lstudent[i].leading_sex);
     n++;
    }
    printf("导入新学生信息成功!\n");
    printf("输入回车以继续.....");
    getchar();
    getchar();
    return n; 
    } 
   else{
    printf("放弃导入学生信息!\n");
    printf("输入回车以继续....."); 
    getchar();
    getchar();
    return n; 
   }
  }
  else 
  {
   printf("未找到该txt文件,请检查文件名是否正确!\n");
   printf("放弃导入学生信息!\n");
   printf("输入回车以继续....."); 
   getchar();
   getchar();
   return n; 
  }  
 }
}
void search(int n)
{
 int j,i=0,p=0;
 printf("请输入您的查询方式:\n1.按学号查询\n2.按姓名查询\n3.按寝室号查询\n4.按联系电话查询\n"); 
 scanf("%d",&j);
 if(j==1){
  int k;
  printf("请输入查询的学号:");
  scanf("%d",&k);
  while(i<n)
  {
   if(student[i].id==k&&p==0&&student[i].id!=-1)
   {
    p++;
    printf("学号   姓名   性别   寝室号     联系方式\n");
    printf("%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
   }else if(student[i].id==k&&student[i].id!=-1)
   {
    p++;
    printf("%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
   }
   i++;
  }
  if(p==0)
  {
   printf("查询失败,没有找到该学号的学生!\n");
  }
 }else if(j==2)
 {
  printf("请输入查询的姓名:");
  char searchname[10];
  scanf("%s",&searchname);
  while(i<n){
  if(strcmp(searchname,student[i].name)==0&&p==0)
  {
   p++;
   printf("学号   姓名   性别   寝室号     联系方式\n");
   printf("%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
  }else if(strcmp(searchname,student[i].name)==0&&p!=0) 
  {
   p++;
   printf("%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
  }
  i++;
  }
  if(p==0)
  {
   printf("查询失败,没有找到该姓名的学生!\n");
  }
 }else if(j==3)
 {
  printf("请输入您要查询的寝室号:\n");
  int number;
  scanf("%d",&number);
  while(i<n)
  {
   if(number==student[i].dormitory&&p==0)
   {
    p++;
    printf("学号   姓名   性别   寝室号     联系方式\n");
    printf("%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
   }else if(number==student[i].dormitory&&p!=0)
   {
    printf("%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
   }
   i++;
  } 
   if(p==0)
  {
   printf("查询失败,没有找到该寝室号的学生!\n");
  }
  
 }else if(j==4)
 {
  printf("请输入您要查询的联系电话:\n");
  char phone[20];
  scanf("%s",&phone);
  while(i<n)
  {
   if(strcmp(phone,student[i].phone)==0&&p==0)
   {
    p++;
    printf("学号   姓名   性别   寝室号     联系方式\n");
    printf("%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
   }else if(phone==student[i].phone&&p!=0)
   {
    printf("%04d   %-7s%-7s%-11d%s\n",student[i].id,student[i].name,student[i].sex,student[i].dormitory,student[i].phone);
   }
   i++;
  } 
   if(p==0)
  {
   printf("查询失败,没有找到该该联系电话的的学生!\n");
  }
  
  } 
 
 printf("输入回车以继续....."); 
 getchar();
 getchar();
 
}
int del(int n){
 printf("请输入您要删除的学生的学号:");
 int i;
 scanf("%d",&i);
 int j,p=0;
 while(1){
  p=0; 
  for(j=0;j<n;j++)
  {
   if(student[j].id==i){
    p++;
    printf("已查询到此学号的学生信息如下:\n");
    printf("学号   姓名   性别   寝室号     联系方式\n");
    printf("%04d   %-7s%-7s%-11d%s\n",student[j].id,student[j].name,student[j].sex,student[j].dormitory,student[j].phone);
    printf("请确认是否删除此学生信息(1.确认  2.取消): ");
    int k=0;
    scanf("%d",&k);
    if(k==1)
    {
     student[j].id=-1;
     printf("删除学生信息成功!\n");
    } else {
     printf("操作取消\n");
    }
   }
   }
  if(p==0)
  {
   printf("未查询到相应的学生信息,请重新输入学号(输入-1则退出):");
   scanf("%d",&i); 
  }
  if(i==-1)
  {
   printf("输入回车以继续....."); 
   getchar();
   getchar();
   return n; 
  }
 }
}

int append(int n)
{
 int choice;
 while(1){
 printf("请输入学生的学号: ");
 scanf("%d",&student[n].id);
 printf("\n请输入学生的姓名:");
 scanf("%s",&student[n].name);
 printf("\n请输入学生的性别: ");
 scanf("%s",&student[n].sex);
 printf("\n请输入学生的寝室号: ");
 scanf("%3d",&student[n].dormitory);
 printf("\n请输入学生的联系电话: ");
 scanf("%s",&student[n].phone);
 printf("添加学生信息成功!\n"); 
 n++;
 printf("是否需要继续添加学生信息?(1:YES 2:NO)\n");
 scanf("%d",&choice);
 if(choice==2)
 {
  printf("输入回车以继续.....\n");  
  
  getchar();
  getchar();
  return n;  
 }
 } 
}

void look(int n)
{
 int i=0,p=0,j=0,t;
 int o=0;
 for(i=0;i<n;i++)
 {
  if(student[i].id!=-1) p++;
  break;
 }
 if(p!=0){
  int sort[max];
  for(i=0;i<n;i++)
  {
   if(student[i].id!=-1)
   sort[i]=student[i].id;
  }
  for(i=0;i<n-1;i++){
   for(j=i;j<n;j++)
   {
    if(sort[i]>sort[j])
    {
     t=sort[i];
     sort[i]=sort[j];
     sort[j]=t;
    }
   }
  } 
  printf("系统中已储存的学生信息如下:\n");
  printf("学号   姓名   性别   寝室号     联系方式\n");
  for(i=0;i<n&&o<n;i++)
  {
   for(j=0;j<n;j++)
   {
    if(sort[i]==student[j].id&&student[j].id!=-1){
    o++;
    printf("%04d   %-7s%-7s%-11d%s\n",student[j].id,student[j].name,student[j].sex,student[j].dormitory,student[j].phone);
   }
   }
   } 
 }else{
  printf("未查询到学生信息!\n");
  
 }
   printf("输入回车以继续.....");
   getchar();
   getchar();
}

int main()
{
 int n=0,m=0,l=0;    //n为实际系统中储存的学生数,m为不合法的学生数 
 while(1)
 {  
   system("cls");
   system("color 3E"); 
 int choice;
 printf("  ------欢迎来到学生信息管理系统2.2.8------\n");
 printf("|*            1.增添学生信息               *|\n");
 printf("|*            2.删除学生信息               *|\n");
 printf("|*            3.修改学生信息               *|\n");
 printf("|*            4.查询学生信息               *|\n");
 printf("|*            5.查看全部信息               *|\n");
 printf("|*            6.导入学生信息               *|\n");
 printf("|*            7.保存学生信息               *|\n");
 printf("|*            8.帮助                       *|\n");
 printf("|*            9.关于我们                   *|\n");
 printf("|*            0.退出系统                   *|\n");
 printf(" -------------------------------------------\n");
 printf("请输入您的选择: ");
 scanf("%d",&choice);
 while(choice!=0&&choice!=1&&choice!=2&&choice!=3&&choice!=4&&choice!=5&&choice!=6&&choice!=7&&choice!=8&&choice!=9){
  printf("输入选择错误,请重新输入:");
  scanf("%d",&choice);
 } 
 switch (choice)
 {
  case 1: n=append(n);  //增添函数实际上应该在n(实际学生人数)的后面继续添加学生信息 ,用n接受返回的实际学生人数 
    
    break;
  case 2: n=del(n); //“删除”函数并没有真正删除(除非有链表技术支持),只是让被删除学生id改为-1 
    m++;  //每“删除”一条学生信息,不合法学生信息++ 
    break;
  case 3: change(n);
    break;
  case 4: search(n); 
    break;
  case 5: look(n);
    break;
  case 6: n=leading(n);
    break;
  case 7: save(n);
    break;
  case 8: help();
       break;
  case 9: about();
    break;
  case 0: quit(n);
    printf("感谢您的使用!\n");
    system("taskkill -f -im 学生信息管理系统.exe");
    return 0;
    break;
 }
 }
 return 0;
 }

以上就是这次C语言大作业的全部代码部分,希望对对家有所帮助和启发
若还有存在疑问的地方,欢迎评论留言

你可能感兴趣的:(C语言大作业——学生信息管理系统(结构体,文件操作))