第十八周--学生成绩管理

问题及代码:

/*2015,烟台大学计算机与控制工程学院
    *作者:张瑞蕾
    *完成日期:2015年12月28日

*/

#ifndef TOU_H_INCLUDED
#define TOU_H_INCLUDED

typedef struct STUDENT
{
char studentNumber[10];/*学生学号*/
char studentName[20];/*学生姓名*/
char className[20];/*班级名称*/
char yearName[20];/*学期名称*/
float mark1;/*第1门成绩*/
float mark2;/*第2门成绩*/
float mark3;/*第3门成绩*/
struct STUDENT *next;
}STUDENT;


#endif // TOU_H_INCLUDED

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
#include "tou.h"
#include <string>
#include "stdlib.h"
#include <windows.h>

STUDENT *headLink;//链表表头指针

void ReadInfoFormFile(void);//w读文件
void DesplayMenu(void);//主界面
void CreateHeadLink(void);//建立链表
STUDENT *MallocNode(void);//创建节点
void GetInformation(STUDENT *t);//获取学生信息
void OutputInformation(void);//输出学生信息
void DesplayInfoBystudentNumber(void);//按姓名输出信息
void DesplayOneNode(STUDENT *t);//输出一个节点
void InsertOneNode(STUDENT *t);//插入一个节点
void DeleteNodeBystudentNumber(void);//按学号删除节点
void ChangeMarkByName(void);//按姓名修改
void ChangeMarkByNumber(void);//按学号修改
void SaveLinkToFile(void);//保存文件
void DesplayMarkSegment(void);//打印分数
void CompositorByTotalMark(void);//最终结果

int choose;/*用于接受用户的选择*/

int main()
{
    system("color 7D");
    int h,flag1,flag2;
    char name[20]="zhang",password[10]="2222";
    char person[20],password1[10];
    printf("\t\t      欢迎进入学生成绩管理系统!       \n\n");
    printf("\t\t\t         用户登录: \n\n");
    for(h=0; h!=5;)
    {
        printf("\t\t\t\t   用户名:");
        gets(person);
        flag1=strcmp(person,name);
        printf("\t\t\t\t   密码:");
        gets(password1);
        flag2=strcmp(password,password1);
        if(flag1==0&&flag2==0)
        {

            printf("\t\t\t\t     登陆成功 !\n\n");
            break;
        }
        else
        {
            printf("\t\t\t        用户名或密码错误!\n\n");
            printf("\t\t\t        请注意:您还剩%d次机会 !\n\n",4-h);
        }
    }
    if(h==5)
        printf("对不起,您输入的用户名或密码有误,已被强制退出。\n");
    CreateHeadLink();
    ReadInfoFormFile();
    CreateHeadLink();
    ReadInfoFormFile();
    DesplayMenu();

}



void ReadInfoFormFile(void)// 函数功能:从文件中读学生信息到链表中
{
    FILE *fp;
    STUDENT *p;
    fp=fopen("student.txt","r");
    if(!fp)
    {
        printf("文件不存在\n");
        return;
    }
    p=MallocNode();
    while
    (fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0)
    {
        InsertOneNode(p);
        p=MallocNode();
    }
    fclose(fp);
}

