Scrittura puntatore

di il
8 risposte

Scrittura puntatore

Ciao! Sto facendo degli esercizi in c++ ,dato che le soluzioni sono in c, vorrei un piccolo aiuto per quanto riguarda la "scrittura" in riferimento ai puntatori.

Ho questo esercizio:
Esercizio 1 (9 punti)
Descrivere un algoritmo codificato in linguaggio C/C++ che:
1. definisce la funzione copia con parametri:
• a di tipo vettore di 100 int;
• b di tipo vettore di 50 int;
• c di tipo vettore di 30 int;
• d di tipo puntatore/riferimento ad un int
La funzione deve copiare nel vettore b (in posizioni differenti) al più 50 valori del vettore a che sono maggiori della media aritmetica dei valori del vettore c. Inoltre, la funzione deve restituire scrivere nell’area di memoria puntata/riferita da d il numero di valori copiati.

2. nella funzione main
I. dichiarare un vettore di nome x di 100 int, un vettore di nome y di 50 int e un vettore di nome z di 30 int;
II. dichiarare una variabile di nome h di tipo int;
III. inserire (uno per ogni posizione) 100 valori letti da standard input nel vettore x;
IV. ripetere le seguenti operazioni fino a quando l’esecuzione della funzione copia inserisce un valore in ogni posizione del vettore y:
a. inserire (uno per ogni posizione) 30 valori letti da standard input nel vettore z;
b. eseguire la funzione copia applicata al vettore x e al vettore z, inserendo il risultato nel vettore y e nella variabile h.

Che ho risolto in questo modo:
#include <iostream>
using namespace std;

void copia(int a[100], int b[50], int c[30], int &d)
{
	int i, j=0;
	int somma = 0;
	int conta = 0;

	// CALCOLO LA MEDIA
	
	double media;
    for (i = 0; i < 30; i++)
	{
		somma = somma + c[i];
	}
	media = somma / 30.0; // ricordarsi il .0 (= un valore dopo la virgola)

	i = 0; // lo ri inizializzo perchè viene usato prima

	while (i < 100 && j < 50) //nel vettore b (in posizioni differenti) al più 50 valori 
	{
		if (a[i]>media)
		{
			b[j] = a[i];
			j++;
		}
		i++; // non è un for
	}

	d = j;
}

int main()
{
	int i, x[100], y[50], z[30];
	int h;

	for (i = 0; i < 100; i++)
	{
		cin >> x[i];
	}

	do{
		for (i = 0; i < 30; i++)
		{
			cin >> z[i];
		}
		copia(x, y, z, h);

	} while (h<50); //inserisce un valore in ogni posizione del vettore y

	return 0;
}
I miei dubbi sono:
1) quando scrivo d=j; (prima del main) dato che d è un puntatore devo scrivere &d=j?
2) nel main in "copia(x, y, z, h);" devo mettere anche qui &h?

Grazie

