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.
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;
}