Programarea Calculatoarelor, seria CC
malloc:
type* malloc (type*) malloc (size_t size);
Unde
Funcţia alocă o zonă continuă de memorie având dimensiunea de
int *a = (int*) malloc( 100 * sizeof(int) );
calloc:
type* ptr = (type*) calloc(size_t num, size_t size);
Funcţia alocă spaţiu de memorie pentru un vector cu
int *a = (int*) calloc( 100, sizeof(int) );
realloc:
type* ptr = (type*) realloc(void* old_ptr, size_t size);
Unde
Funcţia realizează modificarea dimensiunii zonei de memorie referite de
int *a = (int*) malloc( 100 * sizeof(int) );
a = (int*) realloc( 200 * sizeof(int) );
free:
void free(void* ptr);
Unde
strdup:
char *strdup( char *s );
Unde
Funcţia alocă o nouă zonă de memroie la care se copiază octeţii şirului
Copiaţi şi rulaţi următorul program şi scrieţi câte un comentariu în care să explicaţi ce face fiecare instrucţiune. Este foarte important să înţelegeţi cum să folosiţi pointerii în C. Dacă nu înţelegeţi ceva din program, întrebaţi asistenţii.
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
int main ()
{
char c = 'a', *p, s[100];
p = &c;
printf ("%c %c %c", *p, *p+1, *p+2);
s[0] = 'A'; s[1] = 'B'; s[2] = 'C'; s[3] = '\0';
p = s;
printf ("\n%s %s %c %s", s, p, *(p+1), p+1);
strcpy (s, "\nacesta este un exemplu de lucru cu pointeri");
printf ("%s", s);
p += 17;
for (; *p != '\0'; ++p) {
if (*p == 'e')
*p = 'E';
if (*p == ' ')
*p = '\n';
}
printf ("%s\n", s);
return 0;
}
Programul va afişa următoarele linii:
a b c
ABC ABC B BC
acesta este un exemplu de lucru cu pointeri
acesta este un exEmplu
dE
lucru
cu
pointEri
Să se scrie o funcţie
Se va afişa şi conţinutul zonei realocate (de la adresa rezultată).
Funţia
void* my_realloc (void *p, int n)
Pentru copierea datelor de la vechea adresă la noua adresă se va folosi funcţia
Să se scrie o funcţie cu acelaşi efect şi antet ca şi funcţia
char buf[512]; // aici se citeşte un şir
char *p; // adresă şir alocat dinamic
scanf("%s",buf); // citire şir
p=strdup(sir); // alocă memorie şi copiază şir la adresa p
Funcţia declarată trebuie să respecte următorul antet:
char* my_strdup (char *s)
Scrieţi o funcţie care înlocuieşte într-un şir
Funcţia declarată trebuie să respecte următorul antet:
char* my_replace(char *s, char *s1, char *s2)
Să se scrie un program pentru citirea unor cuvinte (de la tastatură) şi afişarea numărului de apariţii al fiecărui cuvânt. Cuvintele au maxim 19 litere fiecare.
Se va folosi un vector de pointeri la cuvinte şi un vector de numere întregi. Variante:
Intrare | Ieşire |
6 ana are mere are mere mere |
ana 1 are 2 mere 3 |
Să se scrie o funcţie pentru interclasarea a doi vectori ordonaţi de pointeri la şiruri într-un singur vector de pointeri. Şirurile au cel mult 19 caractere. La operaţia de interclasare nu se vor muta în memorie şirurile. Programul va afişa pe ecran vectorul interclasat rezultat din funcţie (cele două liste de şiruri se introduc ordonat).
Funcţia declarată trebuie să respecte următorul antet:
char** interclaseaza(int n1, char (*s1)[20], int n2, char (*s2)[20]);
// n1, n2 - numarul de siruri din vectorii s1, respectiv s2
// Alternativ, se poate folosi următorul antet echivalent:
// (cereţi explicaţii suplimentare dacă vreo una din declaraţii nu vă este clară)
char** interclaseaza(char **s1, char **s2);
Va trebui să alocați memorie pentru un nou vector de
Intrare | Ieşire |
2 ana mere 1 are |
3 ana are mere |
Liniarizarea unei matrici. Să considerăm următoarea problemă: dorim să calculăm
Să considerăm că am ales să rezolvăm problema în următorul mod: definim o matrice
Acest algoritm rezolvă problema, dar prezintă un dezavantaj. Pentru calculul unei valori, trebuie păstrată în memorie o matrice de dimensiuni relativ mari, care ocupă multă memorie. În plus, observăm că pentru a calcula
Avem acum două optiuni:
Să se scrie un program care calculează valoarea lui
Intrare | Ieşire |
5 3 |
10 |
12 11 |
12 |