Šta je novo?

C (c-c-c-c-c) :) pitanje

3MAJ86

Čuven
Učlanjen(a)
19.03.2004
Poruke
1,523
Poena
649
pocheo sam pre mesec dana da uchim ovaj programski jezik, i poshto imam dosta dobro znanje iz pascala (iz shkole), ide mi dosta brzo.

imam problem kada pishem program, i kada zhelim da izbacim mogutjnost greshke prilikom unosa promenljive. recimo, kada zhelim da program prijavi greshku ako se unese neki drugi znak osim broja (recimo neko slovo itd.) koristim :

if (!(isdigit(promenljiva))) prijavi poruku o greshci...

problem je u tome shto ova metoda prijavljuje greshku i kada se unese negativan broj kao promenljiva. kako to da eliminishem?

kako usloviti da promenljiva bude odredjenog tipa podataka?
 
Napiši svoju funkciju koja to radi.


Kod:
int is_number(char *str)
{
 int l=strlen(str), i=0, dot=0, ret=1;

 while(i<l && ret==1)
  {
   if(str[i]<'0' || str[i]>'9')  //ako znak nije cifra
    {
     ret=0;
     if(str[i]=='-' && i==0)   //ako je znak minus i nalazi se na pocetku
      ret=1;
     if(str[i]=='.' && (dot==0 && i!=0 && i!=l-1)) //ako je znak tacka a ne nalazi se na pocetku ili kraju i ne postoji ni jedna druga
      { ret=1; dot++; }
     }
    i++;
  }

 return (ret);
}
 
Ma na x nacina si mogao da resis, bilo da dodas jos jedan uslov testiranja da li je jednako ili vece nuli, mogao si da okrenes sign ako je negativan broj (odnosno koristis apsolutnu vrednost), mogao si da pokusas neku koverziju pa testiras da li ce da pukne, itd, itd.
 
fora je u tome shto ja ZHELIM da ukljuchim i negativne, ali reshenje koje sam ja ponudio iskljuchuje negativne brojeve zajedno sa drugim "ne-brojevima"

@ zeleni zub:
skontao sam o chemu se radi, samo mi reci da li tje ovaj deo koda:
if(str<'0' || str>'9')
prihvatiti sve brojeve (vishecifrene i negativne), a odbaciti druge znakove?
nisam josh stigao do stringova, ali (iz paskala) otprilike znam shta rade i kako.

da li postoji neki ipak jednostavniji nachin da se ovo uradi?
 
3MAJ86 je napisao(la):
@ zeleni zub:
skontao sam o chemu se radi, samo mi reci da li tje ovaj deo koda:
if(str<'0' || str>'9')
prihvatiti sve brojeve (vishecifrene i negativne), a odbaciti druge znakove?
nisam josh stigao do stringova, ali (iz paskala) otprilike znam shta rade i kako.


Nisi shvatio. ,) U C++-u se sa ' ' označava jedan karakter, a sa " " string.

Ta funkcija provera da li string str (u kome se nalazi ceo broj a ne samo jedna cifra) sadrži u sebi validan broj (recimo za str=="-453.333" vraća 1, a za "123-3", "asd42" ili "125.3.1" vraća 0).

Funkcija proverava znak po znak u stringu.... ako znak nije između '0' i '9' proverava da li je znak '-' ili '.' i da li se nalaze na dobroj lokaciji (ako je '-' da li se nalazi na početku i ako je tačka da li se ne nalazi na početku ili kraju).

Čim naiđe na znak koji nije cifra postavlja ret na 0. Ako je znak tačka ili minus na dozvoljenoj lokaciji vraća ret na 1.

Ako je ret==0 izlazi iz petlje i vraća 0. Ako u celom stringu ne naiđe na ni jedan znak koji ne bi trebalo da se nalazi u broju ret ostaje 1 i funkcija vraća tu vrednost. Ti možeš da umesto '.' proveravaš da li postoji ',' ili možeš da ubaciš da na početku osim '-' postoji '+'.



