Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C++ problem

[es] :: C/C++ programiranje :: C++ problem
(Zaključana tema (lock), by X Files)

[ Pregleda: 4115 | Odgovora: 8 ] > FB > Twit

Postavi temu

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

x20x

Član broj: 6220
Poruke: 74
*.net.hinet.hr



Profil

icon C++ problem03.05.2003. u 17:21 - pre 228 meseci
Učitaj sa tipkovnice NAREDBU. Ako je NAREDBA jednaka npr. cls -->
Obriši
ekran, ili ako je NAREDBA jednaka IME, prikaži ime (printf("Ime je
NEKAKO")).
Znaci : kada utipkam cls da mi se obrise ekran itd.?
Kako da to uradim uz pomoć SWICHA?
 
0

6544616a006e
Nadej Kilec
Bukulja

Član broj: 10080
Poruke: 44
*.telia.com

Sajt: www.gnu.org


Profil

icon Re: C++ problem04.05.2003. u 12:43 - pre 228 meseci
Napises neki sitni parser koji svaku naredbu pretvara u neku unapred definisanu char vrednost (mozes da definises recimo T_CLS, T_RM, T_KILL ... u 0, 1, 2...) a onda u jednom velikom switch-u da obradjujes svaki od njih zasebno.
---
GNU's Not UNIX
 
0

x20x

Član broj: 6220
Poruke: 74
*.net.hinet.hr



Profil

icon Re: C++ problem04.05.2003. u 21:05 - pre 228 meseci
Hvala na odgovoru ali to bas ne razumijem _"Napises neki sitni parser koji svaku naredbu pretvara u neku unapred definisanu char vrednost (mozes da definises recimo T_CLS, T_RM, T_KILL ... u 0, 1, 2...)"_! Kako da touradim (mislim kako kod glasi)?
 
0

Au197/79
Zlatan Kadragić
Minhen

Član broj: 3556
Poruke: 772
*.ptt.yu

Sajt: aurelije.blogspot.com


+47 Profil

icon Re: C++ problem04.05.2003. u 21:15 - pre 228 meseci
Pogledaj na http://www.puskice.co.yu/download/3/is/strukture/domaci.zip Tu se nalazi dom2 direktorijum. Tu se nalazi rešenje nekog zadatka u kojem je trebalo da se simulira kretanje kroz stablo direktorijuma, pa je postojao isti problem sa parsiranjem komandi tipa: cd a/b/c; ls a itd. Zato pogledaj glavni.c i glavni1.c kako je to rešeno na 2 načina u C-u. Pogledaj i bolja rešenja košrišćenjem heš-tabele stringova i komandi (koje su funkcije ili metode), jer je i to moguće uraditi u C++ (valjda je i C++ za toliko objektno orijentisan).

Bolje džaba ležat nego džaba radit.
 
0

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
217.26.67.*

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: C++ problem04.05.2003. u 21:56 - pre 228 meseci
potrazi malo na internetu lex & yacc literature, tamo ces videti takve stvari, inace teoriski pricano to su konacni automati, to sto ti trazis i tebi treba... Alli takve stvari se rucno ne ispalte raditi jer je to mukotrpan posao osim ako to ne radis u edukativne svrhe... vec je produktivnije iskoristiti lex & yacc i to se tamo svede na 5 minuta posla, i kao rezultat oni ti izgenerisu C kod koji posle lako povezes sa svojim programom....
 
0

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: C++ problem11.05.2003. u 05:04 - pre 227 meseci
Code:

#include <string.h>
#include <stdio.h>

/* Dejan Lekic, <dejan%nu6.org>, http://dejan.nu6.org */

enum x20x
{
    T_BRISI = 0,    /* CLS token */
    T_IME,            /* token za komandu IME */
    T_PREZIME,        /* token komande PREZIME */
    T_KRAJ            /* token za KRAJ */
};    /* enum x20x */

#define MAX_LEN 4096    /* valjda nece niko kucati duzu liniju? */
#define NUM_COM 4        /* broj komandi koje obradjujemo */

char* saKomande[4] = {
    "BRISI",        /* odgovarajuca T_ vrednost: T_BRISI */
    "IME",            /* T_IME */
    "PREZ",            /* T_PREZIME, ne smemo "PREZIME" ! :) */
    "KRAJ"            /* T_KRAJ */
};

/**
 * Napomena, pisati ovakav "glupi" parser je idiotarija
 * narod mnogo pametniji od autora je napisao pomocne
 * alatke koji GENERISU PARSERE, jedna od njih je FLEX.
 */

char procesljaj(const char* sArg, char* sResto)
{
    char* pToken = NULL;
    int iSta = T_BRISI;        /* inicijalno je BRISI */
    char* pKomanda;
    char cRezultat = T_KRAJ;
    int ii = 0;
    char sKopija[MAX_LEN];
    
    strcpy(sKopija, sArg);
    /* hajde da nadjemo o kojoj komandi je rec */
    for (ii = 0; ii < NUM_COM; ii++)
    {
        pKomanda = strstr(sKopija, saKomande[ii]);
        if (pKomanda != NULL)
        {
            /**
             * Hajde da "pokupimo" argument komande...
             * ovo je poznata specificnost funkcije strtok() :) 
             */
            pToken = strtok(sKopija, saKomande[ii]);
            if (pToken)
            {
                strcpy(sResto, pToken);
            } /* if */
            pToken = strtok(NULL, saKomande[ii]);
            if (pToken)
            {
                strcpy(sResto, pToken);
                printf("DEBUG: %s\n", pToken);
            }
            return ii; /* Mozemo komotno da izadjemo odmah */
        } /* if */
        strcpy(sKopija, sArg); /* vracamo stari string */
    } /* for */
    return cRezultat;
} /* char procesljaj() */

int main(char argc, char** argv)
{
    char     sLinija[MAX_LEN];
    char*     pToken = NULL;
    char     bKraj = 1;
    char     sArgument[MAX_LEN];        
    
    /** 
     * valjalo bi ovo optimizovati ...
     * recimo da se koristi makar dinamicka alokacija
     */    
    for (; bKraj;)
    {
        gets(sLinija);
        switch (procesljaj(sLinija, sArgument))
        {
            case T_BRISI:
            {
                printf("x20x: BRISEM\n");
                break;
            } /* case */
            case T_IME:
            {
                printf("x20x: Komanda=IME, Argument=%s\n", sArgument);
                break;
            }
            case T_PREZIME:
            {
                printf("x20x: Komanda=PREZIME, Argument=%s\n", sArgument);
                break;
            }
            case T_KRAJ:
            {
                printf("x20x: Komanda=KRAJ Prekidam program!\n");
                bKraj = 0;
                break;
            }
            default:
                printf("x20x: Greska! Linija=\"%s\"", sLinija);
        } /* switch */
        sLinija[0]='\0';
    } /* for */
    return 0;
} /* main() */


Oprosti na eventualnim greškama, kod je napisan za otprilike pola sata...

Stvar radi ovako:
Code:

[email protected] ~/prj/c 
$ gmake x20x
cc     x20x.c   -o x20x
/tmp/ccA0RaEi.o(.text+0x16c): In function `main':
: the `gets' function is dangerous and should not be used.
[email protected] ~/prj/c 
$ ./x20x 
IME Dejan
x20x: Komanda=IME, Argument= Dejan
PREZ Lekic
x20x: Komanda=PREZIME, Argument= Lekic
BRISI Ovo
x20x: BRISEM
KRAJ
x20x: Komanda=KRAJ Prekidam program!


Ono, u pitanju je ultramegaprosti parser... ali je odgovor na ono što si pitao. Tu je i prilepljen sors fajl... ;)
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
Prikačeni fajlovi
 
0

x20x

Član broj: 6220
Poruke: 74
*.net.hinet.hr



Profil

icon Re: C++ problem11.05.2003. u 13:47 - pre 227 meseci
Puno hvala - Leka -, program radi :-)
Thanks
 
0

x20x

Član broj: 6220
Poruke: 74
*.net.hinet.hr



Profil

icon Re: C++ problem11.05.2003. u 13:52 - pre 227 meseci
A hvala i svima ostalima !
 
0

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: C++ problem11.05.2003. u 15:13 - pre 227 meseci
Naglašavam da nisam džabe dao autput od gmake-a ... gets() zaista ne treba koristiti za neke ozbiljnije stvari.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
0

[es] :: C/C++ programiranje :: C++ problem
(Zaključana tema (lock), by X Files)

[ Pregleda: 4115 | Odgovora: 8 ] > FB > Twit

Postavi temu

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.