第十周项目四 (拓展)大奖赛计分

拓展1:当评委人数不固定为10人时,可输入评委人数

问题及代码:

/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:main.cpp
* 作者:Lingle
* 完成日期:2014年11月2日
* 版本号:v1.0
*
* 问题描述:在十位评委给出的分数中,去掉一个最高分,去掉一个最低分,取其余八个分数的平均值
* 输入描述:输入每个评委给出的分数
* 程序输出:输出最高分、最低分、去掉最高最低分后的平均分即最后得分
*/
#include <iostream>
using namespace std;
int main()
{
    double scores,max=0,min=10,sum=0,average;
    int i=1,n;
    cout<<"请输入评委人数:";
    cin>>n;
    cout<<"请输入选手的成绩(0-10)"<<endl;
    for (i=1;i<=n;++i)
    {
        cout<<"第"<<i<<"位评委给分:";
        cin>>scores;
        sum+=scores;
        if (scores>max)max=scores;
        if (scores<min)min=scores;
    }
    average=(sum-max-min)/(n-2.0);
    cout<<"减去一个最高分:"<<max<<",减去一个最低分:"<<min<<"。"<<endl;
    cout<<"当前选手最后得分是:"<<average;
    return 0;
}


运行结果:


拓展2:输出成绩限制在0-10之间,若不在则重新输入

问题及代码:

/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:main.cpp
* 作者:Lingle
* 完成日期:2014年11月2日
* 版本号:v1.0
*
* 问题描述:在十位评委给出的分数中,去掉一个最高分,去掉一个最低分,取其余八个分数的平均值
* 输入描述:输入每个评委给出的分数
* 程序输出:输出最高分、最低分、去掉最高最低分后的平均分即最后得分
*/
#include <iostream>
using namespace std;
int main()
{
    double scores,max=0,min=10,sum=0,average;
    int i=1,n;
    cout<<"请输入评委人数:";
    cin>>n;
    cout<<"\n请输入选手的成绩(0-10)"<<endl;
    for (i=1; i<=n; ++i)
    {
        do
        {
            cout<<"第"<<i<<"位评委给分:";
            cin>>scores;
            if (scores>10||scores<0)cout<<"输入分数应在0-10之间,请重新输入。"<<endl;
            else
            {
                sum+=scores;
                if (scores>max)max=scores;
                if (scores<min)min=scores;
            }
        }
        while (scores>10||scores<0);
    }
    average=(sum-max-min)/(n-2.0);
    cout<<"减去一个最高分:"<<max<<",减去一个最低分:"<<min<<"。"<<endl;
    cout<<"当前选手最后得分是:"<<average;
    return 0;
}

运行结果:


拓展3:按任意键计算下一位选手的成绩,退出则按N或n(并加入了只有两个评委的算分情况)

问题及代码:

/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:main.cpp
* 作者:Lingle
* 完成日期:2014年11月2日
* 版本号:v1.0
*
* 问题描述:在十位评委给出的分数中,去掉一个最高分,去掉一个最低分,取其余八个分数的平均值
* 输入描述:输入每个评委给出的分数
* 程序输出:输出最高分、最低分、去掉最高最低分后的平均分即最后得分
*/
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    int i=1,n;
    char YN;
    for (; YN!='N'&&YN!='n';)
    {
        double scores,max=0,min=10,sum=0,average;
        cout<<"序号(或按N或n退出):";
        cin>>YN;
        switch (YN)
        {
        default:
        {
            cout<<"请输入评委人数:";
            cin>>n;
            cout<<"\n请输入选手的成绩(0-10)"<<endl;
            for (i=1; i<=n; ++i)
            {
                do
                {
                    cout<<"第"<<i<<"位评委给分:";
                    cin>>scores;
                    if (scores>10||scores<0)cout<<"输入分数应在0-10之间,请重新输入。"<<endl;
                    else
                    {
                        sum+=scores;
                        if (scores>max)max=scores;
                        if (scores<min)min=scores;
                    }
                }
                while (scores>10||scores<0);
            }
            if(n>=3)
                average=(sum-max-min)/(n-2.0);
            else
                average=sum/2.0;
            cout<<"减去一个最高分:"<<setiosflags(ios::fixed)<<setprecision(3)<<max<<",减去一个最低分:"<<setiosflags(ios::fixed)<<setprecision(3)<<min<<"。"<<endl;
            cout<<"当前选手最后得分是:"<<setiosflags(ios::fixed)<<setprecision(3)<<average;
            cout<<"\n******************** SUCCESS ********************\n\n\n";
        };
        break;
        case 'N':
        case 'n':
            break;
        }
    }
    return 0;
}

