学生管理系统

数据结构课程--学习鹏哥通讯录代码

其中为xitong.h

#define _CRT_SECURE_NO_WARNINGS    //可以将scanf进行使用,不用scanf_s
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>      //显示错误,如果出错 则显示其后面的语句
#include<string.h>
#include<assert.h>    //本程序中用来检查信息是否为空,为空则终止程序
#include<windows.h>  //使用光标

#define MAX 20  
#define NAME 20
#define SEX 10
#define Size 2
#define Dest 3

//学生信息的录入:包括学号、姓名、性别、年龄、专业、班级等。
typedef struct PeoInfo{       //利用typedef将struct PeoInfo 转换为PeoInfo
    char xuehao[MAX];  //学号
    char name[NAME];   //姓名
    char sex[SEX];     //性别
    int age;          //年龄
    char zhuangye[MAX];   //专业
    int class;   // 班级
    int Chinese; //语文
    int Math;    //数学
    int English;  //英语
    int otherclass;  //其它课程
}PeoInfo;

typedef struct Zhuti
{
    PeoInfo* data;    
    int count;    //栈顶
    int capacity;  //容量
}Zhuti;

int InitZhuti(Zhuti* pc);  //初始化
void AddZhuti(Zhuti* pc);  //添加学生信息
void DelZhuti(Zhuti* pc);  //删除学生信息
void SearchZhuti(Zhuti* pc);  //搜索学生信息
void ShowZhuti(Zhuti* pc);     //显示学生信息
void ModifyZhuti(Zhuti* pc);   //修改学生信息
void SortZhuti(Zhuti* pc);     //对学生信息排序
void ScoreZhuti(Zhuti* pc);    //对学生分析排序
void Destory(Zhuti* pc);       //结束信息
void SaveZhuti(const Zhuti* pc);  //保存学生信息
void LoadZhuti(Zhuti* pc);     //将学生信息放在文本中

zhuti.c代码

#define CRT_SECURE_NO_WARNINGS 
#include"xitong.h"     //引用头文件中的库函数

void gotoxy(int x, int y)
{
    COORD p;//定义结构体变量p
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//获取当前函数句柄
    p.X = x;//将光标移动位置传递给结构体
    p.Y = y;
    SetConsoleCursorPosition(handle, p);//移动光标
}
void menu()   //目录
{
    gotoxy(45, 10);
    printf("----------------------------------\n");
    gotoxy(45, 11);
    printf("------------学生管理系统----------\n");
    gotoxy(45, 12);
    printf("------------1.录入学生信息--------\n"); 
    gotoxy(45, 13);
    printf("------------2.删除学生信息--------\n");    
    gotoxy(45, 14);
    printf("------------3.搜索学生信息--------\n");    
    gotoxy(45, 15);
    printf("------------4.展现学生信息--------\n");    
    gotoxy(45, 16);
    printf("------------5.修改学生信息--------\n");    
    gotoxy(45, 17);
    printf("------------6.将学生信息排序------\n");   
    gotoxy(45, 18);
    printf("------------7.学生成绩记录--------\n"); 
    gotoxy(45, 19);
    printf("------------0.退出系统------------\n");    
    gotoxy(45, 20);
    printf("----------------------------------\n");
}

enum option   //使用枚举排序
{
    Exit,
    Add,
    Del,
    Search,
    Show,
    Modify,
    Sort,
    Score,
};

int main()
{
    int input = 0;
    Zhuti uti;
    InitZhuti(&uti);   //初始化栈
    do
    {
        menu();
        gotoxy(45, 20);
        printf("请输入功能序号");
        scanf("%d",&input);
        system("cls");
        switch (input)
        {
        case Add:
            AddZhuti(&uti);
            break;
        case Del:
            DelZhuti(&uti); 
            break;
        case Search:
            SearchZhuti(&uti);
            break;
        case Show:
            ShowZhuti(&uti);
            break;
        case Modify:
            ModifyZhuti(&uti);
            break;
        case Sort:
            SortZhuti(&uti); 
            break;
        case Score:
            ScoreZhuti(&uti);
            break;
        case Exit:
            SaveZhuti(&uti); 
            Destory(&uti); 
            break;
        default:
            printf("输入错误");
            break;
        }
    } while (input);
    return 0;
}

gonnen.c

#define CRT_SECURE_NO_WARNINGS 
#include"xitong.h"

