1108. Finding Average (20)

本文介绍了一个C++程序,该程序用于验证输入字符串是否为合法的浮点数,并计算所有合法数字的平均值。文章详细展示了如何通过检查特定字符来判断字符串是否符合数字的标准格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>

#include <string>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;
const int maxn=100005;


bool judge(char s[])
{
    int len=strlen(s);
    int i;
    int t1=0,t2=0,t3=0;
    for(i=0;i<len;i++)
    {
        if(s[i]=='-')
            t1++;
        else if(s[i]=='.')
            t2++;
        else if(s[i]>='0'&&s[i]<='9')
            t3++;
    }

    if(t1+t2+t3<len)
        return 0;
//只剩三种字符
    if(t3==0)
        return 0;
    if(t1>1)
        return 0;
    if(t2>1)
        return 0;
//保证- .都最多只有一个

    for(i=1;i<len;i++)
    {
        if(s[i]=='-')
            return 0;
    }
//保证若有-则必在第一个

    int j;
    for(j=0;j<len;j++)
    {
        if(s[j]=='.')
            break;
    }

    //已经是数字了

    if(len-(j+1)>2)
        return 0;
    //小数点后面控制完毕
    
   // if(s[0]=='.'||(s[0]=='-'&&s[1]=='.'))
    //    return 0;


    return 1;
}

int main()
{
//    freopen("in.txt","r",stdin);

    int N;
    int cou=0;
    double sum=0;
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        char s[maxn];
        scanf("%s",s);
        if(judge(s)==0)//不是数字
        {
            printf("ERROR: %s is not a legal number\n",s);
            continue;
        }
        else
        {
            double t;
            sscanf(s,"%lf",&t);
            if(t>1000||t<-1000)
            {
                printf("ERROR: %s is not a legal number\n",s);
                continue;
            }
            else
            {
              //  printf("%s\n",s);
                cou++;
                sum+=t;
            }
        }
    }

    if(cou==0)
        printf("The average of 0 numbers is Undefined\n");
    else if(cou==1)
        printf("The average of %d number is %.2f",cou,sum/cou);
    else
        printf("The average of %d numbers is %.2f",cou,sum/cou);

    return 0;
}

### 编写C语言程序处理多班级学生成绩 为了满足需求,可以创建一个结构体用于存储单个学生的成绩信息,并通过循环读取多个学生的信息。对于每个班级,将这些信息存入相应的数组中以便后续操作。 #### 结构体定义 ```c #include <stdio.h> #define MAX_STUDENTS 16 /* 定义最大可能的学生数 */ #define NUM_CLASSES 3 /* 总共的班级数目 */ typedef struct { char id[20]; /* 存储学号字符串 */ float score; /* 单科成绩 */ } Student; ``` #### 主函数逻辑框架 主函数负责初始化必要的变量并调用其他辅助函数完成具体任务: - 输入各个班级的学生数据; - 调用`findMaxScore()`寻找最高分及相关信息; - 使用`calculateAverageAndVariance()`分别计算各班平均分和方差。 ```c void inputStudentData(Student class[NUM_CLASSES][MAX_STUDENTS], int studentCounts[]); float findMaxScore(Student classes[][MAX_STUDENTS], int counts[], char *maxId, int *classIndex); void calculateAverageAndVariance(const Student students[], const int count, float *average, float *variance); int main() { Student allClasses[NUM_CLASSES][MAX_STUDENTS]; int numStudentsPerClass[NUM_CLASSES]; // 获取用户输入的数据... inputStudentData(allClasses, numStudentsPerClass); char topScorerID[20]; int bestClassIdx; printf("Finding the highest scorer...\n"); float maxScore = findMaxScore(allClasses, numStudentsPerClass, topScorerID, &bestClassIdx); printf("The highest score is %.2f by ID %s from Class %d\n", maxScore, topScorerID, bestClassIdx + 1); for (int i=0;i<NUM_CLASSES;++i){ float avg,var; calculateAverageAndVariance(allClasses[i],numStudentsPerClass[i],&avg,&var); printf("For Class %d:\n Average Score=%.2f Variance=%.2f \n",i+1,avg,var); } return 0; } ``` #### 辅助函数实现细节 ##### 数据录入部分 `inputStudentData` 此函数接收两个参数:一个是用来保存所有班级记录的二维数组指针;另一个是用来跟踪实际录入了多少条目的整型一维数组。该函数会提示用户提供指定范围内(即12至16之间)的有效学生数量,并依次收集他们的学号与《C程序设计》科目得分[^1]。 ```c void inputStudentData(Student class[NUM_CLASSES][MAX_STUDENTS], int studentCounts[]) { for(int c=0;c<NUM_CLASSES;c++){ do{ printf("\nEnter number of students in Class %d between 12 and 16:",c+1); scanf("%d",&studentCounts[c]); }while(studentCounts[c]<12 || studentCounts[c]>16); for(int s=0;s<studentCounts[c];++s){ printf("Enter details for student #%d in Class %d:\n",s+1,c+1); printf("ID:"); scanf("%s",class[c][s].id); printf("Score:"); scanf("%f",&class[c][s].score); } } } ``` ##### 寻找最高分 `findMaxScore` 遍历整个三维数组中的每一个元素,比较当前项与其他已知的最大值之间的大小关系,更新全局最优解的同时也记录下所属的具体位置信息[^2]。 ```c float findMaxScore(Student classes[][MAX_STUDENTS], int counts[], char *maxId, int *classIndex) { float max=-9999.0; for(int clss=0;clss<NUM_CLASSES;clss++) for(int st=0;st<counts[clss];st++) if(classes[clss][st].score>max){ max=classes[clss][st].score; strcpy(maxId,classes[clss][st].id); *classIndex=clss; } return max; } ``` ##### 平均分及方差计算器 `calculateAverageAndVariance` 接受一组固定长度的学生列表作为输入源,先累加得到总分再除以有效样本量得出平均值;接着利用标准公式\[Var(X)=E[(X-\mu)^{2}]\]来估算离散程度指标——方差[^3]。 ```c void calculateAverageAndVariance(const Student students[], const int count, float *average, float *variance) { double sumScores=0.0,sumSquaredDiffs=0.0; for(int idx=0;idx<count;idx++)sumScores+=students[idx].score; *average=(float)(sumScores/count); for(int jdx=0;jdx<count;jdx++)sumSquaredDiffs+=(double)((*average-students[jdx].score)*(*average-students[jdx].score)); *variance=(float)(sumSquaredDiffs/(count)); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值