» Utilizator
LAMP
» Parteneri» De citit» Recomandari» Taskuri securitate » Statistici
  • 64782 de mesaje.
  • 7635 de topicuri.
  • 1081 de utilizatori.
  •  
  • purcelllefevreo e ultimul utilizator inregistrat.
[Detalii]

 

| |
Pagini: [1] 2 3
Print

[Curs] C - Lectia 03 - Functii I/O standard [6568 afisari]

Agkelos
*


Mesaje: 7180
OnlineOnline

WWW

Recapitulare
Ce mai stiti din lectia anterioara ? Exista functia main() din care sunt apelate
toate functiile, nu ? In functia main() punem cam tot ce ne intereseaza. In
functia main() citim datele, din functia main() scriem datele. In programarea
structurata (care e folosita in C) functia main() este cea mai importanta.
De fapt... ii spune chiar si numele (main=principal).

Bun, v-ati prins care-i structura unui program in C, acum se pune intrebarea
"Cum face altceva?", sau "Cum putem folosi functia main() ca programul sa faca
ce vrem noi sa faca?". Pentru asta avem nevoie de functiile de intrare/iesire
standard puse la dispozitie de C. Pentru a putea folosi functiile standard de
intrare/iesire va trebui sa introducem un header. Un header este un fisier
separat cu terminatia .h in care sunt definite functii, structuri, constante
in functie de scopul headerului. In cazul nostru avem nevoie de headerul
stdio.h (STanDard Input Output) care contine prototipul unor functii
definite in libraria standard C. Headerul se introduce in program in felul
urmator:
Code:
#include
In UNIX din moment ce functiile sunt definite in libc (libraria standard) nu e
neaparat necesar sa includem acest header dar e bine sa ne obisnuit sa-l
includem pentru a fi mai usoara portarea programului pe un alt sistem de
operare.
Bun, sa trecem la fapte. Ce stie stdio asta si ce putem face cu el ?

getchar()
functia getchar() citeste codul ASCII al unui caracter care il introduceti de
la tastatura. Codul nu este citit direct de la tastatura ci dintr-un buffer din
memorie in care se pastreaza toate caracterele introduse, buffer care se
poate corecta folosind tasta backspace.

Functia se apeleaza sub forma:
Code:
char a;
a = getchar();
unde a este o variabila de tip caracter. Dupa executarea
functiei a va lua valoarea returnata de getchar(), adica codul ASCII a tastei
care am apasat-o.

putchar()
Afiseaza codul ASCII al unui caracter. Se apeleaza de forma:
Code:
putchar(a);
unde a este o variabila care contine un cod ASCII
al unui caracter.
Acum ca stim deja doua functii de intrare/iesire sa facem si un mic programel:
Code:
#include

int main(){
        char a;

        a = getchar();
        putchar(a);
        putchar('\n');

        return 0;
}
Pe linia 1 a programului am inclus headerul stdio.h pentru a putea folosi
functiile getchar() si putchar();
Pe linia 3 incepe functia main;
Pe linia 4 am declarat variabila a de tip char. Adica, variabila a va putea tine
un cod ASCII;
Pe linia 6 folosim functia getchar() pentru a citi un cod de la tastatura
cod care il pune in variabila a.
Pe linia 7 avem deja variabila a care are un anumit continut (dat de noi de la
tastatura). Folosim functia putchar() pentru a afisa continutul variabilei.
Pe linia 8 afisam caracterul newline ('\n') strict din motive estetice Big grin
Pe linia 10 returnam 0 ca valoare de iesire pentru functia main() iar pe linia
11 se inchide acolada care marcheaza sfarsitul blocului main().

Simplu, nu ? Copiati codul, compilati-l si jucati-va putin cu el.

Vedeti ce se intampla daca in loc de
Code:
char a;
a = getchar();
putchar(a);
puneti ceva de genul asta:
Code:
putchar(getchar());
Functioneaza ? Daca
da, incercati sa va dati seama de ce. Daca nu, la fel... incercati sa va dati
seama de ce.

