Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

menu

Ostatnio zmodyfikowano 2008-10-31 17:37
Autor Wiadomość
invisiblekid
Temat założony przez niniejszego użytkownika
menu
» 2008-10-14 17:34:26
Mam pytanie związanie z moim projektem (operacje na ciągach- już o tym gdzies pytałem w kontekscie pomocy przy wprowadzaniu liczb).
Tym razem chciałem zapytać o utworzenie menu programu. Chodzi mi o strorzenu czegoś podobnego do programu "książka telefoniczna" z lekcji o strukturach danych- a wiec menu którego poszczegulne chasła były by podswietlane a po wciśnieciu ENTER uruchamiana byłaby określona funkcja.
Narazie napisałem nastepujece menu ale mam problem z "wprowadzeniem go do ruchu" (na razie nie jest ono wogóle użyteczne):

C/C++
void menu()
{
    int pozycja = 0;
    bool koniecMenu = false;
    clrscr();
    while(( koniecMenu != true ) ||( koniec =!true ) )
    {
        cout << "Menu programu: " << endl;
        cout << "\t 1. Wprowadz ciag" << endl;
        if( pozycja = 1 ) {
            cout << "\t  1.1 Wprowadz wlasny ciag " << endl;
            cout << "\t  1.2 Wczytaj ciag jedynek " << endl;
            cout << "\t  1.3 Wczytaj ciag kolejnych liczb calkowitych " << endl;
            cout << "\t  1.4 Wczytaj ciag ....... " << endl;
            cout << "\t  1.5 Wczytaj ciag szybko rosnacy " << endl;
        }
        cout << "\t 2. Wykonaj operacje na wybranym ciagu: " << endl;
        cout << "\t 2.1 Ssumuj ciag " << endl;
        cout << "\t 2.2 Obilcz srednia arytmetychna ciagu " << endl;
        cout << "\t 2.3 Sprawdz monotonicznosc ciagu " << endl;
        unsigned char znak = getch();
        switch( znak )
        {
        case 224: //klawisze specjalne
            znak = getch();
            switch( znak )
            {
            case 72: //strzałka w górę
                pozycja -= 1;
                break;
            case 80: //strzałka w dół
                pozycja += 1;
                break;
            }
        case 27: //ESC
            koniec = true;
            break;
        case 13: //ENTER
            //wykonaj();
            break;
        }
    }
} //  menu()