//函数功能:显示菜单,根据用户的输入 完成相应的功能
void DesplayMenu(void)
{
    system("cls");
    STUDENT *p;
    printf("**********&***********&*************\n\n");
    printf("***********请选择相应功能***********\n\n");
    printf(" 1 依据班级顺序输出学生成绩单         \n");
    printf(" 2 学号查询成绩                   \n");
    printf(" 3 增加学生                     \n");
    printf(" 4 删除学生                     \n");
    printf(" 5 按姓名修改学生成绩           \n");
    printf(" 6 按学号修改学生成绩           \n");
    printf(" 7 保存所有学生信息到文件中     \n");
    printf(" 8 显示不及格学生成绩           \n");
    printf(" 9 以平均成绩排序并输出学生信息 \n");
    printf(" 10 退出                        \n\n");
    printf("**********&***********&**************\n\n");
    printf("-----------请输入你的选择,Enter确定\n");
    scanf("%d",&choose);//取得用户的选择
    switch(choose)
    {
    case 1:
        OutputInformation();//显示所有学生的信息
        break;
    case 2:
        DesplayInfoBystudentNumber();
        break;
    case 3:
        p=MallocNode();//先申请一个新结点
        GetInformation(p);//要求用户输入信息到新结点中
        InsertOneNode(p);//将新结点加到链表中
        break;
    case 4:
        DeleteNodeBystudentNumber();//根据用户输入的学号删除该学生
        break;
    case 5:
        ChangeMarkByName();//根据用户输入的姓名修改学生成绩
        break;
    case 6:
        ChangeMarkByNumber();//根据用户输入的学号修改学生成绩
        break;
    case 7:
        SaveLinkToFile();//保存数据
        break;
    case 8:
        DesplayMarkSegment();//显示不及格的学生成绩
        break;
    case 9:
        CompositorByTotalMark();//按平均成绩排序
        break;
    case 10:
        SaveLinkToFile();//保存数据后再退出
        free(headLink);
        return ;
        break;
    default:
        break;
    }

    DesplayMenu();//递归调用 执行完上面的命令之后重新打印一下。
}

void CreateHeadLink(void)//函数功能:建立链表表头
{
    STUDENT *p;
    p=(STUDENT*)malloc(sizeof(STUDENT));
    headLink=p;
    p->next=NULL;
}

STUDENT *MallocNode(void)//函数功能:申请一个新结点,并将其初始化
{
    STUDENT *p;
    int i;
    p=(STUDENT*)malloc(sizeof(STUDENT));
    if(p==NULL) return NULL;
    for(i=0; i<10; i++)
        p->studentNumber[i]='\0';
    for(i=0; i<20; i++)
        p->studentName[i]='\0';
    for(i=0; i<20; i++)
        p->className[i]='\0';
    p->mark1=0.0;
    p->mark2=0.0;
    p->mark3=0.0;
    p->next=NULL;
//数据初始化,保证不用的时候是0
    return p;
}

void GetInformation(STUDENT *t)//函数功能:取得用户输入的学生信息
{
    printf("请输入学号:\n");
    scanf("%s",t->studentNumber);
    printf("请输入姓名:\n");
    scanf("%s",t->studentName);
    printf("请输入该生所在班级:\n");
    scanf("%s",t->className);
    printf("请输入成绩1:\n");
    scanf("%f",&(t->mark1));
    printf("请输入成绩2:\n");
    scanf("%f",&(t->mark2));
    printf("请输入成绩3:\n");
    scanf("%f",&(t->mark3));
    getch();
}

void InsertOneNode(STUDENT *t)//在链表的结尾处增加一个结点
{
    STUDENT *p;
    p=headLink;
    while(p->next)
    {
        p=p->next;
    }
    p->next=t;//遍历链表,尾插法,知道P的下一位是空,p的下一位是t
}

void DesplayInfoBystudentNumber(void)//函数功能:根据用户输入的学生学号显示该学生的信息
{
    system("cls");
    STUDENT *p;
    char studentNumber[20];
    char flag=0;
    p=headLink->next;
    printf("请输入学生学号:\n");
    scanf("%s",studentNumber);
    while(p)
    {
        if(strcmp(p->studentNumber,studentNumber)==0)
        {
            printf("学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\n");
            DesplayOneNode(p);
            flag=1;

            break;

        }
        p=p->next;
    }
    if(!flag)
        printf("对不起,不存在学号为 %s 的学生\n",studentNumber);
    getch();
}

void DesplayOneNode(STUDENT *t)//函数功能:输出一个结点的信息
{
    // system("cls");
    printf("%s\t",t->studentNumber);
    printf("%s\t",t->studentName);
    printf("%s\t",t->className);
    printf("%.2f\t",t->mark1);
    printf("%.2f\t",t->mark2);
    printf("%.2f\t",t->mark3);
    printf("%.2f\t",t->mark1+t->mark2+t->mark3);
    printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3)/3);

}

