大家可以给我提供思路吗,我也不知道怎么实现一个数组弄完这些

img

就是我大概要怎么写啊,c++用一个数组存放学生数据,我听课听懂了,就是不会写,非常感谢大家

大致思路是:先定义存储学习的结构,然后再从输入获取5个学生的信息存入结构数组,接着遍历结构数组计算每门课程的最高分,最低分,平均分,最后再根据格式打印结果就可以了。

代码如下:


#include <iostream>
#include <string.h>
#define N 3  // 为了便于测试,这里定义学生个数为3个 

using namespace std;

// 存储学生信息的结构 
struct student{
    
    char id[20];  // 学号 
    char name[20];  // 姓名 
    
    // 根据题目给出的例子,成绩全为整数
    // 所以成绩都定义为int类型,如果需要更高精度可以使用浮点数类型
    int math;  // 高数成绩 
    int english;  // 英语成绩 
};

int main(void){
    
    //定义存储指定个数学生信息的结构数组 
    struct student ss[N] ;
    
    // 从输入获取N个学生信息,存入学生结构数组 
    for(int i=0;i<N;i++){
        
        cout<<"请输入第"<<i+1<<"个学生的学号:\n";
        cin>>ss[i].id;
        
        int sameId;
        // 检测学号是否重复 
        while(1){
                sameId=0;
                for(int j=0;j<i;j++){
                
                    if(strcmp(ss[j].id,ss[i].id)==0){
                        sameId=1;
                        cout<<"学号重复,请从重新输入第"<<i+1<<"个学生的学号:\n";
                        cin>>ss[i].id;
                        break;
                    }
                }
                
                if(sameId==0){
                    break;
                }
        }
        
        cout<<"请输入第"<<i+1<<"个学生的姓名:\n";
        cin>>ss[i].name;
        
        cout<<"请输入第"<<i+1<<"个学生的高数成绩:\n";
        cin>>ss[i].math;
        
        
        // 如果高数成绩不在0-100区间,则重复获取一个高数成绩
        // 直到高数成绩在0-100区间 
        while(ss[i].math<0||ss[i].math>100){
                cout<<"成绩必须在0-100之间,请重新输入第"<<i+1<<"个学生的高数成绩:\n";
                cin>>ss[i].math;
        }
        

        
        cout<<"请输入第"<<i+1<<"个学生的英语成绩:\n";
        cin>>ss[i].english;
        
        
        // 如果英语成绩不在0-100区间,则重复获取一个英语成绩
        // 直到英语成绩在0-100区间 
        while(ss[i].english<0||ss[i].english>100){
                cout<<"成绩必须在0-100之间,请重新输入第"<<i+1<<"个学生的英语成绩:\n";
                cin>>ss[i].english;
        }
        
        cout<<endl;
    }
    
    
    // 根据题目给出的例子,成绩全为整数
    // 所以成绩都定义为int类型,如果需要更高精度可以使用浮点数类型
    // 分别定义存储英语最高分,最低分,平均分的变量 
    int englishMax=0,englishMin=100,englishAvg=0; 
    
    // 分别定义存储高数最高分,最低分,平均分的变量 
    int mathMax=0,mathMin=100,mathAvg=0;
    
    
    // 遍历学生结构数组,计算每门课程的最高分,最低分,平均成绩 
    for(int i=0;i<N;i++){
        
        if(ss[i].english>englishMax){
            englishMax=ss[i].english;
        }
        
        if(ss[i].english<englishMin){
            englishMin = ss[i].english;
        }
        
        englishAvg+=ss[i].english;
        
        if(ss[i].math>mathMax){
            mathMax=ss[i].math;
        }
        
        if(ss[i].math<mathMin){
            mathMin = ss[i].math;
        }
        
        mathAvg+=ss[i].math;
        
    }
    englishAvg/=N;  // 计算最终的英语平均分 
    mathAvg/=N;  //计算最终的数学平均分 
    
    // 按格式打印结果    
    cout<<"科目\t最高分\t最低分\t平均分\n";
    cout<<"--------------------------------\n";
    cout<<"英语\t"<<englishMax<<"\t"<<englishMin<<"\t"<<englishAvg<<"\n";
    cout<<"高数\t"<<mathMax<<"\t"<<mathMin<<"\t"<<mathAvg<<"\n";
    cout<<"--------------------------------\n";
    
    
    return 0;
}

img

