#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define M 100
struct score                                    //学生成绩信息结构体定义 
{
int china;
int english;
int math;
int  add;

};

struct info     //学生信息结构体定义
{
int num;            //学生学号5
char name[10];      //学生姓名
struct score mark;       //学生成绩 
   

};

float guake[10];                         //定义一个各科挂科率 
float aver[10];                     //定义一个各科平均分 
struct info student[M];           //定义一个全局数组student,用来存放学生信息,最多存放100个学生。
char ch[20]={"物联1161学生信息"};                                         //定义一个数据库文件名称 
int count=0;                                    //存放实际输入的学生人数
int input(struct info st[]) ;                   //录入学生信息函数声明
void show(struct info st[],int n) ;             //显示学生信息函数声明
int del(struct info st[],int n);                //删除学生信息函数声明
int add_up(struct info st[],int n);                //统计学生信息函数声明
void change(struct info st[],int n);            // 修改学生信息函数声明
void search(struct info st[],int n);            //查询学生信息函数声明
void read();                                    //遍历以往学生信息数据库声明 
void write();                                     //用于修改和删除 重新写入数据库 
void all_del();                                    //清空以往所有学生信息 
void add_date();                                    //自定义学生信息存储文件库
void read_date();                                   //打开自定义学生信息存储文件库 
char b[20]={"物联1161学生信息"};                                   //保存文件名称 用于打开失败 原名称变回 
main()
{
int select;
  system("color E");
    read();
while(1)
{
system("cls");
printf("\t ******************欢迎使用******************\n");
printf("\t **************学生信息管理系统**************\n");
printf("\t  *--------------作者:徐伟明--------------*\n");
printf("\t  *         1--录入/增加学生信息           *\n");
printf("\t  *         2--显示学生信息                *\n");
printf("\t  *         3--查询学生信息                *\n");
printf("\t  *         4--修改学生信息                *\n");
printf("\t  *         5--统计学生信息                *\n");
printf("\t  *         6--删除学生信息                *\n");
    printf("\t  *         7--清空数据库的学生信息        *\n");
    printf("\t  *         8--自定义存储学生信息文件库    *\n");
    printf("\t  *         9--打开自定义存储学生信息文件库*\n");
    printf("\t  *         0--退出                        *\n");
printf("\t *------------------------------------------*\n");
printf("\t *目前存储信息文件名为<<%s>>*\n",ch);
printf("\t 你要输入的功能号是(0--9):");
scanf("%d",&select);
if(select==0) break;
switch(select){
              case 1: count=input(student); //调用input函数录入数据
break;
              case 2: show(student,count); //调用show函数显示学生信息
system("pause");
break;
              case 3: search(student,count);  //调用search函数查询学生信息
system("pause");
break;
              case 4: change(student,count);  //调用change函数修改学生信息
system("pause");
break;
              case 5: count=add_up(student,count);     //调用add_up函数统计学生信息
system("pause");
break;

          case 6: count=del(student,count);    // 调用del函数删除学生信息
system("pause");
break;
          case 7: all_del();    // //清空以往学生信息数据库声明 
system("pause");
break;
          case 8: add_date();    // //自定义增加数据库声明 
system("pause");
break;
          case 9: read_date();    // //打开自定义增加数据库声明 
system("pause");
break;
              case 0: exit(0);    // //打开自定义增加数据库声明 
system("pause");
break;
default:printf("没有此选项,请重新选择!\n"); system("pause");
getchar();
}

}
}

void all_del()
{
int a=0;
         FILE *fp;
         printf("请输入欲清空文件库名:");
         strcpy(b,ch);
         scanf("%s",&ch);
if((fp=fopen(ch,"rb"))==NULL)
{
printf("清空失败~~未发现文件名%s\n",ch);
strcpy(ch,b);
fclose(fp);
goto end;
}
fclose(fp);
fp=fopen(ch,"wb");
strcpy(ch,b);
     fp=fopen(ch,"rb");
while(fread(&student[a],sizeof(struct info),1,fp)!=0)
{
a++;
}   
count=a;
printf("成功清除%s所有学生信息\n\n",ch);
fclose(fp);
end:;
 } 
 
