| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 1119 人关注过本帖
标题:求大佬一个学生成绩管理系统(顺序表算法实现)【求助】
只看楼主 加入收藏
Batters
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-6-27
结帖率:100%
  已结贴   问题点数:20  回复次数:8   
求大佬一个学生成绩管理系统(顺序表算法实现)【求助】
第一:系统简介
      对学生的成绩进行合理的保管、加工、分析等管理
  第二:基本要求
(1)    正确定义信息结构
       学生信息:学号、姓名、班级、成绩(每个学期每门学科成绩)、总分等
(2)建立一个初始信息表 :至少含有三条初始信息
(3)功能
     A 成绩的登录
     B 成绩查询(可以按多个字段查询建立二级菜单)
     C 成绩修改
     D 成绩删除
     E 成绩各项统计(个人总分,不及格科目、排序等建立二级菜单)
(4)友好的界面,信息的输出尽可能带标题及简单的表格线
2018-06-27 09:55
pengzhanggui
Rank: 5Rank: 5
等 级:职业侠客
威 望:8
帖 子:160
专家分:344
注 册:2015-7-20
  得分:0 
哈哈,你这样求助一般都是要收费的

来找我试试看
2018-06-27 14:58
goldAilie18
Rank: 2
等 级:论坛游民
帖 子:21
专家分:20
注 册:2018-6-27
  得分:20 
回复 楼主 Batters

//头文件内容
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 3
typedef struct student
{
    char no[11];
    char name[15];
    float score[N];
    float sum;
    float average;
    int order;
} STUDENT;
/*函数声明*/
int input (STUDENT*stud,int n);
void print(STUDENT*stud,int n);
void sort(STUDENT*stud,int n);
void search(STUDENT*stud,int n);
int insert(STUDENT*stud,int n);
int Delete(STUDENT*stud,int n);
void filewrite(STUDENT*stud,int n);
int fileread(STUDENT*stud);
void swap(STUDENT *studl,STUDENT *stud2);
int fileRead(STUDENT *stud);
void fileWrite(STUDENT *student,int n);
//菜单选择模块
int menu_select()//菜单选择模块
{
    char s[3];
    int c;
    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 ("         * * * * * * * * * * * * * * * * * * *\n\n");
    do
    {
        printf ("     请选择操作(1-9): ");
        scanf ("%s",s);
        c=atoi(s);
    }
    while (c<0||c>9); //选择项不在0-9之间,则重输
    return (c);//返回选择项,主程序根据该值调用相应的函数
}
int main()//主函数
{
    int n=0;
    STUDENT student[20];//定义结构数组
    for (;;)//无限循环
    {
        switch (menu_select())//调用主菜单函数,返回值整数作开关语句的条件
        {
        case 1:
            n=input (student,n);
            break;//新建记录
        case 2:
            print(student,n);
            break;//显示记录
        case 3:
            sort(student,n);
            break;//排序记录
        case 4:
            search(student,n);
            break;//查找记录
        case 5:
            n=insert(student,n);
            break;//插入记录
        case 6:
            n=Delete(student,n);
            break;//删除记录
        case 7:
            fileWrite(student,n);
            break;//记录保存到文件
        case 8:
            n=fileRead(student);
            break;//读文件
        case 9:
            exit(0);//程序结束
        }
    }
    return 0;
}
//输入记录文件
int input(STUDENT*stud,int n)//录入学生记录的模块
{
    int i,j;
    float s;
    char sign;
    i=0;
    while (sign!='n'&&sign!='N')
    {
        printf("\n请按如下提示输入相关信息。\n\n");
        printf("输入学号:");
        scanf("%s",stud[n+i].name);//输入学号
        printf("输入姓名:");
        scanf("%s",stud[n+i].name);//输入姓名
        printf("输入%d个成绩:\n",N);//总分s,初值为0
        s=0;
        for(j=0; j<N; j++) //输入N门成绩,需要循环N次
        {
            do
            {
                printf ("score[%d]:",j+1);//提示输入第几门成绩
                scanf("%f",&stud[n+i].score[j]);//输入成绩
                if (stud[n+i].score[j]>100||stud[n+i].score[j]<0)
                    printf ("非法数据,请重新输入!\n");//确保成绩在0-100之间
            }
            while (stud[n+i].score[j]>100||stud[n+i].score[j]<0);
            s=s+stud[n+i].score[j];//累加各门成绩
        }
        stud[n+i].sum=s;//将总分保存
        stud[n+i].average=(float)s/N;//求出平均值
        stud[n+i].order=0;//未排名次前此值为0
        printf("该学生的总分为:%4.2f\n\t平均分为:%4.2f\n",stud[n+i].sum,stud[n+i].average);
        printf("====>提示:继续添加记录?(Y/N)");
        getchar();/*把键盘缓冲区前面输入的回车键给读掉,不然后面sign读的是回车符*/
        scanf("%c",&sign);
        i++;
    }
    return(n+i);
}
//显示记录文件
void print(STUDENT*stud,int n)