void DeleteNodeBystudentNumber(void)//函数功能:根据用户输入的学号删除该学生
{
    system("cls");
    char studentNumber[10];
    STUDENT *p,*q;
    char flag=0;
    printf("请输入要删除的学生学号:");
    scanf("%s",studentNumber);
    p=headLink;
    q=headLink->next;
    while(q)
    {
        if(strcmp(q->studentNumber,studentNumber)==0)
        {
            p->next=q->next;
            free(q);
            flag=1;
            break;
        }
        p=p->next;
        q=q->next;
    }
    if(!flag)
    {

        printf("不存在该学号的学生\n");
        getch();
        return;
    }
    printf("成功删除\n");
    getch();
}

void OutputInformation(void)//函数功能:显示所有学生的信息
{
    system("cls");
    STUDENT *p;
    p=headLink->next;
    if(p==NULL)
    {
        printf("现在没有该学生信息,请先输入学生信息\n\n");
        getch();
        return;
    }
    printf("学号\t姓名\t班级\t高数\t英语\t体育\t总成绩\t平均成绩\n\n");
    while(p)
    {
        DesplayOneNode(p);
        p=p->next;
    }
    getch();
}

void ChangeMarkByName(void)//函数功能:根据输入的姓名修改成绩
{
    system("cls");
    STUDENT *p;
    int a;
    char studentName[20];
    char flag=0;
    float mark1,mark2,mark3;
    p=headLink->next;
    /*printf("请输入学生班级:\n");
    scanf("%d",&a);*/
    printf("请输入学生姓名:\n");
    scanf("%s",studentName);
    while(p)
    {
        if(strcmp(p->studentName,studentName)==0)
        {
            printf("请输入新的成绩1:\n");
            scanf("%f",&mark1);
            printf("请输入新的成绩2:\n");
            scanf("%f",&mark2);
            printf("请输入新的成绩3:\n");
            scanf("%f",&mark3);
            p->mark1=mark1;
            p->mark2=mark2;
            p->mark3=mark3;
            flag=1;

            printf("修改成功\n");
            break;
        }
        p=p->next;
    }
    if(!flag)
        printf("对不起,不存在姓名为 %s 的学生\n",studentName);
    getch();
}

//函数功能:根据输入的学期修改成绩
void ChangeMarkByNumber(void)
{
    system("cls");
    STUDENT *p;
    int b;
    char studentNumber[20];
    char flag=0;
    float mark1,mark2,mark3;
    p=headLink->next;
    /*printf("请输入学生所在学期:\n");
    scanf("%d",&b);*/
    printf("请输入学生学号:\n");
    scanf("%s",studentNumber);
    while(p)
    {
        if(strcmp(p->studentNumber,studentNumber)==0)
        {
            printf("请输入新的成绩1:\n");
            scanf("%f",&mark1);
            printf("请输入新的成绩2:\n");
            scanf("%f",&mark2);
            printf("请输入新的成绩3:\n");
            scanf("%f",&mark3);
            p->mark1=mark1;
            p->mark2=mark2;
            p->mark3=mark3;
            flag=1;
            printf("修改成功\n");
            break;

        }
        p=p->next;
    }
    if(!flag)
        printf("对不起,不存在学号为 %s 的学生\n",studentNumber);
    getch();

}

void SaveLinkToFile(void)//函数功能:保存链表数据到文件中
{
    system("cls");
    STUDENT *p;
    FILE *fp;
    p=headLink->next;
    if(p==NULL)
    {
        printf("现在没有学生信息,请先输入学生信息\n\n");
        getch();
        return;
    }
    fp=fopen("student.txt","w+");
    if(!fp)
    {
        printf("文件不存在\n");
        getch();
        return;
    }
    while(p)
    {
        fprintf(fp,"%s %s %s %f %f %f\n",p->studentNumber,p->studentName,p->className,p->mark1,p->mark2,p->mark3);
        p=p->next;
    }
    fclose(fp);
}

