Cod sursa(job #1362726)

Utilizator Tokumei_no_KageFMI NEIMPORTANT Tokumei_no_Kage Data 26 februarie 2015 14:53:07
Problema Convertor Scor 70
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.5 kb
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
FILE *f,*g;
int main()
{   f=fopen("convertor.in","r");
    g=fopen("convertor.out","w");
    //dim1 dimensiunea buffer1 - coada pentru chei
    //dim dimensiunea buffer - coada pentru valori
    int dim=-1,dim1=-1,i;
    //glm contor de stare - (-1) => caracterul este inafara cheii; (1) => caracterul este in cheie
    //dpv contor de stare - (1) => nu sunt in zona valorii de dupa cheie; (-1) sunt acolo si verific ce caractere am
    //once contor de frecventa => imi zice daca am citit cheile odata
    //ok contor de pozitie => daca sunt in afara secventei din {} ok==0 astfel ok!=0
    char c,glm=-1,dpv=1,once=1,ok=0;
    char buffer[2000000];

    while(fscanf(f,"%c",&c)!=EOF)
    { if(c=='"')glm*=-1;//schimb starea => zic ca sunt in cheie
      if((glm==1)&&(once)&&(dpv==1)&&(c!='"'))fprintf(g,"%c",c);//pun caracterele din cheie in buffer
      if((once)&&(c==':')&&(glm==-1))fprintf(g,",");//am iesit din cheie si pun o (,) in buffer
      /*if(c=='"')glm*=-1;//schimb starea => zic ca sunt in cheie
      if((glm==1)&&(once)&&(dpv==1)&&(c!='"'))buffer1[++dim1]=c;//pun caracterele din cheie in buffer
      if((once)&&(c==':')&&(glm==-1))buffer1[++dim1]=',';//am iesit din cheie si pun o (,) in buffer
      */
      if((c==':')&&(glm==-1))dpv*=-1;//schimb starea => zic ca sunt in zona de valori de dupa cheie
      if((dpv==-1)&&(isdigit(c)||(glm==1))&&(c!='"'))buffer[++dim]=c;//verific daca caracterul este numar sau litera, si-l pun in buffer sau il ignor
         else if((dpv==-1)&&((c==',')||(c=='}')))buffer[++dim]=',';//pun virgula de la sfarsit dupa fiecare valoare
      if(c=='}'){dpv*=-1;ok=0;}//schimb starea => zic ca nu sunt in zona de valori de dupa cheie si am terminat linia
        else if(c=='{')ok++;//zic ca am inceput linia
             else if((ok)&&(c==','))dpv*=-1;//schimb starea => zic ca sunt in zona de valori de dupa cheie si am inceput linia

      if((c=='}')&&(once)){ /*for(i=0;i<=dim1;i++)fprintf(g,"%c",buffer1[i]);*/
                            fprintf(g,"\n");//afisiez caracterele din buffer cand sunt la capatul liniei
                            dim1=-1;
                            once=0;
                          }
     if((c==']')||(c=='}')){for(i=0;i<=dim;i++)fprintf(g,"%c",buffer[i]);
                            fprintf(g,"\n");//afisiez caracterele din buffer cand sunt la capatul liniei
                            dim=-1;
                           }

      }


    return 0;
}