数组,结构体,指针综合题

7-1 实验二 (100 分)
设计一种结构体,用来保存学生信息。假定学生的总人数不超过100人。学生的信息包括学号(<10000的整数)、姓名(长度不超过19的字符串)、三科成绩(整数)以及综合成绩(实数)。除综合成绩外,各项数据均由键盘输入。综合成绩在计算前,其值为0。现在要求实现如下几种功能,分别有对应的操作方式: 1)输入若干学生的信息。 对应的操作为: 在第一行中输入1和整数N,N代表要输入的学生人数。其后是N行数据,每行数据代表一个学生的信息。
2)计算所有学生的综合成绩,综合成绩 = 第1科成绩 * r1 + 第2科成绩 * r2 + 第3科成绩 * r3。 对应的操作为: 在一行中输入2和三个实数r1、r2、r3,其中r1、r2和r3代表计算综合成绩时的加权系数,输入保证时r1 + r2 + r3 = 1.0。 3)插入学生信息; 对应的操作为: 在第一行中输入3和整数N,N表示要将新输入的学生信息插入到原来的第N个学生前面。如果N大于当前学生人数,则插入到最后面。 第二行数据代表要插入的一个学生的信息。 4)删除学生; 对应的操作为: 在第一行中输入4和整数N,N表示将要删除的学生的序号(从1开始)。如果N大于当前的学生人数,则不会删去学生信息。 5)查询学生; 对应的操作为: 在第一行中输入5和学生的学号,如果能查询到对应的学生,则在一行中显示学生的信息,如果查询不到,则显示“Not Found.”。 还有一种查询方式为按姓名查询,操作如下: 在第一行中输入6和学生的姓名,如果能查询到对应的学生,则在一行中显示学生的信息,如果查询不到,则显示“Not Found.”。 6)显示学生信息。 对应的操作为: 在第一行中输入7,会显示所有学生的信息,每位学生的信息占一行。 7)退出系统 对应的操作为: 在第一行中输入0。
输入格式:
按上述要求输入信息。

输出格式:
按上述要求输出信息,同一行的各项信息间用一个空格分隔,综合成绩保留两位小数。并在最后输出一个空行。

输入样例:
1 4
2001 Wang 90 85 75
2003 Li 78 69 86
2008 Zhao 85 74 90
2010 Liu 85 72 85
7
2 0.2 0.35 0.45
7
6 Li
5 2002
3 3
2005 Bai 80 76 80
7
2 0.5 0.5 0.0
7
4 1
7
0
结尾无空行
输出样例:
学号:2001 姓名:Wang 成绩1:90 成绩2:85 成绩3:75 综合成绩:0.00
学号:2003 姓名:Li 成绩1:78 成绩2:69 成绩3:86 综合成绩:0.00
学号:2008 姓名:Zhao 成绩1:85 成绩2:74 成绩3:90 综合成绩:0.00
学号:2010 姓名:Liu 成绩1:85 成绩2:72 成绩3:85 综合成绩:0.00

学号:2001 姓名:Wang 成绩1:90 成绩2:85 成绩3:75 综合成绩:81.50
学号:2003 姓名:Li 成绩1:78 成绩2:69 成绩3:86 综合成绩:78.45
学号:2008 姓名:Zhao 成绩1:85 成绩2:74 成绩3:90 综合成绩:83.40
学号:2010 姓名:Liu 成绩1:85 成绩2:72 成绩3:85 综合成绩:80.45

学号:2003 姓名:Li 成绩1:78 成绩2:69 成绩3:86 综合成绩:78.45

Not Found.

学号:2001 姓名:Wang 成绩1:90 成绩2:85 成绩3:75 综合成绩:81.50
学号:2003 姓名:Li 成绩1:78 成绩2:69 成绩3:86 综合成绩:78.45
学号:2005 姓名:Bai 成绩1:80 成绩2:76 成绩3:80 综合成绩:0.00
学号:2008 姓名:Zhao 成绩1:85 成绩2:74 成绩3:90 综合成绩:83.40
学号:2010 姓名:Liu 成绩1:85 成绩2:72 成绩3:85 综合成绩:80.45

学号:2001 姓名:Wang 成绩1:90 成绩2:85 成绩3:75 综合成绩:87.50
学号:2003 姓名:Li 成绩1:78 成绩2:69 成绩3:86 综合成绩:73.50
学号:2005 姓名:Bai 成绩1:80 成绩2:76 成绩3:80 综合成绩:78.00
学号:2008 姓名:Zhao 成绩1:85 成绩2:74 成绩3:90 综合成绩:79.50
学号:2010 姓名:Liu 成绩1:85 成绩2:72 成绩3:85 综合成绩:78.50