运行结果:



学习心得:

拓展3之前没有想到清零问题,未把double语句放到for后的大括号里,幸亏有王振学长点拨。

而且拓展3中 for (; YN!='N'&&YN!='n';)一句,之前用的是逻辑或运算符||,造成按N或n无法return0。



<think>好的,用户想查找蓝桥杯第十届嵌入式拓展版的题目和解题思路。我需要先查看提供的引用资料。引用[1]提到第十届省赛程序真题的分析和代码讲解,引用[3]也涉及第十届真题的演练。用户的问题集中在拓展版题目上,可能需要区分省赛和拓展版的不同。 首先,要确认用户所说的“拓展版”是否指的是省赛的扩展题目或者其他版本。根据现有资料,引用[1]和[3]都讨论的是第十届省赛真题,但未明确提到“拓展版”。可能需要进一步解释省赛题目是否包含拓展内容,或者是否有额外资源。 接下来,用户需要解题思路。根据引用[2]中的方法,解析题目时应注重模块分析和代码结构。可能需要结合硬件模块如LED、按键、定时器、ADC、PWM、串口通信等,这些都是嵌入式竞赛常见的考点。 考虑到用户可能需要具体的实现步骤,比如系统初始化、模块配置、中断处理等。此外,代码结构如状态机设计、任务调度可能也是重点。需要提醒用户参考提供的资料中的代码示例,并注意外设驱动编写和调试技巧。 可能还需要指出用户提供的引用中没有直接提到“拓展版”,建议确认题目具体要求,或查看是否有其他资源。同时,建议用户关注模块间的协同工作,如使用STM32CubeMX配置硬件,结合HAL库函数进行开发。 最后,生成相关问题时要围绕嵌入式系统设计、模块实现、调试方法等方面,帮助用户深入理解解题思路和备赛策略。</think>根据蓝桥杯第十届嵌入式省赛真题的解析资料[^1][^3],其拓展版题目通常涉及以下核心考点和解题思路: ### 一、硬件模块分析 1. **LED控制模块** 需配置GPIO输出模式,使用`HAL_GPIO_WritePin()`函数实现跑马灯或状态指示,注意LED编号与引脚映射关系(如LD1对应PC8-PC15)。 2. **按键扫描** 采用中断或轮询方式检测按键,需处理消抖逻辑。参考代码片段: ```c void KEY_Scan(void) { if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) { HAL_Delay(10); // 消抖处理 key_flag = 1; } } ``` 3. **ADC采样与数据处理** 配置ADC通道采集模拟量(如电位器电压),通过DMA传输提高效率,需注意校准和滤波算法: $$ V_{out} = \frac{ADC_{value} \times 3.3}{4095} $$ ### 二、系统设计要点 1. **定时器应用** - 使用TIM定时器生成PWM波(如控制LED亮度) - 配置SysTick作为系统时基,实现任务调度[^1] 2. **状态机设计** 针对多模式切换(如自动/手动模式),推荐使用枚举类型定义状态: ```c typedef enum {MODE_AUTO, MODE_MANUAL} SysMode; ``` 3. **外设协同** 示例:ADC采样触发PWM调整,需注意中断优先级配置以避免冲突[^3] ### 三、代码结构建议 ```plaintext main.c ├── 系统初始化(时钟、GPIO、外设) ├── 主循环 │ ├── 按键扫描 │ ├── 模式状态判断 │ └── 数据刷新(LCD显示) └── 中断服务函数 ├── ADC采样完成中断 └── 定时器更新中断 ``` ### 、调试技巧 1. 使用`printf`重定向至串口输出调试信息 2. 通过ST-Link调试器设置断点观察变量 3. 对临界代码段(如共享资源访问)添加互斥锁
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值