用C语言帮写个小项目

img


基于链表表的学生信息管理系统”
实验内容:编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的链裏结点类
型,包括:学号、姓名、班级、专业、3门成绩。

img


需要创建1.txt


grad name spec     class     score1 score2 score3
2201 Amy   cs        2018-1  98      95         98
2202 Bob    cs        2018-2  91      74         59
2203 Cindy  cs        2018-2  98      84         79
2204 Dell     law      2018-1  86      94         99
2205 Emy    law      2018-1  98      86         89

#include<string.h>
#include<stdlib.h>
#include<iomanip>
#include<fstream>
#include<time.h>
#include<typeinfo>
int length;
char a[10],b[10],c[10],d[10],e[10],f[10],g[10];//标题
struct student
{
    char grad[10];//学号
    char name[10];//姓名
    char spec[10];//专业
    char stu_class[10];//班级
    int score1;
    int score2;
    int score3;
}stu[30];

int Init()//初始化
{
    int i = 0;
    FILE *p = fopen("1.txt", "r");      //打开文件
    if(p==NULL)
        return 0;
    fscanf(p,"%s%s%s%s%s%s%s",&a,&b,&c,&d,&e,&f,&g);//读取标题
    while (!feof(p)) //检测流上的文件结束符,如果文件结束,则返回非0值
    {    //将文件中数据读取到结构体数组
        fscanf(p,"%s%s%s%s%d%d%d",&stu[i].grad,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3);
        i++;
    }
    length = i;
    fclose(p);
    return 1;
}

