学生信息管理系统-数据结构课程设计

大一的时候自己写过一个关于学生成绩管理的程序 当时写了500多行 虽然功能多 但是 排错做的很不好 占的篇幅也多  一直不满意  这个寒假 本打算写 结果一直没动笔 昨天早上觉得没时间了 就搜集 百家姓 专业名称等 因为我想做一个 对姓名的姓氏等很多方面都有检错功能的程序  功夫不负有心人 我昨天早上一直在写  今天早上5点才睡  然后又从 2点多写到现在 终于完成  虽然没有 成绩录入功能 日后再加也好加  总之 这个程序 排错做的不赖  我写的代码可能不怎么好看 但是 我的风格就是 不喜欢 用 case 和 重复的语句  因为 该的时候要改多处   嗯   代码 如下  和 我之前的 运动会分数统计 的文章的解雇差不多  

大约 400行-不是追求代码短    而是追求代码抗错功能好

和之前的那篇 运动会分数统计效果差不多   链接:http://blog.csdn.net/zhagoodwell/article/details/53513045

排序因为用的字符串  有些问题  日后再改 并加上 成绩录入功能  最近有点忙  就这样

/*制作者 查昊昊*/  
# include <stdio.h>  
# include <stdlib.h>  
# include <string.h>  
# define N 13   // N 最小为13且为奇数  
# define SU 23  //学校 学院 专业的字数=SU/2取整 SU必为奇数且最小为23  
# define YEAR 2017  //今年的年份  
# define MAX  75 //学生的最高人数  
# define MIN  15   //学生的最低人数  
# define FIRST  2//首次录入时的学生的最少数量  
# define At(t)  t>0&&(t<'a'||t>'z')&&(t<'A'||t>'Z')
char key[21][3]={"!","。","?","《","》",",","{","}","(",")","¥","‘","’",":",";","—","”","“","、","·","~"};  
char school[20][5]={"大学","学院","华侨","校区","政法","管理","经济","科学","理工","科技","技术","职业","师范","中国","海洋","石油","分区","分校","建筑","工业"};  
char yuan[]={" 理学院 经济管理学院 计算机科学与通信工程学院"};  
char zhuanye[]={" 物联网工程 土木工程 电气工程及其自动化 "};  
char minzu[]={" 汉族 蒙古族 回族 藏族 维吾尔族 苗族 彝族 壮族 布依族 朝鲜族 满族 侗族 瑶族 白族 土家族 哈尼族 哈萨克族 傣族 黎族 傈僳族 佤族 畲族 高山族 拉祜族 水族 东乡族 纳西族 景颇族 柯尔克孜族 土族 达斡尔族 仫佬族 羌族 布朗族 撒拉族 毛南族 仡佬族 锡伯族 阿昌族 普米族 塔吉克族 怒族 乌孜别克族 俄罗斯族 鄂温克族 德昂族 保安族 裕固族 京族 塔塔尔族 独龙族 鄂伦春族 赫哲族 门巴族 珞巴族 基诺族 "};  
char name[]={" 赵 钱 孙 李 周 吴 郑 王 冯 陈 楮 卫 蒋 沈 韩 杨 朱 秦 尤 许 何 吕 施 张 孔 曹 严 华 金 魏 陶 姜 戚 谢 邹 喻 柏 水 窦 章 云 苏 潘 葛 奚 范 彭 郎 鲁 韦 昌 马 苗 凤 花 方 俞 任 袁 柳 酆 鲍 史 唐 费 廉 岑 薛 雷 贺 倪 汤 滕 殷 罗 毕 郝 邬 安 常 乐 于 时 傅 皮 卞 齐 康 伍 余 元 卜 顾 孟 平 黄 和 穆 萧 尹 姚 邵 湛 汪 祁 毛 禹 狄 米 贝 明 臧 计 伏 成 戴 谈 宋 茅 庞 熊 纪 舒 屈 项 祝 董 梁 杜 阮 蓝 闽 席 季 麻 强 贾 路 娄 危 江 童 颜 郭 梅 盛 林 刁 锺 徐 丘 骆 高 夏 蔡 田 樊 胡 凌 霍 虞 万 支 柯 昝 管 卢 莫 经 房 裘 缪 干 解 应 宗 丁 宣 贲 邓 郁 单 杭 洪 包 诸 左 石 崔 吉 钮 龚 程 嵇 邢 滑 裴 陆 荣 翁 荀 羊 於 惠 甄 麹 家 封 芮 羿 储 靳 汲 邴 糜 松 井 段 富 巫 乌 焦 巴 弓 牧 隗 山 谷 车 侯 宓 蓬 全 郗 班 仰 秋 仲 伊 宫 宁 仇 栾 暴 甘 斜 厉 戎 祖 武 符 刘 景 詹 束 龙 叶 幸 司 韶 郜 黎 蓟 薄 印 宿 白 怀 蒲 邰 从 鄂 索 咸 籍 赖 卓 蔺 屠 蒙 池 乔 阴 郁 胥 能 苍 双 闻 莘 党 翟 谭 贡 劳 逄 姬 申 扶 堵 冉 宰 郦 雍 郤 璩 桑 桂 濮 牛 寿 通 边 扈 燕 冀 郏 浦 尚 农 温 别 庄 晏 柴 瞿 阎 充 慕 连 茹 习 宦 艾 鱼 容 向 古 易 慎 戈 廖 庾 终 暨 居 衡 步 都 耿 满 弘 匡 国 文 寇 广 禄 阙 东 欧 殳 沃 利 蔚 越 夔 隆 师 巩 厍 聂 晁 勾 敖 融 冷 訾 辛 阚 那 简 饶 空 曾 毋 沙 乜 养 鞠 须 丰 巢 关 蒯 相 查 后 荆 红 游 竺 权 逑 盖 益 桓 公 万俟 司马 上官 欧阳 夏侯 诸葛 闻人 东方 赫连 皇甫 尉迟 公羊 澹台 公冶 宗政 濮阳 淳于 单于 太叔 申屠 公孙 仲孙 轩辕 令狐 锺离 宇文 长孙 慕容 鲜于 闾丘 司徒 司空 丌官 司寇 仉 督 子车 颛孙 端木 巫马 公西 漆雕 乐正 壤驷 公良 拓拔 夹谷 宰父 谷梁 晋 楚 阎 法 汝 鄢 涂 钦 段干 百里 东郭 南门 呼延 归 海 羊舌 微生 岳 帅 缑 亢 况 后 有 琴 梁丘 左丘 东门 西门 商 牟 佘 佴 伯 赏 南宫 墨 哈 谯 笪 年 爱 阳 佟 第五 言 福 "};  
char XUE[N];   /*以上个字符串 若要添加姓氏或专业等信息 看字符数组该加空格就加空格该加引号就加引号,改学校时找到jianyan函数的 printf("学校名称太奇葩!"); 语句上面有个for(i=0;i<20,i++) 如果school[20][5]改为21 i<20就改为i<21*/  
typedef struct STU{          //储存学生信息的结构体  
    char MG[3][N];//三个字符串分别为 姓名三至四个汉字,学号N-1位数以内,MG[3]为民族   
    int A[5];      /*A[0]=0 为男 A[0]=1  女  A[1].A[2].A[3]分别为年月日  A[4]将出生年月日以八位数的形式保存便于排序  eg:2016.02.08-->20160208*/  
}STU;  
typedef struct CLASS{  //头结点 里面储存  
    char SUB[3][SU];   //该班级的学校+学院+专业名称  
    int CT[5];/*C[0]为当前班级的年级 C[1]本班的总人数 C[2]为当前已经录入的总人数 C[3]为当前的班级的男生CT[4]存学号位数*/  
    int MING[MAX+1];   //记录学生的下标  
    STU *stu; //STU结构体Mstu个  
}CLASS;  
int jiemian(CLASS *Q);//界面 返回用户的选择  
int gainint(int *p,int a,int b);//返回数字*p p的范围符合[a,b]才能在gainint函数里出来  
int gainchar(char *A,int min,int max);//a的范围在[min,max-1]里 返回a的字符串长度  必须满足min<=max-1  
int BF(char a[],char b[]);//a为主串,b为被检验的串 如果a中含有b返回匹配的下标 否则返回0  
int jianyan(char *q,int m);//检验函数 m=={0:school,1:yuan,2:zhuanye,3:name,4:学号,5:minzu}  
void shuru(CLASS *Q);   //录入函数   
void xianshi(STU *Q); //显示第a个同学的全部信息   
void printsum(CLASS *temp,int a,int b);//排序并输出  
int BFS(char a[],char b[]); 
int CMP(char a,char b){//可以通过改变这个来改变是否忽略大小写  
   return  a==b;  
}  
void XINXI(CLASS *Q,int I,int Mg,int Flag);//Flag=-1则正常输入从第I个到第I+Mg个学生的信息 Flag!=-1时会对第I个学生的第Flag 个信息进行修改  
int main(){  
    int a,i,j=0,k=0,TTS,STC;  
    char SEX[][3]={"男","女"};  
    char CHOICE[][5]={"修改","删除","查找"};  
    CLASS *head=(CLASS *)malloc(sizeof(CLASS));  
    STU *COPY,*TEMP;  
    head->CT[0]=head->CT[1]=head->CT[2]=head->CT[3]=head->CT[4]=0;//初始化  
    head->stu=(STU *)malloc(sizeof(STU)*MAX);  
    do{  
        a=jiemian(head);  
        if(a==1)  
            shuru(head);                      
        else if(head->CT[2]&&a>=2&&a<=4)  
        {  
            for(i=0;i<head->CT[2];i++)           //用到CHOICE的地方  
                printf("%d:%9s(%s)%c",i,head->stu[i].MG[0],SEX[head->stu[i].A[0]],(i+1)%4?' ':'\n');  
            printf("\n请输入要%s的学生前的编号(%d---%d):\n",CHOICE[a-2],0,(head->CT[2])-1);  
            if(a!=4)  
                printf("注:退出当前%s界面 请输入最大值: %d !\n",CHOICE[a-2],head->CT[2]);  
            if(gainint(&TTS,0,(head->CT[2])-(a==4?1:0))!=head->CT[2])  
            {  
                printf("1: 姓名    2:   学号   3:   民族   4:   性别  5:  出生日期\n");  
                printf("-----------------------------------------------------------\n");  
                xianshi(&(head->stu[TTS]));           //显示 要"修改","删除","查找"的学生的信息  
            }  
            if(a==3&&TTS!=head->CT[2])  
            {  
                head->CT[3]-=1-head->stu[TTS].A[0];      //当前男生人数看情况减少  
                for(i=TTS;i<head->CT[2]-1;i++)     //对数组的删除操作  
                {  
                    for(j=0;j<3;j++)  
                        for(k=0;k<N;k++)  
                            head->stu[i].MG[j][k]=head->stu[i+1].MG[j][k];     
                        for(k=0;k<5;k++)  
                            head->stu[i].A[k]=head->stu[i+1].A[k];   
                }  
                head->CT[2]--;           //当前录入人数减1  
                printf("\n删除成功!\n");  
            }  
            if(a==2&&TTS!=head->CT[2])  
                do{  
                    printf("输入要修改的信息前的编号(1--5):\n注:退出修改界面请按0!:");   //将其修改  
                    if(gainint(&STC,0,5))  
                    {  
                        XINXI(head,TTS,1,STC-1);  
                        printf("修改成功!\n");  
                    }  
                }while(STC);  
        }  
        else if(head->CT[2]&&a==5)  
        {  
            printf("1:姓名   2:学号   3:民族   4:性别   5:出生日期\n请输入要排序的选项(1--5):");  
            gainint(&TTS,1,5);  
            if(TTS!=4)  
                printf("由大到小请按0,由小到大请按1:\n");  
            else  
                printf("先女后男请按0:    先男后女请按1:\n");  
            for(i=0;i<head->CT[2];i++)  
                head->MING[i]=i;  
            gainint(&STC,0,1);  
            printsum(head,TTS-1,STC);  
            for(i=0;i<head->CT[2]-1;i++)  
                if(head->MING[i]!=i)  
                {  
                    printf("保存排序结果请按1 直接返回请按0:\n");  
                    if(gainint(&STC,0,1))  
                    {  
                        COPY=(STU *)malloc(sizeof(STU)*MAX);  
                        for(i=0;i<head->CT[2];i++)     //对数组的删除操作  
                        {  
                            TTS=head->MING[i];  
                            for(j=0;j<3;j++)  
                                for(k=0;k<N;k++)  
                                    COPY[i].MG[j][k]=head->stu[TTS].MG[j][k];     
                                for(k=0;k<5;k++)  
                                    COPY[i].A[k]=head->stu[TTS].A[k];   
                        }  
                        TEMP=head->stu;  
                        head->stu=COPY;  
                        free(TEMP);  
                    }  
                    break;  
                }  
        }  
        else if(head->CT[2]&&a==6)  
        {  
            printf("   姓名         学号        民族        性别      出生日期\n");  
            printf("-----------------------------------------------------------\n");  
            for(i=0;i<head->CT[2];i++)            
                xianshi(&(head->stu[i]));  
        }  
        else if(head->CT[1]&&a==7)           //清空  
        {  
            printf("确认清空请按1 返回请按0:\n");  
            if(gainint(&STC,0,1))  
            {  
                head->CT[0]=head->CT[1]=head->CT[2]=head->CT[3]=head->CT[4]=0;  
                printf("清空成功!\n");  
            }  
        }  
	   printf("请按任意键继续…"); 
	    getchar();
    }while(a);  
}  
void xianshi(STU *Q) //显示第a个同学的全部信息  
{  
    char SEX[][3]={"男","女"};  
    printf("  %-12s %-12s %-10s   %s      %04d.%02d.%02d\n",Q->MG[0],Q->MG[1],Q->MG[2],SEX[Q->A[0]],Q->A[1],Q->A[2],Q->A[3]);  
}  
int jiemian(CLASS *Q)  
{  
    int a;  
    system("cls");  
    printf("\t\t\t学生信息管理小程序\n");  
    printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \n");  
    printf("\t* 1.添加学生信息       *注:(可分多次录入)         *\n");  
    printf("\t* 2.修改学生信息       *一个汉字两个字节          *\n");  
    printf("\t* 3.删除学生信息       *录入民族时末尾带 族 !     *\n");  
    printf("\t* 4.查找某学生信息     *录入专业时末尾无【专业】! *\n");  
    printf("\t* 5.对 信息 进行排序   *                          *\n");  
    printf("\t* 6.显示全部学生信息   *                          *\n");  
    printf("\t* 7.全部删除重新录入   *                          *\n");  
    printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
    if(Q->CT[1])  
        printf("学校:%s\t学院:%s\n专业:%s   年级:%04d级\n班级人数:%02d    已录人数:%02d\n",Q->SUB[0],Q->SUB[1],Q->SUB[2],Q->CT[0],Q->CT[1],Q->CT[2]);  
    printf("-------------------------------------------------------------------\n");  
    printf("输入您的选择(1--7):");  
    return gainint(&a,1,7);  
}  
void shuru(CLASS *Q)  
{  
    int scope[3],i,month[]={31,28,31,30,31,30,31,31,30,31,30,31};  
    int Doma[][5]={{8,6,4,2008,MIN},{SU,SU,SU,YEAR,MAX}};  
    char ques[][13]={"所在学校名称","的<学院>名称","的*专业*名称","属哪级学生?","的总人数为"};  
    if(!(Q->CT[1]))                             //如果当前结构体的头结点信息为空 则输入学校信息  
        for(i=0;i<5;i++)  
            if(i<3)  
                do{  
                    printf("输入班级%s 注:<录入全称>(%d--%d)个字节:\n",ques[i],Doma[0][i],Doma[1][i]-1);  
                    gainchar(Q->SUB[i],Doma[0][i],Doma[1][i]);  
                }while(jianyan(Q->SUB[i],i));  
                else{  
                    printf("输入班级%s(%d--%d):\n",ques[i],Doma[0][i],Doma[1][i]);  
                    gainint(&(Q->CT[i-3]),Doma[0][i],Doma[1][i]);  
                    if(i==3)  
                        sprintf(XUE,"%d",(Q->CT[i-3]));  
                }   
                scope[0]=Q->CT[2]?0:FIRST;                 //第一次录入至少为FIRST人  之后改为0  
                scope[1]=Q->CT[1]-Q->CT[2];  
                printf("此次录入多少学生(%d--%d)?:\n",scope[0],scope[1]);    //  
                gainint(&scope[2],scope[0],scope[1]);  
                XINXI(Q,Q->CT[2],scope[2],-1);   //录入学生信息  
}   
void XINXI(CLASS *Q,int I,int Mg,int Flag)//Flag=-1则正常输入 否则会对第I个学生的第Flag个信息修改此时 Mg=1  
{                                              //Flag>=0时从第I个输入共输入Mg个   
    char choose[][5]={"姓名","学号","民族"};  
    int domain[2][3]={{4,7,4},{9,N,11}};  
    char Da[][13]={"性别:0男^1女","出生年份","出生月份","出生月份"};  
    int charge[2][4]={{0,1985,1,1},{1,YEAR-15,12,0}};  
    int scope[3],i,j,k,X,month[]={31,28,31,30,31,30,31,31,30,31,30,31};  
    scope[1]=(Flag<0?4:1);  
    if(Flag==4)  scope[1]=4;  
    if(Q->CT[4])  
    {  
        domain[1][1]=domain[0][1]=(Q->CT[4]);  
        domain[1][1]++;  
    }  
    for(i=I;i<I+Mg;i++)       
    {  
        if(Flag<=2)  
            for(j=(Flag<0?0:Flag);j<(Flag<0?3:1+Flag);j++)  
            {  
                  
                  
                do{  
                    printf("输入%d号学生%s的%s(只录入%d--%d字符):\n",i+1,(Flag<0?"":Q->stu[I].MG[0]),choose[j],domain[0][j],domain[1][j]-1);  
                    X=gainchar((Q->stu[i]).MG[j],domain[0][j],domain[1][j]);  
                    k=jianyan(Q->stu[i].MG[j],j+3);  
                    if(!k&&!i&&j==1)  
                    {  
                        Q->CT[4]=X;  
                        domain[1][1]=domain[0][1]=(Q->CT[4]);  
                        domain[1][1]++;  
                    }  
                }while(k);  
                if(j!=2)  
                    for(k=X=0;k<(Flag<0?i:Q->CT[2]);k++)    //对输入的姓名 学号 检验 重复性   
                        if(BF(Q->stu[k].MG[j],Q->stu[i].MG[j])&&BF(Q->stu[i].MG[j],Q->stu[k].MG[j]))  
                        {  
                            if(k!=i)  
                            {  
                                printf("%s已经录入过!",choose[j]);  
                                j--;  
                            }  
                            break;  
                        }  
            }  
            if(Flag>2||Flag<0)  
                for(j=(Flag==4);j<scope[1];j++)  
                {  
                    printf("输入%s(%d--%d):\n",Da[j],charge[0][j],charge[1][j]);   
                    X=gainint(&(Q->stu[i].A[j]),charge[0][j],charge[1][j]);  
                    if(!j)  
                        Q->CT[3]+=1-X;  
                    if(j==1)  
                        month[1]=!(X%4&&X%100)||!(X%400)?29:28;  
                    if(j==2)  
                        charge[1][3]=month[X-1];  
                    if(j==3)  
                    {  
                        scope[0]=((Q->stu[i].A[1])*10000+(Q->stu[i].A[2]*100)+Q->stu[i].A[3]);  //将年月日转成一个数  
                        if(scope[0]==Q->stu[i].A[4])  
                        {  
                            printf("输入的出生日期和原来的相同!\n请重新");  
                            j=0;  
                        }  
                        else  
                            Q->stu[i].A[4]=scope[0];  
                    }  
                }  
    }  
    Q->CT[2]+=Flag<0?Mg:0;  
}  
int gainint(int *p,int a,int b)  
{  
    do{  
        *p=a-1;  
        scanf("%d",p);  
        while(getchar()!='\n');    
        if(*p>b||*p<a)  printf("输入有误,请重新输入(%d--%d):\n",a,b);  
    }while(*p>b||*p<a);  
    return *p;  
}   
int gainchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度      
{      
    int B,C;    
 do{      
        A[max]=B=C=0;  
        while((A[B++]=getchar())!='\n'&&B<max);  
        if(A[B-1]!='\n')  
            while(getchar()!='\n'&&++C);      
    else A[--B]=0;   
    if(C||B&&B<min)  
       printf("您录入的字符串长度:%d字节\n只录入(%d--%d)个字节!\n",B+C,min,max);      
    }while(C||B<min);      
    return B;    
}   
int BF(char a[],char b[])//BF算法 a为主串,b为被检验的串`返回b在a中的第一个下标 若无返回0    
{                         
int i=0,j=0;     
 while (a[i]&&b[j])    
 if (a[i++]==b[j]) ++j;   // 继续比较后继字    
else  {    
    i-=j;           
    j=0;    
    }    
return b[j]?0:i-j+1;    
} 
int BFS(char a[],char b[])
{//匹配 a中b单词完整的个数 
    int i=0,j=0,k=0;  
    do{  
        if (b[j]&&CMP(a[i++],b[j]))++j;//若a[i]与b[j]相等 继续比较  
        else{  
           if(!b[j])  
           {//如果b字符串到头了 此时需要检查 b在a字符串是否为完整的单词  
            if((i!=j)&&At(a[i-j-1])||(i==j))//i==j时 b在a字符串的串首  如果不在串首,则i!=j 此时应检查a[i-j-1]  
            if(!a[i]||a[i]&&At(a[i]))//如果b在a字符串的串尾 则a[i]==0  如果不在末尾 则检验 a[i]  
            return 1;
           }  
           else i-=j;  
            j=0;  
        }  
    }while(a[i-1]);  
        return 0;  
} 
int jianyan(char *q,int m)//{school,yuan,zhuanye,name,学号,minzu}  
{                         //    0    1    2       3    4     5  
    char EG[][5]={"学校","学院","专业","姓氏","学号","民族"},NAME[9];  
    char *ZHI[]={NULL,yuan,zhuanye,name,NULL,minzu};  
    int i=0,b[3]={-1,0,0};  
    while(q[++b[0]]);  
    if(m==3)  
    {  
        b[2]=sizeof(char)*2*(b[0]/4);    
        for(i=NAME[b[2]]=0;i<b[2];i++)  
            NAME[i]=q[i];  
        q=NAME;  
        b[0]=b[2];  
    }  
    if(m==4)  
    {  
        for(i=0;i<b[0];i++)  
            if(q[i]>'9'||q[i]<'0')  
                return printf("学号类型输入有误!\n请重新");    
            for(i=0;i<4;i++)  
                if(XUE[i]!=q[i])  
                    return printf("学号的前四位有误!应为%s\n请重新",XUE);  
                return 0;  
    }  
    for(i=0;i<b[0];i++)  
        if(q[i]>0)  
            return printf("输入中含有汉字以外的字符!\n请重新");  
        for(i=0;i<21;i++)  
            if(BF(q,key[i]))    //用非法中文字符匹配  
                return printf("有非汉字的中文字符!\n请重新");  
            if(!m)  
            {  
                for(i=0;i<20;i++)  
                    if(BF(q,school[i]))    //一定概率防止用户乱输或输错  
                        b[1]++;  
                    if(!b[1])  
                        return printf("学校名称太奇葩!");  
            }  
            else   b[1]=BFS(ZHI[m],q);  
            return b[1]?0:printf("%s输入不合法!\n请重新",EG[m]);  
}  
void printsum(CLASS *temp,int a,int b) //a种类  
{/*0:姓名   1:学号   2:民族   3:性别   4:出生日期*/  
    char *CHAR[MAX+1];  
    STU *Q[MAX+1];  
    int INT[MAX+1],i,j,k;   
    char AA[][9]={"各个姓名","学生学号","民族类别","性别分类","出生日期"};  
    if(a<=2)  
        for(i=0;i<temp->CT[2];i++)               //对结构体里面数据复制  
        {  
            Q[i]=&(temp->stu[i]);  
            CHAR[i]=temp->stu[i].MG[a];  
        }  
        else  
            for(i=0;i<temp->CT[2];i++)               //对结构体里面数据复制  
            {  
                Q[i]=&(temp->stu[i]);  
                INT[i]=temp->stu[i].A[a==3?0:4];  
            }  
            printf("%s顺序如下:    以第%d列为基准:\n",AA[a],a+1);        
            for(i=0;i<temp->CT[2]-1;i++)  
            {  
                k=i;  
                for(j=i+1;j<temp->CT[2];j++)  
                {  
                    if(a<=2)  
                        if(b&&a!=1)  
                            k=(strcmp(CHAR[i],CHAR[j])<0?j:k);  
                        else  
                            k=(strcmp(CHAR[i],CHAR[j])>0?j:k);  
                        else  
                            if(b)  
                                k=(INT[i]>INT[j]?j:k);  
                            else  
                                k=(INT[i]<INT[j]?j:k);  
                            if(k!=i)  
                            {  
                                Q[MAX]=Q[i];  
                                Q[i]=Q[k];  
                                Q[k]=Q[MAX];  
                                temp->MING[MAX]=temp->MING[i];  
                                temp->MING[i]=temp->MING[k];  
                                temp->MING[k]=temp->MING[MAX];  
                            }  
                }  
            }  
            if(a==4)  
                printf("目前男生人数:%d 女生人数:%d\n",temp->CT[3],temp->CT[2]-temp->CT[3]);  
            printf("1:   姓名     2:   学号   3:   民族   4:   性别   5: 出生日期\n");  
            printf("-----------------------------------------------------------\n");  
            for(i=0;i<temp->CT[2];i++)  
            {      
                printf("%02d",!b?i+1:(temp->CT[2])-i);  
                xianshi(Q[i]);  
            }  
}  