学号:2003 姓名:Li 成绩1:78 成绩2:69 成绩3:86 综合成绩:73.50
学号:2005 姓名:Bai 成绩1:80 成绩2:76 成绩3:80 综合成绩:78.00
学号:2008 姓名:Zhao 成绩1:85 成绩2:74 成绩3:90 综合成绩:79.50
学号:2010 姓名:Liu 成绩1:8

代码如下:

#include <stdio.h>
struct Student 
{
    int id;
    char name[20];
    int score[3];
    double zh;
};


//输入
void input(struct Student stu[],int n)
{
    int i;
    for (i=0;i<n;i++)
    {
        scanf("%d %s %d %d %d",&stu[i].id,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
    }
}
//综合
void zh(struct Student stu[],int n,double r1,double r2,double r3)
{
    int i;
    for (i=0;i<n;i++)
    {
        stu[i].zh = r1 * stu[i].score[0] + r2 * stu[i].score[1] + r3 * stu[i].score[2];
    }
}
//插入
void insert(struct Student stu[],int pos,int *n,double r1,double r2,double r3)
{
    int j;
    if(pos > *n)
    {
        scanf("%d %s %d %d %d",&stu[*n].id,stu[*n].name,&stu[*n].score[0],&stu[*n].score[1],&stu[*n].score[2]);
        stu[*n].zh = r1 * stu[*n].score[0] + r2 * stu[*n].score[1] + r3*stu[*n].score[2];
    }else
    {
        for (j = *n;j>=pos;j--)
        {
            stu[j]  = stu[j-1];
        }
        scanf("%d %s %d %d %d",&stu[pos-1].id,stu[pos-1].name,&stu[pos-1].score[0],&stu[pos-1].score[1],&stu[pos-1].score[2]);
        stu[pos-1].zh = r1 * stu[pos-1].score[0] + r2 * stu[pos-1].score[1] + r3*stu[pos-1].score[2];
    }
    *n = *n + 1;
}
//查询
void find(struct Student stu[],int n,int id)
{
    int i;
    for(i=0;i<n;i++)
    {
        if(id == stu[i].id)
        {
            printf("%d %s %d %d %d\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
            break;
        }
    }
    if(i==n)
        printf("Not Found.\n");
}
//显示所有
void showall(struct Student stu[],int n)
{
    int i=0;
    for (i=0;i<n;i++)
    {
        printf("%d %s %d %d %d\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
    }
}

int main()
{
    int op,n,pos,id;
    struct Student stu[1000];
    double r1,r2,r3;
    //输入
    scanf("%d %d",&op,&n);
    input(stu,n);

    //计算综合
    scanf("%d %lf %lf %lf",&op,&r1,&r2,&r3);
    zh(stu,n,r1,r2,r3);

    //插入
    scanf("%d %d",&op,&pos);
    insert(stu,pos,&n,r1,r2,r3);

    //查询
    scanf("%d %d",&op,&id);
    find(stu,n,id);

    //显示所有学生信息
    showall(stu,n);

    //退出
    scanf("%d %d",&op,&pos);
    return 0;

}



参考:


#include "stdio.h"

#define N 100
struct student{
    int id;
    char name[20];
    int kaoqun;
    int biaoxian;
    int zuoye;
    int biji;
    int sum;
}stud[N],t;

int main()
{
    int i,j;
    for(i=0;i<N;i++){
        printf("请输入第%d个学生信息\n",i+1);
        scanf("%d %s",&stud[i].id,&stud[i].name);
        fflush(stdin);
        scanf("%d %d %d %d",&stud[i].kaoqun,&stud[i].biaoxian,&stud[i].zuoye,&stud[i].biji);
        stud[i].sum = stud[i].kaoqun*0.3+stud[i].biaoxian*0.3+stud[i].zuoye*0.3+stud[i].biji*0.1;
    }
    
    //排序
    
    for (i = 0; i < N - 1; i++){
        for (j = 0; j < N - 1 - i; j++){ //按成绩对学生信息进行排序
            if (stud[j].sum > stud[j + 1].sum){ //整型数字的比较
                t = stud[j];
                stud[j] = stud[j + 1];
                stud[j + 1] = t;
            }
        }
    }
    //打印
    printf("学号\t姓名\t考勤\t表现\t作业\t笔记\t总分\t\n");
    for (i = 0; i < N; i++){
        printf("%d\t", stud[i].id);
        printf("%s\t", stud[i].name);
        printf("%d\t", stud[i].kaoqun);
        printf("%d\t", stud[i].biaoxian);
        printf("%d\t", stud[i].zuoye);
        printf("%d\t", stud[i].biji);
        printf("%d \n", stud[i].sum);
    }
    
    return 1;
}