Cod sursa(job #1340570)

Utilizator adrypunctroAdrian Simionescu adrypunctro Data 11 februarie 2015 21:48:41
Problema Convertor Scor 50
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 3.54 kb
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    // Declaratii
    int i, j, k;
    
    ifstream f_in;
    ofstream f_out;
    char c;
    char etichete[32][256];
    char valori[128][32][256];
    
    int este_eticheta = 0;// -1-etichetele au fost inregistrate, 0-nu este eticheta, 1-eticheta in desfasurare
    int col_eticheta = 0;
    int ind_caract_eticheta=0;
    
    int este_valoare = 0;// 0-nu este valoare, 1-prevaloare, 2-valoare in desfasurare (string), 3-valoare numerica
    int rand_valoare = 0;
    int col_valoare = 0;
    int ind_caract_valoare=0;
    
    
    // Program
    f_in.open("convertor.in");
    f_out.open("convertor.out");
    
    
    while (f_in >> noskipws >> c)
    {
        switch(c)
        {
            case '"':// incepe eticheta, se termina eticheta, incepe valoare, se termina valoare
                if(este_valoare == 1)
                {
                    este_valoare=2;// urmeaza valoare. Executare ulterioara!
                }
                else if(este_valoare == 2)
                {
                    valori[rand_valoare][col_valoare][ind_caract_valoare] = '\0';// fix string
                    este_valoare=0;// valoarea s-a terminat
                    ind_caract_valoare=0;
                    col_valoare++;
                }
                else if(este_eticheta == 0)
                {
                    este_eticheta=1;// incepe eticheta. Executare ulterioara!
                }
                else if(este_eticheta == 1)
                {
                    etichete[col_eticheta][ind_caract_eticheta]='\0';// fix string
                    este_eticheta=0;// eticheta s-a terminat   
                    ind_caract_eticheta=0;
                    col_eticheta++;
                }
                continue;
                break;
            case ':':// prevaloare
                este_valoare=1;
                break;
            case '}':// rand nou. acesta aduce si terminarea inregistrarii pentru eticheta
                rand_valoare++;
                col_valoare = 0;
                este_eticheta=-1;// etichetele s-au terminat
                break;
        }
        if(este_valoare == 1 && c >= '0' && c <= '9')
        {
            este_valoare=3;// este valoare numerica. Executare imediata!
        }
        if(este_valoare == 3 && (c < '0' || c > '9'))// daca numarul s-a terminat
        {
            valori[rand_valoare][col_valoare][ind_caract_valoare] = '\0';// fix string
            este_valoare=0;// valoarea s-a terminat
            ind_caract_valoare=0;
            col_valoare++;
        }
        
        // executa comanda
        if(este_valoare == 2 || este_valoare == 3)// inregistram valoare
        {
            valori[rand_valoare][col_valoare][ind_caract_valoare++] = c;
        }
        else if(este_eticheta == 1)// inregistram eticheta
        {
            etichete[col_eticheta][ind_caract_eticheta++] = c;
        }
    }
    f_in.close();
    
    
    // scriere
    for(i=0; i<col_eticheta; i++)
    {
        j=0;
        while(etichete[i][j] != '\0')
        {
            f_out << etichete[i][j];
            j++;
        }
        
        f_out << ',';
    }
    f_out << "\r\n";
    for(k=0; k<rand_valoare; k++)
    {
        for(i=0; i<col_eticheta; i++)
        {
            j=0;
            while(valori[k][i][j] != '\0')
            {
                
                f_out << valori[k][i][j];
                j++;
            }
            
            f_out << ',';
        }
        f_out << "\r\n";
    }
    
    f_out.close();
    return 0;
}