C语言7:输入若干个学生的成绩,统计出平均成绩

news2024/11/24 4:30:29

在程序编辑区编写程序,给定程序功能是: 从键盘上输入若干个学生的成绩,统计出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。

例如输入: 70  80  90  -1

输出: ave =80.00

--------OUTPUT-----------

70.0

程序有两个空(1)、(2)需要补充完整。并将程序调试出所需的结果。

注意:不要随意改动程序,不得增行或删行,也不得更改程序的结构!

 

#include <stdio.h>

int main(void)
{
    float x[100], sum = 0, ave, a;
    int n = 0, i;

    // 读入学生成绩
    scanf("%f", &a);
    while (a >= 0.0 && n < 100) {
        x[n] = a;   // 将读入的成绩存入数组 x 中
        sum += a;
        n++;
        scanf("%f", &a);
    }

    // 判断是否有有效学生成绩 
        ave = sum / n;
        printf("ave =%.2f\n", ave);

        // 输出低于平均分的学生成绩
        printf("-----------OUTPUT. --------\n");
        for (i = 0; i < n; i++) 
            if (x[i] < ave) 
                printf("%.1f\n", x[i]);
    return 0;
}

       上面这段代码缺少了判断是否有有效学生成绩的部分。如果没有有效学生成绩,这个程序会输出一个错误的平均分(通常为一个很大的数),并且不会输出低于平均分的学生成绩。

因此,建议还是加上对有效学生成绩的判断。在计算平均分和输出低于平均分的学生成绩前,判断是否有有效学生成绩。如果没有,就输出一条提示信息;如果有,就按照题目要求进行计算和输出。

#include <stdio.h>

int main(void)
{
    float x[100], sum = 0, ave, a;
    int n = 0, i;

    // 读入学生成绩
    scanf("%f", &a);
    while (a >= 0.0 && n < 100) {
        x[n] = a;   // 将读入的成绩存入数组 x 中
        sum += a;
        n++;
        scanf("%f", &a);
    }

    // 判断是否有有效学生成绩
    if (n > 0) {
        // 计算平均分,并输出
        ave = sum / n;
        printf("ave =%.2f\n", ave);

        // 输出低于平均分的学生成绩
        printf("-----------OUTPUT. --------\n");
        for (i = 0; i < n; i++) {
            if (x[i] < ave) {
                printf("%.1f\n", x[i]);
            }
        }
    } else {
        printf("No scores entered.\n");    // 没有有效学生成绩
    }

    return 0;
}

在上面的代码中,首先判断 n 的值是否大于 0。如果大于 0,说明有有效学生成绩,就进行计算和输出;如果小于等于 0,说明没有有效学生成绩,就输出一条提示信息。

拓展

#include <stdio.h>
#define MAX_NUM 100 // 最多可输入的学生数

int main()
{
    float score[MAX_NUM], sum = 0, avg;
    int i, count = 0;

    printf("请输入学生成绩,以负数作为输入结束:\n");

    // 读入学生成绩,并计算成绩总和和有效学生数
    for (i = 0; i < MAX_NUM; i++) {
        scanf("%f", &score[i]);
        if (score[i] < 0) {
            break; // 输入负数结束
        }
        sum += score[i];
        count++;
    }

    // 计算平均分,并输出
    avg = sum / count;
    printf("ave =%.2f\n", avg);

    // 输出低于平均分的学生成绩
    printf("--------OUTPUT-----------\n");
    for (i = 0; i < count; i++) {
        if (score[i] < avg) {
            printf("%.1f\n", score[i]);
        }
    }

    return 0;
}

上述程序中,首先通过一个 for 循环读入学生成绩,当输入负数时结束循环。在循环过程中,累加学生成绩并计算有效学生数。

之后,根据成绩总和和有效学生数计算平均分,并使用 printf 函数输出平均分。

最后,再通过一个 for 循环输出低于平均分的学生成绩。

需要注意的是,由于输入的学生数不确定,因此需要定义一个数组来存储学生成绩。同时,为了确保程序的健壮性,也需要对输入的学生数进行限制,本例中限制最多可输入100个学生。

 拓展完善

在读入学生成绩时,这个程序没有限制输入的有效数字范围。如果用户输入了非法的字符(如字母、符号等),程序会出现错误。如果需要对输入进行限制,可以使用标准库函数 scanf() 的返回值进行判断

#include <stdio.h>
#define MAX_NUM 100 // 最多可输入的学生数

int main()
{
    float score[MAX_NUM], sum = 0, avg;
    int i, count = 0;

    printf("请输入学生成绩,以负数作为输入结束:\n");

    // 读入学生成绩,并计算成绩总和和有效学生数
    for (i = 0; i < MAX_NUM; i++) {
        if (scanf("%f", &score[i]) != 1 || score[i] < 0) {
            break; // 输入非法或负数结束
        }
        sum += score[i];
        count++;
    }

    // 如果没有有效学生成绩则直接退出
    if (count == 0) {
        printf("没有有效学生成绩。\n");
        return 0;
    }

    // 计算平均分,并输出
    avg = sum / count;
    printf("ave =%.2f\n", avg);

    // 输出低于平均分的学生成绩
    printf("--------OUTPUT-----------\n");
    for (i = 0; i < count; i++) {
        if (score[i] < avg) {
            printf("%.1f\n", score[i]);
        }
    }

    return 0;
}

 

 

 拓展完善2:如果用户输入了非法字符,我们需要通过清空标准输入缓冲区的方式来跳过该非法字符,然后继续读取下一个字符。这个过程可以使用 scanf() 函数的返回值和 getchar() 函数实现。

也就是:如果输入了非法字符,则跳过该非法字符,直到读取到换行符为止

#include <stdio.h>
#define MAX_NUM 100 // 最多可输入的学生数

int main()
{
    float score[MAX_NUM], sum = 0, avg;
    int i, count = 0;

    printf("请输入学生成绩,以负数作为输入结束:\n");

    // 读入学生成绩,并计算成绩总和和有效学生数
    for (i = 0; i < MAX_NUM; i++) {
        if (scanf("%f", &score[i]) != 1) {
            // 清空标准输入缓冲区并跳过非法字符
            while (getchar() != '\n');
            continue;
        }
        if (score[i] < 0) {
            break; // 输入负数结束
        }
        sum += score[i];
        count++;
    }

    // 如果没有有效学生成绩则直接退出
    if (count == 0) {
        printf("没有有效学生成绩。\n");
        return 0;
    }

    // 计算平均分,并输出
    avg = sum / count;
    printf("ave =%.2f\n", avg);

    // 输出低于平均分的学生成绩
    printf("--------OUTPUT-----------\n");
    for (i = 0; i < count; i++) {
        if (score[i] < avg) {
            printf("%.1f\n", score[i]);
        }
    }

    return 0;
}

 

拓展完善3: 将清空标准输入缓冲区并跳过非法字符的代码改为了跳过空格。当读取到非法字符时,该循环会一直执行,直到读取到一个空格停止。也就是:如果读到非法字符,跳过非法字符,直到读取到空格为止

#include <stdio.h>
#define MAX_NUM 100 // 最多可输入的学生数

int main()
{
    float score[MAX_NUM], sum = 0, avg;
    int i, count = 0;

    printf("请输入学生成绩,以负数作为输入结束:\n");

    // 读入学生成绩,并计算成绩总和和有效学生数
    for (i = 0; i < MAX_NUM; i++) {
        if (scanf("%f", &score[i]) != 1) {
            // 清空标准输入缓冲区并跳过非法字符
            while (getchar() != ' ');
            continue;
        }
        if (score[i] < 0) {
            break; // 输入负数结束
        }
        sum += score[i];
        count++;
    }

    // 如果没有有效学生成绩则直接退出
    if (count == 0) {
        printf("没有有效学生成绩。\n");
        return 0;
    }

    // 计算平均分,并输出
    avg = sum / count;
    printf("ave =%.2f\n", avg);

    // 输出低于平均分的学生成绩
    printf("--------OUTPUT-----------\n");
    for (i = 0; i < count; i++) {
        if (score[i] < avg) {
            printf("%.1f\n", score[i]);
        }
    }

    return 0;
}

 拓展完善4:在遇到非法字符时,会输出提示信息并清空缓冲区,同时使用 i-- 将当前位置回退一个字符,保证程序能够重新读入输入。也就是在输入非法字符时,跳过非法字符,在输出低于平均分值,非法字符对应的值不输出

#include <stdio.h>
#define MAX_NUM 100 // 最多可输入的学生数

int main()
{
    float score[MAX_NUM], sum = 0, avg;
    int i, count = 0;

    printf("请输入学生成绩,以负数作为输入结束:\n");

    // 读入学生成绩,并计算成绩总和和有效学生数
    for (i = 0; i < MAX_NUM; i++) {
        if (scanf("%f", &score[i]) != 1) {
            printf("输入非法,已跳过该字符,请重新输入!\n");
            // 清空标准输入缓冲区
            while (getchar() != ' ');
            i--; continue;
        }
        if (score[i] < 0) {
            break; // 输入负数结束
        }
        sum += score[i];
        count++;
    }

    // 如果没有有效学生成绩则直接退出
    if (count == 0) {
        printf("没有有效学生成绩。\n");
        return 0;
    }

    // 计算平均分,并输出
    avg = sum / count;
    printf("ave =%.2f\n", avg);

    // 输出低于平均分的学生成绩
    printf("--------OUTPUT-----------\n");
    for (i = 0; i < count; i++) {
        if (score[i] < avg) {
            printf("%.1f\n", score[i]);
        }
    }

    return 0;
}

 

 拓展5:加入了 while 循环来保证只有在输入合法数字(即 scanf() 的返回值为1)时才会退出循环。同时,处理非法输入时也加入了清空缓冲区的操作。