void DesplayMarkSegment(void)//函数功能:不及格学生成绩
{
    system("cls");
    STUDENT *p;
    int count=0;
    p=headLink->next;
    printf("60分以下(不及格)的学生成绩如下:\n");
    printf("学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\n");
    while(p)
    {
        if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))//只要有一科不及格就认为该生不及格
        {


            count++;
            DesplayOneNode(p);
        }
        p=p->next;
    }
    printf("不及格的学生一共有%d人\n",count);
    printf("下一次要加油喽!");
    getch();
}


void CompositorByTotalMark(void)//函数功能:按平均成绩排序
{
    system("cls");
    STUDENT exchange,*r,*p,*q;
    r=headLink->next;
    if(r==NULL)
    {
        printf("现在还没学生信息,请先输入学生信息\n");
        getch();
        return;
    }
    while(r)//两层while循环实现排序
    {
        p=r;
        q=r->next;
        while(q)
        {
            if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3))
            {
                strcpy(exchange.studentNumber,q->studentNumber);//先复制q结点信息到exchange
                strcpy(exchange.studentName,q->studentName);
                strcpy(exchange.className,q->className);//C语言风格字符串,用strcpy来交换    类似3个数交换
                exchange.mark1=q->mark1;
                exchange.mark2=q->mark2;
                exchange.mark3=q->mark3;//  字符可以直接交换
                strcpy(q->studentNumber,p->studentNumber);//再复制p结点信息到q
                strcpy(q->studentName,p->studentName);
                strcpy(q->className,p->className);
                q->mark1=p->mark1;
                q->mark2=p->mark2;
                q->mark3=p->mark3;
                strcpy(p->studentNumber,exchange.studentNumber);//最后复制exchange结点信息到p
                strcpy(p->studentName,exchange.studentName);

                strcpy(p->className,exchange.className);
                p->mark1=exchange.mark1;
                p->mark2=exchange.mark2;
                p->mark3=exchange.mark3;
            }
            q=q->next;
        }
        r=r->next;
    }
    OutputInformation();
}
运行结果:











学习心得:

  已是学期末,这是数据结构这节课发的最后的博文了,还是希望要做到最完美的句号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
旋转变压器---数字转换器作为现代伺服系统中被广泛使用的角位置测量系统,大量应用于高精度及大中型数控系统、机器人控制、工业控制、武器火力控制及惯性导航领域中。 传统的角测量系统面临的问题有:体积、重量、功耗偏大,调试、误差补偿试验复杂,费用较高。本文从微型化、智能化的方向进行研究,是解决传统角测量系统所面临问题的好途径。 本文所研究的旋转变压器---数字转换器是由信号调理模块、系统芯片C8051F064和输出控制模块组成的。整个系统的三路输入信号为X=AsinOcosar、Y=Acosθcos ot和Z=Ucosar(基准信号),输出信号为偏转角θ,输出形式为16 位数字量。信号调理模块是由模拟电路组成的,包括信号输入电路、相敏整流电路、滤波电路和直流稳压电源电路,其难点在于相敏整流电路的设计。信号调理模块的主要功能是把输入的交流信号X=AsinOcosor、Y=Acosθcosot转变成直流信号Bsinθ和Bcosθ,并使输出的直流信号在0~2.4V之间;系统芯片C8051F064是CYGNAL公司近年来推出的一款功能齐全的完全集成的混合信号片上系统型单片机。在本文所设计的系统中,系统芯片的输入信号为直流信号Bsinθ和Bcosθ,通过片内自带的2个16位A/D转换器对输入信号的数据进行采样和转换,并对转换完的数据进行滤波处理,以减小由于外界干扰而产生的误差,再用除法和反正切函数解算出偏转角θ的16位数字量;输出控制模块主要完成的功能是通过UARTO向计算机实时发送由单片机计算出来的偏转角度0的16位数字量,而串口的RS-232电平与单片机系统采用的是TTL电平之间的转换所采用的转换芯片是MC1488和MC1489。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值