求数组的平均数,中位数,众数

题目

给定一个长度为100的整型数。根据键盘输入的整数nn<100),往数中依次n个整数,出其中位数,平均数,众数果以double数据格式出。

输入:8

1 2 3 9 9 4 0 6

输出:

中位数:3.500000

平均数:4.250000

众数:9.000000

代码如下:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//冒泡排序
void paixu(int a[],int n)
{
    int i,j,t;
    for(i=0;i<n-1;i++)
        for(j=0;j<n-1-i;j++)
    {
        if(a[j]>a[j+1])
        {
            t=a[j];
            a[j]=a[j+1];
            a[j+1]=t;
        }
    }
}
//求众数
void zhongshu(int a[],int n)
{
    int i,temp,j,l,k=0,flag;
    int b[105]={0};
    int p=1,count=0;


    for(j=0;j<n;j++)
    {
        temp=a[j];//控制光标移动,实施遍历
        for(i=0;i<n;i++)
       {
           if(temp==a[i])
        {
            count++;
        }
       }
       if(count>=p) {
            if(count==p&&a[j]!=a[j-1]) flag=1;
            else if(count>p) flag=0;
            p=count;
            if(a[j]!=a[j-1]) {b[k++]=a[j];}
            }//更新,记录众数
       count=0;//计数器重置
    }
    if(p==1)
        {for(i=0;i<105;i++)
        {
            if(b[i]!=0) printf("%d ",b[i]);}
        }
   else
   {
       if(flag)
      {
          for(i=1;i<k;i++)
        {
             printf("%d ",b[i]);
        }
      }
      else printf("%d ",b[k-1]);
   }
    printf("\n");
}
int main()
{
    int a[105];
    int n,i,l;
    double ave,s,zw,z;
    while(scanf("%d",&n)!=EOF)
    {
        s=0;
        for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        s+=a[i];//求和
    }
    ave=(double)(s/n);//求平均数
    //排序后求中位数
    paixu(a,n);
    if(n%2!=0) {l=(n-1)/2;zw=a[l];}
    else {l=n/2;zw=(double)(a[l-1]+a[l])/2;}
    printf("中位数:");
    printf("%lf\n",zw);
    printf("平均数:");
    printf("%lf\n",ave);
    printf("众数:");
    zhongshu(a,n);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/arthu6/article/details/78925617