#include <stdio.h>
#define MAX_NUM 100 // 最多可输入的学生数

int main()
{
    float score[MAX_NUM], sum = 0, avg;
    int i, count = 0;
    char c; // 用于清空缓冲区

    printf("请输入学生成绩,以负数作为输入结束:\n");
    // 读入学生成绩,并计算成绩总和和有效学生数
    for (i = 0; i < MAX_NUM; i++) {
        while (scanf("%f", &score[i]) != 1) {
            printf("输入非法,请输入一个数字!\n");
            // 清空标准输入缓冲区,避免无限循环
            while ((c = getchar()) != '\n' && c != EOF);
        }
        if (score[i] < 0) {
            break; // 输入负数结束
        }
        sum += score[i];
        count++;
    }

    // 如果没有有效学生成绩则直接退出
    if (count == 0) {
        printf("没有有效学生成绩。\n");
        return 0;
    }

    // 计算平均分,并输出
    avg = sum / count;
    printf("平均分为:%.2f\n", avg);

    // 输出低于平均分的学生成绩
    printf("低于平均分的成绩为:\n");
    for (i = 0; i < count; i++) {
        if (score[i] < avg) {
            printf("%.1f\n", score[i]);
        }
    }

    return 0;
}

 

 实际输入:70 80 70 80 90

实际输出:平均分:78.00

低于平均分的成绩:70.0 70.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/613993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)

&#x1f4af; 博客内容&#xff1a;【茶话数据结构】查找最短路径——Dijkstra算法详解 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f989;所属专栏&#xff1a;数据结构笔记 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实…

软考A计划-电子商务设计师-模拟试题卷一

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

chatgpt赋能python:Python抢票的绝招

Python 抢票的绝招 随着互联网技术的不断发展&#xff0c;越来越多的人开始享受网购的便利。但是&#xff0c;随着一些热门事件的到来&#xff0c;如演唱会、体育比赛等&#xff0c;大家面临同一个问题&#xff1a;如何抢到热门事件的门票&#xff1f;这时&#xff0c;Python …

Win10利用剪贴板多次粘贴

工作中需要经常复制粘贴图片&#xff0c;每次ctrl C, ctrl V来回切换效率很低 网上有很多剪贴板增强工具&#xff0c;但win10本身有增强版的功能 多次复制后&#xff0c;在需要粘贴的地方按下&#xff0c;Windows徽标 V&#xff0c;就会出现所有复制过的内容 需要哪个直接点…

2023/06/05 PM Day4 软件项目生存期和生命周期

视频参考地址&#xff1a; B站闫波软件项目管理视频学习. 视频资源&#xff1a;video P4-P6 本篇重点&#xff1a;项目生存期 简书日更计划同步记录&#x1f3c3;… 项目生命周期 软件项目生命周期 *项目生命周期的阶段 C概念/启动阶段&#xff1a;确立项目需求和目标D开发/计…

chatgpt赋能python:Python如何把数据存到字典

Python如何把数据存到字典 字典是Python中非常有用的数据类型之一&#xff0c;它允许您将值与唯一的键相关联&#xff0c;从而快速地查找、插入和删除数据。在这篇文章中&#xff0c;我们将介绍如何使用Python将数据存储到字典中。 什么是字典&#xff1f; 字典是Python中的…

[开发板]001瑞芯微3588s开发记录--装一个仿真环境

文章目录 前言1. 构建python环境2 模型转换 前言 我是一个开发板的新手&#xff0c;刚买了一个瑞芯微3588s的板子&#xff0c;目标是要学习嵌入式的开发&#xff0c;也就是说把深度学习的框架&#xff0c;跑到板子上。万丈高楼平地起步。先把仿真环境搭建起来。 仿真环境可以跑…

趣未来科技董事长黄婵娇:专注创新研发,把公司当做科研机构来运作!

身为研发型董事长&#xff0c;黄婵娇女士谈及“技术”&#xff0c;眼中总是透着由衷的自豪。她的办公室摆满了各类技术文件以及图纸&#xff0c;以身作则将技术研发基因带入公司核心运维&#xff0c;强势带动深圳市趣未来&#xff08;B2GO&#xff09;科技有限公司一步步成长为…

