欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c语言简易学生管理系统

程序员文章站 2022-07-14 18:35:25
...

刚刚写好了一个c语言简易学生管理系统,写个博客,来整理一下自己的收获,话不多说,直接来先写一下这个管理系统的整体需求。
整体需求:编写一个学生管理系统,实现对学生信息的,新建,输出,修改,查询,按平均成绩排序等功能
1、学生信息包括:学号,姓名,计算机成绩,英语成绩,数学成绩,平均成绩。
2、查询按学号查找。
我是分成4个头文件,和一个主函数来写的。下面是第一个头文件:

#include<stdio.h>
#include<string.h>
typedef struct
{
   int number;
    char name[10];
    int computer,english,math;
    double average;
}Student;

这是第一个头文件只是简单的定义了一个学生的结构体包含需要的学生信息。

extern Count;
//创建学生
void CreateStudent(Student S[])
{
    int i=0;
    //这里添加一个do while循环判断输入的数据是否正确。
    do
    {
        if(i>0)
        {
            printf("输入数据有误,请重新输入\n");
        }
    printf("请输入学号:");
    scanf("%d",&S[Count].number);
    printf("请输入名字:");
    getchar();
    scanf("%s",&S[Count].name);
    printf("请输入计算机成绩:");
    scanf("%d",&S[Count].computer);
    printf("请输入英语成绩:");
    scanf("%d",&S[Count].english);
    printf("请输入数学成绩:");
    scanf("%d",&S[Count].math);
    i++;
    }while(S[Count].english>100||S[Count].computer>100||S[Count].math>100||S[Count].english<0||S[Count].computer<0||S[Count].math<0); 
    //注意这里要除以3.0不然得到的是整数,不是小数
    S[Count].average=(S[Count].computer+S[Count].english+S[Count].math)/3.0;
    printf("添加成功\n");
    printf("\n");
}

//输出学生
void OutStudent(Student  S[])
{
    int i;
    if(Count==0)
    {
        /*这里如果不这么写,没有添加学生时输出结构体数组的第一个结构体
        并不会不输出而是会随机赋值,输出的全部为随机值。
        */
        printf("未找到学生,请先添加。\n");
    }
    else
    for(i=0;i<=Count;i++)
    {
        printf("第%d名学生的学号为:%d\n",i+1,S[i].number);
        printf("第%d名学生的名字为:%s\n",i+1,S[i].name);
        printf("第%d名学生的计算机成绩为%d\n",i+1,S[i].computer);
        printf("第%d名学生的英语成绩为:%d\n",i+1,S[i].english);
        printf("第%d名学生的数学成绩为:%d\n",i+1,S[i].math);
        printf("第%d名学生的平均成绩为:%f\n",i+1,S[i].average);
        printf("\n");

    }
}

这里是实现了创建学生和输出学生信息的函数操作,其实这里我最初陷入一个误区,误以为数组作为形参是写需要传入指针才能影响到实参,后来才知道数组名作为参数传递的话,传递的是数组的首地址,也就是说这里的形参的值是会改变是实参的值的。

extern Count;
//按照平均成绩排序
void Sort(Student S[])
{
    int i,j;
    Student temp;
    if(Count<0)
    {
        printf("没有学生,排序失败。");
        printf("\n");
    }

    if(Count==0)
    {
        printf("排序成功\n");
        printf("\n");
    }
    else
    {
         for( i=0;i<Count;i++)
    {
        for(j=1;j<=Count;j++)
        {
        if(S[i].average>S[j].average)
        {
            temp=S[j];
            S[j]=S[i];
           S[i]=temp;
        }
        }
    }
    printf("排序成功\n");
    printf("\n");
    }


}

这里是实现了按照平均成绩排序的操作,就是简单地比较然后排序。