Czy mógłbym liczyc na jakąś pomoc? Jesli nie dało by sie czegoś takiego zrobić (ale chyba sie da :D) to w sumie moge zrobic proste menu polegajace na wybraniu cyfry przypisanej danemu tematowi. Ale chyba "fajowsiejsze" jest menu, które ja sobie ubzdurałem :P.
P-2027
DejaVu
» 2008-10-14 21:06:19
Poniższa linijka zawiera błąd:
if( pozycja = 1 ) {

/edit:
Co do listy to przeanalizuj głównie działanie kodu z książki telefonicznej:
C/C++
void WyswietlListeOsob( OsobaST tablica[], int iloscElementow, int zaznaczElement, int wyswietlOdElementu )
{
    int max = wyswietlOdElementu + WYSWIETL_OSOB;
    if( max > iloscElementow ) max = iloscElementow;
   
    for( int i = wyswietlOdElementu; i < max; i++ )
    {
        if( i == zaznaczElement )
        {
            textbackground( 12 );
            textcolor( 14 );
        } else
        {
            textbackground( 0 );
            textcolor( 7 );
        }
        gotoxy( 1, 3 + i - wyswietlOdElementu );
        for( int j = 0; j < 60; j++ ) cout << " ";
       
        gotoxy( 1, wherey() );
        cout <<( i + 1 );
        gotoxy( 10, wherey() );
        cout << tablica[ i ].imie;
        gotoxy( 30, wherey() );
        cout << tablica[ i ].nazwisko;
    }
    return;
}
P-2031
invisiblekid
Temat założony przez niniejszego użytkownika
» 2008-10-16 17:02:00
Ja go analizowałem :P
I różnica z którą sobie nie mogę poradzić jest fakt, że w w.w. funkcji tekst pojawia się cyklicznie (za pomocą pętli) a ja chyba nie mogę sobie na to pozwolić. Tak mi sie przynajmniej wydaje.
 Miałem pomysł aby przed wyswietleniem jakiegoś tekstu pisać instr. warunkową sprawdzającą czy czy "pozycja" równa jest wartości przypożądkowanej konkretnej linijce tekstu.
 Miałem też drugi pomysł aby na początku pętli sprawdzic jak jest ustawiona "pozycja": getxy(x,pozycja) (czy jakoś tak- pisze to na poczekaniu), pokolorować, a potem spowrotem getxy(1,1) i wyswietlic od początku. Ale to chba jest znacznie gorsze i bez sensu nawet bo psuje cały układ menu.
 Czy któryś z szanownych forumowiczów mógłby mnie nakierunkować na jakiś łatwiejszy i barzdzej przeejżysty sposób. Byłbym gratefull :D

Btw: fajna stronka choć stara wydawała mi sie bardziej przejrzysta- ale może to kwestia przyzwyczajeń :P
P-2085
invisiblekid
Temat założony przez niniejszego użytkownika
» 2008-10-25 18:00:20
Po kilku dniach starania skonstruowalem taki model menu:
C/C++
bool finito = false;

void menu( bool & logiczny )
{
    int pozycja = 1;
    if( pozycja = 0 ) pozycja = 1;
   
    if( pozycja = 11 ) pozycja = 10;
   
    bool koniec = false;
    clrscr();
    while(( koniec != true ) ||( logiczny =!true ) )
    {
        clrscr();
        cout << "\tMenu programu: (poruszasz sie za pomoca strzlek [UP] i [DOWN]" << endl;
        light( pozycja, 1 ); cout << " 1. ...." << endl;
        if(( pozycja >= 1 ) &&( pozycja <= 6 ) ) {
            light( pozycja, 2 ); cout << "  1.1 .... " << endl;
            light( pozycja, 3 ); cout << "  1.2 .... " << endl;
            light( pozycja, 4 ); cout << "  1.3 .... " << endl;
            light( pozycja, 5 ); cout << "  1.4 .... " << endl;
            light( pozycja, 6 ); cout << "  1.5 .... " << endl;
        }
        light( pozycja, 7 ); cout << " 2. .... " << endl;
        light( pozycja, 8 ); cout << " 3. .... " << endl;
        light( pozycja, 9 ); cout << " 4. .... " << endl;
        light( pozycja, 10 ); cout << " 5. .... " << endl;
       
        unsigned char znak = getch();
        switch( znak )
        {
        case 224: //klawisze specjalne
            znak = getch();
            switch( znak )
            {
            case 72: //strzałka w górę
                pozycja -= 1;
                break;
            case 80: //strzałka w dół
                pozycja += 1;
                break;
            }
        case 27: //ESC
            logiczny = true;
            break;
        case 13: //ENTER
            koniec = true;
            break;
        }
    }
    if( koniec ) wykonaj( pozycja );
   
} //  menu()

void light( int obecneMiejsce, int daneMiejsce )
{
    if( obecneMiejsce == daneMiejsce )
    {
        textbackground( 12 );
        textcolor( 14 );
    } else
    {
        textbackground( 0 );
        textcolor( 7 );
    }
} //  light()

void wkonaj( int przypadek )
{
    switch( przypadek )
    {
    case 1:
        funkcaja1();
        break;
    case 2:
        funkcja2();
        break;
    case 3:
        //...
    case 10:
        f10();
        break;
    }
} // wykonaj()
Funkcja ta pracuje jak należy (prawie) natomiast mam proźbę o weryfikację tego kodu.
Problemami są:
1) podswietlenie pojawia sie ma polu 2.3 - dlaczego skoro int pozycja=1?
2) przesuwając się z pozycji 2.3 (nie ważne w którą stronę) pojawia się lekki  błąd: tło całego programu koloruje się na czerwono.
3) gdy opuszczę menu (tj. przejade podświetleniem poza obszar menu) wartość "pozycji" powinna sie nie zmieniac- a jednak aby powrócić na obszar trzeba wcisnąć strzałkę dokładnie tyle razy ile razy wcisnęło się strzalkę o grocie przeciwnym poza obszarem menu (mam nadzieję,że jest to zrozumiałe :P).

