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

Kako spreciti unosenje karaktera sa tastature u nekom opsegu?

[es] :: C/C++ programiranje :: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?

[ Pregleda: 2700 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Brolly

Član broj: 66668
Poruke: 363
*.dialup.neobee.net.



Profil

icon Kako spreciti unosenje karaktera sa tastature u nekom opsegu?11.11.2007. u 22:44 - pre 200 meseci
Skoro svako dugme na tastaturi ima svoj ASCII kod. Program poziva scanf() funkciju koja "zamrzava" program i ceka da korisnik unese neku vrednost koju ona snimi u odgovarajucu promenljivu. E sad, kako da namestim da se u tu promenljivu (npr. neka bude celobrojna promenljiva n) moze uneti SAMO broj, a da se nista ne desava ako korisnik pokusa da pritisne neko drugo dugme, npr. znak ili slovo?

Ako ovo NIJE moguce izvesti, da li se moze onda izvrsiti provera nakon pritisnutog tastera ENTER?

Hvala.
...
 
Odgovor na temu

obranko
severna amerika

Član broj: 36599
Poruke: 152
*.cpe.net.cable.rogers.com.



+1 Profil

icon Re: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?11.11.2007. u 23:58 - pre 200 meseci
Pozdrav,

to mozes da uradis na ovaj nacin:

int nastavi = 0;
int dozvoljeniKodovi[] = { /* ovde navedas scan kodove koje dozvoljavas */ };
while(nastavi == 0) {
sa funkcijom scan() ucitas vrednost;
ako je ucitana vrednost jednaka nekoj od vrednosti koja je u nizu dozvoljeniKodovi promenis vrednost nastavi u recimo jedan;
};


 
Odgovor na temu

xeron
Sarajevo

Član broj: 25909
Poruke: 133
89.146.175.*



Profil

icon Re: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?12.11.2007. u 15:35 - pre 200 meseci
Za takve stvari je pogodna getch() funkcija iz conio.h biblioteke. Nakon unosa nekog znaka sa tastature getch() ga pokupi, bez potrebe da se nakon unosa pritisne enter. Za razliku od scanf() funkcije gdje nakon svakog unosa moras pritisnuti enter.

char c=getch() hvata bilo koji unos sa tastaure.
Ako zelis da testiras sta je uneseno mozes koristiti switch-case.

U ovom slucaju:

Code:

switch(c){
    case '1':
        UradiNesto();
        break;
   case '2':
        UradiNesto();
        break;
    default: 
        UradiNesto();
    //Ako je uneseno nesto sto nismo pokrili sa gore
    //navedenim case -ovima, smatra se kao default.
    //Ako unese bilo sta drugo osim 1 ili 2 to se smatra 
    //kao default.
 }


Ili drugi nacin:
Napravis funkciju koja testira sta je uneseno ....
Code:

bool IspravanUnos(char c){
    return (c>='0' && c<='9');
 //testira da li je unesen broj 0-9
}

char c;
while(1){
    printf("Vas Unos: \n");
    c=getch();
    if(IspravanUnos(c)){
        printf("Unesen je broj u intervalu 0-9\n Uspjesan unos !\n");
        break;//Izlazimo iz petlje
    }



Petlja se vrti sve dok korisnik ne unese broj (0-9), kad to ucini petlja se prekida.


if (argc > 1 && strcmp(argv[1], "-advice") == 0) {
printf("Don't Panic!n");
exit(42);
}
 
Odgovor na temu

mjux

Član broj: 124150
Poruke: 158
*.ADSL.neobee.net.



+2 Profil

icon Re: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?12.11.2007. u 15:45 - pre 200 meseci
ili ovako
Code:

        char c, s[6]="";
        int i=0,n=0;

        while(c!='\r')
        {

                c=getche();

                if(c>='0' && c<='9' )
                {
                        s[i]=c;
                        i++;
                        s[i]='\0';
                }
                else
                {
                        gotoxy(wherex()-1,wherey());
                        printf(" ");
                        gotoxy(wherex()-1,wherey());
                }
        }
        n=atoi(s);


meni je ovako lakse sad ne znam....
ovo ce da radi naravno pod uslovom da e postuje da int ide do 32000 + nesto sitno
 
Odgovor na temu

Brolly

Član broj: 66668
Poruke: 363
*.dialup.neobee.net.



Profil

icon Re: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?12.11.2007. u 17:10 - pre 200 meseci
@obranko

To nece raditi na nacin koji sam zamislio. Ali ipak ti hvala, jer si mi dao ideju.

@mjux, xeron

Postoji nesto sto sam zaboravio da napomenem. :( Programiram na Linux platformi. Posto je conio.h nestandardna biblioteka, sve njene funkcije su meni nedostupne.


Da ne biste pomislili da samo sedim skrstenih ruku i cekam resenje, evo koda koji mi nazalost ne radi, za koji mi je obranko dao ideju:

Code:

#include<stdio.h>
#define ASCII_NULA 48 //ovo je ASCII kod za nulu

main()
{
    int n=0, k=1, i, j, uneseno=0;
    char c[10]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    char G=' ';
    do
    {
        uneseno=getchar();
        for(i=0; i<=9; i++)
        {
            if(uneseno==c[i])
                n+=(k*(c[i]-ASCII_NULA));
            if(uneseno=='\n')
                break;
            else
            {
                G='g';
                break;
            }
        }
        k*=10;
        if (G=='g') break;
    }
    while (uneseno!='\n');
    if (G=='g')
        printf("\n\nGreska!\n\n");
    else
        printf("\n\nn=%d\n\n", n);
    
    
}





Sa ovim, pokusao sam da unos trenutno prekinem, cim se unese neki znak koji nije broj 0-9.



Bio bih neizmerno zahvalan ako bi mi XFiles, ili bilo ko drugi ko se dobro razume u C programiranje pomogne! Proveo sam sveukupno barem 7 sati za kompom muceci se oko ovoga.

hvala
...
 
Odgovor na temu

mjux

Član broj: 124150
Poruke: 158
*.ADSL.neobee.net.



+2 Profil

icon Re: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?12.11.2007. u 18:20 - pre 200 meseci
ovde je problem, koliko sam ja skontao, sa stoticama, deseticama i jedinicama, jer mi ne znamo da li ce korisnik uneti jednocifre, dvocifren... petocifren broj...
probaj da sve sto se tacno unese upisujes u neki string po redosledu kojim su unoseni...
istovremeno sve sto unese prikazujes na ekranu...
kada se pritisne <e> onda prebrojis koliko strin ima clanova (ne moze vise od 5)onda kazes(po onoj tvojoj formuli) da za npr
Code:

if(strlen(s)==4) k=10000;
{

      for(i=0;i<strlen(s),i++)
      {
           n+=(s[i]-48)*k;
           k=k/10;
      }
}
else
{
              if(strlen(s)==3) k=1000;
              {
                   for(i=0;i<strlen(s),i++)
                   {
                          n+=(s[i]-48)*k;
                          k=k/10;
                   }
              }
       .
       .
       .
       .


}

mislim da bi to bilo ok
 
Odgovor na temu

xeron
Sarajevo

Član broj: 25909
Poruke: 133
*.PPPoE-7397.sa.bih.net.ba.



Profil

icon Re: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?12.11.2007. u 18:37 - pre 200 meseci
Code:

#include <stdio.h>
#include <stdlib.h>

bool IspravanUnos(char c){
    return (c >= '0' && c< '9');
}

int main(){
    char c;

    while(1){
        c=getchar();
        if(IspravanUnos(c))
            exit(1);
    }
    return 0;
}

Gasi se kada je unesen bilo koji broj 0-9.

if (argc > 1 && strcmp(argv[1], "-advice") == 0) {
printf("Don't Panic!n");
exit(42);
}
 
Odgovor na temu

mjux

Član broj: 124150
Poruke: 158
*.ADSL.neobee.net.



+2 Profil

icon Re: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?12.11.2007. u 18:41 - pre 200 meseci
nesto sam odradio ali nisam testirao... uglavnom nesto na ovaj fazon

Code:

    int kon=0,j=0,i, uneseno,k=0;
    char s[6]="";
    int n=0;
    
    
    do
    {
        uneseno=getchar();
    kon=0;
        for(i=0; i<=9; i++)
        {
             if(uneseno==c[i])kon=1;   
        }
    if(kon==1)s[j]=uneseno,j++,s[j]='\0';
    }while (uneseno!='\n');   //u ovom slucaju moze da unosi i pogresno ali to nece biti uracunato
    


    if(strlen(s)==4) k=10000;
    {
    
          for(i=0;i<strlen(s),i++)
                 {
               n+=(s[i]-48)*k;
               k=k/10;
            }
    }
    else
    {
              if(strlen(s)==3) k=1000;
              {
                   for(i=0;i<strlen(s),i++)
                   {
                          n+=(s[i]-48)*k;
                          k=k/10;
                   }
              }
          else
              {
               if(strlen(s)==2) k=100;
                   {
                          for(i=0;i<strlen(s),i++)
                          {
                                n+=(s[i]-48)*k;
                                k=k/10;
                          }
                   }
              
                   else
                   {
                       if(strlen(s)==2) k=10;
                           {
                                  for(i=0;i<strlen(s),i++)
                                  {
                                         n+=(s[i]-48)*k;
                                         k=k/10;
                                  }
                           }
 
                           else
                           {
                               if(strlen(s)==2) k=1;
                                   {
                                         for(i=0;i<strlen(s),i++)
                                         {
                                                   n+=(s[i]-48)*k;
                                                   k=k/10;
                                         }
                                   }
                           }
                    }
              }
              
        

 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?12.11.2007. u 20:22 - pre 200 meseci
Pozdrav,

Vidim da me pominjes, ali na zalost ja ti ne mogu puno pomoci jer se podavno ne bavim konzolnim programiranjem :( Limitirani unos sa tastature se najcesce realizuje posebnim bibliotekama, pa to treba traziti po netu.

Sto se tice unosa koji se kontrolise nakon ENTER-a, ideja je sledeca:

Code:

do
{
   // ... ovde se unese tekst (recimo sa gets, ...)

} while ( ! da_li_je_broj_ispravno_unet( tekst ) );

bool da_li_je_broj_ispravno_unet( char *tekst )
{
   // ... provera da li su samo cifre, uz eventualnu poruku 
}


odnosno, u kodu /netestirano/ :
Code:

// ...
bool da_li_je_broj_ispravno_unet( char *tekst )
{
   bool result = true;
   char ch;
   while ( ch = *tekst++ )
   {
      if ( !isdigit( ch ) )
      {
           result = false;
           break;
      }
   }
   return ( result );   
}
// ...

--- MAIN ---
char tekst[100];
do
{
    gets( tekst );
} while ( ! da_li_je_broj_ispravno_unet( tekst ) );



Što se tiče ideje koju je dao mjux, može se optimizovati, da se ne ponavlja kod:

Code:

// ...
int s_length = strlen( s );
int k = pow( 10, s_length );

for( i=0; i<strlen( s ); i++ )
{
   n += ( s[i]-48 ) * k;
   k /= 10;
}
// ...
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?13.11.2007. u 09:02 - pre 200 meseci
Code:
#include <stdio.h>
#include <stdlib.h>
int main() {
    int i=0;
    long n;
    char c, niz[10];
    // niz ima 9 clanova kao prvi korak protiv prekoracenja opsega broja n
    do {
        c = getch();
        if (c>=48 && c<=57 && i<10){
            niz[i] = c;
            i++;
            niz[i] = '\0';
            printf("%c", c); // da bi znao sta si otkucao
        }
    } while (c!=13);
    n = atoi(niz);
    printf("\nn = %d\n", n);
    return 0;
}

Mozda bi ovo moglo biti resenje koje objedinjuje sve gornje ideje.
Naravno da se treba bojle pozabaviti proverom opsega, zatim slucaja ako je prvi karakter '0' itd,...
pozdrav idb.
 
Odgovor na temu

Brolly

Član broj: 66668
Poruke: 363
*.dialup.neobee.net.



Profil

icon Re: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?15.11.2007. u 20:55 - pre 200 meseci
Hvala ljudi!

Trenutno mi je frka oko silnih kolokvijuma, ali cim mi se ukaze prilika pokusacu da implementiram neko od resenja, verujem da ce uspeti... Pa cu vam javiti.

Pozdrav!!!
...
 
Odgovor na temu

[es] :: C/C++ programiranje :: Kako spreciti unosenje karaktera sa tastature u nekom opsegu?

[ Pregleda: 2700 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

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