gets()
Sa luam un text de 30 de caractere cu functia getchar() e destul de nasol. In
libraria standard exista functia gets() care ne ajuta cu siruri de caractere.
Apelul se face in felul urmator:
Code:
char sir[30];
gets(sir);
unde sir poate contine maxim 30 de caractere (dupa cum e
specificat). La apelul functiei gets() utilizatorul va introduce un sir de
caractere iar programul va returna sirul cand utilizatorul va apasa tasta enter.

puts()
Daca exista functie pentru citirea unui sir de caractere trebuie sa existe o
functie si pentru afisarea acestuia. Functia puts primeste ca parametru un
sir de caractere care il afiseaza pe ecran. Se foloseste de forma:
Code:
char sir[] = "Test";
puts(test);
OK, haideti sa combinam cele doua functii si sa facem un programel mic.
Sa folosim functia gets() pentru a va citi numele iar apoi functia puts() pentru
a-l afisa. Codul va arata de forma:
Code:
#include

int main(){
        char nume[30];
        puts("Care e numele tau?");
        gets(nume);
        puts(nume);
        return 0;
}
Ce face codul de mai sus ? Creaza o variabila nume care poate tine maxim
30 de caractere. Afiseaza "Care este numele tau?", asteapta sa introduceti
un text care va fi salvat in variabila nume iar apoi afiseaza continutul
variabilei nume.
Faceti cateva teste si vedeti ce se intampla daca tastati mai mult de 30
de caractere. Modificati programul si jucati-va putin cu el.

printf()
Probabil v-ati dat seama ca nu aveti flexibilitate cu functiile getchar(),
putchar(), gets() si puts(). Poate ca doriti ca intr-o singura linie sa
afisati mai multe date: caractere, numere intregi, numere reale etc. Pentru asta
se foloseste functia printf() (printf formated). Functia ne permite sa afisam
un text si sa controlam modul de afisare. printf() returneaza numarul de
caractere afisate sau -1 in caz de eroare.
Se foloseste in felul urmator:
Code:
printf(sir_de_control,parametrul1,parametrul1,...,parametrulN);
unde sir_de_control este un camp text care contine caractere speciale de control
despre care am vorbit si in lectia trecuta. La rulare se inlocuiesc in text
caracterele speciale (specificatorii de format) cu valorile parametrilor
dati functiei, parametrii ce corespund sirurilor de control.
Probabil stiti deja cum se lucreaza cu functia din lectia anterioara asa ca
ma rezum la un exemplu scurt:
Code:
printf("Acesta este un numar - %d\n",53);
Observati ca in sirul
de control se pot pune si caractere speciale (newline - \n, tab - \t etc).
Hai a refacem programul de mai sus folosind functia printf. Ar arata cam asa:
Code:
#include

int main(){
        char nume[30];
        printf("Care e numele tau?");
        gets(nume);
        printf("Salut, %s\n",nume);
        return 0;
}
Compilati-l si rulati-l. Alta viata, nu ? Big grin
Acum putem formula o propozitie cu variabila nume Winking

scanf()
Prin analogia cu printf() va puteti da seama si ce face scanf(). Adica,
citeste (scaneaza) ceva de la tastatura si returneaza in variabilele specificate.
Functia are formatul:
Code:
scanf(sir_de_control,$parametrul1,parametrul2,...,parametrulN);
Ce putem face cu scanf() ?
Daca vrem sa citim un numar, putem folosi variabila scanf() in felul urmator:
Code:
scanf("%d",&i);
astfel i-am "spus" functiei scanf() ca ii trimitem
un numar intreg ( %d ) care trebuie sa-l stocheze la adresa variabilei i ( &i ).
Observati ca s-a pus un & in fata lui i. Asta pentru ca scanf() asteapta o
adresa la care sa puna variabila, nu o variabila. Momentan obisnuiti-va cu ideea.
Cand ajungem la pointeri intelegeti mai bine ce e & sau * si la ce si cum se
folosesc.

