c语言一个简易的学生管理系统(课程作业)

一、实验目的:

  1. 掌握线性表的逻辑结果和存储结构特点;
  2. 掌握线性表的基本操作,如建立、查找、插入和删除等。

二、 问题描述

创建一个班级学生信息表,包含“学号、姓名、性别、成绩”等信息。具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据学号进行查找,返回此学生的学号和成绩;
(4) 给定一个学生信息,插入到表中指定的位置;
(5) 删除指定位置的学生记录;

三、数据结构设计(选用的数据元素逻辑结构和存储结构实现形式说明)

(1)逻辑结构设计 :采用的线性结构,主要通过线性表实现各元素之间一对一的关系

(2)存储结构设计 :采用顺序存储结构,顺序存储结构较为方便,直接在空间开辟一处存储空间存放数据,创建顺序表较简单,但是在插入和删除时效率明显较低。

四、算法设计

1、头文件

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>

2、宏定义

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100	//顺序表可能达到的最大长度

typedef int Status;	//Status 是函数返回值类型,其值是函数结果状态代码。

3、结构体

typedef struct
{
    char name[50];
    char num[50];
    int mark;
	char genger[50];
} student;
typedef student ElemType;
typedef struct
{
    ElemType* elem;	//存储空间的基地址
    int length;	    //当前长度
} studentList;
Status InitList(studentList* bl) 	  //顺序表的初始化
{
    //构造一个空的顺序表L
    bl->elem = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
   
    if (!bl->elem)
        exit(OVERFLOW);		//存储分配失败
    bl->length = 0;	  //空表长度为0
    return OK;
}

4、各子函数说明

1、信息输入

采用的C语言程序设计,因此直接用的scanf函数进行输入

void input(ElemType* e)
{
    printf("学生姓名:");
    scanf("%s", e->name);
    printf("学生学号:");
    scanf("%s", e->num);
	printf("性别:");
    scanf("%s", &e->genger);
    printf("学生成绩:");
    scanf("%d", &e->mark);
    printf("***OK***\n\n");
}
2、信息输出

直接打印结构体里面的内容

void output(ElemType* e)
{
	printf("学生姓名:%-10s 学生学号:%-10s  性别:%-10s 学生成绩:%-10d\n\n", e->name, e->num, e->genger,e->mark);
}
3、表的查找

引用到结构体里面,将要查找的名字与所存储的名字进行对比,最后返回名字的位置

int LocateElem_Sq(studentList* bl, ElemType e) 	//顺序表的查找
{
    //顺序表的查找
    int i;
    for (i = 0; i < bl->length; i++)
        if (!strcmp(bl->elem[i].name, e.num))
            return i + 1;
    return 0;
}
4、表的插入

首先将插入位置以及之后的元素全部后移(保证开辟空间足够),表长加1
再将所要插入的元素放置于插入位置

Status InsertElem(studentList* bl, int i, ElemType e)      //顺序表的插入
{
    //在顺序表L中第i个位置之前插入新的元素e
    int k;
    if (i<1 || i>bl->length + 1)
        return ERROR;	
    if (bl->length == MAXSIZE)
        return ERROR;	 
    for (k = bl->length - 1; k >= i - 1; k--)
        bl->elem[k + 1] = bl->elem[k];	//插入位置及之后的元素后移
    bl->elem[i - 1] = e;	 //将新元素e放入第i个位置
    ++bl->length;									//表长增1
    return OK;
}
5、表的删除

引入表之后,应当明确要删除的位置信息,先查找要删除的学生,删除之后应该将后面的学生向前移,最后表长减1

Status DeleteElem(studentList* bl, char* i, char* e)      //顺序表的删除
{
    int k = 0;
    while (k < bl->length && strcmp(bl->elem[k].name, i))
        k++;
    if (k != bl->length)
    {
        strcpy(e, bl->elem[k].name);
        for (; k <= bl->length; k++)
            bl->elem[k] = bl->elem[k + 1];
    }
    else
        return ERROR;
    --bl->length;	//表长减1
    return OK;
}
6、主菜单

此处无需赘述

void menu()
{
    printf("主菜单:\n");
    printf("  1.建立顺序表             ");printf("2.输入学生信息\n");
    printf("  3.查找                   ");printf("4.插入\n");
    printf("  5.删除                   ");printf("6.输出学生信息\n");
    printf("  7.退出\n\n");
}

5、主函数

int main()
{
    studentList bl;
    int i, temp, a, choice, x;
    ElemType b, e;
    char res[20], c[10];
    menu();
    choice = -1;
    while (choice != 7)
    {
        printf("请选择功能:");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:        //创建顺序表
            if (InitList(&bl))
                printf("成功建立顺序表\n\n");
            else
                printf("顺序表建立失败\n\n");
            break;
        case 2:
            printf("学生数量:");
            scanf("%d", &x);
            for (i=0;i<x;i++)
            {
                printf("第%d个:\n", i + 1);
                input(&bl.elem[i]);
            }
            bl.length=x;
            putchar('\n');
            break;
        case 3:		//顺序表的查找
            printf("请输入所要查找的学生姓名:");
            scanf("%s", e.num);
            temp = LocateElem_Sq(&bl, e);
            if (temp != 0)
            {
                printf("该学生信息如下:\n");
                output(&bl.elem[temp - 1]);
            }
            else
                printf("查找失败!\n\n");
            break;
        case 4:		//顺序表的插入
            printf("请输入一个数,代表插入的位置:");
            scanf("%d", &a);
            printf("请输入所要插入学生信息:\n");
            printf("学生姓名:");
            scanf("%s", b.name);
            printf("学生学号:");
            scanf("%s", b.num);
			printf("性别:");
            scanf("%s", b.genger);
            printf("学生成绩:");
            scanf("%d", &b.mark);
            if (InsertElem(&bl, a, b))
                printf("插入成功.\n\n");
            else
                printf("插入失败.\n\n");
            break;
        case 5:		//顺序表的删除
            printf("请输入所要删除的学生姓名:");
            scanf("%s", c);
            if (DeleteElem(&bl, c, res))
                printf("删除成功.");
            else
                printf("删除失败.\n\n");
            break;
        case 6:		//顺序表的输出
            printf("当前学生总数为:%d\n", bl.length);
            printf("当前顺序表为:\n");
            for (i = 0; i < bl.length; i++)
                output(&bl.elem[i]);
            printf("\n");
            break;
        case 7:
            printf("********************************END************************************\n");
            break;
        }
    }
    return 0;
}

五、结论

经过了多次调式,其中几次是因为缺少预编译头,也出现过输出的汉字出现乱码现象,通过多次改进解决了问题。同时在调试过程中,也出现了多出语法问题,后面进行了一一改正。在调试过程中出现中断的现象,在经过分析和探讨之后发现,是由于没有建立顺序表就开始输入信息,导致程序停止运行。
在输入相关学生信息之后,能够正确输出。插入,删除,查找功能也能正常执行。
有何问题可联系QQ:2745498610与我探讨 !后续会上传整个工程文档至云盘。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值