void read()
{
int a=0;

         FILE *fp;
if((fp=fopen(ch,"rb"))==NULL)
{
printf("~~~~~~~~~~~~~~!!!!!!!!!!未发现该文件!!!!!!!!!!~~~~~~~~~~~~~~");

            strcpy(ch,b);
     fclose(fp);
goto end; 
}
while(fread(&student[a],sizeof(struct info),1,fp)!=0)
{
a++;
}   
count=a;
fclose(fp);
printf("··············恭喜遍历%s成功················\n",ch); 
end:;


void write()                                                        //格式化文件 重新录入所有信息 
{
FILE *fp;
int i;
if((fp=fopen(ch,"wb"))==NULL)
{
printf("error");
exit(0);
}
for(i=0;i<count;i++)
{
if(fwrite(&student[i],sizeof(struct info),1,fp)!=1)
{
printf("error");
fclose(fp);
}
}
fclose(fp);
 } 

void add_date()
 {
  FILE *fp;
  int a=0;
  printf("请输入数据库文件名称:");
  scanf("%s",&ch);
  if(!(fp=fopen(ch,"wb")))
  {
  printf("cannoe open the file");

}
fclose(fp);
fp=fopen(ch,"rb");
while(fread(&student[a],sizeof(struct info),1,fp)!=0)
{
a++;
}   
count=a;
printf("···················成功创建数据库%s···················\n",ch); 
fclose(fp);
 }
 
 void read_date()
 {
  printf("输入你下要打开数据库名称:"); 
  strcpy(b,ch);
  scanf("%s",&ch);
  char b[20]={"a"};
  read();
 }

int input(struct info st[]) //录入学生信息的函数
{
char sel;
FILE *fp;

if((fp=fopen(ch,"ab+"))==NULL)
{
printf("sfsdf");
exit(0);
}
  int i=count;                                
do
  {

printf("\n请输入第%d个学生信息:\n",i+1);
printf("\t学生学号:");
scanf("%d",&st[i].num);
printf("\t学生姓名:");
scanf("%s",&st[i].name);
printf("\t语文成绩:");
scanf("%d",&st[i].mark.china);
printf("\t英语成绩:");
scanf("%d",&st[i].mark.english);
printf("\t数学成绩:");
scanf("%d",&st[i].mark.math);
st[i].mark.add=st[i].mark.china+st[i].mark.english+st[i].mark.math;
if(fwrite(&student[i],sizeof(struct info),1,fp)!=1)         //录入数据库 
printf("error");
i++;
printf("\n是否要继续录入学生信息(Y/N):");
getchar();                               //此处是读走缓冲区的换行符
sel=getchar();     
}while(sel=='Y' || sel=='y' ); 
fclose(fp);                                  //关闭文件 
return i;
}

void show(struct info st[],int n)               //显示所有学生信息函数
{
int i,j,min;
for(i=0;i<count-1;i++)                            //步骤:学号排序 
  {   min=i;                 
     
      for(j=i+1;j<count;j++)
      if(st[min].num>st[j].num)
      {
      st[99]=st[min]; st[min]=st[j]; st[j]=st[99];
}
}
printf("\n\n%-10s%-15s%-10s%-10s%-10s%-10s\n","学生学号","学生姓名","语文","英语","数学","总分");
for(i=0;i<n;i++)
{
printf("\n%-10d%-15s%-10d%-10d%-10d%-10d\n",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,st[i].mark.math,st[i].mark.add);
}
printf("\n");
}

void search(struct info st[],int n)                   //根据学号查询学生信息 
{
int num,i;
printf("\n\n请输入需要查询的学号:");
scanf("%d",&num);
for(i=0;i<count;i++)
{
if(num==st[i].num) 
{
printf("\n\n%-10s%-15s%-10s%-10s%-10s%-10s\n",
"学生学号","学生姓名","语文","英语","数学","总分");
printf("\n%-10d%-15s%-10d%-10d%-10d%-10d\n",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,st[i].mark.math,st[i].mark.add);
}
    
}
return;
}

void change(struct info st[],int n)                                     //修改学生信息 
{
int num,i;
printf("\n\n%-10s%-15s%-10s%-10s%-10s%-10s\n",
"学生学号","学生姓名","语文","英语","数学","总分");
for(i=0;i<count;i++)
{
printf("\n%-10d%-15s%-10d%-10d%-10d%-10d\n",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,
st[i].mark.math,st[i].mark.add);   
}
printf("\n\n请输入需要修改信息的学号:");
scanf("%d",&num);
for(i=0;i<count;i++)
{
if(num==st[i].num) 
{
printf("\n%-10s%-15s%-10s%-10s%-10s%-10s\n",
"学生学号","学生姓名","语文","英语","数学","总分");
printf("\n%-10d%-15s%-10d%-10d%-10d%-10d\n",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,st[i].mark.math,st[i].mark.add);break;
}
if(i==count-1){  printf("修改失败~未发现学号%d\n",num);goto end;}
 }
    printf("\n请输入学号为%d学生信息:\n",st[i].num);
printf("\t学生学号:");
scanf("%d",&st[i].num);
printf("\t学生姓名:");
scanf("%s",&st[i].name);
printf("\t语文成绩:");
scanf("%d",&st[i].mark.china);
printf("\t英语成绩:");
scanf("%d",&st[i].mark.english);
printf("\t数学成绩:");
scanf("%d",&st[i].mark.math);
getchar();
printf("。。。。。。。。。。。修改成功。。。。。。。。。。。。\n"); 
write();
end:;
}

int add_up(struct info st[],int n)                     //统计学生信息 
{
int a,b,c,d,e,f;
     int i,j,max;
     float add=0.0,g=0.0;
     for(i=0;i<count-1;i++)                            //步骤:总分排序 
  {   max=i;                 
     
      for(j=i+1;j<count;j++)
      if(st[max].mark.add<st[j].mark.add)
      {
      st[99]=st[max]; st[max]=st[j]; st[j]=st[99];
}
}
     
     
      printf("\n%-10s%-15s%-10s%-10s%-10s%-10s%-10s\n",
"学生学号","学生姓名","语文","英语","数学","总分","名次");
max=1;
     for(i=0;i<count;i++)
    {
printf("\n%-10d%-15s%-10d%-10d%-10d%-10d%-10d\n",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,st[i].mark.math,st[i].mark.add,max++);
    }

     for(i=0;i<count;i++)                                                           //步骤:统计平均分 
     add=st[i].mark.china+add;
     aver[0]=add/count;
     
add=0;
     for(i=0;i<count;i++)
     add+=st[i].mark.english;
     aver[1]=add/count;
     
     add=0;
     for(i=0;i<count;i++)
     add+=st[i].mark.math;
     aver[2]=add/count;
     

printf("             平均分:  \t%-10.2f%-10.2f%-10.2f\n",aver[0],aver[1],aver[2]) ;   
 
 
for(i=0;i<count;i++)                                              //步骤: 统计各科挂科率 
{if(st[i].mark.china<60)  g++; } guake[0]=(g/count)*100;
g=0;
for(i=0;i<count;i++)
{if(st[i].mark.english<60)  g++; } guake[1]=(g/count)*100;
g=0;
for(i=0;i<count;i++)
{if(st[i].mark.math<60)  g++; }   guake[2]=(g/count)*100;

 
printf("             挂科率:  \t%-10.2f%-10.2f%-10.2f\n",guake[0],guake[1],guake[2]) ; 
 
printf("\n\n各科状元郎:\n");
printf("\n%-10s%-15s%-15s%-10s\n","状元科目","分数","姓名","学号");
                          
      a=0;                 
      for(j=1;j<count;j++)                                               //步骤: 通过打雷法寻最高分 
      if(st[a].mark.china<st[j].mark.china) a=j;
       
  b=0;                 
      for(j=1;j<count;j++)
      if(st[b].mark.english<st[j].mark.english)
      {
          b=j;
}
 
  c=0;                 
      for(j=1;j<count;j++)
      if(st[c].mark.math<st[j].mark.math)
      {
          c=j;
}

printf("%-10s%-15d%-15s%-10d \n","语文",st[a].mark.china,st[a].name,st[a].num);
     printf("%-10s%-15d%-15s%-10d \n","英语",st[b].mark.english,st[b].name,st[b].num);
     printf("%-10s%-15d%-15s%-10d \n","数学",st[c].mark.math,st[c].name,st[c].num);
                         
     return i;
}

int del(struct info st[],int n)                 //删除学生信息 
{
int num,i;
printf("\n\n%-10s%-15s%-10s%-10s%-10s%-10s\n",
"学生学号","学生姓名","语文","英语","数学","总分");
for(i=0;i<count;i++)
{
printf("\n%-10d%-15s%-10d%-10d%-10d%-10d\n",st[i].num,st[i].name,st[i].mark.china,st[i].mark.english,
st[i].mark.math,st[i].mark.add);   
}
printf("\n\n请输入需要删除信息的学号:");
scanf("%d",&num);
for(i=0;i<count;i++)
{
if(num==st[i].num) break;
if(i==count-1) {printf("删除失败~未发现学号%d\n",num);goto end;}
}
for(;i<count-1;i++)
{
st[i]=st[i+1];
}
count--;
printf("。。。。。。。。。。。删除成功。。。。。。。。。。。。\n"); 
write();
     end:
    return i;

}

C语言学生管理系统完善版的更多相关文章

  1. 模拟斗地主和学生管理系统 IO 版

    1.模拟斗地主 public class PlayCards { public static void main(String[] args) { String[] color = {"黑桃 ...

  2. C语言学生管理系统

    想练习一下链表,所以就有了这个用C写的学生管理系统 没有把它写入文件,才不是因为我懒哈哈哈,主要是为了练习链表的 #include<stdio.h> #include<stdlib. ...

  3. C语言学生管理系统(增进版)

    在原版上进行改进,主要改进的功能有. 1.利用atof:将字符串转换为浮点型: 利用atoi:将字符串转换为整型: 原文地址:http://www.cnblogs.com/sddai/p/577412 ...

  4. C语言学生管理系统(C语言课程设计/精简版)

    #include<stdio.h>#include<stdlib.h>#include<windows.h>#include<conio.h>typed ...

  5. C语言学生管理系统(原版本)(自编)

    /*系统特色:(大牛勿笑) *颜色提示 *文字提示 *功能 */ #include <stdio.h> #include <stdlib.h> #include <mat ...

  6. C语言学生管理系统源码分享

    大家好 我就是如假包换的...陈玲 自从运营了C语言程序设计微信公众号 很多粉丝都给我备注 ...奇葩 实在是不敢当 也被人开始叫玲玲姐 我知道 很多人都想看我出境 我本人也有 年多的舞台演讲训练 实 ...

  7. Java小例子(学习整理)-----学生管理系统-控制台版

    1.功能介绍: 首先,这个小案例没有使用数据库,用集合的形式暂时保存数据,做测试! 功能: 增加学生信息 删除学生信息 修改学生信息 查询学生信息:  按照学号(精确查询)  按照姓名(模糊查询) 打 ...

  8. Java 简化版学生管理系统(IO版)

    Student management system   学生管理系统IO版 详细知识点可参考一下几篇文章 常用API Java 之ArrayList集合及应用 Java 之IO流及应用 Compreh ...

  9. python开发的学生管理系统

    python开发的学生管理系统(基础版) #定义一个函数,显示可以使用的功能列表给用户 def showInfo(): print("-"*30) print(" 学生管 ...

随机推荐

  1. VsCode从零开始配置一个属于自己的Vue开发环境

    vscode vue VsCode算是比较热门的一个代码编辑器了,全名Visual Studio Code下载地址:点我去下载插件众多,功能齐全,我在平常开发过程中都是用的它,整理了些自认好用的插件, ...

  2. 一文搞懂 Elasticsearch 之 Mapping

    这篇文章主要介绍 Mapping.Dynamic Mapping 以及 ElasticSearch 是如何自动判断字段的类型,同时介绍 Mapping 的相关参数设置. 首先来看下什么是 Mappin ...

  3. 【Weiss】【第03章】练习3.20:中缀表达式转后缀表达式

    [练习3.20] a.编写一个程序将中缀表达式转换为后缀表达式,该中缀表达式含括号及四则运算. b.把幂操作符添加到你的指令系统中去. c.编写一个程序将后缀表达式转化为中缀表达式. Answer: ...

  4. 聊一聊 React 中的 CSS 样式方案

    和 Angular,Vue 不同,React 并没有如何在 React 中书写样式的官方方案,依靠的是社区众多的方案.社区中提供的方案有很多,例如 CSS Modules,styled-compone ...

  5. 一道值得思考的fork()面试题

    程序如下,判断输出多少个'_' ./a.out int main(){ ; i < ; ++i){ fork(); printf("_"); } } 熟悉fork的话,这里很 ...

  6. IdentityServer4实现.Net Core API接口权限认证(快速入门)

    什么是IdentityServer4 官方解释:IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现. 通俗 ...

  7. vue-element框架通过blob进行后端token权限验证下载

    在项目中,后端要求下载时要进行后端的权限验证,发现a链接进行直接下载无法满足这个需求,只能通过blob对象来进行下载操作,翻阅大量资料最后实现该功能.以下是我个人的理解,如有不足,请各位大佬多指教 / ...

  8. asp.net core系列 76 Apollo 快速安装模式下填坑和ASP.NetCore结合使用

    前言:由于公司占时没有运维,出于微服务的需要,Apollo只能先装在windows 阿里云上跑起来,由于环境及网络等问题,在安装过程中遇到很多坑,算是一个个坑填完后,最终实现. 一. java jdk ...

  9. hdu1732 Pushbox bfs 细节比较多,需要注意

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1732/ 题目就是推箱子游戏,有三个箱子和三个洞,最终目标状态就是三个箱子到三个洞中,所以我们搜索的状态就是人的位 ...

  10. 接口自动化框架pyface详细介绍

    版权说明 本框架系本人结合一些实践经验和开源框架设计思想,在家基于兴趣爱好独立完成的代码开发. 源码只保存在私人电脑,办公电脑上无.github开源与公司无关,先把关系撇清,不涉及侵权. 嘘. 框架定 ...