C51单片机关于求平均的编程问题

单片机C51 求平均:
1、随机生成N个整数
2、去掉最大、最小值,求取平均值
3、显示原始数据和平均值,平均值带2个小数点

用keil写了代码,但是无法正常输出结果不知道怎么该,初学单片机。

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
运行结果及详细报错内容
#include <reg52.h>
#include <stdio.h>
#include <stdilb.h>

sbit P_3=P3^1;
void Delayms(unsigned int ms)
{
    while(ms)
    {
        unsigned char i;
        for(i=0;i<100;i++);
        ms--;
    }
}
  int a[10],j,sum=0,max=0,min=99;
    float aver;
void main()
{
     TMOD=0x21;
  SCON=0x50;
  TH1=-3;
  TR1=1;
  TI=1;
     rand(void){
    for(j=0;j<10;j++)
    {
        a[j]=rand()%10;
        printf("%02d\n",a[j]);
        if(a[j]>max)
            max=a[j];
        else if(a[j]<min)
            min=a[j];
        sum+=a[j];
        aver=(sum-max-min)/(j-2);
    }
}
    P_3=1;
    printf("\n");
    printf("%0.2f\n",aver);
    Delayms(20);
}
    

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/254513
  • 以下回答由chatgpt基于相关博客总结生成:

    由于没有具体的代码和输出结果,无法确定具体报错内容和解决方案。但是,下面给出一些相似问题的解决思路,供参考。

    1. 随机生成N个整数

    单片机C51的随机数生成,可以使用种子生成和伪随机数生成。种子生成是固定的,所以产生的随机数模式重复,而伪随机数生成则是通过当前时间等变量来生成更为随机的数。具体实现可以通过调用C51库函数或者自己编写算法实现。

    1. 去掉最大值和最小值

    在随机生成N个整数的过程中,可以同时记录保留在数组中的最大值和最小值,在计算平均值时,排除这两个数即可。

    1. 求出剩余整数的平均值

    去掉最大值和最小值后,对数组中的所有数进行求和,然后除以N-2。

    1. 显示原始数据和平均值

    将原始数据和平均值打印出来,保留两位小数可以使用浮点数输出函数。

    下面是一个实现随机生成N个整数,去掉最大值和最小值,求出剩余整数平均值,打印原始数据和平均值的代码片段。

    #include <reg51.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define N 10
    
    unsigned int arr[N];
    
    void main()
    {
        unsigned int i, max_val, min_val;
        float avg_val = 0.0;
    
        // 随机生成N个整数
        srand((unsigned int)time(NULL));
        for (i = 0; i < N; i++) {
            arr[i] = rand() % 100;
            printf("%d ", arr[i]);
        }
        putchar('\n');
    
        // 找到数组中最大值和最小值
        max_val = arr[0];
        min_val = arr[0];
        for (i = 1; i < N; i++) {
            if (arr[i] > max_val) {
                max_val = arr[i];
            }
            if (arr[i] < min_val) {
                min_val = arr[i];
            }
        }
    
        // 求出剩余整数的平均值
        for (i = 0; i < N; i++) {
            if (arr[i] != max_val && arr[i] != min_val) {
                avg_val += arr[i];
            }
        }
        avg_val /= (N - 2);
    
        // 显示原始数据和平均值
        printf("Max val: %d\n", max_val);
        printf("Min val: %d\n", min_val);
        printf("Avg val: %.2f\n", avg_val);
    }
    

    该代码生成N个随机整数并存储到数组中,找到数组中的最大值和最小值,然后去掉最大值和最小值求得平均值,最后打印出原始数据和平均值。

    注意,在C51的计算中,除法运算需要使用乘法和移位,而不是直接使用除法运算符。应该将除数乘上倍数,然后右移相应位数,来进行除法运算。

    如果有特定的报错内容或者需求,可以通过详细的描述和代码进行修改。

问题:

  1. rand() 函数的实现不正确。你需要在程序开始时调用 srand() 函数来初始化随机数生成器,然后才能调用 rand() 函数。你可以使用时间作为 srand() 函数的参数,以确保每次运行程序时生成的随机数都不同。

  2. 计算平均值的公式也有问题。你需要先计算出去掉最大值和最小值后的数组元素的总和,然后再除以剩余的元素个数。

  3. 你没有在串口中输出原始数据,只输出了平均值。你需要在循环中将每个随机数输出到串口中。

修改了一下:

#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

sbit P_3 = P3^1;

void Delayms(unsigned int ms) {
    while (ms) {
        unsigned char i;
        for (i = 0; i < 100; i++);
        ms--;
    }
}

void main() {
    int a[10], j, sum = 0, max = 0, min = 99;
    float aver;

    // 初始化随机数生成器
    srand((unsigned int)time(NULL));

    // 生成随机数并计算总和、最大值和最小值
    for (j = 0; j < 10; j++) {
        a[j] = rand() % 10;
        printf("%02d\n", a[j]);
        if (a[j] > max)
            max = a[j];
        if (a[j] < min)
            min = a[j];
        sum += a[j];
    }

    // 计算平均值
    aver = (float)(sum - max - min) / 8;

    // 输出原始数据和平均值
    for (j = 0; j < 10; j++) {
        printf("%02d ", a[j]);
    }
    printf("\n");
    printf("Average: %0.2f\n", aver);

    P_3 = 1;
    Delayms(20);
}

至少说一下你现在的现象,才好分析啊