[ Aleksandar Gajic @ 09.06.2008. 14:57 ] @
Ovako,
Dobio sam zadatak da program ispise kog je tipa uneti znak sa tastature.

Nije mi jasno kako bi trebalo da deklarisem kog je tipa podatak koji unosim? Mogu da predpostavim da bi to trebalo da bude "unsigned", ali ne znam kako posle da ispitam kog je tipa uneti znak. Jer zadatak zahteva da se nakon unosenja ispita da li je u pitanju veliko slovo, malo slovo, broj, ili specijalni znak!

Moze li me neko posavetovati za ovo? Hitno mi je potrebna pomoc...
[ POW R TOC H @ 09.06.2008. 16:35 ] @
Za proveravanje da li su u pitanju slova ili brojevi (ili ostali znaci), i da li su mala slova ili velika, koristi sledece funkcije iz string.h :
int isdigit ( int c );
int isalnum ( int c );
int isalpha ( int c );
int isupper ( int c );
int iscntrl ( int c );

Mislim da imena funkcija objasnjavaju sve. Osim mozda isalnum() koji vraca 1 ako je vrednost ili broj ili slovo, a ako nije, onda vraca nulu.
[ xeron @ 09.06.2008. 20:42 ] @
Evo možda nešto ovako:
Code:

#include <iostream>
using namespace std;

template <typename Tip>
void KojiJeTip (Tip n){
    if ( sizeof( n ) == 4) cout << "Unesen je int"<<endl;
    else if( sizeof( n ) == 8 ) cout << "Unesen je double"<<endl;
    else if( sizeof( n ) == 1 ) cout << "Unesen je char"<<endl;
}

int main(void){
    cout<<"Koliko memorije zauzimaju pojedine varijable: "<<endl;
    cout<<"int: "<< sizeof( int ) << endl;
    cout<<"double: "<< sizeof( double ) << endl;
    cout<<"char: "<< sizeof( char ) << endl;
    cout<<"---------------------------------"<<endl;

    KojiJeTip('c');
    KojiJeTip (1);
    KojiJeTip (2.27); 
    return 0;


evo izlaz poziva ovih funkcija:

Citat:

./velicine
Koliko memorije zauzimaju pojedine varijable:
int: 4
double: 8
char: 1
---------------------------------
Unesen je char
Unesen je int
Unesen je double


[ Aleksandar Gajic @ 09.06.2008. 21:22 ] @
Citat:
xeron: Evo možda nešto ovako:
Code:

#include <iostream>
using namespace std;

template <typename Tip>
void KojiJeTip (Tip n){
    if ( sizeof( n ) == 4) cout << "Unesen je int"<<endl;
    else if( sizeof( n ) == 8 ) cout << "Unesen je double"<<endl;
    else if( sizeof( n ) == 1 ) cout << "Unesen je char"<<endl;
}

int main(void){
    cout<<"Koliko memorije zauzimaju pojedine varijable: "<<endl;
    cout<<"int: "<< sizeof( int ) << endl;
    cout<<"double: "<< sizeof( double ) << endl;
    cout<<"char: "<< sizeof( char ) << endl;
    cout<<"---------------------------------"<<endl;

    KojiJeTip('c');
    KojiJeTip (1);
    KojiJeTip (2.27); 
    return 0;


evo izlaz poziva ovih funkcija:


Ovo mi lici na C++ ako se ne varam? Meni je potrebno ovo u C-u.

Sto se ovoga string tice, ja ne znam sta da radim sa tim funkcijama, odnosno kako se koriste u programu... Provericu to na netu negde, a ako ne nadjem icicu starom dobrom tehnologijom "||" (npr. if (znak=="a" || znak=="b" || znak=="c"......)) :)
[ POW R TOC H @ 09.06.2008. 21:50 ] @
To sto ti je xeron napisao nije tacno (oprosti xeron-e), iz jednog razloga :
Funkcija koja odredjuje tip u stvari odredjuje tip podatka promenljive u kojoj cuvas informaciju. Ako odlucis da cuvas 'c' u promenljivoj tipa int, on ce prepoznati int, zato sto je char < int i moze savrseno da stane. Koju god promenljivu koristis za cuvanje podataka, sizeof() ce ti uvek reci samo njen tip. Ovo sto je on napisao i dalje nije tacno, jer velicina tipova int, double i short (i ostalih, osim char) je promenljiva, od platforme do platforme, a ovakva je (pouzdano) samo na 32-bintim x86 arhitekturama. Mada i dalje zavisi od samog OS-a :)
Sve u svemu, 'tip podatka' je apstrakcija koju su uveli visi programski jezici (visi od assembly-a), a svaki podatak je generalno niz jedinica i nula, ili gledano u okviru najmanjih korisnih celija - niz bajtova. Informaciju velicine 1 bajt mozes da stavis u ono sto C zove : char, int, unsigned int, short, long... Sve u svemu, tip podatka je (u vecini slucajeva) samo broj bajtova odvojen za tu promenljivu, pa tako nikad ne mozes da kazes da li je neki podatak ovo ili ono.

Ono sto mozes, jeste da znas sledece :
unsigned int znaci prosto 'ceo broj bez -' i moze da ima duplo vecu pozitivnu vrednost nego signed int. Razlog za to je prost. Na primer, signed int moze biti od -32767 do 32767, a unsigned int 65535. Nadam se da je ovo donekle pomoglo :)
[ Aleksandar Gajic @ 09.06.2008. 22:48 ] @
Evo kako sam ja uradio ovo... jedino sto nisam uspeo je da mi ispise da li je unet specijalni karakter, tipa !@#$%&*)_

A za ostalo program izgleda ovako...

Code:

#include <stdio.h>
#include <ctype.h>

int main ()
{
    char znak;
    scanf( "%c", &znak );
    if (islower (znak))
        printf ("Uneti znak je malo slovo.\n");
    if (isupper (znak))
        printf ("Uneti znak je veliko slovo.\n");
    if (isdigit (znak))
        printf ("Uneti znak je broj.\n");
    if (isspace (znak))
        printf ("Uneti znak je prazno polje.\n");
return 0;
}
[ Eurora3D Team @ 10.06.2008. 00:00 ] @
Mozes ovako (mada si skoro sve uradio)
Ponadji negde ASCII Character Codes tabelu. Ona pokazuje koja je brojevna vrednos svakog znaka (npr. A = 65)
Code:

#include <stdio.h>

int main ()
{
    printf("Unesi znak\n");
    char znak;
    scanf( "%c", &znak );
    
    if((znak > 96) && (znak < 123))
        printf ("Uneti znak je malo slovo.\n");
    if((znak > 64) && (znak < 91))
        printf ("Uneti znak je veliko slovo.\n");
    if((znak > 47) && (znak < 58))
        printf ("Uneti znak je broj.\n");
    if(znak == 32)
        printf ("Uneti znak je prazno polje.\n");
    if((znak > 32) && (znak < 48))
        printf ("Uneti znak je specijalni znak.\n"); // OSTALI ZNAKOVI
    if((znak >57) && (znak < 65))
        printf ("Uneti znak je specijalni znak.\n"); // OSTALI ZNAKOVI
    if((znak >122) && (znak <128))
        printf ("Uneti znak je specijalni znak.\n"); // OSTALI ZNAKOVI
    return 0;
}

[ Aleksandar Gajic @ 10.06.2008. 14:29 ] @
Ma dobro je i ovo, samo sto na kraju moram da dodam else za specijalne znakove, ovo sam predao i bilo je ok. Hvala na pomoci!