数据结构课程设计

    技术2025-01-30  8

    #include <stdio.h> #include <string.h>  #include <stdlib.h>  #include <conio.h>/* 头文件 */  #define MAX 100    typedef struct {   int num; /* 学号 */   char name[20]; /* 姓名 */ /* 定义结构体 */   char roomnum[30]; /* 房号 */   char classes[10]; /* 班级 */   }STUDENTS;     /* 读取信息 */  int read_file(STUDENTS students[]) {   FILE *fp;   int i=0;   if((fp=fopen("stu.txt","rt"))==NULL) {   printf("\n\n***** 库存文件不存在!请创建 "); /* 创建文件 */   return 0;   }   while((fread(&students[i],sizeof(STUDENTS),1,fp))==1) /* 成功创建 */   {   i++; }   fclose(fp);   return i;   }     /* 保存信息 */  void save_file(STUDENTS students[],int sum) {   FILE *fp;   int i;   if((fp=fopen("stu.txt","wb"))==NULL) {   printf(" 读文件错误 !\n");   return; }   for(i=0;i<sum;i++)   if(fwrite(&students[i],sizeof(STUDENTS),1,fp)!=1)   printf(" 写文件错误 !\n"); /* 学生信息保存到文件中 */   fclose(fp); } /* 输入模块 */   int input(STUDENTS students[]) {   int i=0,t;     /* 定义要输入学生的个数 */   system("cls");   printf("\n\n  录入学生个数 ( 最多 %d 个 )",MAX);   scanf("%d",&t);  printf(" ------------------------\n");   do { // printf("\n  第 %d 个学生信息 ",i+1); /* 输入学生的基本信息 */   printf("\n  第 %d 个学生的学号 ",i+1);   scanf("%d",&students[i].num);   if(students[i].num==0)   break;   printf("\n  学生姓名 :");   scanf("%s",students[i].name);   printf("\n  学生房号:");   scanf("%s",students[i].roomnum);   printf("\n  学生班级 :");   scanf("%s",students[i].classes);    i++; }while(i<t);   save_file(students,t); /* 保存输入的学生信息 */   printf("\n %d 个学生信息输入完毕 ! \n",t);   getch();   return t; /* 返回输入学生的个数值 */   }     /* 输出模块 */   void output(STUDENTS students[],int sum) {   int i;   system("cls");   printf("学号 姓名 房号 班级\n");   printf(" \n");   for(i=0;i<sum;i++) /* 输出学生的信息 */   {  printf("%5d %5s %5s %5s\n",   students[i].num,students[i].name,students[i].roomnum, students[i].classes);   printf(" \n");   }   getch();   save_file(students,sum); }     /* 添加信息模块 */   int append(STUDENTS students[],int sum){         int i=sum,flag=0; /* 从已经输入的学生尾部添加 */     char choice;         sum=read_file(students);     system("cls");     printf("\n\n  添加学生信息  \n");     do {    if(i<MAX){  /* 已经输入的学生个数和要添加的学生个数之和要小于定义的学生个数最大值 */         printf("\n  新学生学号 :");   /* 输入添加学生的基本信息 */    scanf("%d",&students[i].num);         printf("\n  学生姓名 :");     scanf("%s",students[i].name);         printf("\n  学生房号 :");     scanf("%s",students[i].roomnum);         printf("\n  学生班级 :");     scanf("%s",students[i].classes);     i++;     }     printf("\n  继续添加吗 ?(Y/N)");     choice=getch();         if(choice=='Y'||choice=='y') {     flag=1;     printf("\n  继续 !\n"); /* 是否要继续添加 */     }     else flag=0; }    while(flag==1); 

       printf("\n  按任意键返回主菜单 !");     getch();     save_file(students,i); /* 保存添加的学生信息到原文件 */     return i; /* 返回文件中学生个数值 */  }     /* 修改信息模块 */   void modify(STUDENTS students[],int sum) { //   FILE *fp;    int i,choice,flag,modify_num;    sum=read_file(students); /* 读文件 */   do {    system("cls");       printf("\n  输入要修改的学生学号 :");    scanf("%d",&modify_num); /* 输入要修改的学生学号 */     for(i=0;i<sum;i++)   if(students[i].num==modify_num) {       printf("\n  学生信息  \n");    printf("学号 姓名 房号 班级\n");    printf(" \n");    printf("%5d %5s %5s %5s\n",students[i].num,students[i].name,students[i].roomnum,students[i].classes);    printf("\n  要修改哪一项 ?\n");    printf("\n 1. 学生学号  \n");    printf("\n 2. 学生姓名  \n");    printf("\n 3. 学生房号  \n");    printf("\n 4. 学生班级  \n");    printf("\n  请选择 (1-4):");       scanf("%d",&choice);     switch(choice) {   case 1:printf("\n  输入修改后的学号 :");    scanf("%d",&students[i].num);   break;   case 2:printf("\n  输入修改后的姓名 :");    scanf("%s",students[i].name);    break;   case 3:printf("\n  输入修改后的房号 :");    scanf("%s",students[i].roomnum);   break;   case 4:printf("\n  输入修改后的班级 :");    scanf("%s",students[i].classes);   break;    }      printf("\n  学生信息表  \n");    printf("学号 姓名 房号 班级\n");    printf(" \n");    printf("%5d %5s %5s %5s\n", students[i].num,students[i].name,students[i].roomnum, students[i].classes);    break; /* 输出修改后的学生信息 */   }   if(i==sum) {    printf("\n  该学生不存在 !");    getch(); }    printf("\n\n  继续修改吗 ?(Y/N)");    choice=getch();   if(choice=='Y'||choice=='y') {    flag=1;    printf("\n  继续 !\n"); } /* 是否要继续修改 */   else flag=0;   } while(flag==1);    printf("\n  按任意键返回主菜单 !");    getch();    save_file(students,sum); /* 保存修改后的信息 */   }     /* 删除信息模块 */   int del(STUDENTS students[],int sum) {    int i,del_num;       printf(" 请输入要删除的学生学号 ");    scanf("%d",&del_num); /* 输入要删除的学生学号 */      for(i=0;i<sum;i++) {     if(del_num==students[i].num) {    for(;i<sum-1;i++)     students[i].num=students[i+1].num;     printf(" 删除成功 "); }   }    getch();    save_file(students,sum-1); /* 保存删除后的学生信息到原文件 */    return (sum-1); } 

     /* 查询信息模块 */  void inquire(STUDENTS students[],int sum) {   FILE *fp;   int i,choice,flag,inquire_num;   sum=read_file(students); /* 读文件 */   printf("%d\n",sum);   do { system("cls");   printf("\n  输入要查询的学生学号 :");   scanf("%d",&inquire_num); /* 输入要查询的学生学号 */   for(i=0;i<sum;i++)   if(students[i].num==inquire_num) {   printf("\n  此学生信息为 : \n");   printf("学号 姓名 房号 班级\n"); /* 输出要查询的学生信息 */   printf(" \n");   printf("%5d %5s %5s %5s\n", students[i].num,students[i].name,students[i].roomnum, students[i].classes);   break;    }     if(i==sum) {   printf("\n  无此学生信息  \n");   getch(); }   printf("\n\n  是否继续 ?(Y/N)");   choice=getch();   if(choice=='Y'||choice=='y') {   flag=1;   printf("\n  继续 !\n"); /* 是否要继续 */   }   else flag=0; }while(flag==1);   printf("\n  按任意键返回主菜单 !");   getch(); }     /* 统计信息模块 */   void count(STUDENTS students[],int sum)   { int i,count=0;   char s[10];   printf(" 请输入要统计的班级的学生的班级号 !");   scanf("%s",s); /* 按输入的班级号统计此班的总学生人数 */   for(i=0;i<sum;i++)   if(strcmp(s,students[i].classes)==0)   count++;   printf("%s 班的总人数为 %d 人 ",s,count);   getch(); save_file(students,sum); }     /* 排行信息模块 */  void sort(STUDENTS students[],int sum) {   int i,j,t;   system("cls");   printf("\n  学生信息排行 \n");   printf("\n  按学号排行 \n");   printf(" \n");   for(i=0;i<sum-1;i++) /* 按学号用冒泡法升序排列学生信息 */   for(j=i+1;j<sum;j++) {   if(students[i].num>students[j].num) {  t=students[i].num;   students[i].num=students[j].num;   students[j].num=t; }   }   printf(" \n");   printf("学号 姓名 房号 班级\n");   for(i=0;i<sum;i++) printf("%5d %5s %5s %5s\n",   students[i].num,students[i].name,students[i].roomnum, students[i].classes); /* 输出排序后的学生信息 */   getch();   save_file(students,sum); // 保存排序后的学生信息到文件中  } 

    int main() /* 主函数 */  {    STUDENTS students[MAX];   int choice,sum;   sum=read_file(students);   if(!sum) { printf(" 并录入基本库存信息 !\n");   getch();   sum=input(students); /* 录入学生信息 */   }   do { system("cls");   printf("\n\n\n  学生宿舍管理系统  \n\n");   printf(" 1. 添加学生信息 \n\n");   printf(" 2. 修改学生信息 \n\n");   printf(" 3. 删除学生信息 \n\n");   printf(" 4. 查询学生信息 \n\n");   printf(" 5. 统计学生信息 \n\n");   printf(" 6. 学生排序 \n\n");   printf(" 7. 打印学生信息 \n\n");   printf(" 0. 退出系统 \n\n");   printf("  请选择 (0-7):");   scanf("%d",&choice);   switch(choice) /* 用 switch 选择要调用的各模块函数并执行 */   {   case 1: sum=append(students,sum);break;   case 2: modify(students,sum);break;   case 3: sum=del(students,sum);break;   case 4: inquire(students,sum); break;   case 5: count(students,sum); break;   case 6:sort(students,sum); break;   case 7:output(students,sum); break;   case 0: break; /* 执行完各模块后按 0 退出系统 */   }   }while(choice!=0);   save_file(students,sum); /* 保存执行完各模块后的学生信息 */  } 

    Processed: 0.010, SQL: 9