电赛备赛日记(一):K210与STM32串口通信

拖更了n久的备赛日记终于来啦&#xff0c;最近实现了关于K210图像识别并将所需数据&#xff08;即目标类别&#xff0c;目标在图像中的加权坐标&#xff09;其中&#xff0c;加权坐标指K210识别到的目标并框出的框的宽和高与框左上顶点的坐标加权&#xff0c;希望以此来判断目标…

海云捷讯杯 赛后总结 目标检测——缺陷检测(模型训练部分)

在这次比赛中&#xff0c;本人在队伍中主要负责模型训练部分&#xff0c;所以本文主要讲述如何使用PaddleDetection代码自定义数据集进行目标检测&#xff0c;欢迎大家纠错讨论哦&#xff0c;不胜荣幸~ 参考项目&#xff1a; SSDquexianjiance - 飞桨AI Studio (baidu.com) 感…

云上高校导航

2023042719 - 云上高校导航 中国大学生计算机设计大赛 广西赛区 软件应用与开发 - 移动应用开发&#xff08;非游戏类&#xff09; 三等奖 “云上高校导航”是一套基于小程序云开发的校园导航类系统开发方案。 该开发方案可供开发者进行二次开发&#xff0c;用于解决师生和访客…

MySQL数据库理论基础

数据库-理论基础 1.什么是数据库2.数据库管理系统(DBMS)3.数据库与文件系统的区别4.数据库的发展史5. 常见数据库5.1 关系型数据库5.2 非关系型数据库 6.MySQL简介7. MySQL的特性8.MySQL获取9.MySQL在企业中应用10.MySQL体系结构 1.什么是数据库 数据&#xff1a; 描述事物的符…

Linux 高级篇-定制自己的Linux 系统

Linux 高级篇-定制自己的Linux 系统 基本介绍 通过裁剪现有Linux 系统(CentOS7.6)&#xff0c;创建属于自己的min Linux 小系统&#xff0c;可以加深我们对linux 的理解。利用centos7.6&#xff0c;搭建一个小小linux 系统, 很有趣。 基本原理 启动流程介绍&#xff1a; 制…

LeetCode25. K 个一组翻转链表

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值…

操作系统之IO管理

目录 IO设备的概念和分类 IO控制器 IO控制方式 IO软件层次结构 IO应用程序接口和驱动程序接口 IO核心子系统 假脱机技术 IO设备的分配和回收 缓冲区管理 磁盘的结构 磁盘调度算法 磁盘的管理 固态硬盘 本文内容摘自&#xff1a;5.1_1_I-O设备的概念和分类_哔哩哔哩…

cookie 和 session 的恩恩怨怨

目录 cookie 1. Cookie 从哪里来? 2. Cookie 到哪里去? 3. Cookie 有啥用? Session Session 中的常用方法 模拟实现一个登录页面: session 和 cookie 的最官方的恩恩怨怨 cookie Cookie 是浏览器在本地存储数据的一种机制 1. Cookie 从哪里来? Cookie 从服务器…

chatgpt赋能python:Python如何将两张图片横向拼在一起

Python如何将两张图片横向拼在一起 在网页设计中&#xff0c;有时候需要将两张图片横向拼在一起来达到更好的展示效果。本文将介绍如何使用Python实现这一功能。 前置知识 在使用Python进行图像处理之前&#xff0c;先了解以下几个库&#xff1a; Pillow&#xff1a;Python…

chatgpt赋能python:Python如何取非

Python如何取非 Python是一种强大的编程语言&#xff0c;可以用于许多不同的任务&#xff0c;包括搜索引擎优化&#xff08;SEO&#xff09;。在这篇文章中&#xff0c;我们将重点介绍Python如何取非&#xff0c;这对于SEO优化非常重要。 什么是取非&#xff1f; 在SEO中&am…

chatgpt赋能python:Python如何手动安装包:技术向SEO文章

Python如何手动安装包&#xff1a;技术向SEO文章 虽然大多数Python用户都习惯使用pip来安装和管理包&#xff0c;但手动安装包是必要的技能之一。这篇文章将介绍如何使用Python的标准方法手动安装包&#xff0c;并提供实际的指导。 为什么要手动安装包&#xff1f; 有时候&a…

达梦数据库读写分离集群搭建

目录 说明... 3 前期准备... 4 开始搭建读写分离... 5 一、主库200. 5 1、卸载原实例... 5 2、创建新的实例... 6 3、配置主库200. 6 4、启动主库... 8 5、设置OGUID.. 8 二、配置2台备库... 9 1、创建新的实例... 9 2、备份恢复&#xff08;初始化实例后应该先备份…