注册 登录
编程论坛 C++教室

C++,关于数组与结构体的结合。初学者,谢谢

yxs0924 发布于 2016-03-10 11:29, 3988 次点击
定义一个学生成绩结构体类型,包含“学号”、“姓名”、“性别”、“年龄”、“班级”、“英语”、“数学”、“物理”、“总分”、“名次”等信息。编写6个函数分别用于:
(1)    使用结构体数组,输入全班10名学生的上述信息;
(2)    计算每一个学生的总分、平均分;
(3)    计算每一门课程的平均分;
(4)    查找成绩有不及格的学生信息;
(5)    按学生成绩总分降序排序;
(6)    输出全班学生的学号、总分及名次。
7 回复
#2
yxs09242016-03-10 11:30
#3
qq10235692232016-03-10 15:30
这个好做,很基本的,自己多看看。
#4
wengbin2016-03-11 11:26
程序代码:
/**
定义一个学生成绩结构体类型,包含“学号”、“姓名”、“性别”、“年龄”、“班级”、“英语”、“数学”、“物理”、“总分”、“名次”等信息。编写6个函数分别用于:
(1)    使用结构体数组,输入全班10名学生的上述信息;
(2)    计算每一个学生的总分、平均分;
(3)    计算每一门课程的平均分;
(4)    查找成绩有不及格的学生信息;
(5)    按学生成绩总分降序排序;
(6)    输出全班学生的学号、总分及名次。

以下是简单写的几下,没做优化,容错性很差,必须按要求输入,正常情况下可以达到你的要求,只是没写查找不及格的代码,懒的写了,基本的方法都在以下代码中能找到,自己写剩下的吧
*/
#include<iostream>
#include<string>
#include<fstream>
#define MAX 2
struct Student
{
    unsigned int ID;
    std::string name;
    std::string sex;
    unsigned int age;
    unsigned int grade;
    unsigned int English;
    unsigned int Math;
    unsigned int Chinese;
    unsigned int Physics;
    unsigned int total=0;
    unsigned int average=0;
    unsigned int rank_=0;
};
struct StudentInfo
{
    Student student[MAX];
    int average[4];
};
std::ostream & operator<<(std::ostream & os,const Student stu)
{
    os<<"ID:"<<stu.ID<<"\ttotal:"<<stu.total<<"\trank:"<<stu.rank_<<std::endl;
    return os;
}
void show(Student ss[],const int n)
{
    int len=n;
    int i=0;
    for(;i<len;i++)
    {
        std::cout<<ss[i]<<std::endl;
    }
}
void SortByTotal(Student s[],const int n)
{
    int len=n;
    int i=0;
    for(;i<len;i++)
    {
        for(int j=i+1;j<len;j++)
        {
            if(s[i].total<s[j].total)
            {
                Student temp;
                temp=s[i];
                s[i]=s[j];
                s[j]=temp;
            }
        }
        s[i].rank_=i+1;
    }
}
void aver(StudentInfo &ss,int n)
{
    int len=n;
    int sum[4]={0};
    for(int i=0;i<len;i++)
    {
        sum[0]+=ss.student[i].English;
        sum[1]+=ss.student[i].Math;
        sum[2]+=ss.student[i].Chinese;
        sum[3]+=ss.student[i].Physics;
    }
    ss.average[0]=sum[0]/len;
    ss.average[1]=sum[1]/len;
    ss.average[2]=sum[2]/len;
    ss.average[3]=sum[3]/len;
}
void TotalAndAverageCalculate(Student& s)
{
    s.total=s.English+s.Math+s.Chinese+s.Physics;
    s.average=s.total/4;
}
void Calculate(Student* stu,const int length)
{
    int i=0;
    int temp=length;
    for(;i<temp;i++)
    {
        TotalAndAverageCalculate(*(stu+i));//计算第i个学生和平均分和总分
    }
}
void GetInfoFromKeyboard(Student StuArr[],const int length)//读入学生信息
{
    int i=0;
    int temp=length;
    for(;i<temp;i++)
    {
        std::cout<<"学号:";
        std::cin>>StuArr[i].ID;
        std::cout<<"姓名:";
        std::cin>>StuArr[i].name;
        std::cout<<"性别:";
        std::cin>>StuArr[i].sex;
        std::cout<<"年龄:";
        std::cin>>StuArr[i].age;
        std::cout<<"年级:";
        std::cin>>StuArr[i].grade;

        std::cout<<"英语:";
        std::cin>>StuArr[i].English;
        std::cout<<"数学:";
        std::cin>>StuArr[i].Math;
        std::cout<<"语文:";
        std::cin>>StuArr[i].Chinese;
        std::cout<<"物理:";
        std::cin>>StuArr[i].Physics;
    }
}
int main()
{
    StudentInfo ss;
    GetInfoFromKeyboard(ss.student,MAX);//录入信息
    std::cout<<"录入学生信息如下:\n";
    show(ss.student,MAX);
    Calculate(ss.student,MAX);//计算10个学生各自的总分与平均分
    aver(ss,MAX);//每门课的平均分
    std::cout<<"录入学生信息统计如下:\n";
    show(ss.student,MAX);

    SortByTotal(ss.student,MAX);
    std::cout<<"录入学生信息排序如下:\n";
    show(ss.student,MAX);
    return 0;
}
#5
yangfrancis2016-03-11 12:35
还是wengbin版主有耐心
#6
wengbin2016-03-11 14:57
回复 5楼 yangfrancis
谁让我也是菜鸟呢,就当练习了
#7
清风先生2016-03-12 21:52
楼上真有耐心
#8
lswdcyy2016-03-15 23:12
1