De asemenea, putem "scana" 2 sau mai multe variabile cu scanf() chiar si de
tipuri diferite. Cum facem asta ? In felul urmator:
Code:
int a;
char nume[20];
scanf("%s %d",&nume, &a);
Chestia de mai sus spune functiei scanf() ca utilizatorul va introduce o linie
care va avea forma : un sir de caractere (spatiu) un numar ( de ex. 'test 5' ).

Haideti sa facem acum un program care cere numele si varsta pe o singura linie
si apoi le afiseaza:
Code:
#include

int main(){
        char nume[30];
        int varsta;
        puts("Introdu numele si varsta pe o singura linie separate de spatiu!");
        scanf("%s %d",&nume,&varsta);
        printf("Salut, %s!. Stiu ca ai %d ani :D\n",nume,varsta);
        return 0;
}
NOTA - Specificatori de format
Specificatorii de format sunt caracterele alea care le puneti in sirul
de control al functiilor printf() sau scanf(). In functie de specificator
functia stie ce tip de variabila trebuie sa puna la adresa specificata
sau ce tip de variabila trebuie sa citeasca. Mai jos pun o lista a
specificatorilor de format:
Code:
COD          SEMNIFICATIE
%c     -     Caracter
%d     -     Intreg cu semn
%i     -     Intreg cu semn
%e     -     Afisare numere reale in format cu exponent
%E     -     Afisare numere reale in format cu exponent
%f     -     Afisare cu numere reale, simpla precizie, in format cu virgula
%g     -     Foloseste cel mai scurt format dintre %e si %f
%G     -     Foloseste cel mai scurt format dintre %E si %f
%o     -     Afisarea unui numar in octal
%s     -     Afisarea unui sir de caractere
%u     -     Afisare intreg fara semn
%x     -     Hexazecimal fara semn folosind litere mici
%X     -     Hexazecimal fara semn folosind litere mari
%p     -     Afisarea unui pointer
%n     -     Pointer intreg spre numarul de caractere afisate anterior
%%     -     Afisarea caracterului %
Tema
OK, haideti sa va dau si o tema daca tot suntem la scoala:
Faceti si voi 2-3 programele simplute folosind functiile prezentate mai sus.
Folositi-va imaginatia. Faceti ceva dragut. Astept sa vad ce ati lucrat.
Logged

25-09-2006, 21:01 Twitt ::
3rotix



Mesaje:

Continuarea ? :lol:
Logged
29-09-2006, 09:39 Twitt ::
Agkelos
*


Mesaje: 7180
OnlineOnline

WWW

Quote
Continuarea ? :lol:

Ai lipsit la primele 3 cursuri, esti exmatriculat :lol:

Urmeaza... dar nu acum ca is al naibi de ocupat Sad
Logged

29-09-2006, 10:07 Twitt ::
Sad_Dreamer
*


Mesaje: 274
OfflineOffline

WWW

OffTopic: ma...e o diferenta intre cursul asta si cel de pe operabilus.3xforum.....forumul asta 'strica codul'...am dat copy paste la ce ai pus tu in [ c o d e ]  [/ c o d e ] ..programul ala...si da eroare la compilare...si am dat copy paste si de pe operabilus.3xforum si nu da eroare !

OnTopic:

Quote
Vedeti ce se intampla daca in loc de

Code:

char a;
a = getchar();
putchar(a);


puneti ceva de genul asta:

Code:

spacer putchar(getchar());


Functioneaza ? Daca
da, incercati sa va dati seama de ce. Daca nu, la fel... incercati sa va dati
seama de ce.



functioneaza pentru ca a este egal cu getchar()

Mai jos..la celelalte 'quest-uri' ale tale:
Code:

Faceti cateva teste si vedeti ce se intampla daca tastati mai mult de 30
de caractere. Modificati programul si jucati-va putin cu el.

Pai daca pun mai multe caractere ...functioneaza perfect...arata exact ce trebuie...doar ca da o eroare la sfarsit..si anume
Segmentation Fault...dar programul si-a facut datoria...a functionat :-)) :-D

Cu temele revin altadata...ca e 02:03 si eu tocmai am terminat de citit/invatat tutorialul :-D.
Logged
11-10-2006, 00:03 Twitt ::
Sad_Dreamer
*


