| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1600 人关注过本帖, 1 人收藏
标题:C语言学生管理系统完整版,高手飞过!望对初学者有用!
取消只看楼主 加入收藏
々NARUTO
Rank: 2
等 级:论坛游民
帖 子:80
专家分:85
注 册:2011-6-19
结帖率:77.78%
收藏(1)
 问题点数:0 回复次数:2 
C语言学生管理系统完整版,高手飞过!望对初学者有用!
先谢谢 论坛的同志帮我找到错误 不晓得为什么 自己总是很难发现自己的一些错误!!!
另附上 我写的时候遇到错误的 地址:https://bbs.bccn.net/thread-404963-1-1.html  
好了 废话 不说把 源码 和工程放上.
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//设置个全局变量 用于在不同选择不同层次时显示不同的菜单
//定义一个 OBJ结构体 用于表示学生科目成绩
typedef struct OBJ                            
{
    float math;
    float english;
    float chinese;
}OBJ,* POBJ;
//定义一个 STU结构体 用于表示学生的信息
typedef struct STUDENT
{
    int number;            //学号
    char name[40];         //姓名
    char sex;              //性别
    OBJ object;            //科目

    struct STUDENT* pNext; //指向下一个
}STU,* PSTU;

PSTU Create();                                                   //创建学生的数据
FILE* OpenFile(char Get_Choose,char* filename);  //新建 打开 文件的函数
PSTU LoadFile(FILE* file,PSTU pHead);                       //读取文件
void SaveFile(FILE* file,PSTU pHead);                       //保存文件 第一个参数为要保存到哪个文件 第二个为要保存的数据
void View(PSTU pHead);                           //浏览学生信息
void Sort(PSTU pHead);                           //排序
void CopyData(PSTU p1,const PSTU p2);            //复制数据  将P2的值复制进P1中 不过指向的pNext不变
bool Find(PSTU pHead);                           //查找学生信息
bool Insert(PSTU pHead,int pos);           //插入学生信息  第一个参数是要插入的头节点所指向的链表结构 第二个是要插入的位置
bool Delete(PSTU pHead,int pos);                 //删除学生信息  从第几个位置开始删除pos个位置的学生信息
int  GetLength(PSTU);                          //得到链表长度
//PSTU CleanUpList(PSTU pHead);                  //清空链表中的数据  
/*
各函数 调用测试......................... 
*/
int main()
{
    system("cls");
    system("color a");
    FILE* file=NULL;                                 
    PSTU pHead=NULL;
    char choose;
    char filename[40]="";
    //加入后缀名.dat   
_RETURN_1:   
    while(printf("新建(N)\\打开(O)\\退出(Q):"),choose=getchar())
    {
        choose=toupper(choose);
        while(getchar()!='\n')
            continue;
        if ('N'==choose)
        {
            printf("文件名:");
            scanf("%s",filename);
            while(getchar()!='\n')
                continue;
            if (file!=NULL)
            {
                fclose(file);
            }
            file=OpenFile(choose,filename);
            pHead=LoadFile(file,pHead);
            pHead=Create();

            while(printf("保存文件(S) 浏览数据(V) 排序(P) 查找数据(F) 插入(I) 删除(D) 统计学生数量(N) 上一级菜单(R)\n退出(Q)\n"),choose=getchar())
            {
                choose=toupper(choose);
                while(getchar()!='\n')
                    continue;
                switch(choose)
                {
                case 'S':
                    SaveFile(file,pHead);
                    break;
                case 'F':
                    if (!Find(pHead))
                    {
                        printf("无结果\n");
                    }
                    break;
                case 'V':
                    View(pHead);
                    break;
                case 'P':
                    Sort(pHead);
                    break;
                case 'I':
                    if(!Insert(pHead,0))
                        printf("插入失败\n");
                    break;
                case 'D':
                    if (!Delete(pHead,0))
                        printf("删除失败\n");
                    break;
                case 'N':
                     printf("共有%d个学生的数据\n",GetLength(pHead));
                    break;
                case 'R':
                    goto _RETURN_1;
                    break;
                case 'Q':
                    printf("感谢您的使用\n");
                    if (file!=NULL)
                    {
                        fclose(file);
                    }               
                    exit(1);
                    break;
                default:
                    printf("输入错误请,重新输入\n");
                    continue;
                }
            }
        }
        else if ('O'==choose)
        {
            printf("文件名:");
            scanf("%s",filename);
            while(getchar()!='\n')
                continue;
            if (file!=NULL)
            {
                fclose(file);
            }
            file=OpenFile(choose,filename);
            pHead=LoadFile(file,pHead);
            while(printf("保存文件(S) 浏览数据(V) 排序(P) 查找数据(F) 插入(I) 删除(D) 统计学生数量(N)\n上一级菜单(R)\n退出(Q)\n"),choose=getchar())
            {
                choose=toupper(choose);
               
                while(getchar()!='\n')
                    continue;
                switch(choose)
                {
                case 'S':
                    SaveFile(file,pHead);
                    break;
                case 'F':
                    if (!Find(pHead))
                    {
                        printf("无结果\n");
                    }
                    break;
                case 'V':
                    View(pHead);
                    break;
                case 'P':
                    Sort(pHead);
                    break;
                case 'I':
                    if(!Insert(pHead,0))
                        printf("插入失败\n");
                    break;
                case 'D':
                    if (!Delete(pHead,0))
                        printf("删除失败\n");
                    break;
                case 'N':
                    printf("共有%d个学生的数据\n",GetLength(pHead));
                    break;
                case 'R':
                    goto _RETURN_1;
                    break;
                case 'Q':
                    printf("感谢您的使用\n");
                    if (file!=NULL)
                    {
                        fclose(file);
                    }               
                    exit(1);
                    break;
                default:
                    printf("输入错误请,重新输入\n");
                    continue;
                }
            }
        }
        else if ('Q'==choose)
        {
            break;
        }
        else
        {
            printf("输入错误 重新输入\n");
            continue;
        }
    }
    printf("感谢您的使用\n");
    if (file!=NULL)
    {
        fclose(file);
    }
    return 0;
}
FILE* OpenFile(char Get_Choose,char* filename)
{
    FILE* file=NULL;
    Get_Choose=toupper(Get_Choose);
                                            //加入后缀名.dat
      
    char mode[4];
    if ('N'==Get_Choose)
    {
        strcpy(mode,"wb+");
    }
    else if ('O'==Get_Choose)
    {
        strcpy(mode,"rb+");
    }
    else
    {
        return NULL;
    }
    file = fopen(filename,mode);
    return file;
}
PSTU Create()
{
    PSTU pHead=NULL;
    PSTU p=NULL,pNew=NULL;
    int n=0;            //要创建的个数
    int number;         //学号
    float grade=0.0f;   //保存成绩
    char name[40];      //姓名
    char sex;           //性别

    pHead=(PSTU)malloc(sizeof(STU));         //创建头结点
    pHead->pNext=NULL;                      
    p=pHead;
    printf("请输入您要创建的学生信息个数:");
    scanf("%d",&n);
    for (int index=0;index<n;index++)
    {
        pNew=(PSTU)malloc(sizeof(STU));
        printf("请输入第%d个学生学号:",index+1);
        scanf("%d",&number);
        pNew->number=number;
        printf("请输入第%d个学生姓名:",index+1);
        scanf("%s",name);
        while(getchar()!='\n')
            continue;
        strcpy(pNew->name,name);
INPUT_ERROR_B:   
        printf("请输入第%d个学生性别 男(B)女(G)",index+1);
        scanf("%c",&sex);
        sex=toupper(sex);
        if (sex!='B'&&sex!='G')
        {
            printf("输入错误,请重新输入\n");
            goto INPUT_ERROR_B;
        }
        pNew->sex=sex;
        printf("请输入第%d个学生的数学成绩:",index+1);
        scanf("%f",&grade);
        pNew->object.math=grade;
        printf("请输入第%d个学生的英语成绩:",index+1);
        scanf("%f",&grade);
        pNew->object.english=grade;
        printf("请输入第%d个学生的语文成绩:",index+1);
        scanf("%f",&grade);
        while(getchar()!='\n')
            continue;
        pNew->object.chinese=grade;
        p->pNext=pNew;
        p=p->pNext;
        pNew->pNext=NULL;
    }
    return pHead;
}
PSTU LoadFile(FILE* file,PSTU pHead)
{
    PSTU p=NULL;
    PSTU pSave=NULL;
    int index=0;
    int length=0;

    fread(&length,sizeof(int),1,file);                  //这里读取后 为什么为0?
    if (NULL==file||0==length)
    {
        return NULL;
    }
    if (NULL!=pHead)
    {
        for (p=pHead,index=0;p!=NULL;p=pSave)
        {
            pSave=p->pNext;
            free(p);
        }
    }
    pHead=(PSTU)malloc(sizeof(STU));
    pHead->pNext=NULL;
    p=pHead;

    PSTU pNew=(PSTU)malloc(sizeof(STU));
    pNew->pNext=NULL;

    index=0;
    while(fread(pNew,sizeof(STU),1,file),pNew!=NULL&&index<length)
    {
            index++;
            p->pNext=pNew;
            p=pNew;
            pNew=(PSTU)malloc(sizeof(STU));
   
    }
    return pHead;
}
void SaveFile(FILE* file,PSTU pHead)
{
    PSTU p;
    int length=0;
    if (file!=NULL)
    {
        length=GetLength(pHead->pNext);

        fwrite(&length,sizeof(int),1,file);
        for (p=pHead->pNext;p!=NULL;p=p->pNext)
        {
            fwrite(p,sizeof(STU),1,file);
        }
        fflush(file);
    }
    return;
}
void View(PSTU pHead)
{
    float sum;
    if (NULL==pHead||NULL==pHead->pNext)
    {
        printf("数据为空,无法浏览\n");
        return;
    }
    PSTU p=pHead->pNext;
    while(p!=NULL)
    {
        sum=p->object.math+p->object.english+p->object.chinese;
        printf("\n学号:%d 姓名:%s 性别:%s\n",p->number,p->name,p->sex=='B'?"":"");
        printf("数学:%.1f 英语%.1f 语文%.1f\n",p->object.math,p->object.english,p->object.chinese);
        printf("总分:%.1f 平均分:%.1f\n\n",sum,sum/3);
        p=p->pNext;
    }
    return;
}
void Sort(PSTU pHead)
{
    char ch;
    PSTU p;
    PSTU q;
    PSTU y=(PSTU)malloc(sizeof(STU));
    float p_sum,q_sum;

INPUT_ERROR_C:   
    printf("请问您要按 总成绩(P) 学号(X):");
    ch=getchar();
    while(getchar()!='\n')
        continue;
    ch=toupper(ch);
    if (ch!='X'&&ch!='P')
    {
        printf("输入错误,请重新输入\n");
        goto INPUT_ERROR_C;
    }
    if ('X'==ch)
    {
        for (p=pHead->pNext;p!=NULL;p=p->pNext)
        {
            for (q=p->pNext;q!=NULL;q=q->pNext)
            {
                if((p->number)>(q->number))
                {
                    CopyData(y,p);
                    CopyData(p,q);
                    CopyData(q,y);
                }
            }
        }
    }
    else
    {
        for (p=pHead->pNext;p!=NULL;p=p->pNext)
        {
            for (q=p->pNext;q!=NULL;q=q->pNext)
            {
                p_sum=p->object.math+p->object.english+p->object.chinese;
                q_sum=q->object.math+q->object.english+q->object.chinese;
                if(p_sum<=q_sum)
                {
                    CopyData(y,p);
                    CopyData(p,q);
                    CopyData(q,y);
                }
            }
        }
    }
    return;
}
void CopyData(PSTU p1,const PSTU p2)       //复制数据  pNext不变
{
    PSTU pNext;
    pNext=p1->pNext;
    *p1=*p2;
    p1->pNext=pNext;

    return;
}
bool Find(PSTU pHead)                    //查找
{
    bool isHave=false;
    PSTU p=pHead;
    char ch;
    char name[40];
    int number;
    char sex;
    float sum;
INPUT_ERROR_D:
    printf("查找方式\n学号(X) 姓名(N) 性别(S)\n");
    ch=getchar();
    while(getchar()!='\n')
        continue;
    ch=toupper(ch);

    if ('X'==ch)
    {
        printf("学号:");
        scanf("%d",&number);
    }
    else if ('N'==ch)
    {
        printf("姓名:");
        scanf("%s",name);
    }
    else if ('S'==ch)
    {   
        printf("性别 男(B) 女(G):");
        sex=getchar();
        sex=toupper(sex);
    }
    else
    {
        printf("输如错误,请重新输入\n");
        goto INPUT_ERROR_D;
    }
    while(getchar()!='\n')
        continue;
    for (p=pHead->pNext;p!=NULL;p=p->pNext)
    {
        sum=p->object.math+p->object.english+p->object.chinese;
        if ('X'==ch)
        {
            if (number==p->number)
            {
                isHave=true;
                printf("\n学号:%d 姓名:%s 性别:%s\n",p->number,p->name,p->sex=='B'?"":"");
                printf("数学:%.1f 英语%.1f 语文%.1f\n",p->object.math,p->object.english,p->object.chinese);
                printf("总分:%.1f 平均分:%.1f\n\n",sum,sum/3);
            }
        }
        else if ('N'==ch)
        {
            if (strcmp(name,p->name)==0)
            {
                printf("\n学号:%d 姓名:%s 性别:%s\n",p->number,p->name,p->sex=='B'?"":"");
                printf("数学:%.1f 英语%.1f 语文%.1f\n",p->object.math,p->object.english,p->object.chinese);
                printf("总分:%.1f 平均分:%.1f\n\n",sum,sum/3);
            }   
            isHave=true;
        }
        else if ('S'==ch)
        {   
            if (sex==p->sex)
            {
                printf("\n学号:%d 姓名:%s 性别:%s\n",p->number,p->name,p->sex=='B'?"":"");
                printf("数学:%.1f 英语%.1f 语文%.1f\n",p->object.math,p->object.english,p->object.chinese);
                printf("总分:%.1f 平均分:%.1f\n\n",sum,sum/3);
            }
            isHave=true;
        }
    }
    return isHave;
}                
bool Insert(PSTU pHead,int pos)             //之前的位置插入
{
    int number;
    char name[40];
    char sex;
    float grade;
    int index=0;
    PSTU p=pHead,pNew=NULL;
    printf("您要在第几个学生前面插入:");
    scanf("%d",&pos);
    for (index=0;index<pos-1;index++)
    {
        p=p->pNext;
    }
    if (NULL==p||pos<1)
    {
        return false;
    }

    pNew=(PSTU)malloc(sizeof(STU));
    printf("请输入插入学生的学号:",index+1);
    scanf("%d",&number);
    pNew->number=number;
    printf("请输入插入学生的姓名:",index+1);
    scanf("%s",name);
    while(getchar()!='\n')
        continue;
    strcpy(pNew->name,name);
INPUT_ERROR_D:
    printf("请输入插入学生的性别 男(B)女(G)",index+1);
    scanf("%c",&sex);
    sex=toupper(sex);
    if (sex!='B'&&sex!='G')
    {
        printf("输入错误,请重新输入\n");
        goto INPUT_ERROR_D;
    }
    pNew->sex=sex;
    printf("请输入插入学生的数学成绩:");
    scanf("%f",&grade);
    pNew->object.math=grade;
    printf("请输入插入学生的英语成绩:");
    scanf("%f",&grade);
    pNew->object.english=grade;
    printf("请输入插入学生的语文成绩:");
    scanf("%f",&grade);
    pNew->object.chinese=grade;
   
    while(getchar()!='\n')
        continue;
   
    pNew->pNext=p->pNext;
    p->pNext=pNew;
    return true;
}     
bool Delete(PSTU pHead,int pos)               //删除数据
{
    PSTU p=pHead;
    PSTU pSave=NULL;
    int index=0;
   
    pSave=(PSTU)malloc(sizeof(STU));
    printf("您要删除第几个学生的数据:");
    scanf("%d",&pos);
    while(getchar()!='\n')
        continue;
    for (index=0;index<pos-1;index++)
    {
        p=p->pNext;
    }
    if (NULL==p||pos<1||NULL==pSave)
    {
        return false;
    }
    pSave=p->pNext;
    p->pNext=pSave->pNext;
    free(pSave);
    return true;
}
int GetLength(PSTU p)                         //利用递归  求出  长度
{
    if (p!=NULL)
    {
        return 1+GetLength(p->pNext);
    }
    return 0;
}

学生管理系统.rar (45.22 KB)


[ 本帖最后由 々NARUTO 于 2013-4-20 17:53 编辑 ]
搜索更多相关主题的帖子: 管理系统 完整版 C语言 
2013-04-20 17:48
々NARUTO
Rank: 2
等 级:论坛游民
帖 子:80
专家分:85
注 册:2011-6-19
收藏
得分:0 
回复 4楼 yctchxf
你自己 仔细看代码啊  
逗号表达式哇,其目的 是为了 让 输出菜单 和得到选择 无限进行 !!!!!!!!!!!
按q  不分大小写 均可退出!!!!!!!!!!
2013-04-20 18:34
々NARUTO
Rank: 2
等 级:论坛游民
帖 子:80
专家分:85
注 册:2011-6-19
收藏
得分:0 
回复 11楼 czzdcn123
真是初学者 额 ,不过 我重学了一遍C  ,,看完 一本 C的书  再学点链表的知识 就能写出来的  功能实现都不难!
2013-04-22 19:29
快速回复:C语言学生管理系统完整版,高手飞过!望对初学者有用!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064105 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved