6-7 统计大于等于平均分人数 (10 分)

该博客介绍了一道PTA编程题,要求使用C语言编写一个函数,统计输入数组中高于或等于平均分的学生人数。函数接收学生分数数组、学生人数及平均分作为参数,返回大于等于平均分的学生数量。博客提供了函数接口定义和裁判测试程序的样例输入输出。

PTA 6-7 统计大于等于平均分人数 (10 分)

函数 fun 的功能是:从m个学生的成绩中统计出高于和等于平均分的学生人数, 此人数由函数值返回。平均分通过形参传回,输入学生成绩时, 用-1结束输入,由程序自动统计学生人数。

函数接口定义:

int fun ( float *s, int n, float *aver );

其中 s、n、aver 都是用户传入的参数。n 值是学生人数。函数的功能是:从指针s所指向的数组中统计出大于等于平均分的学生人数, 此人数由函数值返回。平均分通过形参aver传回。

裁判测试程序样例:

#include <stdio.h>
int fun ( float *s, int n, float *aver );
int main()
{ float a,s[30],aver;
int m = 0,i;
scanf("%f",&a );
while( a>0 ) { s[m] = a; m++; scanf ( "%f", &a );}
printf( "The number of students : %d\n" , fun ( s, m, &aver ));
printf( "ave=%.2f\n",aver );
return 0;
}


/* 请在这里填写答案 */

输入样例:

80.5 60 72 90.5 98 51.5 88 64 -1

输出样例:

The number of students : 4
ave=75.56

我的代码如下

int fun(float *s, int n, float *aver)
{
    float sum = 0,m;
    int count=0;
    for (int i = 0; i < n; i++)
    {
        sum += *(s + i);
        
    }
    
    *aver = sum / n;
    m = sum / n;
    for (int i = 0; i < n; i++)
    {
        if (*(s + i) >= m)

        {
            count++;
        }
    }
    
    return count;
 
}