Mesaje: 274
OfflineOffline

WWW

Quote

Haideti sa facem acum un program care cere numele si varsta pe o singura linie
si apoi le afiseaza:
Code:
#include

int main(){
        char nume[30];
        int varsta;
        puts("Introdu numele si varsta pe o singura linie separate de spatiu!");
        scanf("%s %d",&nume,&varsta);
        printf("Salut, %s!. Stiu ca ai %d ani :Dn",nume,varsta);
        return 0;
}




am o intrebare aici..am compilat si am rulat....si cand ma pune sa introduc numele si varsta am pus:
Code:

sad 2222222222222222222222222222222222222222222222222222222222222222222
222222222222222222222222222222222222222222

si apoi apare:
Code:

Salut, sad !. Stiu ca ai 2147483647 ani :D

de unde a iesit 2147483647 ??
Logged
11-10-2006, 14:53 Twitt ::
3Nigma
*


Mesaje: 1617
OfflineOffline

WWW

tu vezi ca ai declarat variabila "varsta" ca fiind un int???
Code:
int varsta;

Variabilele au limita de ce valori pot inmagazina....de exemplu... un int poate inamgazina doar 32767 sau 64000++...ideeea e ca tu ai vrut sa bagi intr-un int o valoare de :
Code:
2222222222222222222222222222222222222222222222222222222222222222222
222222222222222222222222222222222222222222


De nerealizat...iar cand valoarea maxima de inmagazinare a unei variabile este depasita,apare fenomenul de overflow adica inmagazinare eroanata.Practic compilatorul este nevoit sa bage valoarea aia gigantica a ta pe 16 sau 32 de biti-->>de nerealizat
Logged

11-10-2006, 15:09 Twitt ::
Sad_Dreamer
*


Mesaje: 274
OfflineOffline

WWW

am inteles mersi !
Logged
11-10-2006, 16:12 Twitt ::
DarkByte



Mesaje:

Quote
de unde a iesit 2147483647 ??


2147483647 e numarul maxim care poate un calculator sa-l tina minte pe 4 bytes cu semn. In Pascal asta e constanta MaxLongInt = $7FFFFFF, iar numarul minim ce poate fi stocat pe 4 bytes cu semn e $8000000, adica -2147483648.

In C, depinde de compilator un picutz... fiindca variabilele de tip int pot fi pe 2 sau 4 bytes... felicitari, tocmai ai aflat ca la tine e implementat pe 4 bytes Smile era mai simplu cu sizeof, dar e bine si asa Smile

See ya
Logged
11-10-2006, 16:44 Twitt ::
3Nigma
*


Mesaje: 1617
OfflineOffline

WWW

Quote
fiindca variabilele de tip int pot fi pe 2 sau 4 bytes


sau 8 Byets(64 biti) pe noile compilatoare...
Logged

