UNIX, Linux, Programare, Scripting, Retele
unix, linux, programare, script, hosting, server, retele
Lista Forumurilor Pe Tematici
UNIX, Linux, Programare, Scripting, Retele | Reguli | Inregistrare | Login

POZE UNIX, LINUX, PROGRAMARE, SCRIPTING, RETELE

Nu sunteti logat.
Nou pe simpatie:
angel_jo la Simpatie.ro
Femeie
25 ani
Bucuresti
cauta Barbat
25 - 72 ani
UNIX, Linux, Programare, Scripting, Retele / Cursuri / [Curs] C - Lectia 03 - Functii de intrare/iesire standard  
Autor
Mesaj Pagini: 1
operabilus
B.O.F.H.

Din: Sillycon Valley
Inregistrat: acum 18 ani
Postari: 200
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 <stdio.h>

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 <stdio.h>

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
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 <stdio.h>

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 - %dn",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 <stdio.h>

int main(){
        char nume[30];
        printf("Care e numele tau?");
        gets(nume);
        printf("Salut, %sn",nume);
        return 0;
}

Compilati-l si rulati-l. Alta viata, nu ?
Acum putem formula o propozitie cu variabila nume

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 %a",&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 <stdio.h>

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;
}

NOTA - Specificatori de format
Specificatorii de forumat 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.


_______________________________________
Portal SkullBox
SkullBox Forum
IP Finder and web browser details revealer


pus acum 18 ani
   
!_30
near connection ..

Din: nowhere ?
Inregistrat: acum 18 ani
Postari: 47
Am facut si eu un programel program

i


_______________________________________


pus acum 18 ani
   
operabilus
B.O.F.H.

Din: Sillycon Valley
Inregistrat: acum 18 ani
Postari: 200
Dragut... dar la mine nu face nimic. E doar un executabil care nu face nimic. Banuiesc ca nu asta vroiai... sau gresesc ?
By the way, ar fi interesant sa isi pui si codul sursa aici pe forum (nu pe rapidshare) ca sa aiba si altii putina inspiratie. Pentru incepatori C-ul poate fi destul de ciudat... mie mi s-ar parea interesant sa puna fiecare sursa programelor facute de ei si eventual sa se faca comentarii


_______________________________________
Portal SkullBox
SkullBox Forum
IP Finder and web browser details revealer


pus acum 18 ani
   
!_30
near connection ..

Din: nowhere ?
Inregistrat: acum 18 ani
Postari: 47




char sir[] = "Test";
puts(test);



Miros ceva dubios aici .

O sa revin cu programu


_______________________________________


pus acum 18 ani
   
!_30
near connection ..

Din: nowhere ?
Inregistrat: acum 18 ani
Postari: 47
Am si eu o intrebare , nu e la subiect dar nu stiam unde sa o tastez


%p     -     Afisarea unui pointer


Ai scris asta mai sus si am zis sa incerc si am intrat in mici dubii..

Am facut un mic programel de genu ( folosind pointeri ):


int main()

{
        int x;
        int *p;

        p=&x;
        printf("Valoare lui p este %p",p);
        return 0
                ;
}


Faza interesanta e ca mi-a aratat ( cum si credeam ) numarul hexazecimal ( care cred eu ca reprezinta valoarea in memoria RAM , cred unde va fi stocata valoarea variabilei   x ).Deci sa inteleg ca o variabila , i se aloca un spatiu in memoria RAM , dinainte ca aceasta sa priemasca o valoare.Corect ? Cand primeste o valoare , acel spatiu e folosit.

Ceea ce nu prin eu , este : la rularea acestui mic programel (  nu cred ca se poate numi asa dar in fine ) , am primit :

Valoare lui p este 0xbfe23474


deci eu sa inteleg ca RAM-ul e facut din multe bucatele ( foarte mici ) , indexate dupa numere hexa de genu (  0xbfe2347 ) , folosite pentru a se tine anumite chestii de genu : valoarea unei variabile ( din C ).










_______________________________________


pus acum 18 ani
   
Shocker
Moderator

Inregistrat: acum 18 ani
Postari: 12

!_30 a scris:


printf("Valoare lui p este %p",p);

Faza interesanta e ca mi-a aratat ( cum si credeam ) numarul hexazecimal ( care cred eu ca reprezinta valoarea in memoria RAM , cred unde va fi stocata valoarea variabilei   x ).Deci sa inteleg ca o variabila , i se aloca un spatiu in memoria RAM , dinainte ca aceasta sa priemasca o valoare.Corect ? Cand primeste o valoare , acel spatiu e folosit.

Ceea ce nu prin eu , este : la rularea acestui mic programel (  nu cred ca se poate numi asa dar in fine ) , am primit :

Valoare lui p este 0xbfe23474


Intr-adevar, spatiul se aloca inca de la declararea variabilei...
Nu prea stiu cum e in C, insa cred ca tu ai dat sa iti arate adresa de memorie unde este stocata valoarea variabilei.


!_30 a scris:

deci eu sa inteleg ca RAM-ul e facut din multe bucatele ( foarte mici ) , indexate dupa numere hexa de genu (  0xbfe2347 ) , folosite pentru a se tine anumite chestii de genu : valoarea unei variabile ( din C ).

