Waňov web

PB071 Jazyk C - 10. cvicení

Urcení základních statistik

Zadání:

Je dán soubor dat dvojicemi kladných císel typu double oddelených mezerou nebo jiným bílým znakem:

x-value y-value

(Data si tedy muzeme predstavit jako dva sloupce císel.)

Napiste program, který pro data z druhého sloupce souboru urcí minimum, maximum a prumernou hodnotu. Program dále urcí ty hodnoty x-value z prvního sloupce, jimz odpovídající hodnota y-value se od prumeru nelisí více nez o zadanou relativní odchylku r, tedy je v uzavreném intervalu

[(1-r).p,(1+r).p]

kde p je (nezáporná) prumerná hodnota. Relativní odchylka je nezáporné reálné císlo.

Pozadavky:

Poznámky:


Riešenie:


minmax.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

FILE *fp;
double odchylka=0,stlpecX,stlpecY,sucet=0,max,min,priemer;
char line[101];
int pocet_riadkov=0,pocet_OK=0;
/*===========================================================================*/
int main(int argc,char *argv[])
{
if (argc<2) 
     {printf("CHYBA: Zadaj meno vstupneho suboru ako 2. argument.\n");
      return(1);}
if (argc>=2)
     {if ((fp=fopen(argv[1],"r"))==NULL)
      {printf("Subor sa nepodarilo otvorit. \n");return 1;}
     }
if (argc>2)
     {odchylka=atof(argv[2]);
      if (odchylka<0) {printf("CHYBA: Odchylka musi byt nezaporna\n");
                       fclose(fp);return 1;}
     }
/*---------------------------------------------------------------------------*/
while (fscanf(fp,"%lf %lf",&stlpecX,&stlpecY)!=EOF)
{
 if (pocet_riadkov==0)
	{max=min=stlpecY;}
 ++pocet_riadkov;
 sucet+=stlpecY;
 if (max<stlpecY) max=stlpecY;
 if (min>stlpecY) min=stlpecY;


}
if (pocet_riadkov==0)
   {printf("Subor je prazdny.\n");
    printf("Priemerna hodnota=0\nmax=0\nmin=0\n");
    fclose(fp);return 0;}

priemer = sucet/pocet_riadkov;
printf("Subor s datami: %s\nRelativna odchylka:%lf\n",argv[1],odchylka);
printf("Priemerna hodnota y-value je %10.5lf\n",priemer);
printf("max=%10.5lf\nmin=%10.5lf\n",max,min);
printf("y-hodnoty jsou v intervalu [%.5lf,%.5lf] pro x-hodnoty\n",
        (1-odchylka)*priemer,(1+odchylka)*priemer);
rewind(fp);
pocet_riadkov=0;
while (fscanf(fp,"%lf %lf",&stlpecX,&stlpecY)!=EOF)
{pocet_riadkov++;
 if ((stlpecY<=(1+odchylka)*priemer)&&(stlpecY>=(1-odchylka)*priemer))
    {printf("%3d.) %10.3lf %10.3lf\n",pocet_riadkov,stlpecX,stlpecY);
     pocet_OK++;}
}
if (pocet_OK==0) printf("Ziadne data z daneho intervalu.\n");
fclose(fp);
return 0;
}