单片机C51 求平均:
1、随机生成N个整数
2、去掉最大、最小值,求取平均值
3、显示原始数据和平均值,平均值带2个小数点
用keil写了代码,但是无法正常输出结果不知道怎么该,初学单片机。
#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);
}
由于没有具体的代码和输出结果,无法确定具体报错内容和解决方案。但是,下面给出一些相似问题的解决思路,供参考。
单片机C51的随机数生成,可以使用种子生成和伪随机数生成。种子生成是固定的,所以产生的随机数模式重复,而伪随机数生成则是通过当前时间等变量来生成更为随机的数。具体实现可以通过调用C51库函数或者自己编写算法实现。
在随机生成N个整数的过程中,可以同时记录保留在数组中的最大值和最小值,在计算平均值时,排除这两个数即可。
去掉最大值和最小值后,对数组中的所有数进行求和,然后除以N-2。
将原始数据和平均值打印出来,保留两位小数可以使用浮点数输出函数。
下面是一个实现随机生成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的计算中,除法运算需要使用乘法和移位,而不是直接使用除法运算符。应该将除数乘上倍数,然后右移相应位数,来进行除法运算。
如果有特定的报错内容或者需求,可以通过详细的描述和代码进行修改。
问题:
rand() 函数的实现不正确。你需要在程序开始时调用 srand() 函数来初始化随机数生成器,然后才能调用 rand() 函数。你可以使用时间作为 srand() 函数的参数,以确保每次运行程序时生成的随机数都不同。
计算平均值的公式也有问题。你需要先计算出去掉最大值和最小值后的数组元素的总和,然后再除以剩余的元素个数。
你没有在串口中输出原始数据,只输出了平均值。你需要在循环中将每个随机数输出到串口中。
修改了一下:
#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);
}
至少说一下你现在的现象,才好分析啊