void Input()//从键盘输入一个学生信息存入文件和结构体数组。
{
    printf("请输入学生信息:\n");
    printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
    int i = length;
    scanf("%s%s%s%s%d%d%d",&stu[i].grad,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3);
    FILE *p = fopen("1.txt", "a");      //打开文件
    fprintf(p,"\n%s %s      %s       %s  %d      %d         %d",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
    fclose(p);
    printf("写入文件成功!\n");
    length++;
}

void Output()//输入学号,将对应的学生信息格式化输出。
{
    char *grad;
    printf("请输入查询的学号:");
    scanf("%s",grad);
    printf("学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
    for(int i=0;i<length;i++)
        if(strcmp(stu[i].grad,grad)==0)
            printf("%s %s %s %s %d    %d   %d \n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
}

void Save()//将某个学生信息存入一个新的文件。
{
    printf("请输入学生信息:\n");
    printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
    int i = length;
    scanf("%s%s%s%s%d%d%d",&stu[i].grad,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3);
    FILE *p = fopen("other.txt", "w");      //打开文件
    fprintf(p,"%s %s %s %s %s %s %s\n",a,b,c,d,e,f,g);
    fprintf(p,"%s %s      %s   %s  %d      %d         %d",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
    fclose(p);
    printf("写入文件成功!\n");
}

void Max()//求所有学生某门课程的最高分及对应的学生的姓名。
{
    int i;
    int max[3]={0,0,0};
    for(i=0;i<length;i++)
        if(max[0]<stu[i].score1)
            max[0]=stu[i].score1;

    printf("课程1最高分:%d分----",max[0]);
    for(i=0;i<length;i++)
        if(stu[i].score1 == max[0])
            printf("%s ",stu[i].name);
    printf("\n");

    for(i=0;i<length;i++)
        if(max[1]<stu[i].score2)
            max[1]=stu[i].score2;
    printf("课程2最高分:%d分----",max[1]);
    for(i=0;i<length;i++)
        if(stu[i].score2 == max[1])
            printf("%s ",stu[i].name);
    printf("\n");

    for(i=0;i<length;i++)
        if(max[2]<stu[i].score3)
            max[2]=stu[i].score3;
    printf("课程3最高分:%d分----",max[2],stu[i].name);
    for(i=0;i<length;i++)
        if(stu[i].score3 == max[2])
            printf("%s ",stu[i].name);
    printf("\n");
}

void Fetch()//从文件中随机读取某个学生的信息。
{
    int i = time(NULL) % length;
    printf("第%d名学生\n",i+1);
    printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
    printf("%s %s %s %s %d %d %d \n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
}

void Sort_select()//按总平均成绩由低到高进行简单选择排序。
{
    struct student tmp;
    char str[6];
    int i,j,t,n,k;
    float avg[length],avg_temp;
    printf("请输入专业:\n");
    scanf("%s",str);
    for(i=0;i<length;i++)
        avg[i] = float(stu[i].score1 + stu[i].score2 + stu[i].score3) / 3;
    //简单选择排序
    for(i=0; i<length; i++)  //做n-1趟选取
    {
        k = i;
        for(j=i+1;j<=length;j++)
            if(avg[j] < avg[k] && strcmp(stu[i].spec,str)==0 && strcmp(stu[j].spec,str)==0)
                k = j;    //k为最小值
        if(i!=k)//交换
        {
            tmp=stu[k];      avg_temp = avg[k];
            stu[k]=stu[i];   avg[k] = avg[i];
            stu[i]=tmp;         avg[i] = avg_temp;
        }
    }
    printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 平均分\n");
    for(i=0;i<length;i++)
        if(strcmp(stu[i].spec,str)==0)
            printf("%5s %-6s %3s %s %3d %3d %3d %-6.2f\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,avg[i]);
}

void Sort_buble()//按总平均成绩由高到低进行冒泡排序。
{
    struct student tmp;
    char str[6];
    float avg[length],avg_temp;
    int i,j;
    printf("请输入班级:\n");
    scanf("%s",str);
    for(i=0;i<length;i++)
        avg[i] = float(stu[i].score1 + stu[i].score2 + stu[i].score3) / 3;
    //冒泡排序
    for(i=0;i<length;i++)
        for(j=0;j<length;j++)
            if(avg[i]>avg[j] && strcmp(stu[i].stu_class,str)==0 && strcmp(stu[j].stu_class,str)==0)
            {
                tmp = stu[i];      avg_temp = avg[i];
                stu[i] = stu[j];   avg[i] = avg[j];
                stu[j] = tmp;         avg[j] = avg_temp;
            }
    printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 平均分\n");
    for(i=0;i<length;i++)
        if(strcmp(stu[i].stu_class,str)==0)
            printf("%5s %-6s %3s %s %3d %3d %3d %-6.2f\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,avg[i]);
}

void Sort_insert()//按课程1成绩由低到高进行直接插入排序。
{
    int i,j,len=0;
    char str[6];
    struct student tmp;
    struct student insert[100];
    printf("请输入班级:\n");
    scanf("%s",str);
    for(i=0;i<length;i++)
        if(strcmp(stu[i].stu_class,str)==0) //筛选出某个班上的学生进行插入排序
        {
            insert[len] = stu[i];
            len++;
        }
    for(i=1;i<len;i++)//循环从第2个元素开始
    {
        if(insert[i].score1 < insert[i-1].score1)
        {
            tmp = insert[i];
            for(j = i-1; j >= 0 && insert[j].score1 > tmp.score1; j--)
                insert[j+1] = insert[j];
            insert[j+1] = tmp;
        }
    }
    printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
    for(i=0;i<len;i++)
        printf("%5s %-6s %3s %s %3d %3d %3d\n",insert[i].grad,insert[i].name,insert[i].spec,insert[i].stu_class,insert[i].score1,insert[i].score2,insert[i].score3);
}

void my_Sort_insert()//按课程1成绩由低到高进行直接插入排序。
{
    int i,j=0,len=0,location[50];
    char str[6];
    struct student tmp;
    struct student insert[100];
    printf("请输入班级:\n");
    scanf("%s",str);
    for(i=0;i<length;i++)
        if(strcmp(stu[i].stu_class,str)==0) //筛选出某个班上的学生进行插入排序
        {
            insert[len] = stu[i];
            location[j++] = i;//存储位置
            len++;
        }
    for(i=1;i<len;i++)//循环从第2个元素开始
    {
        if(insert[i].score1 < insert[i-1].score1)
        {
            tmp = insert[i];
            for(j = i-1; j >= 0 && insert[j].score1 > tmp.score1; j--)
                insert[j+1] = insert[j];
            insert[j+1] = tmp;
        }
    }
    for(i=0;i<len;i++)
        stu[location[i]] = insert[i];
    printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
    for(i=0;i<length;i++)
        printf("%5s %-6s %3s %s %3d %3d %3d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
}

void Search()//查找某班总分在某分数段以上的学生
{
    int i,k=0,score;
    char str[6];
    printf("请输入班级和分数:\n");
    scanf("%s%d",str,&score);
    printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 总分\n");
    for(i=0;i<length;i++)
        if(strcmp(stu[i].stu_class,str)==0 && stu[i].score1+stu[i].score2+stu[i].score3 > score)
            {
                printf("%5s %-6s %3s %s %3d %3d %3d   %d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score1+stu[i].score2+stu[i].score3);
                k++;
            }
    printf("%s班总分%d以上的一共有%d人。\n",str,score,k);
}

void Sort_total_score()//Self:全体总分排序
{
    struct student tmp;
    int i,j;
    //根据总分进行从大到小冒泡排序
    for(i=0;i<length;i++)
        for(j=0;j<length;j++)
            if(stu[i].score1+stu[i].score2+stu[i].score3 > stu[j].score1+stu[j].score2+stu[j].score3)
            {
                tmp = stu[i];
                stu[i] = stu[j];
                stu[j] = tmp;
            }
    for(i=0;i<length;i++)
        printf("%5s %-6s %3s %s %3d %3d %3d %d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score1+stu[i].score2+stu[i].score3);
}

void Sort_grad()//Self:全体学号排序
{
    struct student tmp;
    int i,j;
    //根据学号进行从大到小冒泡排序
    for(i=0;i<length;i++)
        for(j=0;j<length;j++)
            if(strcmp(stu[i].grad,stu[j].grad) > 0 )
            {
                tmp=stu[i];
                stu[i]=stu[j];
                stu[j]=tmp;
            }
    for(i=0;i<length;i++)
        printf("%5s %-6s %3s %s %3d %3d %3d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
}

int main()
{
    int i,j,k;
    if(Init()==0)
    {
        printf("文件不存在!");
        return 0;
    }
    printf("菜单\n1.输入学生信息\n2.输出学生信息\n3.写入文件\n4.查找课程最高分\n5.随机读取学生信息\n6.同专业平均分简单选择排序\n7.同班级平均分冒泡排序\n");
    printf("8.同班级按课程1分数直接插入排序\n9.综合查找\n10.全体总分排序\n11.全体学号排序\n12.重现菜单\n0.退出\n");
    printf("请输入选项:");
    scanf("%d",&k);
    while(k)
    {
        switch(k)
        {
            case 0:
                break;
            case 1:
                Input();
                break;
            case 2:
                Output();
                break;
            case 3:
                Save();
                break;
            case 4:
                Max();
                break;
            case 5:
                Fetch();
                break;
            case 6:
                Sort_select();
                break;
            case 7:
                Sort_buble();
                break;
            case 8:
                Sort_insert();
                //my_Sort_insert();
                break;
            case 9:
                Search();
                break;
            case 10:
                Sort_total_score();
                break;
            case 11:
                Sort_grad();
                break;
            case 12:
                printf("菜单\n1.写入文件\n2.输出学生信息\n3.写入新文件\n4.查找课程最高分\n5.随机读取学生信息\n6.同专业平均分简单选择排序\n7.同班级平均分冒泡排序\n");
                printf("8.同班级按课程1分数直接插入排序\n9.综合查找\n10.全体总分排序\n11.全体学号排序\n12.重现菜单\n0.退出\n");
                break;
            default:
                printf("输入有误,请重新输入!\n");
        }
        printf("请输入选项:");
        scanf("%d",&k);
    }
    return 0;
}

void write()
{
    int i = length;
    FILE *p = fopen("1.txt", "w");      //打开文件
    fprintf(p,"%s %s %s %s %s %s %s\n",a,b,c,d,e,f,g);
    for(i=0;i<length;i++)
        fprintf(p,"%s %s      %s   %s  %d      %d         %d",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
    fclose(p);
}