Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Kako se ograditi od pogresno unetih izbora u konzoli c programiranja

  • 10 odgovora
  • 3.733 pregleda

Najnovija ↓

Kako se ograditi od pogresno unetih izbora u konzoli c programiranja 06.06.2017. u 11:12 · pre 114 meseci
izmenjeno 1 put, poslednji put X Files 06.06.2017. u 22:23
  1. X Files06.06.2017. u 22:23zapis iz teksta poruke
#1
Korisnik ima na pocetku slobodan izbor programa unosom rednog broja 1 ili 2. Ako korisnik unese bilo sta drugo treba ispisati "Greska pri unosu" i vratiti se na main();
Imam problem kada unesem bilo koje slovo ili karakter program takoreci zabode to jest ponavlja ispisivanje, brisanje i vracanje na main() u beskonacnosti.
Kada deklarisem promenljivu za unos da je celi broj onda mi 1 i 2 radi ali kada stavi da je promenljiva x karakter onda se ne moze dalje u izvrsavanje prve i druge funkcije.

Kako da se ogradim tako da šta god korisnik uneo, a da nije 1 ili 2 da mu ispiše grešku i da se vrati na početak programa?

Code:
main()
{
   int x;
   printf("\n\t Izaberite opciju unosom rednog broja\n\n");
   printf("\n\n\t\t 1. Ucenik\n");
   printf("\n\t\t 2. Predmet");
   printf("\n\n\t\t >> ");
   scanf("%d",&x);
   switch(x)
   {
       case 1:
           evidentiranje(x);
           break;
       case 2:
           funkcija2(x);
           break;
       default:
        printf("\n\t\t Greska pri unosu!\n\n\t\t");
        system("pause");
        system("cls");
        return main();
   }
} 
Re: Kako se ograditi od pogresno unetih izbora u konzoli c programiranja 06.06.2017. u 19:24 · pre 114 meseci #2
Prvo inkluduj sve sto je potrebno, implicitne deklaracije donose iznenadjenja. main ti nije pravilno definisan i nauci petlje umesto da rekurzivno zoves main. scanf ne skida karakter kad naleti na gresku tako da kad god dalje pozivas scanf on pokusava jedan te isti karakter da konvertuje
i tako u beskonacnost. dakle pozovi getchar umesto system("pause") i radice ti koliko toliko.
Re: Kako se ograditi od pogresno unetih izbora u konzoli c programiranja 12.07.2017. u 22:08 · pre 113 meseci #4
Code:
/*
    Sablon za meni.
*/

#include <stdio.h>


// Unosi integer i smesta ga u broj. Vraca 1 ako jeste integer, 0 ako nije.
int input_int( int *broj )
{
    char ch;

    fflush(stdin);  // prazni bafer

// Funkcija scanf() vraca broj uspesno ucitanih podataka.
// Na sledeci nacin zahtevamo da se unese integer pracen enter-om :
    if( scanf("%d%c", broj, &ch) != 2 || ch != '\n' ){
//        printf("\n\n Greska ! \n\n");
        return 0;
    }
    else{
//        printf("\n\n Unet je integer pracen enter-om.  \n\n");
//        printf("\n\n Uneli ste broj: %d", *broj );
        return 1;
    }
}


void funkcija_1(void)
{
    printf("\n Izabrali ste funkcija_1. \n");
}

void funkcija_2(void)
{
    printf("\n Izabrali ste funkcija_2. \n");
}

void funkcija_3(void)
{
    printf("\n Izabrali ste funkcija_3. \n");
}

void funkcija_4(void)
{
    printf("\n Izabrali ste funkcija_4. \n");
}

void funkcija_5(void)
{
    printf("\n Izabrali ste funkcija_5. \n");
}