da li postoji neki ipak jednostavniji nachin da se ovo uradi?

Lepo ti je silver rekao: ima gomila načina da to uradiš. Recimo da koristiš neke od ugrađenih funkcija za konverziju atoi(), atol().... Samo one će da ti string "-454 asd" da konvertuju u broj -454 (neće prijaviti grešku), a vratiće nulu ako ne mogu da konvertuju string u broj (vraćaju nulu i ako je string "0" takod a ne znaš da li je unesena nula ili neka slova).

A i za ovo se ne može reći da je nešto preterano komplikovano... :)
 
e, u medjuvremenu sam uspeo sam... :)
ovako to izgleda:

bla bla
char ulaz[10]
gets(ulaz);
if (!(isdigit(ulaz[0])) && (ulaz[0] != '-')) { poruka o greshci bla bla... }
itd..

ma kad ne razmishljam

hvala !

kako da napravim sopstveni .h fajl, pa da tamo ispishem ovu moju funkcijicu jednom zauvek, a ne da je qckam svaki put kada mi treba ovako neshto (a treba chesto zar ne). :type:
ja sam otvarao postojetje fajlove i nishta nisam skontao iz onoga :wall: :d
 
Poslednja izmena:
i da, naravno da sam smestio ovo u neogranichenu petlju i da proverava ovo (i eventualno druge uslove), sve dok se ne dobije odgovarajutji ulaz
 
3MAJ86 je napisao(la):
kako da napravim sopstveni .h fajl, pa da tamo ispishem ovu moju funkcijicu jednom zauvek, a ne da je qckam svaki put kada mi treba ovako neshto (a treba chesto zar ne). :type:
ja sam otvarao postojetje fajlove i nishta nisam skontao iz onoga :wall: :d
lepo, napravis nesto.h i u njega upises

rezultat MojaFunkcija (parametri)
{
tralala
return izlaz;
}

i kad hoces da je koristis, ubacis ga u direktorijum gde je tvoj C program a u njemu stavis #include "nesto.h"
 
I šta kada u dva fajla uradi #include "xxxxx.h"?

U .h fajl samo deklaracija funkcije:

my_functions.h:
Kod:
#ifndef __MY_F__
#define __MY_F__

int f1(void);    
int f2(int, int);   
#endif

U .cpp definicija:
my_functions.cpp
Kod:
#include "my_functions.h"  

int f1(void)
{
 // kod funkcije
}

int f2(int a, int b)
{
 // kod funkcije
}


.cpp uključiš u projekat (ako ga nećeš menjati ubaciš ga kao DLL, da ti ne kompajlira svaki put), a .h (#include "my_functions.h") koristiš u svakom .cpp fajlu gde koristiš svoje funkcije.
 
Poslednja izmena:
Al si se uvatio C++-a ko pijan plota :)
Dobro mu nisi rekao da napravi staticku biblioteku :)
 
3MAJ86 je napisao(la):
Kod:
char ulaz[10]
gets(ulaz);
if (!(isdigit(ulaz[0])) && (ulaz[0] != '-')) { poruka o greshci bla bla... }
itd..
Ne valja ti ni ovo, proći će ti svi stringovi koji počinju sa brojem ili sa znakom -. Znači za stringove kao što su "124", "-145","---d","2-1xd1", itd. neće prijavljivati grešku. ;)
 
Voodoo_NBGD je napisao(la):
Al si se uvatio C++-a ko pijan plota :)

Nema veze... i u C-u je isto. Samo umesto .cpp neka nazove fajl .c :)


Voodoo_NBGD je napisao(la):
Dobro mu nisi rekao da napravi staticku biblioteku :)

Dobro, priznajem malo sam preterao. ,)
 
Poslednja izmena:
ma smislitju vetj neshto, ali skont'o sam u chemu je stvar :)

hvala svima na pomotji!
 
Nazad
Vrh Dno