输入不超过20个非负整数(输入每个整数后按回车,以-1结束且不计入整数个数),用一维数组作函数参数编程实现如下功能:
(1)录入每个整数,函数原型:unsigned short ReadNumber(int num[]),num存储输入的整数,返回值为输入整数的个数;
(2)按由高到低的顺序排序,函数原型:void SortNumberDescending(int num[], unsigned short n),n为整数个数;
(3)对这些整数求和及平均值,函数原型:void SummingAveraging(int num[], unsigned short n, int *pSum, float *pAver),pSum指向和变量,pAver指向平均值变量;
(4)输出这些整数,函数原型:void PrintNumber(int num[], unsigned short n) 。
主函数中按以下示例形式提示输入、调用函数(1)、调用函数(2)、提示输出、调用函数(4)、调用函数(3)、输出整数和及平均值。
Input Numbers:
87
100
...
23
-1
Sort in descending order:
100
...
23
Sum=474,Aver=59.25
输入格式:
"Input Numbers:\n"
"%d"
输出格式:
"\nSort in descending order:\n"
"\nSum=%d,Aver=%.2f\n"
"%d\n"
想问一下下面程序哪里有问题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int ReadNumber(int num[]);
void SortNumberDescending(int num[],int n);
void SummingAveraging(int num[],int n, int *pSum, float *pAver);
void PrintNumber(int num[], int n);
int main()
{
int num[20],sum=0;
int n;
float Aver=0;
int *pSum=&sum,*pAver=&Aver;
printf("Input Numbers:\n");
n=ReadNumber(num[20]);
SortNumberDescending(num[n],n);
SummingAveraging(num[n],n,*pSum,*pAver);
printf("\nSort in descending order:\n");
PrintNumber(num[n],n);
printf("\nSum=%d,Aver=%.2f\n",*pSum,*pAver);
}
int ReadNumber(int num[])
{
int i;
int n=0;
for(i=0;;i++)
{
scanf("%d\n",&num[i]);
n++;
if(num[i]==-1)
break;
}
return n;
}
void SortNumberDescending(int num[],int n)
{
int i,j,temp;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if (num[j]>num[i])
{
temp=num[j];
num[j]=num[i];
num[i]=temp;
}
}
}
}
void SummingAveraging(int num[],int n, int *pSum, float *pAver)
{
int i,sum=0;
for(i=0;i<n;i++)
{
*pSum=*pSum+num[i];
}
*pAver=(float)*pSum/n;
}
void PrintNumber(int num[], int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d\n",num[i]);
}
}
#include<stdio.h>
unsigned short ReadNumber(int num[]){
unsigned short count = 0;
int n = 0;
do{
scanf("%d", &n);
if(n != -1 && count < 20){
num[count++] = n;
}
}while(n != -1 && count < 20);
return count;
}
void SortNumberDescending(int num[], unsigned short n){
int temp = 0, i = 0, j = 0;
for(i = 0; i < n-1; i++){
for(j = i+1; j < n; j++){
if(num[i] < num[j]){
temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
}
void SummingAveraging(int num[], unsigned short n, int *pSum, float *pAver){
int sum = 0, i = 0;
for(i = 0; i < n; i++){
sum += num[i];
}
*pSum = sum;
*pAver = (float)sum/n;
}
void PrintNumber(int num[], unsigned short n){
int i = 0;
for(i = 0; i < n; i++){
printf("%d ", num[i]);
}
printf("\n");
}
int main(){
int num[20], sum = 0;
float aver = 0.0f;
unsigned short count = 0;
//提示输入
printf("Please input up to 20 non-negative integers, end with -1:\n");
// 调用函数1,读取数字并统计个数
count = ReadNumber(num);
// 调用函数2,将数字排序
SortNumberDescending(num, count);
// 提示输出
printf("The numbers in descending order are: ");
// 调用函数3,将排序后的数字输出
PrintNumber(num, count);
// 调用函数4,求和及平均值
SummingAveraging(num, count, &sum, &aver);
// 输出整数和及平均值
printf("The sum of these numbers is: %d\n", sum);
printf("The average of these numbers is: %.2f\n", aver);
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:该程序没有明显的语法错误,但存在以下问题:
没有对输入的非负整数的范围进行限制,可能会导致程序出错。
未检查输入的数组长度是否超过20个,可能会导致程序出错。
排序函数SortNumberDescending()没有检查数组长度n是否为0,可能会导致程序出错。
在求和平均值函数SummingAveraging()中,指针pSum和pAver未检查是否为NULL,可能会导致程序出错。
在输出平均值时,未指定小数点后保留位数,可能会导致输出错误。
为了解决以上问题,可以对程序进行如下修改:
#include <iostream>
#include <iomanip> // 加入iomanip库,用于输出控制
using namespace std;
unsigned short ReadNumber(int num[]);
void SortNumberDescending(int num[], unsigned short n);
void SummingAveraging(int num[], unsigned short n, int *pSum, float *pAver);
void PrintNumber(int num[], unsigned short n);
int main()
{
int num[20];
unsigned short n = ReadNumber(num);
SortNumberDescending(num, n);
PrintNumber(num, n);
int sum;
float aver;
SummingAveraging(num, n, &sum, &aver);
cout << "The sum is " << sum << endl;
// 设置小数点后保留两位
cout << fixed << setprecision(2) << "The average is " << aver << endl;
return 0;
}
// 限制输入的非负整数的范围
unsigned short ReadNumber(int num[])
{
cout << "Please enter no more than 20 non-negative integers" << endl;
unsigned short count = 0;
int input;
while(cin >> input && input >= 0 && count < 20) { // 判断输入是否合法
num[count] = input; // 将输入存入数组
count++;
}
return count; // 返回输入的数量
}
// 检查数组长度n是否为0,避免程序出错
void SortNumberDescending(int num[], unsigned short n)
{
if(n == 0) {
return; // 直接返回,不进行操作
}
// 排序算法
for(int i = 0; i < n - 1; i++) {
for(int j = i + 1; j < n; j++) {
if(num[j] > num[i]) {
int tmp = num[i];
num[i] = num[j];
num[j] = tmp;
}
}
}
}
// 检查指针pSum和pAver是否为NULL,避免程序出错
void SummingAveraging(int num[], unsigned short n, int *pSum, float *pAver)
{
if(pSum == NULL || pAver == NULL) {
return; // 直接返回,不进行操作
}
int sum = 0;
for(int i = 0; i < n; i++) {
sum += num[i];
}
*pSum = sum;
*pAver = (float)sum / n;
}
void PrintNumber(int num[], unsigned short n)
{
cout << "The numbers are: ";
for(int i = 0; i < n; i++) {
cout << num[i] << " ";
}
cout << endl;
}