void CheckCapition(Zhuti* pc)
{
    if (pc->count == pc->capacity)    
    {            //重新调整之前的内存块大小加2
        PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + Size) * sizeof(PeoInfo)); 
        if (ptr == NULL)
        {
            printf("%s\n", strerror(errno));
            return;
        }
        else {
            pc->data = ptr;    //扩容后放到指针指向的信息中
            pc->capacity += Size;
            printf("增容成功\n");
        }
    }
}
void LoadZhuti(Zhuti* pc)
{
    FILE* pfRead = fopen("zhuti.txt", "rb");   //打开其文本
    if (pfRead == NULL)
    {
        perror("LoadZhuti");
        return;
    }
    PeoInfo tmp = { 0 };
    while (fread(&tmp, sizeof(PeoInfo), 1, pfRead) == 1)  //读取文件显示数据,从pfRead输入流到到其指向指针读取sizeof(PeoInfo)次
    {
        CheckCapition(pc);   //扩容
        pc->data[pc->count] = tmp;     //读取后的数据转移到数组信息中
        pc->count++;   //一个一个转移
    }
    fclose(pfRead);   //关闭文本
    pfRead = NULL;   
}
//动态版本
int InitZhuti(Zhuti* pc)
{
    assert(pc);
    pc->count = 0;
    pc->data = (PeoInfo*)calloc(Dest, sizeof(PeoInfo));    //分配内存空间,将其初始化为零,返回其指针
    if (pc->data == NULL)     //判断分配是否成功
    {
        printf("%s\n", strerror(errno));
        return 1;
    }
    pc->capacity = Dest;   //将容量设定为3
    LoadZhuti(pc);  
    return 0;
}

//动态的版本
void AddZhuti(Zhuti* pc)
{
    assert(pc);
    //增容
    CheckCapition(pc);

    printf("输入学生学号:\n");
    scanf("%s",pc->data[pc->count].xuehao); 
    printf("请输入姓名:\n");
    scanf("%s",pc->data[pc->count].name);  //pc->count 代表为零输入在data的姓名信息中
    printf("请输入年龄:\n");
    scanf("%d",&(pc->data[pc->count].age));  //&是因为姓名是数组,本身数组名就是地址,而age是int,需要&地址名的引用
    printf("请输入性别:\n");
    scanf("%s",pc->data[pc->count].sex);
    printf("请输入专业:\n");
    scanf("%s",pc->data[pc->count].zhuangye);
    printf("请输入班级:\n");
    scanf("%d",&(pc->data[pc->count].class));
    printf("请输入语文成绩:\n");
    scanf("%d", &(pc->data[pc->count].Chinese));
    printf("请输入数学成绩:\n");
    scanf("%d", &(pc->data[pc->count].Math));
    printf("请输入英语成绩:\n");
    scanf("%d", &(pc->data[pc->count].English));
    printf("课程的选择有:考古--1,植物学--2,海洋学--3,不想选0\n");
    scanf("%d", &(pc->data[pc->count].otherclass));
    //学生信息的录入:包括学号、姓名、性别、年龄、专业、班级等。
    pc->count++;   //栈中的数量增加一位
    printf("增加成功\n");
}

void ShowZhuti(const Zhuti* pc)
{
    assert(pc);
    int i = 0;
    printf("%-10s\t%-10s\t%-5s\t%-10s\t%-10s\t%-5s\t%-5s\t%-5s\t%-5s\t%-5s\t\n", "学号","姓名", "年龄", "性别", "专业","班级","语文","数学","英语","其他课程");
    for (i = 0; i < pc->count; i++)   //出栈
    {
        printf("%-10s\t%-10s\t%-5d\t%-10s\t%-10s\t%-5d\t%-5d\t%-5d\t%-5d\t%-5d\t\n", pc->data[i].xuehao,
            pc->data[i].name,
            pc->data[i].age,
            pc->data[i].sex,
            pc->data[i].zhuangye,
            pc->data[i].class,
            pc->data[i].Chinese,
            pc->data[i].Math,
            pc->data[i].English,
            pc->data[i].otherclass);
    }
}

static int FindByName(Zhuti* pc, char name[])   //使用static将局部变量中姓名生命周期延长
{
    assert(pc);
    int i = 0;
    for (i = 0; i < pc->count; i++)
    {
        if (strcmp(pc->data[i].name, name) == 0)   //判断输入姓名与信息中的姓名是否一致
        {
            return i;
        }
    }
    return -1;
}


void DelZhuti(Zhuti* pc)
{
    char name[NAME] = { 0 };
    assert(pc);
    int i = 0;
    if (pc->count == 0)
    {
        printf("管理系统为空,没有信息可以删除\n");
    }
    printf("请输入要删除人的姓名");
    scanf("%s",name);
    int pos = FindByName(pc, name);  //查明联系人姓名
    if (pos == -1)
    {
        printf("要删除的人不存在\n");
        return;
    }
    for (i = pos; i < pc->count - 1; i++)  //删除
    {
        pc->data[i] = pc->data[i + 1];
    }
    pc->count--;  //栈中的数据删除一位
    printf("删除成功\n");
}