<think>好的,我现在需要解决用户的问题,用C++动态配内存来实现统计成绩大于等于平均分人数。首先,我得理解用户的需求。用户想要一个示例代码,使用动态配内存,这意味着需要使用newdelete来管理内存,而不是静态组或者STL容器。 首先,我需要确定程序的步骤。大概的流程应该是这样的:首先输入学生人数,然后动态配一个组来存储成绩,接着输入每个学生成绩,计算平均分,然后统计大于等于平均分人数,最后输结果并释放内存。 接下来,我需要考虑如何动态配内存。在C++中,可以使用new关键字来配内存,比如int* scores = new int[n];,其中n是学生人数。完成后,必须用delete[] scores;来释放内存,避免内存泄漏。 然后,计算平均分。需要遍历组,累加所有成绩,然后除以人数。这里要注意除法可能导致整除法的问题,所以可能需要使用浮点类型,比如double来存储平均分。不过用户的问题中并没有特别说明是否需要浮点结果,但通常平均分可能有小,所以应该用double。 统计人数,再次遍历组,比较每个成绩是否大于等于平均分,符合条件的计器加一。 接着,我需要处理输入输。用户需要输入学生人数,然后逐个输入成绩。这里需要注意输入的正确性,但用户可能不需要复杂的错误处理,示例代码可能不需要处理无效输入,比如负人数或者非字输入,这样可以保持代码简洁。 然后,编写代码结构。主函数中先获取n,配内存,输入成绩,计算总平均分统计人数,输结果,释放内存。 可能还需要考虑特殊情况,比如n为0的情况,但用户的问题可能假设n至少为1,或者可以在代码中加入检查,但示例代码可能可以省略这部,除非用户特别指。 现在,检查是否有遗漏的步骤。动态配内存的正确使用,计算平均分统计人数,释放内存,这些步骤都有了。 然后,测试代码逻辑。例如,假设有3个学生成绩别是80、90、70。总是240,平均分80,那么大于等于80的人数是2。代码应该正确输这个结果。 再比如,所有成绩等于平均分的情况,比如三个60平均分60,人数应该是3。 还有,当所有成绩都低于平均分的情况是否可能?实际上不可能,因为平均分是所有成绩的平均,至少有一个成绩等于高于平均分的情况可能存在,但学上,如果所有成绩相同,则都等于平均分。所以代码逻辑没问题。 现在考虑代码的语法正确性。使用正确的指针操作,输入输使用cincout,正确的循环结构,最后释放内存。 然后,参考用户提供的引用,但用户给的引用似乎不太相关。引用[1]讲的是conststatic的区别,以及类的大小,可能当前问题无关。引用[2]是关于学生成绩管理系统的,可能涉及动态内存,但具体代码示例可能不同。用户可能希望代码使用动态内存配,而不是静态组或vector。 所以,示例代码应该展示如何正确使用newdelete,处理动态组,计算统计结果。 现在,开始编写代码的大纲: 1. 输入学生人数n。 2. 动态配int组scores,大小为n。 3. 循环输入n个成绩组。 4. 计算总sum,然后平均分avg = sum / n。 5. 遍历组,统计>=avg的人数count。 6. 输count。 7. 释放组内存。 需要注意的地方: - 在计算avg时,sum是整,n是整,直接sum / n会得到整除法结果。例如,总是250,n是3,平均分会是83而不是83.333,这可能导致统计错误。所以应该将sum转换为double再计算平均分。 因此,代码中应该将avg声明为double,并计算为double(sum) / n。 例如,sum = 240,n = 3 → avg = 80.0,正确统计。 如果sum = 241,n=3 → avg≈80.333,统计成绩>=80.333的。 所以,在代码中必须将avg计算为浮点。 现在,编写代码: #include <iostream> using namespace std; int main() { int n; cout << "请输入学生人数: "; cin >> n; int* scores = new int[n]; cout << "请输入" << n << "个成绩:" << endl; for (int i = 0; i < n; ++i) { cin >> scores[i]; } int sum = 0; for (int i = 0; i < n; ++i) { sum += scores[i]; } double avg = static_cast<double>(sum) / n; int count = 0; for (int i = 0; i < n; ++i) { if (scores[i] >= avg) { count++; } } cout << "平均分: " << avg << endl; cout << "大于等于平均分人数: " << count << endl; delete[] scores; return 0; } 现在检查这段代码是否符合要求。动态配内存使用了newdelete[],正确计算平均分统计人数,并输结果。是的,这样应该可以工作。 接下来,用户可能需要知道这段代码的注意事项,比如内存泄漏的风险,或者是否需要处理n为0的情况。但示例代码中假设用户输入合法的n值(正整)。如果用户输入0,new会抛异常,但通常示例代码可能不处理这种情况,因为重点是展示动态内存配的使用。 另外,可以指,在实际应用中,可能需要使用智能指针或STL容器如vector来更安全地管理内存,但用户明确要求使用动态配内存,所以示例代码使用原始指针。 这样,用户的问题应该得到了解答,示例代码也正确演示了如何动态配内存来实现所需功能。</think>以下是使用C++动态配内存实现成绩统计功能的示例代码,包含详细的中文注释: ```cpp #include <iostream> using namespace std; int main() { int numStudents; cout << "请输入学生人数: "; cin >> numStudents; // 动态配内存存储成绩 int* scores = new int[numStudents]; // 输入成绩 cout << "请输入" << numStudents << "个学生成绩:" << endl; for (int i = 0; i < numStudents; ++i) { cin >> scores[i]; } // 计算总 int total = 0; for (int i = 0; i < numStudents; ++i) { total += scores[i]; } // 计算平均分(转换为浮点避免整除法) double average = static_cast<double>(total) / numStudents; // 统计达标人数 int count = 0; for (int i = 0; i < numStudents; ++i) { if (scores[i] >= average) { ++count; } } // 输结果 cout << "平均分: " << average << endl; cout << "达标人数: " << count << endl; // 释放动态配的内存 delete[] scores; return 0; } ``` 代码执行流程: 1. 通过`new`动态配内存空间存储成绩组 2. 循环接收用户输入的成绩据 3. 计算总平均分时,使用`static_cast<double>`确保精度 4. 遍历统计达标人数 5. 最后通过`delete[]`释放内存 注意事项: - 动态内存必须配对使用`new[]``delete[]` - 使用浮点转换避免整除法错误(如总245/3=81.666- 实际开发建议使用`vector`容器更安全[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值