8 Risposte

  • Re: Scrittura puntatore

    Ciao!

    Per il momento compila? Invece apportando le modifiche di cui parli?
  • Re: Scrittura puntatore

    Ciao Giulia,
    per rispondere alle tue domande :
    1) Non dovrebbe compilare quanto da te scritto perche' la dichiarazione di copia() non e' corretta. Se tu volessi passare per riferimento la variabile d dovresti scrivere una cosa del tipo void copia(int a[100], int b[50], int c[30], int *d) se tu volessi invece passare una "copia" della variabile basterebbe scrivessi void copia(int a[100], int b[50], int c[30], int d). Quando poi vai a fare d = j, se d fosse un puntatore dovresti assegnare il valore di j con il valore puntato da d scrivendo quindi d* = j, se invece fosse una semplice variabile dovresti scrivere d = j.
    2) Se h dovesse venire passato per riferimento a copia(), ovvero nella prima dichiarazione di copia che ti ho scritto nel punto 1, ed essendo h un int (e non un puntatore ad int) allora dovresti aggiungere &, passando quindi la variabile per riferimento. Se tu avessi definito int *h e la funzione copia() si aspettasse un puntatore, dovresti passare a copia semplicemente h, tipo copia(..., h)
    Speri d essere stato d'aiuto.
  • Re: Scrittura puntatore

    Occhio al refuso, Bomber: *d = j, non d* = j. Ti è scappato un tasto.
  • Re: Scrittura puntatore

    BomberUS ha scritto:


    Ciao Giulia,
    per rispondere alle tue domande :
    1) Non dovrebbe compilare quanto da te scritto perche' la dichiarazione di copia() non e' corretta. Se tu volessi passare per riferimento la variabile d dovresti scrivere una cosa del tipo void copia(int a[100], int b[50], int c[30], int *d) se tu volessi invece passare una "copia" della variabile basterebbe scrivessi void copia(int a[100], int b[50], int c[30], int d). Quando poi vai a fare d = j, se d fosse un puntatore dovresti assegnare il valore di j con il valore puntato da d scrivendo quindi d* = j, se invece fosse una semplice variabile dovresti scrivere d = j.
    2) Se h dovesse venire passato per riferimento a copia(), ovvero nella prima dichiarazione di copia che ti ho scritto nel punto 1, ed essendo h un int (e non un puntatore ad int) allora dovresti aggiungere &, passando quindi la variabile per riferimento. Se tu avessi definito int *h e la funzione copia() si aspettasse un puntatore, dovresti passare a copia semplicemente h, tipo copia(..., h)
    Speri d essere stato d'aiuto.
    Ciao! Scusami se ti rispondo solo ora ma ero fuori città fino a ieri sera.
    Se nn ho capito male quindi dovrei fare cosi'?
    #include <iostream>
    using namespace std;
    
    void copia(int a[100], int b[50], int c[30], int &d)
    {
       int i, j=0;
       int somma = 0;
       int conta = 0;
    
       // CALCOLO LA MEDIA
       
       double media;
        for (i = 0; i < 30; i++)
       {
          somma = somma + c[i];
       }
       media = somma / 30.0; // ricordarsi il .0 (= un valore dopo la virgola)
    
       i = 0; // lo ri inizializzo perchè viene usato prima
    
       while (i < 100 && j < 50) //nel vettore b (in posizioni differenti) al più 50 valori
       {
          if (a[i]>media)
          {
             b[j] = a[i];
             j++;
          }
          i++; // non è un for
       }
    
       &d = j;
    }
    
    int main()
    {
       int i, x[100], y[50], z[30];
       int h;
    
       for (i = 0; i < 100; i++)
       {
          cin >> x[i];
       }
    
       do{
          for (i = 0; i < 30; i++)
          {
             cin >> z[i];
          }
          copia(x, y, z, h);
    
       } while (h<50); //inserisce un valore in ogni posizione del vettore y
    
       return 0;
    }
    Grazie
  • Re: Scrittura puntatore

    Quando vuoi passare un indirizzo, lo ricavi usando "&", mentre quando vuoi vedere cosa c'è all'indirizzo puntato da un puntatore, accedi alla memoria puntata con "*". Quindi, per esempio...
    #include <stdio.h>
    
    void funzione( int *h ) { // questo non e' direttamente l'h del main,
                              // e' l'indirizzo della memoria dove si trova h
        *h = 250; // qui vai a porre il valore 250 nell'int che si trova
                  // all'indirizzo di memoria puntato dal parametro h
    }
    
    int main() {
        int h = 32;
        
        printf( "%d\n", h ); // qui ti viene stampato h, che "vale" 32
    
        funzione( &h ); // qui dici a funzione() che all'indirizzo
                        // puntato da h c'e' un valore intero
        
        printf( "%d\n", h ); // qui viene stampato di nuovo h che, essendo
                             // stato modificato da funzione(), ora "vale" 250
        
        return 0;
    }
  • Re: Scrittura puntatore

    AldoBaldo ha scritto:


    Quando vuoi passare un indirizzo, lo ricavi usando "&", mentre quando vuoi vedere cosa c'è all'indirizzo puntato da un puntatore, accedi alla memoria puntata con "*". Quindi, per esempio...
    #include <stdio.h>
    
    void funzione( int *h ) { // questo non e' direttamente l'h del main,
                              // e' l'indirizzo della memoria dove si trova h
        *h = 250; // qui vai a porre il valore 250 nell'int che si trova
                  // all'indirizzo di memoria puntato dal parametro h
    }
    
    int main() {
        int h = 32;
        
        printf( "%d\n", h ); // qui ti viene stampato h, che "vale" 32
    
        funzione( &h ); // qui dici a funzione() che all'indirizzo
                        // puntato da h c'e' un valore intero
        
        printf( "%d\n", h ); // qui viene stampato di nuovo h che, essendo
                             // stato modificato da funzione(), ora "vale" 250
        
        return 0;
    }
    Ma anche programmando con c++ si usa il *? il ragionamento l'ho capito, il mio dubbio era proprio su "come si scrive"
  • Re: Scrittura puntatore

    Ma anche programmando con c++ si usa il *? il ragionamento l'ho capito, il mio dubbio era proprio su "come si scrive"
    In C++ c'è un detto: "usa i reference quando puoi e i puntatori quando devi".
    Quindi se proprio non devi usare un puntatore, il codice iniziale va più che bene.
  • Re: Scrittura puntatore

    Reference e puntatori sono parenti stretti, ma non sono proprio la stessa cosa, per quel che ne so.

    Comunque sia, la sintassi dei puntatori è identica in C come in C++, anche se C++ impiega un controllo dei tipi diverso, più restrittivo (e dunque più sicuro, almeno sulla carta).
Devi accedere o registrarti per scrivere nel forum
8 risposte