{
    int i=0;
    if(n==0)
    {
        printf("\n很遗憾,空表中没有任何记录可供显示!\n");

    }
    else
    {
        printf("* * * * * * * * * * STUDENT * * * * * * * * * \n");
        printf("记录号 学号 姓名 成绩1 成绩2 成绩3 总分 平均分 名次\n");
        printf("- - - - - - - - - - - - - - - - - - - - - - - - - -\n");
        while (i<n)
        {
            printf("%-4d %-11s %-15s %5.2f %7.2f %7.2f %9.2f %6.2f %3d\n",i+1,
                   stud[i].no,stud[i].name,stud[i].score[0],stud[i].score[1],
                   stud[i].score[2],stud[i].sum,stud[i].average,stud[i].order);
            i++;
        }
        printf("* * * * * * * * * * * * * * * * * * * * * * * * * * \n\n");
    }
}
//记录排序文件
void swap(STUDENT *stud1,STUDENT *stud2)
{
    int i;
    char temp1[15];
    float temp2;
    float temp3;
    strcpy(temp1,stud1->no);
    strcpy(stud1->no,stud2->no);
    strcpy(stud2->no,temp1);
    strcpy(temp1,stud1->name);
    strcpy(stud1->name,stud2->name);
    strcpy(stud2->name,temp1);
    for (i=0; i=3; i++)
    {
        temp2=stud1->score[i];
        stud1->score[i]=stud2->score[i];
        stud2->score[i]=temp2;
    }
    temp3=stud1->sum;
    stud1->sum=stud2->sum;
    stud2->sum=temp3;
    temp3=stud1->average;
    stud1->average=stud2->average;
    stud2->average=temp3;
}
void sort_sum(STUDENT *stud,int n)
{
    int i,j;
    int maxPosition;
    for (i=0; i<n-1; i++)
    {
        maxPosition=i;
        for(j=i+1; j<n; j++)
        {
            if(stud[j].sum>stud[maxPosition].sum)
            {
                maxPosition=j;
            }
        }
        if(maxPosition!=i)
        {
            swap(&stud[i],&stud[maxPosition]);
        }
    }
    i=0;
    while(i<n)
    {
        stud[i].order=i+1;
        i++;
    }
    printf("按总分从高到低排名成功!!!\n");
}
void sort_no(STUDENT *stud,int n)
{
    int i,j;
    int minNoPosition;
    for(i=0; i<n-1; i++)
    {
        minNoPosition=i;
        for(j=i+1; j<n; j++)
        {
            if(atoi(stud[j].no)<atoi(stud[minNoPosition].no))
            {
                minNoPosition=j;
            }
        }
        if(minNoPosition!=1)
        {
            swap(&stud[i],&stud[minNoPosition]);
        }
    }
    printf("按学号从低到高排序成功!!!\n");
}
void sort(STUDENT *stud,int n)
{
    char s[3];
    int c;
    printf("\n  ********排序菜单*******\n");
    printf("            1.按学号排序\n");
    printf("            2.按总分排序\n");
    printf("    *********************\n\n");
    do
    {
        printf("请选择操作(1-2):");
        scanf("%s",s);
        c=atoi(s);
    }
    while(c<0||c>2);
    switch(c)
    {
    case 1:
        sort_no(stud,n);
        break;
    case 2:
        sort_sum(stud,n);
        break;
    }
}