定义结构体存放每个学生的信息,然后定义这个结构体数组。循环输入时,每一轮循环里依次输入结构体中的信息。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/735948
  • 这篇博客你也可以参考下:蓝桥杯准备已经差不多了,就在2个星期前,我还在为我的算法而担忧,现在已经差不多了
  • 除此之外, 这篇博客: 存在数组的引用,而不存在引用类型的数组中的 存在数组的引用,而不存在引用类型的数组 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #if 0
    
    1.没有引用数组的原因:
    (1).引用数组指的是引用类型的数组,也就是数组的各个成员是引用&类型,这是在c++中不能实现的
    
    (2).c++中,引用可以说只是某个变量的别名,所谓别名,是和指针类型区分开的:指针类型也可以
    指向某个变量,但指针类型本身也是一个变量,而引用实际上不是一个变量。更本质来说,可以
    理解为引用没有自身的地址,不占用内存空间(这里为了简化问题可以这样考虑)。因此,
    声明引用数组没有办法分配空间,因为根本就没有空间可以分配给引用。所以不能声明和定义引用数组
    
    (3).C++不支持传统意义的复制:
    传统的复制为:int a = b;
    这里a和b在内存中分别占用不同的内存空间,但是内容一致。
    如果int& a = b; 这个时候,内存中a并不被分配内存,所以没有复制可言。
    所以对于数组元素是引用来说,没法完成元素的复制操作,没有给数组分配内存,所以数组中的元素不能是引用。
    
    2.数组的引用的作用(存在) 如:int(&arr)[n]
    
    (1).作为形参(防止数组退化为指针)
    下面三种方法是等价的:
    int func(int array[]);
    int func(int array[10]);
    int func(int* array);
    在func中是无法知道数组的大小,如果开发者必须提前知道数组的大小,就需要用到数组的引用做参数
    例如,int(&a)[2],可以有效的防止数组退化。也就是,数组作为函数参数传递过去后,仍然是一个数组。
    优点:节省内存消耗,不用拷贝一份数组,直接使用原数组(甚至可以修改原数组)
    
    #include <iostream>
    using namespace std;
    
    int func(int(&a)[6])
    {
    	int count = 0;
    	for (int i = 0; i < 6; i++)
    	{
    		count += a[i];
    	}
    	return count;
    }
    
    int main()
    {
    	int a1[6] = { 1,2,3,4,5,6 };
    	int count = func(a1);
    	cout << "count:" << count << endl;
    	return 0;
    }
    
    代码安全性提高:
    如果将 int a1[6] = { 1,2,3,4,5,6 }; 改为 int a1[5] = { 1,2,3,4,5 };
    编译会报错说明编译时将进行数组长度的检查
    
    
    (2).作为返回类型
    函数不能直接返回数组,但是可以返回数组的指针和数组的引用,还需要注意,返回的不能是栈对象,
    因为栈对象很快会被销毁
    
    有关定义:
    题目:编写一个函数的声明,使其返回包含10个string对象的数组的引用
    
    //不用类型别名
    string(&func(形参))[10];
    
    //类型别名
    using arr = string[10];
    arr& func(形参);
    
    typedef string(&arr)[10];
    arr func(形参);
    
    //尾置返回类型
    auto func(形参)->string(&)[10];
    
    //decltype关键字
    string ss[10];
    decltype(ss) &func(形参);
    
    
    例子:
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    int odd[] = { 1,3,5,7,9 };
    int even[] = { 0,2,4,6,8 };
    
    decltype(odd)& func(int i)
    {
    	return (i % 2) ? odd : even;
    }
    
    int main()
    {
    	cout << func(2)[1] << endl; //输出2
    	return 0;
    }
    
    #endif

     

  • 您还可以看一下 李月喜老师的企业微信开发第三方应用开发篇课程中的 我是选择网页应用还是小程序小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    首先,需要定义一个结构体或类来存储学生信息,例如:

    struct student{ string name; int age; int grade; };

    然后,定义一个数组来存储学生信息,数组元素类型为结构体或类,例如:

    student students[100];

    在修改或访问某个学生信息时,可以通过数组下标来实现,例如:

    students[0].name = "张三"; students[0].age = 18; students[0].grade = 90;

    可以为数组添加数据,例如:

    for(int i=0;i<100;i++){ students[i].name = "学生"+to_string(i); students[i].age = i%20+18; students[i].grade = i%50+50; }

    可以按照某种规则来排序学生信息,例如按照成绩从高到低排序:

    sort(students, students+100, { return a.grade > b.grade; });

    以上是一个简单的实现方式,当然还可以添加其他功能和优化。