Uite aici o mini-descriere interesanta:


Din punct de vedere intern memoria RAM este aranjata într-o matrice de celule de memorie , fiecare celula fiind folosita pentru stocarea unui bit de date (0sau1logic) . Datele memorate pot fi gasite aproape instantaneu (timp de ordinul zecilor de ns) prin indicarea rândului si coloanei la intersectia carora se afla celula respectiva . Se deosebesc doua tipuri de memorie :
SRAM(Static Ram) si DRAM(Dynamic Ram) .

Intersectia despre care se vorbeste este defapt aceasta adresa/offset, reprezinta pozitia la care se afla valoarea variabilei (in cazul tau incepe de la byte-ul BFE2347, si tine... well, asta depinde cum ai declarat variabilele [4 bytes-pentru DWORD... blabla])
Si in RAMi nu se tin doar valori din variabile, acolo se tin orice informatii preluate de la diferite aplicatii, iar `pozitiai/locul` lor in memorie este cunoscut si se fac trimiteri imediat la ele, prin offset/adresa (cum aveai tu BFE2347)

Modificat de Shocker (acum 18 ani)


_______________________________________
Portal SkullBox
SkullBox Forum
IP Finder and web browser details revealer


pus acum 18 ani
   
operabilus
B.O.F.H.

Din: Sillycon Valley
Inregistrat: acum 18 ani
Postari: 200
Se pare ca ti-a raspuns Shocker. Intr-adevar memoria calculatorului (RAM, virtuala, cache) e impartita in mai multe zone mici (de obicei 2Ko) si ce ti-a aratat tie acolo e adresa la care se afla variabila a.
Ai creat variabila a si pointerul p caruia i-ai "spus" adresa variabilei a. Apoi cu printf ai afisat continutul pointerului p, adica adresa variabilei a.

Mai multe discutam ceva mai tarziu... peste vreo 4 lectii


_______________________________________
Portal SkullBox
SkullBox Forum
IP Finder and web browser details revealer


pus acum 18 ani
   
andoseg
Newbi

Inregistrat: acum 18 ani
Postari: 32


_______________________________________
Portal SkullBox
SkullBox Forum
IP Finder and web browser details revealer


pus acum 18 ani
   
!_30
near connection ..

Din: nowhere ?
Inregistrat: acum 18 ani
Postari: 47
Am facut un mic "research" si am observat urmatoarele chestii :

am folosit urmatorul program :


#include <stdio.h>

float d;char a[10];

int main()
{
        int k;

        printf("Adresa lui d %pn",&d);
        printf("Adresa lui a[0] %pn",&a[0]);
        printf("Adresa lui a[1] %pn",&a[1]);
        printf("Adresa lui a[2] %pn",&a[2]);
        printf("Adresa lui a[3] %pn",&a[3]);
        printf("Adresa lui k : %pn",&k);

        return 0;

        }


ce am facut mai bine zis ? am inlocuit acel char , pe rand cu int , float si alte cele.Ce am observat ? Pe cati biti din RAM se distribuie fiecare array din acela.Stiam deja , dar e tare ca poti observa asa :

1. char



Adresa lui a[0] 0x80496e8
Adresa lui a[1] 0x80496e9
Adresa lui a[2] 0x80496ea
Adresa lui a[3] 0x80496eb


-se observa foarte usor cum fiecare char ( caracater ) are cate un byte ( adica adresa lui a[1]-a[0]=1 , etc ) in memoria RAM.

2. int



Adresa lui a[0] 0x8049720
Adresa lui a[1] 0x8049724
Adresa lui a[2] 0x8049728
Adresa lui a[3] 0x804972c


-observam ca are cate 4 byte's per array ..

Cred ca am prins bine faza


_______________________________________


pus acum 18 ani
   
operabilus
B.O.F.H.

Din: Sillycon Valley
Inregistrat: acum 18 ani
Postari: 200
Da... e si asta o posibilitate... dar de obicei se foloseste sizeof(variabila)

_______________________________________
Portal SkullBox
SkullBox Forum
IP Finder and web browser details revealer


pus acum 18 ani
   
Shocker
Moderator

Inregistrat: acum 18 ani
Postari: 12

!_30 a scris:


1. char


Adresa lui a[0] 0x80496e8
Adresa lui a[1] 0x80496e9
Adresa lui a[2] 0x80496ea
Adresa lui a[3] 0x80496eb


-se observa foarte usor cum fiecare char ( caracater ) are cate un byte

Se stocheaza "codul ASCII / reprezentarea HEX" a caracterului, care nu poate depasi 255, adica 1 byte

!_30 a scris:


2. int



Adresa lui a[0] 0x8049720
Adresa lui a[1] 0x8049724
Adresa lui a[2] 0x8049728
Adresa lui a[3] 0x804972c


-observam ca are cate 4 byte's per array ..

INT-ul se stocheaza pe 4 bytes deoarece este o variabila de/pe 32-biti (32biti / 8 = 4 bytes)

Modificat de Shocker (acum 18 ani)


_______________________________________
Portal SkullBox
SkullBox Forum
IP Finder and web browser details revealer


pus acum 18 ani
   
Pagini: 1  

Mergi la