Programarea Calculatoarelor, seria CC
Atunci când definiți o variablilă, compilatorul va fi informat despre 2 lucruri: numele
variabilei si tipul ei, de exemplu
Atunci când se face o atribuire
Pentru ca o funcție să poată modifica valoarea variabilei
Să presupunem că vrem să scrie o funcție care incrementează un întreg, va trebui deci
să ținem cont că funcția va primi ca argument adresa întregului pe care vrem să-l incrementăm,
deci un
void inc(int * p_n)
{
*p_n = *p_n + 1; // prin *p_n ne referim la valoarea de la respectiva adresa
}
Pentru a apela funcția pentru un întreg definit ca
void inc_gresit(int n)
{
n++; // n este doar o copie a valorii cu care a fost apelata functia
}
Funcția este greșită deoarece ea primește un întreg. Dacă ar fi apelată în modul următor:
Urmăriți următorul program care definește funcția
#include <stdio.h>
void inc(int * p_n)
{
printf("incrementing value at address %p\n", p_n);
printf("before: %d\n", *p_n);
*p_n = *p_n + 1; // prin *p_n ne referim la valoarea de la respectiva adresa
printf("after: %d\n", *p_n);
}
int main()
{
int n = 0;
int *pn = &n;
// pn va fi un pointer catre n
printf("%p\t%p\n", &n, pn); // se observa ca reprezinta aceeasi adresa
printf("%d\t%d\n", n, *pn); // si, prin urmare, indica catre aceeasi valoare
inc(&n);
// apelam functia pentru adresa lui n, pentru ca n sa fie modificat
printf("%d\t%d\n", n, *pn); // valoarea lui n s-a modificat
inc(pn);
// pn indica tot catre adresa lui n
printf("%d\t%d\n", n, *pn); // se va obtine deci acelasi comportament
return 0;
}
Dimensiunea unui pointer,
Desenul următor prezintă o posibilă dispunere a variabilelor din programul nostru în memorie. Urmăriți desenul și cereți explicații dacă ceva nu este clar.
Un șir de caractere este un vector cu elemente de tip
De exemplu, șirul
Funcțiile pentru prelucrarea șirurilor se găsesc în
Funcții din
Funcții pentru citirea și afișarea șirurilor de caractere
Scrieți o funcție pentru interschimbarea a 2 întregi.
#include <stdio.h>
void swap(int *pa, int *pb)
{
int aux; // vom avea nevoie de un loc auxiliar de stocare
aux = *pa; // aux este un intreg, nu un pointer, deci nu vom folosi "*"
*pa = *pb; // pa si pb sunt pointeri, vom folosi "*" pentru a accesa valorile de la respectivele adrese
*pb = aux;
}
int main()
{
int a = 5, b = 7;
printf("%d %d\n", a, b);
swap(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
...
int *aux;
*aux = *pa;
...
O funcție care primește un vector și numărul său de elemente și întoarce un pointer la elementul maxim din vector (dacă există mai multe, se poate întoarce un pointer la oricare dintre ele).
Dacă vectorul nu are elemente, se va returna
int* get_max(int n, int *v);
Se va afișa adresa întoarsă de funcție, precum și valoarea aflată la această adresă.
Intrare | Ieşire |
5 2 5 6 1 4 |
0xcfde121e 6 |
O funcție care numără câte elemente pozitive, câte elemente negative și câte elemente nule se află într-un vector. Antetul funcției va fi:
void count(int n, int *v, int *zero, int *poz, int *neg);
Intrare | Ieşire |
5 0 1 -2 3 0 -5 6 |
zero : 2 poz : 3 neg : 2 |
O funcție pentru ștergerea a
Funcția primește adresa de unde se șterge și numărul de caractere șterse și are ca rezultat adresa
char *strdel(char *p, int n); // sterge n caractere din pozitia poz
Pentru a șterge 5 caractere începând cu poziția 3 (al 4-lea caracter) din șirul
O funcție pentru inserarea unui șir
char *strins (char *p, char *s); // insereaza la p, sirul s
Un program care va căuta și înlocui un șir dat cu alt șir (de lungime diferită) într-un text. Vor fi înlocuite toate aparițiile șirului dat.
Se vor folosi funcțiile definite anterior și funcții de bibliotecă.
Textul se va introduce în program ca un șir constant. Șirul căutat și cel cu care va fi înlocuit se citesc de la consolă.
Pentru șirul "ala bala portocala".
Intrare | Ieşire |
ala lala |
lala blala portoclala |
O funcție care extrage un subșir de lungime dată dintr-o poziție dată a unui șir:
char *substr(char *src, int n, char *dest); // extrage de la pozitia src in dest n caractere
Funcția are ca rezultat adresa șirului extras.
Pentru a extrage 5 caractere începând cu poziția 3 (al 4-lea caracter) din șirul
Intrare | Ieşire |
abcdefg 2 3 |
cde |
O funcție de comparare a două șiruri de cifre zecimale ce reprezintă numere naturale (fără semn), cu rezultat -1, 0 sau 1:
int strdcmp(char *s1, char *s2);
O funcție de citire a unui întreg pozitiv cu verificare depășire
valoare maximă posibilă. Se va citi numărul ca șir de caractere (cu
Șirul se va compara șirul citit cu șirul corespunzator valorii maxime admise
(
Pentru comparare folosiți funcția definită anterior.
În caz de introducere a unui număr prea mare funcția are ca rezultat pe
int readint();
Pentru a converti un întreg
Pentru a converti din șir în întreg puteți folosi
Intrare | Ieşire |
1 |
1 |
2147483648 |
-2147483647 |
Funcție care extrage următorul cuvânt format numai din litere mici începând de la o adresă dată.
Funcția are ca rezultat adresa imediat următoare cuvântului extras (în al doilea argument al funcției):
char *next (char *from, char *word);
Program pentru citirea unei linii ce conține cuvinte formate din litere mici și alte șiruri și afișarea cuvintelor formate din litere mici (separate între ele prin orice alte caractere).
Intrare | Ieşire |
( unu, 1 doi DOI trei; "patru" ) | unu doi trei patru |
O funcție care calculează panta și ordonata pentru o dreaptă dată prin 2 puncte.
Ecuația dreptei dată prin pantă și ordonată este
void panta(int x1, int y1, int x2, int y2, float *m, float *n);
Dacă dreapta este verticală
Programul va citi coordonate a 2 puncte ce determină dreapta și încă un punct pentru care se va verifica dacă aparține dreptei, folosind funcția de mai sus. Atenție la cazul când dreapta e verticală.
Panta unei drepte date prin coordonatele
Ordonata va fi
Folosiți ecuația
Intrare | Ieşire |
1 1 2 2 3 3 |
DA |
2 1 2 3 3 3 |
NU |
Funcție pentru incrementarea unui moment de timp, dat ca oră, minut și secunda și perioada zilei (AM sau PM). Funcția va trebui să modifice 3 numere întregi și un vector de caractere și va primi 3 argumente pointer și un argument vector.
Intrare | Ieşire |
09 09 09 AM | 09:09:10 AM |
10 25 59 PM | 10:26:00 PM |
11 59 59 PM | 00:00:00 AM |