void SearchZhuti(Zhuti* pc)
{
    assert(pc);
    int i = 0;
    char  name[NAME] = { 0 };
    printf("输入查找人的姓名");
    scanf("%s",&name);
    int pos = FindByName(pc, name);  //查明联系人姓名
    if (pos == -1)
    {
        printf("要查找的人不存在\n");
        return;
    }
    else {
        printf("%-10s\t%-10s\t%-5s\t%-10s\t%-10s\t%-5s\t%-5s\t%-5s\t%-5s\t%-5s\t\n", "学号", "姓名", "年龄", "性别", "专业", "班级","语文","数学","英语","其他课程");
            printf("%-10s\t%-10s\t%-5d\t%-10s\t%-10s\t%-5d\t%-5d\t%-5d\t%-5d\t%-5d\t\n", pc->data[pos].xuehao,
                pc->data[pos].name,
                pc->data[pos].age,
                pc->data[pos].sex,
                pc->data[pos].zhuangye,
                pc->data[pos].class,
                pc->data[pos].Chinese,
                pc->data[pos].Math,
                pc->data[pos].English,
                pc->data[pos].otherclass);
    }
}

void ModifyZhuti(Zhuti* pc)
{
    assert(pc);
    char  name[NAME] = { 0 };
    printf("输入修改人的姓名");
    scanf("%s",name);
    int pos = FindByName(pc, name);  //查明联系人姓名
    if (pos == -1)
    {
        printf("要修改的人不存在\n");
        return;
    }
    else
    {
        printf("请输入姓名:\n");
        scanf("%s",pc->data[pos].name);  //pc->count 代表为零输入在data的姓名信息中
        printf("请输入年龄:\n");
        scanf("%d",&(pc->data[pos].age));  //&是因为姓名是数组,本身数组名就是地址,而age是int,需要&地址名的引用
        printf("请输入性别:\n");
        scanf("%s",pc->data[pos].sex);
        printf("请输入学号:\n");
        scanf("%s",pc->data[pos].xuehao);
        printf("请输入专业:\n");
        scanf("%s",pc->data[pos].zhuangye);
        printf("请输入班级:\n");
        scanf("%d",&(pc->data[pos].class));
        printf("请输入语文成绩:\n");
        scanf("%d", &(pc->data[pos].Chinese));
        printf("请输入数学成绩:\n");
        scanf("%d", &(pc->data[pos].Math));
        printf("请输入英语成绩:\n");
        scanf("%d", &(pc->data[pos].English));
        printf("请输入其它课程:\n");
        scanf("%d", &(pc->data[pos].otherclass));
    }
    printf("修改成功");
}


int by_name(const void* e1, const void* e2)
{
    return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);    //排序方式由姓名从小到大
}
void SortZhuti(Zhuti* pc)
{
    assert(pc);
    qsort(pc->data, pc->count, sizeof(PeoInfo), by_name);   //C语言排序万能工具   数组名 元素个数,元素字节数 排序方式
    printf("排序成功,再输入4");
}

void ScoreZhuti(Zhuti* pc)
{
    assert(pc);
    char  name[NAME] = { 0 };
    printf("输入学生的姓名");
    scanf("%s", name);
    int pos = FindByName(pc, name);
    if (pos == -1)
    {
        printf("寻找的人不存在");
        return;
    }
    else {
        if(pc->data[pos].Chinese<60)
        {
            printf("该学生语文成绩差\n");
        }
        if (pc->data[pos].Math < 60)
        {
            printf("该学生数学成绩差\n");
        }
        if (pc->data[pos].English<60)
        {
            printf("该学生英语成绩差\n");
        }
        if ((pc->data[pos].Chinese + pc->data[pos].Math + pc->data[pos].English) >= 180)
        {
            printf("该学生成绩合格\n");
        }
    }
    printf("该学生分析完成\n");
}


void Destory(Zhuti* pc)
{
    assert(pc);
    free(pc->data); //将信息清空
    pc->data = NULL;    
}

void SaveZhuti(const Zhuti* pc)
{
    assert(pc);
    FILE* pfWrite = fopen("zhuti.txt", "wb");
    if (pfWrite == NULL)
    {
        perror("SaveZhuti");
        return;
    }
    int i = 0;
    for (i = 0; i < pc->count; i++)
    {
        fwrite(pc->data + i, sizeof(PeoInfo), 1, pfWrite);   //将数组中数据给定到输出流中
    }
    fclose(pfWrite);
    pfWrite = NULL;
}
设定好头文件,源文件可以运行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值