//查找记录文件
void search(STUDENT*stud,int n)
{
    int i=0;
    char s[15];
    printf("请输入您要查找的学生姓名:\n");
    scanf("%s",s);
    while(i<n&&strcmp(stud[i].name,s))
    {
        i++;
    }
    if(i==n)
        printf("\n您要查找的是%s,很遗憾,查无此人!\n",s);
    else
    {
        printf("* * * * * * * * * *  Found  * * * * * * * * * * * \n");
        printf(" 学号 姓名 成绩1 成绩2 成绩3 总分 平均分 名次\n");
        printf("%-11s %-15s %5.2f %7.2f %7.2f %9.2f %6.2f %3d\n",
               stud[i].no,stud[i].name,stud[i].score[0],stud[i].score[1],
               stud[i].score[2],stud[i].sum,stud[i].average,stud[i].order);
        printf("* * * * * * * * * * * * * * * * * * * * * * * \n\n");
    }
}
//插入记录文件
int insert(STUDENT*stud,int n)
{
    int i=0,j;
    float s;
    int position;
    printf("请输入插入记录的位置:\n");
    scanf("%d",&position);
    while(position<0||position>n)
    {
        printf("输入的位置有误,请重新输入插入记录的位置:\n");
        scanf("%d",&position);
    }
    for(i=n-1; i>=position; i--)
    {
        strcpy(stud[i+1].no,stud[i].no);
        strcpy(stud[i+1].name,stud[i].name);
        stud[i+1].score[0]= stud[i].score[0];
        stud[i+1].score[1]= stud[i].score[1];
        stud[i+1].score[2]= stud[i].score[2];
        stud[i+1].sum= stud[i].sum;
        stud[i+1].average= stud[i].average;
        stud[i+1].order= stud[i].order;
    }
    i=position;
    printf("\n请按如下提示输入相关信息\n\n");
    printf("输入学号:");
    scanf("%s,stud[i].no");
    printf("输入姓名:");
    scanf("%s,stud[i].name");
    printf("输入%d个成绩:\n",N+1);
    s=0;
    for(j=0; j<N; j++)
    {
        do
        {
            printf("score[%d+1]:",j);
            scanf("%f",&stud[i].score[j]);
            if(stud[i].score[j]>100||stud[i].score[j]<0)
                printf("非法数据,请重新输入!\n");

        }
        while (stud[i].score[j]>100||stud[i].score[j]<0);
        s=s+stud[i].score[j];
    }

    stud[i].sum =s;
    stud[i].average=(float)s/N;
    stud[i].order=0;
    printf("\n已经在位置%d成功插入新记录!\n",position);
    return n+1;
}
//删除记录文件
int Delete (STUDENT*stud,int n)
{
    int i=0;
    char k[5];
    char s[15];
    printf("请输入学生的姓名:");
    scanf("%s,s");
    while(i<n&&strcmp(stud[i].name,s))
    {
        i++;
    }
    if(i==0)
        printf("\n您要删除的是%s,很遗憾,查无此人!\n",s);
    else
    {
        printf("* * * * * * * * * * Found * * * * * * * * * *\n");
        printf(" 学号 姓名 成绩1 成绩2 成绩3 总分 平均分 名次\n");
        printf("- - - - - - - - - - - - - - - - - - - - - - - - - -\n");
        printf("%-11s %-15s %5.2f %7.2f %7.2f %9.2f %6.2f %3d\n",
               stud[i].no,stud[i].name,stud[i].score[0],stud[i].score[1],
               stud[i].score[2],stud[i].sum,stud[i].average,stud[i].order);
        printf("* * * * * * * * * * * * * * * * * * * * * * \n");
        do
        {
            printf("您确定要删除此纪录吗?(y/n):");
            scanf("%s",k);
        }
        while(k[0]!='y'&&k[0]!='n');
        if(k[0]!='n')
        {
            for(; i<n; i++)
            {
                strcpy(stud[i].no,stud[i+1].no);
                strcpy(stud[i].name,stud[i+1].name);
                stud[i].score[0]= stud[i+1].score[0];
                stud[i].score[1]= stud[i+1].score[1];
                stud[i].score[2]= stud[i+1].score[2];
                stud[i].sum= stud[i+1].sum;
                stud[i].average= stud[i+1].average;
                stud[i].order= stud[i+1].order-1;
            }
            printf("\n已经成功删除姓名为%s的学生的记录!\n",s);
        }
    }
    return n-1;
}
//记录存储与导入文件
void fileWrite(STUDENT*stud,int n)/*保存数据到文件的函数模块*/
{
    FILE*fp;//定义指向文件的指针
    int i=0;
    char outfile[20];
    printf("请输入导出文件名,例如:G\\f1\\score.txt:\n");
    scanf("%s",outfile);
    if((fp=fopen(outfile,"wb"))==NULL);/*为输出打开一个二进制文件,如没有则建立*/
    {
        printf("Can not open file\n");
        exit(1);
    }
    while (i<n)
    {
        fwrite(&stud[i],sizeof(STUDENT),1,fp);/*写入一条记录*/
        i++;
    }
    fclose(fp);//关闭文件
    printf("---所有记录已经成功保存至文件%s中!---\n",outfile);
}
int fileRead(STUDENT *stud)/*从文件导入记录的函数模块*/
{
    int i;
    FILE *fp;//定义指向文件的指针
    char infile[20];
    printf ("请输入导入文件名,例如:G\\f1\\score.txt:\n");
    scanf("%s",infile);//输入文件名
    if((fp=fopen(infile,"rb"))==NULL)/*打开一个二进制文件,为读方式*/
    {
        printf("文件打开失败!\n");
        return 0;
    }
    i=0;
    while(!feof(fp))/*循环读数据直到文件尾结束*/
    {
        if(1!=fread(&stud[i],sizeof(STUDENT),1,fp))
            break;/*如果没读到数据,跳出循环*/
        i++;
    }
    fclose(fp);
    printf("已经成功从文件%s导入数据!!!\n",infile);
    return i;
}
自己根据你所要的版块进行修改删减
2018-06-28 09:54
goldAilie18
Rank: 2
等 级:论坛游民
帖 子:21
专家分:20
注 册:2018-6-27
  得分:0 
回复 2楼 pengzhanggui
来我的帖子看看我的问题?挑战一下?
2018-06-28 09:55
pengzhanggui
Rank: 5Rank: 5
等 级:职业侠客
威 望:8
帖 子:160
专家分:344
注 册:2015-7-20
  得分:0 
回复 4楼 goldAilie18
可以啊

来找我试试看
2018-06-28 12:34
goldAilie18
Rank: 2
等 级:论坛游民
帖 子:21
专家分:20
注 册:2018-6-27
  得分:0 
回复 5楼 pengzhanggui
为何久久没有等到你的代码?哈哈
2018-06-28 16:05
Batters
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-6-27
  得分:0 
回复 3楼 goldAilie18
谢谢。

[此贴子已经被作者于2018-6-28 20:17编辑过]

2018-06-28 18:52
轻松糯米
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2018-5-9
  得分:0 
硬核回答
2018-07-13 13:29
md00000000
Rank: 2
等 级:论坛游民
帖 子:37
专家分:54
注 册:2017-6-22
  得分:0 
回复 3楼 goldAilie18
哇哇哇
C++的代码发到Cs板块里来
2018-09-04 22:51







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

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