extern Count;
//查找学生
void Search(Student S[])
{
    int id;
    printf("请输入要查找学生的学号:");
    scanf("%d",&id);
    int i=0;
    for(;i<=Count;i++)
    {
        if(S[i].number==id)
        {
             printf("查找的第%d名学生的学号为:%d\n",i+1,S[i].number);
             printf("查找的第%d名学生的名字为:%s\n",i+1,S[i].name);
             printf("查找的第%d名学生的计算机成绩为:%d\n",i+1,S[i].computer);
             printf("查找的第%d名学生的英语成绩为:%d\n",i+1,S[i].english);
             printf("查找的第%d名学生的数学成绩为:%d\n",i+1,S[i].math);
             printf("查找的第%d名学生的平均成绩为:%f\n",i+1,S[i].average);
             printf("\n");
        }
        else
        {
            printf("查找的学生不存在,请检查是否输入错误?\n");
            printf("\n");
        }
    }
}
//修改学生
void modify(Student S[])
{
     int id;
    printf("请输入要修改学生的学号:");
    scanf("%d",&id);
    int i=0;
    int n;
    for(;i<=Count;i++)
    {
        if(S[i].number==id)
        {
             printf("查找的第%d名学生的学号为:%d\n",i+1,S[i].number);
             printf("查找的第%d名学生的名字为:%s\n",i+1,S[i].name);
             printf("查找的第%d名学生的计算机成绩为:%d\n",i+1,S[i].computer);
             printf("查找的第%d名学生的英语成绩为:%d\n",i+1,S[i].english);
             printf("查找的第%d名学生的数学成绩为:%d\n",i+1,S[i].math);
             printf("查找的第%d名学生的平均成绩为:%f\n",i+1,S[i].average);
             while(1)
    {
        int m=0;
        printf("输入1:修改计算机成绩\n");
        printf("输入2:修改英语成绩\n");
        printf("输入3:修改数学成绩\n");
        printf("输入0:退出\n");
        printf("请输入要执行的操作:\n");
        scanf("%d",&n);
        switch(n)
        {
            case 1:
                do
                {
                    if(m>0)
                        printf("输入数据有误,请重新输入\n");
                     printf("请输入计算机成绩:\n");
               scanf("%d",&S[i].computer);
               m++;
                }while(S[i].computer>100||S[i].computer<0);
               break;

            case 2:
                  do
                {
                    if(m>0)
                        printf("输入数据有误,请重新输入\n");
                 printf("请输入英语成绩:\n");
               scanf("%d",&S[i].english);
                 m++;
                }while(S[i].english>100||S[i].english<0);
               break;

            case 3:
                 do
                {
                    if(m>0)
                        printf("输入数据有误,请重新输入\n");
                 printf("请输入数学成绩:\n");
               scanf("%d",&S[i].math);
                 m++;
                }while(S[i].math>100||S[i].math<0);
               break;

            case 0:
                break;
        }
        if(n==0)
            break;
    }
    S[i].average=(S[i].computer+S[i].english+S[i].math)/3.0;
    printf("修改成功。\n");
    printf("\n");

        }
        else
        {
            printf("查找的学生不存在,请检查是否输入错误?\n");
            printf("\n");
        }
    }
}

这里实现的是队学生的查找和修改操作,也是这个管理程序算是最复杂的操作,这里修改学生先查找到学生,然后运用菜单的方式选择要修改的成绩,同时运用了do while 循环判断输入的数据是否合理。

#include <student.h>
#include <createstudent.h>
#include<sort.h>
#include<serch_modify.h>
int Count=0;
int main(void)
{
    Student S[50];
    int n;
      while(1)
    {
        printf("输入1:添加学生\n");
        printf("输入2:显示学生信息\n");
        printf("输入3:查找学生\n");
        printf("输入4:修改学生成绩\n");
        printf("输入5:学生按照平均成绩排序\n");
        printf("输入0:退出\n");
        printf("请输入要执行的操作:\n");
        scanf("%d",&n);
        switch(n)
        {
            case 1:
               CreateStudent(S);
               Count++;
               break;

            case 2:
                OutStudent(S);
               break;

            case 3:
                Search(S);
               break;

            case 4:
                modify(S);
                break;

                case 5:
                Sort(S);
                break;

                case 0:
                break;
        }
        if(n==0)
            break;
    }
    return 1;
}

最后是整个程序的主函数,前面的头文件顺序是与上面的代码顺序对应的,这里就是简单地运用了一个菜单选择的方式,也没有什么东西。

  **至此,这个程序大概花了4,5个小时终于写了出来,写的还有很多不足,也算是对自己这段时间的学习的一个检测,这个程序我学到了以下几点:
  1、数组名作为参数传递的话,传递的是数组的首地址,形参的值是会改变是实参的值的。
  2、可以运用do while循环来判断输入的数据是否合理
  3、因为是第一次使用code:blocks对这个软件的使用也算是有了一个初步的认识。**