Advertisement
robonx12

Untitled

Nov 20th, 2014
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.85 KB | None | 0 0
  1. /* Projekt č. 1, předmět IZP
  2.  * Autor: Dominik Dvořák, xdvora1t@stud.fit.vutbr.cz
  3.  * Skupina: 1BIA
  4.  * Datum: 11.11.2013
  5.  * Název souboru: proj1.c
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <stdbool.h>
  12.  
  13. char buff[1024]; //buffer pro funkce vyberu a nasledne vybranou operaci
  14. //****************************************************************************************************
  15. int Error(int error) //funce pro výpis chybových stavů
  16. {
  17.   if (error==1) fprintf(stderr,"Error! \n - prvnim argumentem mohou byt pouze fce: \n - select \n - min \n - max \n - sum \n - avg \n - --help"); //chyba názvu prvního arumentu    
  18.   if (error==2) fprintf(stderr,"Error! \n - druhym argumentem muze byt pouze: \n - row \n - col \n - rows \n - cols \n - range"); //chyba názvu 2 argumentu
  19.   if (error==3) fprintf(stderr,"Error! \n - vyber row ocekava 1 argument - cislo zvoleneho radku "); //chyba počtu argumentů
  20.   if (error==4) fprintf(stderr,"Error! \n - vyber col ocekava 1 argument - cislo zvoleneho sloupce "); //chyba počtu argumentů
  21.   if (error==5) fprintf(stderr,"Error! \n - vyber rows ocekava 2 argumenty - rozmezi zvolenych radku "); //chyba počtu argumentů
  22.   if (error==6) fprintf(stderr,"Error! \n - vyber cols ocekava 2 argumenty - rozmezi zvolenych sloupcu "); //chyba počtu argumentů
  23.   if (error==7) fprintf(stderr,"Error! \n - vyber range ocekava 4 argumenty - rozmezi zvolenych sloupcu a radku "); //chyba počtu argumentů
  24.   if (error==8) fprintf(stderr,"Error! \n - 2. argument musi byt vetsi nez 1. "); //chyba počtu argumentů
  25.   if (error==9) fprintf(stderr,"Error! \n - operace ocekava vyber bunek: \n - row \n - col \n - rows \n - cols \n - range"); //program spu?těn pouze s operací
  26.   if (error==10) fprintf(stderr,"Error! \n - zadany rozsah bunek neobsahuje zadne ciselne hodnoty"); //pouze písmena či znaky VS funkce sum etc.
  27.   if (error==11) fprintf(stderr,"Error! \n - argument 3 (5) musi byt <= nez argument 4 (6) "); //chyba argumentů
  28.   if (error==12) fprintf(stderr,"Error! \n - argumenty musi byt >= 1 "); //chyba argumentů
  29.   if (error==13) fprintf(stderr,"Error! \n - zadany parametr presahuje rozsah tabulky "); //chyba argumentů
  30.   if (error==14) fprintf(stderr,"Error! \n - argument 3 musi byt < nez arg. 4 "); //chyba argumentů
  31.   return(EXIT_FAILURE);
  32. }
  33. //****************************************************************************************************
  34. void Help() //funkce pro výpis nápovědy
  35. {
  36.          fprintf(stdout,
  37.                               "\n"
  38.                               "Program implementuje funkce vyhledani maxima, minima, \n" "funkce souctu a aritmetickeho prumeru vybranych bunek. \n"
  39.                               "Tabulku ve forme textoveho souboru program ocekava na \n" "standardnim vstupu. Pozadovanou operaci a vyber bunek \n"
  40.                               "specifikujte v argumentu prikazove radky.\n" "\n" "Spusteni programu: \n" "./proj1 operace vyber_bunek <tabulka.txt |nebo| ./proj1 --help \n"     
  41.                               "\n" "--help - tisk napovedy \n" "\n" "operace: \n" "  select - vyber a tisk zvol. bunek \n"
  42.                               "  min - tisk nejmensi hodnoty zvol. bunek \n" "  max - tisk nejvet. hodnoty zvol. bunek \n"
  43.                               "  sum - suma zvol. bunek \n" "  avg - aritmeticky prum. zvol. bunek \n" "\n" "vyber_bunek: \n"
  44.                               "  row X - vyber vsech bunek na radku X \n" "  cal X - vyber vsech bunek ve sloupci X \n"
  45.                               "  rows X Y - vyber bunek na radcich X az Y (vcetne X;Y) \n" "  cals X Y - vyber bunek ve sloupcich X az Y (vcetne X;Y) \n"
  46.                               "  range A B X Y - vyber bunek od rad. A po rad. B a od sl. \n" "        X po sl. Y (vcetne A;B;X;Y) \n"                           
  47.                 );
  48. }
  49. //****************************************************************************************************
  50. void _42_ (char* argv3,char* argv4,char* argv5,char* argv6, int argc, long *arg3, long *arg4, long *arg5, long *arg6) //funkce pro načtení argumentů 3 - 6
  51. {  
  52.   if ((argc==4) || (argc==5) || (argc==7)) *arg3 = strtol(argv3, NULL, 10);
  53.   if ((argc==5) || (argc==7))  *arg4 = strtol(argv4, NULL, 10);
  54.   if ((argc==6) || (argc==7)) *arg5 = strtol(argv5, NULL, 10); 
  55.   if (argc==7) *arg6 = strtol(argv6, NULL, 10);
  56. }
  57. //****************************************************************************************************
  58. char VyberBunek (char* argv2, int argc, long arg3, long arg4, long arg5, long arg6) //funkce pro výběr buněk
  59. {  
  60.     static long shelper=1; //statická pomocná proměnná pro loopy funkcí
  61.     char c; //char do return VyberBunek, dále pouzit ve fci operace
  62.     char buff2[1024]; //pomocný buffer pro odřádkování
  63.     if ((strcmp(argv2, "row")) == 0) //výběr řádku X
  64.       {
  65.         if (arg3<1) Error(12);
  66.         else if (argc==4)
  67.           {
  68.             while (shelper!=arg3) //odřádkování, dokud nejsme na řádku arg3
  69.                {  
  70.                  fgets(buff,1024,stdin);
  71.                  shelper++;
  72.                }    
  73.             scanf("%s", buff); //načtení buňky po bílý znak
  74.             c=getchar();    //načtení bílého znaky
  75.           }
  76.         else Error(3);
  77.       }
  78.     else if ((strcmp(argv2, "col")) == 0) //výběr sloupce X
  79.       {
  80.         if (arg3<1) Error(12);
  81.         else if (argc==4)
  82.           {    
  83.             while (shelper!=arg3+1) //loop dokud nebudeme na sloupci X
  84.               {
  85.                 scanf("%s",buff);
  86.                 shelper++;
  87.                 c=getchar();
  88.                 if (((c=='\n') || (c=='\r')) && (shelper!=(arg3+1))) Error(13); //chyba, pokud jsme za "hranicí" tabulky
  89.               }
  90.               if ((c=='\n') || (c=='\r')) fseek(stdin,-1,1); //fseek -1 kvůli správnému odřádkování
  91.               else fgets(buff2,1024,stdin); //odřádkování
  92.               shelper=1;
  93.           }          
  94.         else Error(4);
  95.       }
  96.     else if ((strcmp(argv2, "rows")) == 0) //výběr řádku X - Y
  97.       {
  98.         if ((arg3<1) || (arg4<1)) Error(12);  
  99.         if (arg3>=arg4) Error(14);
  100.         else if (argc==5)
  101.           {                
  102.             while (shelper!=arg3)
  103.               {
  104.                 fgets(buff,1024,stdin);
  105.                 if ((shelper!=(arg3+1)) && feof(stdin)) Error(13);
  106.                 c=10;
  107.                 fseek(stdin,-1,1);
  108.                 shelper++;
  109.               }
  110.              scanf("%s", buff);
  111.              c=getchar();
  112.           }  
  113.         else Error(6);
  114.       }
  115.     else if ((strcmp(argv2, "cols")) == 0) //výběr sloupců X - Y
  116.       {
  117.         if ((arg3<1) || (arg4<1)) Error(12);
  118.         if (arg3>=arg4) Error(14);
  119.         else if (argc==5)
  120.           {
  121.             static long helper=1;
  122.             static long helper2=0;
  123.             if (shelper==1)
  124.                 {
  125.                     while (shelper!=arg3+1)
  126.                     {
  127.                         scanf("%s", buff);
  128.                         shelper++;
  129.                         helper=1;
  130.                         c=getchar();
  131.                         if (((c=='\n') || (c=='\r')) && (shelper!=(arg3+1))) Error(13); //chyba, pokud jsme za "hranicí" tabulky
  132.                     }  
  133.                 }  
  134.             if ((shelper!=1) && (helper!=1)) scanf("%s", buff);
  135.             helper++;
  136.             helper2++;  
  137.             if (helper2-1==arg4-arg3)
  138.                 {
  139.                     fgets(buff2,1024,stdin);
  140.                     shelper=1;
  141.                     helper2=0;
  142.                 }
  143.           }    
  144.         else Error(6);  
  145.       }
  146.     else if ((strcmp(argv2, "range")) == 0) //výběr X - Y a A - B
  147.       {  
  148.         if ((arg3<1) || (arg4<1) || (arg5<1) || (arg6<1)) Error(12);
  149.         else if ((arg3>arg4) || (arg5>arg6)) Error(11);
  150.         else if (argc==7)
  151.           {
  152.             static long helper=1; //pomocná proměnná
  153.             static long helper2=1; //pomocná proměnná
  154.             static long helper3=1; //pomocná proměnná
  155.             if (helper2==1)
  156.                 {
  157.                     while(helper2!=arg3)
  158.                      {  
  159.                         fgets(buff2,1024,stdin); //odřádkování na arg3
  160.                         helper2++;
  161.                      }
  162.                 }
  163.             if (arg6==arg5)
  164.                 {
  165.                     while (helper!=arg5+1) //loop dokud nebudeme na sloupci X
  166.                       {
  167.                         scanf("%s",buff);
  168.                         helper++;
  169.                         c=getchar();
  170.                         if (((c=='\n') || (c=='\r')) && (helper!=(arg5+1))) Error(13); //chyba, pokud jsme za "hranicí" tabulky
  171.                       }
  172.                     if ((c=='\n') || (c=='\r')) fseek(stdin,-1,10); //fseek -1 kvůli správnému odřádkování
  173.                     else fgets(buff2,1024,stdin); //odřádkování
  174.                     helper=1;
  175.                 }
  176.             else
  177.                 {
  178.                     static long helper=1;
  179.                     static long helper2=0;
  180.                     if (helper3==1)
  181.                         {
  182.                             while (helper3!=arg5+1)
  183.                             {
  184.                                 scanf("%s", buff);
  185.                                 helper3++;
  186.                                 helper=1;
  187.                                 c=getchar();
  188.                                 if (((c=='\n') || (c=='\r')) && (helper!=(arg5+1))) Error(13); //chyba, pokud jsme za "hranicí" tabulky
  189.                             }  
  190.                         }
  191.                     if ((helper3!=1) && (helper!=1)) scanf("%s", buff);
  192.                     helper++;
  193.                     helper2++;  
  194.                     if (helper2-1==arg6-arg5)
  195.                         {
  196.                             fgets(buff2,1024,stdin);
  197.                             helper3=1;
  198.                             helper2=0;
  199.                         }
  200.                 }      
  201.           }
  202.         else Error(7);
  203.       }
  204. else Error(2);
  205. return c; //vrácení bílého znaku
  206. }
  207. //****************************************************************************************************
  208. bool Integer(char buff[1024], double *c, bool *onlychars) //funkce pro zji?tění, zda jde o číselnou hodnotu
  209. {      
  210.        int Integer0=0;
  211.        *c=strtod(buff,NULL);
  212.        if ((*c==0) & (strcmp(buff,"0") == 0))
  213.               {
  214.                 Integer0=1;
  215.                 (*onlychars)++;
  216.               }
  217.        else if (*c>0)
  218.               {
  219.                 Integer0=1;
  220.                 (*onlychars)++;
  221.               }
  222.        else Integer0=0;
  223.        return Integer0;
  224. }
  225. //****************************************************************************************************
  226. int Operace(char* argv1, char* argv2, char* argv3, char* argv4, char* argv5, char* argv6, int argc) //funce pro všechny operace
  227. {      
  228.        long arg3, arg4, arg5, arg6; //argumenty 3 - 6
  229.        _42_(argv3, argv4, argv5, argv6, argc, &arg3, &arg4, &arg5, &arg6);
  230.        long c_h = 0; //ridici prom. pro loop
  231.        double c = 0.0; //proměnná pro sum, min, max a avg
  232.        bool onlychars; //proměnná pro sum, min, max a avg
  233.        long c_hh = 0; //++ kdyz je konec řádku nebo eof - loop
  234.        long avg_h = 0; //pomocná proměnná pro průměr
  235.        double vysl = 0.0; //proměnná pro sum, min, max a avg
  236.        long rowsloop = arg4-arg3+1; //proměná pro loop rows
  237.        long rangeloop = (arg4-arg3+1)*(arg6-arg5+1); //proměná pro loop range
  238.             for(;;)
  239.                 {  
  240.                     char chr=VyberBunek(argv2, argc, arg3, arg4, arg5, arg6);
  241.                     if (((strcmp(argv2, "col")) == 0) && (chr==EOF)) break;  //break u col
  242.                     if (((strcmp(argv2, "cols")) == 0) && (chr==EOF)) break; //break u cols
  243.                     if (((strcmp(argv2, "rows")) == 0) && ((c_hh!=rowsloop) && (chr==EOF))) Error(13); //error "hranic" taulky u rows
  244.                     if (((strcmp(argv2, "rows")) == 0) && ((c_hh==rowsloop) || (chr==EOF))) break; //break u rows
  245.                     if (chr==EOF) Error(13); //chyba, pokud jsme za hranicí tabulky            
  246.                     Integer(buff, &c, &onlychars); //zjistění zda jde o číslo
  247.                     if ((chr== '\r') || (chr== '\n') || (feof(stdin))) c_hh++; //++ kdyz je konec řádku nebo eof - loop
  248.                     c_h++;
  249.                     if ((strcmp(argv1, "select"))==0) printf("%s \n",buff); //operace select
  250.                     if ((strcmp(argv1, "min"))==0) //operace min
  251.                         {
  252.                             bool Integer0=Integer(buff, &c, &onlychars);
  253.                             if (Integer0!=0)
  254.                                 {
  255.                                     if (c_h==1) vysl=c;
  256.                                 }
  257.                             if (Integer0!=0) if (c_h!=1)
  258.                                 {
  259.                                     if (c<vysl) vysl=c;
  260.                                 }
  261.                         }
  262.                     if ((strcmp(argv1, "max"))==0) //operace max
  263.                         {
  264.                             if (c_h==1) vysl=c;
  265.                             if (c_h!=1)
  266.                                 {
  267.                                     if (c>vysl) vysl=c;
  268.                                 }
  269.                         }
  270.                     if ((strcmp(argv1, "sum"))==0)  vysl=vysl+c; //operace sum
  271.                     if ((strcmp(argv1, "avg"))==0) //operace avg
  272.                         {  
  273.                             bool Integer0=0;
  274.                             Integer0=Integer(buff, &c, &onlychars);
  275.                             if (Integer0==1) avg_h++;
  276.                             vysl=vysl+c;
  277.                         }        
  278.                     if (((strcmp(argv2, "row")) == 0) && ((chr=='\r') || (chr=='\n') || (chr==EOF)))  break;   //break u row
  279.                     if (((strcmp(argv2, "range")) == 0) && (c_h==rangeloop))  break;  //break u range
  280.                     if ((c_h!=rangeloop) && (chr==EOF)) Error(13);          
  281.                 }
  282.            if (((onlychars)==0) && (((strcmp(argv1, "min"))==0) || ((strcmp(argv1, "max"))==0) ||
  283.                               ((strcmp(argv1, "sum"))==0) || ((strcmp(argv1, "avg"))==0))) Error(10);
  284.            else
  285.              {     
  286.                 if ((strcmp(argv1, "min"))==0) printf("Nejmensi hodnota ze zvolenych bunek je: %.10g",vysl);
  287.                 if ((strcmp(argv1, "max"))==0) printf("Nejvetsi hodnota ze zvolenych bunek je: %.10g",vysl);
  288.                 if ((strcmp(argv1, "sum"))==0) printf("Suma zvolenych bunek je: %.10g",vysl);
  289.                 if ((strcmp(argv1, "avg"))==0) printf("Aritmeticky prumer zvolenych bunek je: %.10g",vysl/avg_h);                                    
  290.              } 
  291.   return (EXIT_SUCCESS);      
  292. }
  293. //****************************************************************************************************
  294. int main(int argc, char **argv)
  295. {
  296. if (argc>1)
  297.   {  
  298.     if ((strcmp(argv[1], "--help")) == 0)   //výpis nápovědy
  299.         {            
  300.             Help();
  301.         }      
  302.     else if (((strcmp(argv[1], "select")) == 0) | ((strcmp(argv[1], "min")) == 0) | ((strcmp(argv[1], "max")) == 0) |
  303.             ((strcmp(argv[1], "sum")) == 0) | ((strcmp(argv[1], "avg")) == 0))
  304.         {      
  305.           if (argc>=3) Operace(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6],argc); //volání funkce se vsemi moznými argumenty
  306.           else Error(9);  
  307.         }
  308.     else Error(1);     
  309.   }
  310.   return (EXIT_SUCCESS);
  311. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement