8.4.4. Diferenta a doi pointeri

2019/03/09 in Programare in C

Doi pointeri care pointeaza spre elementele aceluiasi tablou pot fi scazuti. Fie p un pointer spre elementul t[i] al tabloului t si q un pointer spre elementul t[i+n] al aceluiasi tablou. Atunci diferenta:

q - t

are valoarea n.

Exercitii:

8.8. Sa se scrie o functie care citeste cel mult n elemente de tip double si le pastreaza in zona de memorie a carei adresa de inceput este valoarea parametrului formal p al functiei. Functia returneaza numarul elementelor citite.

Functia de fata este analoga functiei ndcit definita la exercitiul 4.37. In acest caz, se utilizeaza expresii cu pointeri in locul indicilor.

int pndcit(int n, double *p)
{
    double d;
    char t[255];
    int i = 0;
    double *q = p+n;
	
    while(p < q) {
      printf("elementul[%d] = ", i);
	  if (gets(t) == NULL)
	    return i;
	  if (sscanf(t, "%lf", &d) != 1)
	    break;
	  *p++ = d;
	  i++;
    }
    return i;
}

Observatii:

  1. Parametrul p are ca valoare, la apel, adresa de inceput a zonei in care se pastreaza numerele citite. Dimensiunea acestei zone este de 8*n octeti, pentru a putea pastra cel mult n numere de tip double.

  2. Instructiunea:

    *p++ = d;
    memoreaza numarul citit in zona spre care pointeaza p

Totodata, pointerul p se incrementeaza, deci valoarea lui se mareste cu 8. In felul acesta, la iteratia urmatoare, p pointeaza spre zona in care urmeaza a fi memorat elementul urmator.

Dupa pastrarea a n numere, p devine egal cu valoarea lui q. Deci ciclul while in acest moment trebuie sa se termine, daca nu cumva s-a terminat inainte, deoarece s-au tastat mai putin de n numere.

8.9. Sa se scrie o functie care citeste componentele unui vector precedate de numarul lor. Functia returneaza numarul componentelor vectorului respectiv.

Numarul componentelor se citeste apeland functia pcit_int_lim definita la exercitiul 8.3.

Componentele vectorului se citesc apeland functia pndcit definita mai sus la exercitiul 8.8.

int pdvcit(int nmax, double dvector[])

/* - citeste un intreg n si cele n componente ale vectorului dvector;/
   - returneaza valoarea lui n. */
{
    int i, n;
    char t[255];
	
    if(pcit_int_lim("numarul componentelor=", 1, nmax, &n) == 0) {
      printf("s-a tastat EOF\n");
      exit(1);
    }	
    if((i=pndcit(n, dvector)) != n) {
      printf("nu s-a reusit citirea celor n = %d componente\n", n);
      printf("s-au citit numai %d componente\n", i);
    }
    return i;
}

Observatie: Functia pcit_int_lim a fost apelata folosind sirul de caractere:

"numarul componentelor="

ca prim parametru al apelului. Acest parametru este pastrat de compilator intr-o zona speciala rezervata sirului de caractere, iar la apel, se atribuie parametrului formal corespunzator, adresa de inceput a zonei in care se pastreaza sirul respectiv.

8.10. Sa se scrie un program care citeste componentele vectorilor x si y, calculeaza si afiseaza produsul lor scalar.

Componentele celor doi vectori sunt precedate de numarul lor.

Programul este similar cu Programul 086 definit la exercitiul 4.39. In cazul de fata se folosesc expresii cu pointeri in locul variabilelor cu indici.

#include <stdio.h>
#include <stdlib.h>
#include "FUNCTIA094B.C" /* pcit_int */
#include "FUNCTIA094C.C" /* pcit_int_lim */
#include "FUNCTIA096A.C" /* pndcit */
#include "FUNCTIA096B.C" /* pdvcit */

#define MAX 1000

main()
{
    int i, n;
    double *p, *q;
    double x[MAX], y[MAX], s;

    /*citeste pe n si componentele vectorului x*/
    n = pdvcit(MAX, x);

    /*citeste componentele vectorului y*/
    if (pndcit(n, y) != n) {
        printf("nu sunt n = %d componente pentru y\n", n);
        exit(1);
    }

    /*calculeaza produsul scalar*/
    s = 0.0;
    for (p=x, q=y, i=0; i <= n; i++, p++, q++)
      s += *p * *q;
    printf("(x, y) = %g\n", s);
}

8.5. Modificatorul const