--------------------------------------------------------------------------------

/*制作者 zha good well*/
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define N 13   // N 最小为13且为奇数
# define SU 23  //学校 学院 专业的字数=SU/2取整 SU必为奇数且最小为23
# define YEAR 2017  //今年的年份
# define MAX  75 //学生的最高人数
# define MIN  15   //学生的最低人数
# define FIRST  2//首次录入时的学生的最少数量
char key[21][3]={"!","。","?","《","》",",","{","}","(",")","¥","‘","’",":",";","—","”","“","、","·","~"};
char school[20][5]={"大学","学院","华侨","校区","政法","管理","经济","科学","理工","科技","技术","职业","师范","中国","海洋","石油","分区","分校","建筑","工业"};
char yuan[]={" 理学院 经济管理学院 计算机科学与通信工程学院"};
char zhuanye[]={" 物联网工程 土木工程 电气工程及其自动化 "};
char minzu[]={" 汉族 蒙古族 回族 藏族 维吾尔族 苗族 彝族 壮族 布依族 朝鲜族 满族 侗族 瑶族 白族 土家族 哈尼族 哈萨克族 傣族 黎族 傈僳族 佤族 畲族 高山族 拉祜族 水族 东乡族 纳西族 景颇族 柯尔克孜族 土族 达斡尔族 仫佬族 羌族 布朗族 撒拉族 毛南族 仡佬族 锡伯族 阿昌族 普米族 塔吉克族 怒族 乌孜别克族 俄罗斯族 鄂温克族 德昂族 保安族 裕固族 京族 塔塔尔族 独龙族 鄂伦春族 赫哲族 门巴族 珞巴族 基诺族 "};
char name[]={" 赵 钱 孙 李 周 吴 郑 王 冯 陈 楮 卫 蒋 沈 韩 杨 朱 秦 尤 许 何 吕 施 张 孔 曹 严 华 金 魏 陶 姜 戚 谢 邹 喻 柏 水 窦 章 云 苏 潘 葛 奚 范 彭 郎 鲁 韦 昌 马 苗 凤 花 方 俞 任 袁 柳 酆 鲍 史 唐 费 廉 岑 薛 雷 贺 倪 汤 滕 殷 罗 毕 郝 邬 安 常 乐 于 时 傅 皮 卞 齐 康 伍 余 元 卜 顾 孟 平 黄 和 穆 萧 尹 姚 邵 湛 汪 祁 毛 禹 狄 米 贝 明 臧 计 伏 成 戴 谈 宋 茅 庞 熊 纪 舒 屈 项 祝 董 梁 杜 阮 蓝 闽 席 季 麻 强 贾 路 娄 危 江 童 颜 郭 梅 盛 林 刁 锺 徐 丘 骆 高 夏 蔡 田 樊 胡 凌 霍 虞 万 支 柯 昝 管 卢 莫 经 房 裘 缪 干 解 应 宗 丁 宣 贲 邓 郁 单 杭 洪 包 诸 左 石 崔 吉 钮 龚 程 嵇 邢 滑 裴 陆 荣 翁 荀 羊 於 惠 甄 麹 家 封 芮 羿 储 靳 汲 邴 糜 松 井 段 富 巫 乌 焦 巴 弓 牧 隗 山 谷 车 侯 宓 蓬 全 郗 班 仰 秋 仲 伊 宫 宁 仇 栾 暴 甘 斜 厉 戎 祖 武 符 刘 景 詹 束 龙 叶 幸 司 韶 郜 黎 蓟 薄 印 宿 白 怀 蒲 邰 从 鄂 索 咸 籍 赖 卓 蔺 屠 蒙 池 乔 阴 郁 胥 能 苍 双 闻 莘 党 翟 谭 贡 劳 逄 姬 申 扶 堵 冉 宰 郦 雍 郤 璩 桑 桂 濮 牛 寿 通 边 扈 燕 冀 郏 浦 尚 农 温 别 庄 晏 柴 瞿 阎 充 慕 连 茹 习 宦 艾 鱼 容 向 古 易 慎 戈 廖 庾 终 暨 居 衡 步 都 耿 满 弘 匡 国 文 寇 广 禄 阙 东 欧 殳 沃 利 蔚 越 夔 隆 师 巩 厍 聂 晁 勾 敖 融 冷 訾 辛 阚 那 简 饶 空 曾 毋 沙 乜 养 鞠 须 丰 巢 关 蒯 相 查 后 荆 红 游 竺 权 逑 盖 益 桓 公 万俟 司马 上官 欧阳 夏侯 诸葛 闻人 东方 赫连 皇甫 尉迟 公羊 澹台 公冶 宗政 濮阳 淳于 单于 太叔 申屠 公孙 仲孙 轩辕 令狐 锺离 宇文 长孙 慕容 鲜于 闾丘 司徒 司空 丌官 司寇 仉 督 子车 颛孙 端木 巫马 公西 漆雕 乐正 壤驷 公良 拓拔 夹谷 宰父 谷梁 晋 楚 阎 法 汝 鄢 涂 钦 段干 百里 东郭 南门 呼延 归 海 羊舌 微生 岳 帅 缑 亢 况 后 有 琴 梁丘 左丘 东门 西门 商 牟 佘 佴 伯 赏 南宫 墨 哈 谯 笪 年 爱 阳 佟 第五 言 福 "};
char XUE[N];   /*以上个字符串 若要添加姓氏或专业等信息 看字符数组该加空格就加空格该加引号就加引号,改学校时找到jianyan函数的 printf("学校名称太奇葩!"); 语句上面有个for(i=0;i<20,i++) 如果school[20][5]改为21 i<20就改为i<21*/
typedef struct STU{          //储存学生信息的结构体
	char MG[3][N];//三个字符串分别为 姓名三至四个汉字,学号N-1位数以内,MG[3]为民族 
	int A[5];      /*A[0]=0 为男 A[0]=1  女  A[1].A[2].A[3]分别为年月日  A[4]将出生年月日以八位数的形式保存便于排序  eg:2016.02.08-->20160208*/
}STU;
typedef struct CLASS{  //头结点 里面储存
	char SUB[3][SU];   //该班级的学校+学院+专业名称
	int CT[5];/*C[0]为当前班级的年级 C[1]本班的总人数 C[2]为当前已经录入的总人数 C[3]为当前的班级的男生CT[4]存学号位数*/
	int MING[MAX+1];   //记录学生的下标
    STU *stu; //STU结构体Mstu个
}CLASS;
int jiemian(CLASS *Q);//界面 返回用户的选择
int gainint(int *p,int a,int b);//返回数字*p p的范围符合[a,b]才能在gainint函数里出来
int gainchar(char *a,int min,int max);//a的范围在[min,max-1]里 返回a的字符串长度  必须满足min<=max-1
int BF(char a[],char b[]);//a为主串,b为被检验的串 如果a中含有b返回匹配的下标 否则返回0
int jianyan(char *q,int m);//检验函数 m=={0:school,1:yuan,2:zhuanye,3:name,4:学号,5:minzu}
void shuru(CLASS *Q);   //录入函数 
void xianshi(STU *Q); //显示第a个同学的全部信息 
void printsum(CLASS *temp,int a,int b);//排序并输出
void XINXI(CLASS *Q,int I,int Mg,int Flag);//Flag=-1则正常输入从第I个到第I+Mg个学生的信息 Flag!=-1时会对第I个学生的第Flag 个信息进行修改
int main(){
	int a,i,j=0,k=0,TTS,STC;
	char SEX[][3]={"男","女"};
	char CHOICE[][5]={"修改","删除","查找"};
	CLASS *head=(CLASS *)malloc(sizeof(CLASS));
	STU *COPY,*TEMP;
	head->CT[0]=head->CT[1]=head->CT[2]=head->CT[3]=head->CT[4]=0;//初始化
	head->stu=(STU *)malloc(sizeof(STU)*MAX);
	do{
		a=jiemian(head);
		if(a==1)
			shuru(head);                    
		else if(head->CT[2]&&a>=2&&a<=4)
		{
			for(i=0;i<head->CT[2];i++)           //用到CHOICE的地方
				printf("%d:%9s(%s)%c",i,head->stu[i].MG[0],SEX[head->stu[i].A[0]],(i+1)%4?' ':'\n');
			printf("\n请输入要%s的学生前的编号(%d---%d):\n",CHOICE[a-2],0,(head->CT[2])-1);
			if(a!=4)
				printf("注:退出当前%s界面 请输入最大值: %d !\n",CHOICE[a-2],head->CT[2]);
			if(gainint(&TTS,0,(head->CT[2])-(a==4?1:0))!=head->CT[2])
			{
				printf("1: 姓名    2:   学号   3:   民族   4:   性别  5:  出生日期\n");
				printf("-----------------------------------------------------------\n");
				xianshi(&(head->stu[TTS]));           //显示 要"修改","删除","查找"的学生的信息
			}
			if(a==3&&TTS!=head->CT[2])
			{
				head->CT[3]-=1-head->stu[TTS].A[0];      //当前男生人数看情况减少
				for(i=TTS;i<head->CT[2]-1;i++)     //对数组的删除操作
				{
					for(j=0;j<3;j++)
						for(k=0;k<N;k++)
							head->stu[i].MG[j][k]=head->stu[i+1].MG[j][k];   
						for(k=0;k<5;k++)
							head->stu[i].A[k]=head->stu[i+1].A[k]; 
				}
				head->CT[2]--;           //当前录入人数减1
				printf("\n删除成功!\n");
			}
			if(a==2&&TTS!=head->CT[2])
				do{
					printf("输入要修改的信息前的编号(1--5):\n注:退出修改界面请按0!:");   //将其修改
					if(gainint(&STC,0,5))
					{
						XINXI(head,TTS,1,STC-1);
						printf("修改成功!\n");
					}
				}while(STC);
		}
		else if(head->CT[2]&&a==5)
		{
			printf("1:姓名   2:学号   3:民族   4:性别   5:出生日期\n请输入要排序的选项(1--5):");
			gainint(&TTS,1,5);
			if(TTS!=4)
				printf("由大到小请按0,由小到大请按1:\n");
			else
				printf("先女后男请按0:    先男后女请按1:\n");
			for(i=0;i<head->CT[2];i++)
				head->MING[i]=i;
			gainint(&STC,0,1);
			printsum(head,TTS-1,STC);
			for(i=0;i<head->CT[2]-1;i++)
				if(head->MING[i]!=i)
				{
					printf("保存排序结果请按1 直接返回请按0:\n");
					if(gainint(&STC,0,1))
					{
						COPY=(STU *)malloc(sizeof(STU)*MAX);
						for(i=0;i<head->CT[2];i++)     //对数组的删除操作
						{
							TTS=head->MING[i];
							for(j=0;j<3;j++)
								for(k=0;k<N;k++)
									COPY[i].MG[j][k]=head->stu[TTS].MG[j][k];   
								for(k=0;k<5;k++)
									COPY[i].A[k]=head->stu[TTS].A[k]; 
						}
						TEMP=head->stu;
						head->stu=COPY;
						free(TEMP);
					}
					break;
				}
		}
		else if(head->CT[2]&&a==6)
		{
			printf("   姓名         学号        民族        性别      出生日期\n");
			printf("-----------------------------------------------------------\n");
			for(i=0;i<head->CT[2];i++)          
				xianshi(&(head->stu[i]));
		}
        else if(head->CT[1]&&a==7)           //清空
		{
			printf("确认清空请按1 返回请按0:\n");
			if(gainint(&STC,0,1))
			{
				head->CT[0]=head->CT[1]=head->CT[2]=head->CT[3]=head->CT[4]=0;
				printf("清空成功!\n");
			}
		}
		system("pause");
	}while(a);
}
void xianshi(STU *Q) //显示第a个同学的全部信息
{
	char SEX[][3]={"男","女"};
	printf("  %-12s %-12s %-10s   %s      %04d.%02d.%02d\n",Q->MG[0],Q->MG[1],Q->MG[2],SEX[Q->A[0]],Q->A[1],Q->A[2],Q->A[3]);
}
int jiemian(CLASS *Q)
{
	int a;
	system("cls");
    printf("\t\t\t学生信息管理小程序\n");
	printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \n");
	printf("\t* 1.添加学生信息       *注:(可分多次录入)         *\n");
	printf("\t* 2.修改学生信息       *一个汉字两个字节          *\n");
	printf("\t* 3.删除学生信息       *录入民族时末尾带 族 !     *\n");
	printf("\t* 4.查找某学生信息     *录入专业时末尾无【专业】! *\n");
	printf("\t* 5.对 信息 进行排序   *                          *\n");
	printf("\t* 6.显示全部学生信息   *                          *\n");
	printf("\t* 7.全部删除重新录入   *                          *\n");
	printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
	if(Q->CT[1])
		printf("学校:%s\t学院:%s\n专业:%s   年级:%04d级\n班级人数:%02d    已录人数:%02d\n",Q->SUB[0],Q->SUB[1],Q->SUB[2],Q->CT[0],Q->CT[1],Q->CT[2]);
	printf("-------------------------------------------------------------------\n");
	printf("输入您的选择(1--7):");
	return gainint(&a,1,7);
}
void shuru(CLASS *Q)
{
	int scope[3],i,month[]={31,28,31,30,31,30,31,31,30,31,30,31};
	int Doma[][5]={{8,6,4,2008,MIN},{SU,SU,SU,YEAR,MAX}};
	char ques[][13]={"所在学校名称","的<学院>名称","的*专业*名称","属哪级学生?","的总人数为"};
	if(!(Q->CT[1]))                             //如果当前结构体的头结点信息为空 则输入学校信息
		for(i=0;i<5;i++)
			if(i<3)
				do{
					printf("输入班级%s 注:<录入全称>(%d--%d)个字节:\n",ques[i],Doma[0][i],Doma[1][i]-1);
					gainchar(Q->SUB[i],Doma[0][i],Doma[1][i]);
				}while(jianyan(Q->SUB[i],i));
				else{
					printf("输入班级%s(%d--%d):\n",ques[i],Doma[0][i],Doma[1][i]);
					gainint(&(Q->CT[i-3]),Doma[0][i],Doma[1][i]);
					if(i==3)
						sprintf(XUE,"%d",(Q->CT[i-3]));
				} 
				scope[0]=Q->CT[2]?0:FIRST;                 //第一次录入至少为FIRST人  之后改为0
				scope[1]=Q->CT[1]-Q->CT[2];
				printf("此次录入多少学生(%d--%d)?:\n",scope[0],scope[1]);    //
				gainint(&scope[2],scope[0],scope[1]);
				XINXI(Q,Q->CT[2],scope[2],-1);   //录入学生信息
} 
void XINXI(CLASS *Q,int I,int Mg,int Flag)//Flag=-1则正常输入 否则会对第I个学生的第Flag个信息修改此时 Mg=1
{                                              //Flag>=0时从第I个输入共输入Mg个 
	char choose[][5]={"姓名","学号","民族"};
	int domain[2][3]={{4,7,4},{9,N,11}};
    char Da[][13]={"性别:0男^1女","出生年份","出生月份","出生月份"};
	int charge[2][4]={{0,1985,1,1},{1,YEAR-15,12,0}};
	int scope[3],i,j,k,X,month[]={31,28,31,30,31,30,31,31,30,31,30,31};
	scope[1]=(Flag<0?4:1);
	if(Flag==4)
		scope[1]=4;
	if(Q->CT[4])
	{
		domain[1][1]=domain[0][1]=(Q->CT[4]);
		domain[1][1]++;
	}
	for(i=I;i<I+Mg;i++)     
	{
		if(Flag<=2)
			for(j=(Flag<0?0:Flag);j<(Flag<0?3:1+Flag);j++)
			{
				
				
				do{
					printf("输入%d号学生%s的%s(只录入%d--%d字符):\n",i+1,(Flag<0?"":Q->stu[I].MG[0]),choose[j],domain[0][j],domain[1][j]-1);
					X=gainchar((Q->stu[i]).MG[j],domain[0][j],domain[1][j]);
					k=jianyan(Q->stu[i].MG[j],j+3);
					if(!k&&!i&&j==1)
					{
						Q->CT[4]=X;
						domain[1][1]=domain[0][1]=(Q->CT[4]);
						domain[1][1]++;
					}
				}while(k);
				if(j!=2)
					for(k=X=0;k<(Flag<0?i:Q->CT[2]);k++)    //对输入的姓名 学号 检验 重复性 
						if(BF(Q->stu[k].MG[j],Q->stu[i].MG[j])&&BF(Q->stu[i].MG[j],Q->stu[k].MG[j]))
						{
							if(k!=i)
							{
								printf("%s已经录入过!",choose[j]);
								j--;
							}
							break;
						}
			}
			if(Flag>2||Flag<0)
				for(j=(Flag==4);j<scope[1];j++)
				{
					printf("输入%s(%d--%d):\n",Da[j],charge[0][j],charge[1][j]); 
					X=gainint(&(Q->stu[i].A[j]),charge[0][j],charge[1][j]);
					if(!j)
						Q->CT[3]+=1-X;
					if(j==1)
						month[1]=!(X%4&&X%100)||!(X%400)?29:28;
					if(j==2)
						charge[1][3]=month[X-1];
					if(j==3)
					{
						scope[0]=((Q->stu[i].A[1])*10000+(Q->stu[i].A[2]*100)+Q->stu[i].A[3]);  //将年月日转成一个数
						if(scope[0]==Q->stu[i].A[4])
						{
							printf("输入的出生日期和原来的相同!\n请重新");
							j=0;
						}
						else
                            Q->stu[i].A[4]=scope[0];
					}
				}
	}
	Q->CT[2]+=Flag<0?Mg:0;
}
int gainint(int *p,int a,int b)
{
	do{
		*p=a-1;
		scanf("%d",p);
		while(getchar()!='\n');  
		if(*p>b||*p<a)
			printf("输入有误,请重新输入(%d--%d):\n",a,b);
	}while(*p>b||*p<a);
    return *p;
}
int gainchar(char *a,int min,int max)//对*a输入范围(min,max),如果字符数组中存在'\n',将其改为'\0'
{
	int c,k;
	do{
		c=-1;k=0;
		fgets(a,max,stdin);
		while(a[++c]);
		c=a[c-1]=='\n'&&c<max?c-1:c;
		if(c>=max-1)
			while(getchar()!='\n')
				k++;
			else
				a[c]='\0';
			if(k||c&&(c>max||c<min))//如果用户只输入'\n'则不提示输入错误,否则提示错误
				printf("输入范围有误,请重新输入只录入(%d--%d)字节:\n",min,max-1);
	}while(k||(c>max||c<min));
    return c;
}
int BF(char a[],char b[])//a为主串,b为被检验的串
{                     
	int c[2]={-1,-1};
	int i=0,j=0; 
	while(a[++c[0]]);
	while(b[++c[1]]);//c[0]c[1]存长度
	while (i <c[0]&&j <c[1])
		if (a[i]==b[j]) // 继续比较后继字
		{
			++i;
			++j;
		}
		else
		{
			i-=j-1;
			j=0;
		}
		return j>(c[1]-1)?i-c[1]+1:0;
}
int jianyan(char *q,int m)//{school,yuan,zhuanye,name,学号,minzu}
{                         //    0    1    2       3    4     5
	char EG[][5]={"学校","学院","专业","姓氏","学号","民族"},*NAME;
	char *ZHI[]={NULL,yuan,zhuanye,name,NULL,minzu};
	int i=0,b[3]={-1,0,0};
	while(q[++b[0]]);
	if(m==3)
	{
		b[2]=sizeof(char)*2*(b[0]/4)+1;
		NAME=(char *)malloc(b[2]);
		for(i=0;i<b[2]-1;i++)
			NAME[i]=q[i];
		NAME[i]='\0';
		q=NAME;
		b[0]=b[2]-1;
	}
	if(m==4)
	{
		for(i=0;i<b[0];i++)
			if(q[i]>'9'||q[i]<'0')
				return printf("学号类型输入有误!\n请重新");  
			for(i=0;i<4;i++)
				if(XUE[i]!=q[i])
					return printf("学号的前四位有误!应为%s\n请重新",XUE);
				return 0;
	}
	for(i=0;i<b[0];i++)
		if(q[i]>0)
			return printf("输入中含有汉字以外的字符!\n请重新");
		for(i=0;i<21;i++)
			if(BF(q,key[i]))    //用非法中文字符匹配
				return printf("有非汉字的中文字符!\n请重新");
			if(!m)
			{
				for(i=0;i<20;i++)
					if(BF(q,school[i]))    //一定概率防止用户乱输或输错
						b[1]++;
					if(!b[1])
						return printf("学校名称太奇葩!");
			}
			else
			{
				b[1]=BF(ZHI[m],q);
				if(b[1])
					b[1]=(ZHI[m][b[1]-2]==' ');
			}
			return b[1]?0:printf("%s输入不太符合实际或不合法!\n请重新",EG[m]);
}
void printsum(CLASS *temp,int a,int b) //a种类
{/*0:姓名   1:学号   2:民族   3:性别   4:出生日期*/
	char *CHAR[MAX+1];
	STU *Q[MAX+1];
	int INT[MAX+1],i,j,k; 
	char AA[][9]={"各个姓名","学生学号","民族类别","性别分类","出生日期"};
	if(a<=2)
		for(i=0;i<temp->CT[2];i++)               //对结构体里面数据复制
		{
			Q[i]=&(temp->stu[i]);
			CHAR[i]=temp->stu[i].MG[a];
		}
		else
			for(i=0;i<temp->CT[2];i++)               //对结构体里面数据复制
			{
				Q[i]=&(temp->stu[i]);
				INT[i]=temp->stu[i].A[a==3?0:4];
			}
			printf("%s顺序如下:    以第%d列为基准:\n",AA[a],a+1);      
			for(i=0;i<temp->CT[2]-1;i++)
			{
				k=i;
				for(j=i+1;j<temp->CT[2];j++)
				{
					if(a<=2)
						if(b&&a!=1)
							k=(strcmp(CHAR[i],CHAR[j])<0?j:k);
						else
							k=(strcmp(CHAR[i],CHAR[j])>0?j:k);
						else
							if(b)
								k=(INT[i]>INT[j]?j:k);
							else
								k=(INT[i]<INT[j]?j:k);
							if(k!=i)
							{
								Q[MAX]=Q[i];
								Q[i]=Q[k];
								Q[k]=Q[MAX];
								temp->MING[MAX]=temp->MING[i];
								temp->MING[i]=temp->MING[k];
								temp->MING[k]=temp->MING[MAX];
							}
				}
			}
			if(a==4)
				printf("目前男生人数:%d 女生人数:%d\n",temp->CT[3],temp->CT[2]-temp->CT[3]);
			printf("1:   姓名     2:   学号   3:   民族   4:   性别   5: 出生日期\n");
			printf("-----------------------------------------------------------\n");
			for(i=0;i<temp->CT[2];i++)
			{    
				printf("%02d",!b?i+1:(temp->CT[2])-i);
				xianshi(Q[i]);
			}
}


  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学生成绩管理系统是一个用来管理学生的课程成绩的系统。它可以帮助学校或教育机构更加有效地管理学生的成绩信息。 这个成绩管理系统可以使用数据结构来存储和处理学生的成绩数据。我们可以使用数组、链表或树等数据结构来存储学生的信息,如学号、姓名、课程成绩等。通过使用适当的数据结构,我们可以方便地对学生的信息进行增删改查等操作。 在设计这个学生成绩管理系统时,可以使用面向对象的方法。学生可以看作是一个对象,具有一定的属性和行为。我们可以创建一个学生类,包含学生的基本信息,如学号、姓名等,以及一些方法来对学生成绩进行操作,如添加成绩、计算平均成绩等等。 另外,我们可以创建一个成绩管理类来管理学生的成绩信息。这个类可以包含一些方法来实现对学生成绩的管理,如添加学生、删除学生、查询学生等。我们还可以使用一些排序算法来对学生成绩进行排序,如冒泡排序、快速排序等,以便更好地展示学生的成绩情况。 在设计过程中,需要考虑一些特殊情况,如学生信息的重复录入、成绩的准确性等。为了解决这些问题,可以使用一些合适的算法和技术,如哈希表、正则表达式等。 总之,学生成绩管理系统需要使用合适的数据结构和算法来存储和处理学生的成绩数据,从而更好地管理学生成绩信息。通过使用myeclipse等开发工具,可以更加方便地实现这个系统的设计和开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值