void meny(void)
{
    int izbor, kraj=0, br;

    while(!kraj){
//        system("CLS");

 printf("\n\n +-------------------------------------------------------+ \n"
            " |                                                       | \n"
            " |      GLAVNI MENI                                      | \n"
            " |                                                       | \n"
            " +-------------------------------------------------------+ \n"
            " |                                                       | \n"
            " |  1 - izbor_1                                          | \n"
            " |                                                       | \n"
            " |  2 - izbor_2                                          | \n"
            " |                                                       | \n"
            " |  3 - izbor_3                                          | \n"
            " |                                                       | \n"
            " |  4 - izbor_4                                          | \n"
            " |                                                       | \n"
            " |  5 - izbor_5                                          | \n"
            " |                                                       | \n"
            " |  0 - Kraj rada                                        | \n"
            " |                                                       | \n"
            " +-------------------------------------------------------+ \n"
        );

        printf("\n\t Izbor: (0-5): ");

//        scanf("%d", &izbor);              // Ovde pada program ako se ne unese integer.

//        input_int(&izbor);                // Moze ovako, unosi se samo integer,


        while( input_int(&izbor) == 0 ){    // ali je bolje ovako.
            printf("\n\n \t Morate izabrati (0-5) ! \n\n");
            printf("\n\t Izbor: (0-5): ");
        }

        switch(izbor){
            case 1:                     // izbor_1
                    funkcija_1();
                    break;
            case 2:                     // izbor_2
                    funkcija_2();
                    break;
            case 3:                     // izbor_3
                    funkcija_3();
                    break;
            case 4:                     // izbor_4
                    funkcija_4();
                    break;
            case 5:                     // izbor_5
                    funkcija_5();
                    break;
            case 0:                     // Kraj rada
                    kraj = 1;
                    break;
            default :
                    printf("\n\n \t Morate izabrati (0-5) ! \n\n");
                    break;
        }
    }
}



int main(void)
{

    meny(); // pozivamo glavni meni


    return 0;
}
Re: Kako se ograditi od pogresno unetih izbora u konzoli c programiranja 13.07.2017. u 10:36 · pre 113 meseci #6
I treba da se vrti u petlji dok se ne izabere odgovarajuća opcija. Dodao je novu opciju 0 za izlazak iz programa. Stoga to nije mrtva petlja.
Potpis
http://pedja.supurovic.net - http://wireless.uzice.net - Besplatni .RS domeni - Mikrotik uputstva - YT9TP - OpenStreetMap Srbija
Re: Kako se ograditi od pogresno unetih izbora u konzoli c programiranja 14.07.2017. u 00:34 · pre 113 meseci #8
Zanimljivo je kako si brzo prešao na sočan rečnik smao zato što ne umeš d aobjasniš to što hoćeš da kažeš.

Ja ne radim u ovom jeziku (liči na c, verovatno c++) i nemam gde da pokrenem progrm ali koliko ja vidim, postoji provera dali je unet broj tako da ako korisnik unese slovo program ga pomene da unese broj. To je sasvim ok.

Ako korsinik unese broj, onda progrmaproverava da li je broj neka od opcija. Ako je opsija pokreneopciju a ako jenula, izadje iz programa. opet, kako treba.

Ako ti milsiš da tu nešto ne valja onda odvoj malo vremena da dobro razmisliš o tome i da napišeš komentar koji jasno objašnjava to što milsiš da kažeš. Pametovati može svako.
Potpis
http://pedja.supurovic.net - http://wireless.uzice.net - Besplatni .RS domeni - Mikrotik uputstva - YT9TP - OpenStreetMap Srbija
Re: Kako se ograditi od pogresno unetih izbora u konzoli c programiranja 14.07.2017. u 00:55 · pre 113 meseci #9
Predraze, programiranje je egzaktno, nema tu filozofije. Ako kazem da program ulazi u mrtvu petlju onda sam to verovatno i *proverio*. Iako sam napisao da je to zbog toga sto scanf *ne ekstraktuje karakter* u slucaju greske ipak sam proverio. Dakle *mora da se pozove funkcija koja ekstraktuje karakter* nakon greske inace ce scanf samo da ponavlja istu gresku. Jel sad jasno?
Toliko.
Re: Kako se ograditi od pogresno unetih izbora u konzoli c programiranja 14.07.2017. u 02:32 · pre 113 meseci #10
Branimire, ako si našao bag u kodu onda lepo napišeš šta je bag, na kojoj liniji i ponudiš ispravku baga. A ne pametuješ.

Egzaktno.

Potpis
http://pedja.supurovic.net - http://wireless.uzice.net - Besplatni .RS domeni - Mikrotik uputstva - YT9TP - OpenStreetMap Srbija
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme