Programarea Calculatoarelor, seria CC

Laborator 7

Funcții cu pointeri. Șiruri de caractere

În acest laborator veţi învăţa să:



Pointeri

Atunci când declarați o variablilă, compilatorul va fi informat despre 2 lucruri: numele variabilei si tipul ei, de exemplu int n. Astfel compilatorul va rezerva o zonă de memorie pentru aceasta variabilă (4 octeți pentru o arhitectură pe 32 biți).

Atunci când se face o atribuire n = 7, la zona de memorie rezervată variabilei n va fi scrisă noua valoare.

Pentru ca o funcție să poată modifica valoarea variabilei n ea va avea nevoie de adresa la care se află, de exemplu, pentru a citi variabila am scrie scanf("%d", &n);

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 int *.

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 int n vom scrie inc(&n).

Șiruri de caractere

Un șir de caractere este un vector cu elemente de tip char, ultimul caracter din șir fiind '\0' (cod ASCII 0).

De exemplu, șirul "abc" va fi reprezentat prin vectorul {'a', 'b', 'c', '\0'}, deci va ocupa 4 octeți.

Funcțiile pentru prelucrarea șirurilor se găsesc în string.h.

Funcții din string.h:

Funcții pentru citirea și afișarea șirurilor de caractere


Problema 1.

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.

Exemplu:

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

Problema 2.

O funcție care calculează panta și ordonata pentru o dreaptă dată prin 2 puncte.

Ecuația dreptei dată prin pantă și ordonată este y = m * x + n

void panta(int x1, int y1, int x2, int y2, float *m, float *n);

Dacă dreapta este verticală m va avea valoarea INT_MAX (definită in limits.h).

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ă.

Exemplu:

Intrare Ieşire
1 1
2 2
3 3
DA
2 1
2 3
3 3
NU

Problema 3.

A.

O funcție pentru ștergerea a n caractere dintr-o poziție p dată a unui șir. Se va folosi funcția strcpy.

Funcția primește adresa de unde se șterge și numărul de caractere șterse și are ca rezultat adresa p.

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 s va trebui să apelați cu parametrii: strdel(s + 3, 5).

B.

O funcție pentru inserarea unui șir s într-o poziție dată p dintr-un alt șir, folosind funcția strcpy.

char *strins (char *p, char *s); // insereaza la p, sirul s

C.

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ă.

Exemplu:

Pentru șirul "ala bala portocala".

Intrare Ieşire
ala
lala
lala blala portoclala

Problema 4.

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 s în șirul p va trebui să apelați cu parametrii: substr(s + 3, 5, p).

Exemplu:

Intrare Ieşire
abcdefg
2 3
cde

Problema 5.

A.

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

B.

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 scanf).

Șirul se va compara șirul citit cu șirul corespunzator valorii maxime admise (INT_MAX). Constanta INT_MAX este definită in limits.h.

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_MAX.

int readint();

Pentru a converti un întreg n într-un șir de caracter s puteți folosi: sprintf(s, "%d", n) (afișează în s pe n, ca întreg).

Pentru a converti din șir în întreg puteți folosi int atoi(char *s).

Exemplu:

Intrare Ieşire
1
1
2147483648
-2147483647

Problema 6.

A.

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

B.

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).

Exemplu:

Intrare Ieşire
( unu, 1 doi DOI trei; "patru" ) unu doi trei patru