11-10-2006, 16:56 Twitt ::
Y2K`



Mesaje:

am incercat sa ma joc si yo cu ce am invatzat de la osho Big grin

am modificat un cod de a lui


Code:
#include

int main(){
char nume[30];
int varstra;
char ocupatie[50];
scanf("%s %d %c",&nume,&varstra,&ocupatie);
printf("Deci Daca Am Inteles Te Cheama, %s Ai %d ani si esti interesat de %c . parerea mea despre tine : esti un dulce n",&nume,&varstra,&ocupatie);
return 0;
}
dar cand intru in el nu imi apare nik scris si daca scriu ceva imi da ceva erroare Sad
Logged
02-11-2006, 19:52 Twitt ::
DarkByte



Mesaje:

Code:
#include
#include

int main(){
   clrscr();
   char nume[30], ocupatie[50];
   int varsta;
   printf("Dati numele, varsta, ocupatia:");
   scanf("%s %d %s",nume,&varsta,&ocupatie);
   printf("Te Cheama %s, Ai %d ani si esti interesat de %s. Parerea mea despre tine : esti un dulce n",&nume,varsta,&ocupatie);
   getch();
   return 0;
}


Mie nu mi-a dat eroare (Windows XP, Borland C++ 3.1), in schimb imi afisa ca am -11 ani si un semn ciudat la ce ma interesa. In primul rand, "varsta", la afisare, nu are nevoie de adresa variabilei, iar "ocupatie" trebuie citit ca string.

In rest, sunt doar modificari de look Smile Try it out
Logged
02-11-2006, 20:09 Twitt ::
Agkelos
*


Mesaje: 7180
OnlineOnline

WWW

Quote
Code:
#include

int main(){
char nume[30];
int varstra;
char ocupatie[50];
scanf("%s %d %c",&nume,&varstra,&ocupatie);
printf("Deci Daca Am Inteles Te Cheama, %s Ai %d ani si esti interesat de %c . parerea mea despre tine : esti un dulce n",&nume,&varstra,&ocupatie);
return 0;
}

Cand folosesti scanf() trebuie sa dai adresele variabilelor de aceea se pune &variabila, nu variabila. Cand folosesti printf() foloseste numele variabilelor fara & in fata Winking
Logged

02-11-2006, 20:25 Twitt ::
DarkByte



Mesaje:

Quote
Cand folosesti scanf() trebuie sa dai adresele variabilelor de aceea se pune &variabila, nu variabila. Cand folosesti printf() foloseste numele variabilelor fara & in fata Winking

Parca imi aduc aminte de ceva in gen din liceu... dar ma intreb cum de mi-a mers la stringuri...

L.E. pff... numele stringului pointeaza la primul caracter din sir... idem si adresa... acum am picat si eu din pom Big grin
Logged
02-11-2006, 20:41 Twitt ::
Agkelos
*


Mesaje: 7180
OnlineOnline

WWW

Quote
L.E. pff... numele stringului pointeaza la primul caracter din sir... idem si adresa... acum am picat si eu din pom Big grin


puts("Hello, World!");

:lol:
Logged

02-11-2006, 21:01 Twitt ::
Y2K`



Mesaje:

deci am stat si am citit azi de 2 ori de la lectia 1 la 3 si am zis noh hai din cat imi amintesc sa fac un chestionar :

Code:
#include
     
int main(){
char nume[30];
int ani;
char ocupatie[30];
char studi[30]
puts("Care e numele tau?");
scanf("%s",&nume);
printf("Ok %s , imi zici cati ani ai ? n",nume);
scanf("%d",&ani)
pritnf("OK %s , vad ca ai ai %d ani , dar ce ma intereseaza pe mine este ce studi ai facute !n",nume,ani);
scanf("%s",&studi);
printf("pai daca ai studiat %s , cu ce te ocupi ? n",studi);
scanf("%s"&ocupatie);
pritnf("bun aha vad ca te ocupi cu %d , esti tare . Vrei sa shti ce informati am cules despre tine ?n",ocupatie);
printf("Ok , Te Cheama %s .n",nume);
pritnf("Ai %d ani n",ani);
printf("ai studiat : %s .n",studi)
printf("shi de ocupi cu %d . n",ocupatie);
printf("esti tare mai %s .n",nume);
return 0;
}


da yo nu ii gasesc nik cum errroarea cica ii erroare la :

Quote
Compiling NONAME00.CPP:
Error NONAME00.CPP 8: Declaration syntax error
Error NONAME00.CPP 12: Statement missing ;
Error NONAME00.CPP 15: Illegal use of pointer
Error NONAME00.CPP 16: Function 'pritnf' should have a prototype
Error NONAME00.CPP 20: Statement missing ;



osho si ce ashi vrea sa nu imi dai codu corect sa imi explici de ce e eroroare la linia curenta si cum ar tr s`o repar (nu vreau sa imi dai codu corect ca atunci cum mai invatz? )


mc Kiss
Logged
03-11-2006, 19:44 Twitt ::
Pagini: [1] 2 3
Print
SkullBox Forum  |  Development  |  Java / C / C++ / C#  |  Topic: [Curs] C - Lectia 03 - Functii I/O standard