Aplikacja na zasadzie LOGO

0

Witam! Ostatnio dobija mnie to, że w III klasie gimnazjum mamy to zas*ane LOGO ;/ I sobie pomyślałem, że napiszę aplikację, która by wykonywała zadania takie jak LOGO tylko, że była by wzbogacona o zapisywanie do pliku i przede wszystkim "zmądrzona", bo wg. mnie polecenia typu "pw" nic nie znaczą, nawet nie można domyślić się o co chodzi. Teraz przejdę do rzeczy. Jak napisać kod, aby było możliwe wpisywanie poleceń typu właśnie "naprzód XX", gdzie XX to jednostka. Myślałem o tablicy char'ów, ale chyba odpada, bo odejmowanie działało by, gdyby liczba cyfr była zawsze jednakowa. Szukam właśnie takiego pomysłu, który rozwiąże problem komend.
PS: Nie chodzi mi tu już o pętle, bo to już pewnie bardziej skomplikowana rzecz, przecież nie tworzę języka ;p

0

Są jeszcze komendy bezargumentowe takie jak PŻ, SŻ (Pokaż/Schowaj żółwia), PP, UP (Podnieś/Upuść pisak).
No i wieloargumentowe takie jak UstawKolor.

Nie pamiętam dokładnie nazw tych komend, bo są one dość luźno tłumaczone
Ja bym to w C zrobił tak:

char polecenie[20];
int wartosc;
while(true){
  scanf("%s ", polecenie); //wczytuje polecenie i znak za
  if(! (strcmp(polecenie, "pz") || strcmp(polecenie, "sz") || strcmp(polecenie, "pp") || strcmp(polecenie, "up")){
    scanf("%d", &wartosc);
  }
  //sprawdzenie jeszcze raz komend i wykonanie dla nich instrukcji
}
0

Nigdy nie tknąłem nawet LOGO (za moich czasów to szczęście, że w ogóle jakieś komputery w szkole były...), więc sorry jeżeli coś zamieszam, ale czy Ty chcesz zrobić interpreter poleceń?
Jeżeli tak, a może to być coś bardziej skomplikowanego to zainteresuj się strukturą danych "Tree" (drzewo) dla podstaw i potem "abstract syntax tree".
Jeśli to już overkill i aż takiego rozwiązania nie wymaga to co chcesz zrobić, to wczytuj polecenie (jeśli to np jedna linijka) za pomocą getline() do std::string.
Przykład, wpisujesz: prawo 15cm
Za pomocą getline(cin, linia) pakujesz polecenie do stringa, ze stringa robisz stringstream i wyciągasz pierwsze słowo: ss >> komenda;
Dostajesz "prawo", po tej komendzie spodziewasz się liczby i jednostki, więc wyciągasz ss >> liczba >> jednostka;
Możesz to robić pojedynczo żeby sprawdzać na bieżąco czy na pewno wyciągnięto liczbę, od razu wyłapując błąd składni. ;)

0

OK, teraz jak ze string'a zrobić stringstream? Po prostu "stringstream << string"?
@madmike:
Wiem co to LOGO ;p Chodzi oto żebym zrobił taki pierwszy prototyp LOGO, kolega powiedział, że nie napisałbym czegoś takiego, odparłem, że nie, ale same komendy na rysowanie itp. (bez pętl i procedur) to co w tym trudnego? Tylko właśnie nie miałem pomysłu na wyciągnięcie wartości.

Tiaaa. Już sobie poradziłem, po prostu nie dodałem sstream i były kwiatki, teraz działa elegancko, dzięki :D

Utknąłem przy tym, że sprawdzam dane polecenie. Działa, ale tylko za pierwszym razem, bo potem cały czas jest błędne, tak jakby coś zostało w strumieniu/zmiennej. Kod:

//......
string linia, polecenie;
int wartosc;
stringstream komenda;

int main(int argc, char *argv[])
{
    input:
    komenda.ignore();
    linia = "";
    wartosc = 0;
    polecenie = "";
    cin.ignore();
    cout << "Wpisz komende: " << endl;
    getline(cin, linia);
    if (linia == "")
    {
        cout << "Brak komendy!" << endl;
        cout << "---------------------" << endl;
        cin.get();
        goto input;
    }
    komenda << linia;
    komenda >> polecenie;
    if (polecenie != "biegnij")
    {
        cout << "Bledne polecenie!" << endl;
        cout << "---------------------" << endl;
        cin.get();
        goto input;
    }
    komenda >> wartosc;
    cout << "Wykonywanie " << polecenie << " o wartosci " << wartosc << endl << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
0

No wiem już, że cin.get() blokuje, ale znowu ludzie się plują, że używam system("PAUSE") zamiast właśnie cin.get(), co z tym zrobić?

1 użytkowników online, w tym zalogowanych: 0, gości: 1