Po (ewentualnym) rozpatrzeniu tych problemów prosiłbym o w.w. weryfikacje tzn. o sprawdzenie czy mój schemat jest optymalny i czy nie można wy wprowadzić kilku uleprzeń. Pozdrawiam :D

/edit: Dodam parę objaśnien:
* bool finito to zmienna globalna (może to niewlaściwe słowo, w karzdym razie: ) jest ona odpowiedzialna za zamkniecie calego programu. Dla tego wlasnie w definicji funkcji jest referencja (zmienna zmieniona w funkcji na przybrac zmienioną wartość także poza nią). Finito uaktywnia sie ona po wcisniecu [ESC]- z tym wiąrze sie kolejny problem: PROGRAM NIE ZAMYKA SIĘ PO WCISNIĘCIU [ESC] (nawet nie wychodzi z menu) :/
* bool koniec to zmienna lokalna i jej zadaniem jest opuszczenie pętli przez użytkownika po wybraniu odpowiedniej opcji.
P-2301
DejaVu
» 2008-10-25 20:06:09
Co do koloru tła ustaw go bezpośrednio przed czyszczeniem ekranu jakiego koloru ma być. Co do weryfikacji rozwiązania - Twój program, więc to Twoja praca. My nie jesteśmy testerami Twojej aplikacji, tymbardziej nie mamy ochoty weryfikować poprawności jego działania na podstawie kodu. Ustal jakie błędy występują, przedstaw fragmenty kodów odpowiedzialnych za dane zagadnienia i wtedy ktoś będzie w stanie udzielić jakiejś konstruktywnej odpowiedzi.
P-2303
invisiblekid
Temat założony przez niniejszego użytkownika
» 2008-10-26 17:14:31
Tak więc problemów z kompilacją nie mam natomiast są jakieś problemy logiczne (I mean: program nie działa tak jak bym chciał). Opisałem je w poprzednim poscie ale moge powtórzyć:
"1) podswietlenie pojawia sie ma polu 2.3 - dlaczego skoro int pozycja=1?
2) przesuwając się z pozycji 2.3 (nie ważne w którą stronę) pojawia się lekki  błąd: tło całego programu koloruje się na czerwono.
3) gdy opuszczę menu (tj. przejade podświetleniem poza obszar menu) wartość "pozycji" powinna sie nie zmieniac- a jednak aby powrócić na obszar trzeba wcisnąć strzałkę dokładnie tyle razy ile razy wcisnęło się strzalkę o grocie przeciwnym poza obszarem menu (mam nadzieję,że jest to zrozumiałe )."
4)Kolejnym problemem jest niefunkcjonalność [ESC'a]. Nie wiem czemu tak się dzieje, gdzyż zmienna "finito" powinna reagować na wcisniecie escepe'a. Fragment kodu:
C/C++
void menu( bool & logiczny ) {
    while(( koniec != true ) ||( logiczny =!true ) ) {
        //...
        switch( znak )
        {
        case 27: //ESC
            logiczny = true;
            break;
        }
    }
}
 Zaznaczam, że w definicji funkcji: void menu(bool& logiczny); zawarłem referencje do zmiennej logicznej finito aby w wyniku zmiany zmiennej wewnątrz funkcji zmieniła sie jej wartość również poza funkcją (w czego eyniku program ma sie zamknąć)

Prosłbym o skopiowanie tego kodu (zamiast funkcji menu wpisanie main, skompilowanie i przeanializowanie tego na co zwracam uwagę:D
Jesli sie nie da to trudno (będę kombinował nadal).
Pozdrawiam:D

/edit: problem nr 2 rozwiązałem <jupi>. Będę myślał nad problemem nr 1, ale czuję, że bez pomocy z problemami 3 i 4 chyba sobie nie poradze :D
P-2314
DeBugger
» 2008-10-26 17:23:50
Nie chce mi się patrzeć na kod, bom zmęczony.
Ale sam na niego popatrz.
Najpierw uruchom skompliowany program, a później, w miejscu, gdzie nie działą poprawnie, pogrzeb z kodem.
P-2315
invisiblekid
Temat założony przez niniejszego użytkownika
» 2008-10-26 17:40:22
Tak wlasnie robie :D (już rozwiązałem problem nr 2 <jupi>)
Ale dzieki:D
P-2316
« 1 » 2
  Strona 1 z 2 Następna strona