Informatica – Esercitazione 7 – Puntatori

Premi qui per scaricare il PDF

[adinserter block="7"]

In questa esercitazione, vedremo alcuni esercizi risolti di programmazione in C riguardanti i puntatori, combinati con array e matrici.

Esercizio 1

Scrivere un programma in C che dichiari ed inizializzi due variabili intere. Utilizzare una variabile puntatore per stampare a video il contenuto delle due variabili.

#include <stdio.h>
int main()
{
	int var1, var2;
	int *p;
	var1 = 5;
	var2 = -10;
	
	//Se p = var1 corrisponde a p = 5 -> il puntatore punta alla cella 5 (non sappiamo dove sia)
	p = &var1; //Assegno a p, l'indirizzo di memoria di var1
	printf("%d", *p);
	
	p = &var2;
	printf("%d", *p);	

	return 0;
}
[adinserter block="5"]

Esercizio 2: Array e puntatori

Scrivere un programma in C che:

  1. Dichiara un array di numeri interi di 10 elementi;
  2. Chiede all’utente l’indice dell’elemento che vuole modificare. Se l’indice non è corretto (minore di 0 o maggiore di 9) il programma stampa un opportuno messaggio;
  3. Chiede all’utente il valore da inserire nell’array;
  4. Modifica l’array e stampa a video l’array utilizzando i puntatori;
  5. Il programma ripete la richiesta fino a che l’utente non inserisce come indice 0.
#include <stdio.h>
#define MAXDIM 10

int main()
{
	int temp[MAXDIM];
	int indice, valore, finito, i;

	valori = &temp[0];
	for (i = 0; i < MAXDIM; i++)
		*(valori + i)	= 0; //equivale a temp[i] = 0

	finito = 0
	do
	{
		printf("Inserire l'indice da modificare: 0 per terminare\\n");
		scanf("%d", &indice);
		if (indice < 0 || indice > 10)
      printf("ATTENZIONE, inserisci un indice compreso tra 0 e 9\\n");
		else if (indice == 0)
			finito = 1;
		else
		{
			printf("Inserire il valore:");
			scanf("%d", &valore);
			
			*(valori + indice-1) = valore;
			printf("L'array modificato e':\\n");
			for (i = 0; i < MAXDIM; i++)
				printf("\\t%d", *(valori + i));
		}
	}while (!finito); //equivale a finito == 0
	return 0;
}
[adinserter block="7"]

Esercizio 3: Comparazione Array

Scrivere un programma in C che usi i puntatori per verificare che due array di numeri interi (massimo 20 posizioni) siano uguali.

#include <stdio.h>

#define MAXDIM 20

int main()
{
	int vettore1[MAXDIM], vettore2[MAXDIM];
	int *p1, *p2;
	int i, uguali;

	for (i = 0; i < MAXDIM; i++)
	{
		printf("Inserire il valore %d per il vettore 1\\n", i+1);
		scanf("%d", &vettore1[i]);

		printf("Inserire il valore %d per il vettore 2\\n", i+1);
		scanf("%d", &vettore2[i]);
	}
	
	uguali = 1;
	p1 = vettore1; //equivale a p1 = &vettore1[0]
	p2 = vettore2; //equivale a p2 = &vettore2[0]
	for (i = 0; i < MAXDIM && uguali; i++) //Uguali equivale a Uguali != 0
		if (*(p1+i) != *(p2 + i))
			uguali = 0;
	
	if (uguali) //uguali != 0 (Se uguali non è 0)
		printf("I due array sono uguali\\n");
	else
		printf("I due array sono diversi\\n");
	return 0;
}
[adinserter block="7"]

Esercizio 4: Matrice e puntatori

Scrivere un programma in C che esegua le seguenti operazioni:
  1. Dichiara una matrice NxM (con N = 10 e M = 13) e inizializza tutte le posizioni a 0;
  2. Dichiara un puntatore a interi che punta all’elemento della matrice (0, 0);
  3. Esegue un algoritmo che sposta il puntatore di i righe e j colonne rispetto alla posizione corrente e imposta l’elemento della matrice a 1. L’algoritmo viene eseguito fino a che l’utente decide di non ripetere l’operazione;
  4. Stampa tutte le coordinate modificate e la matrice risultante.
Per tutte le operazioni utilizzare l’aritmetica dei puntatori.
#include <'stdio.h>
#define MAXROW 10
#define MAXCOL 13

int main()
{
	int matrice [MAXROW][MAXCOL];
	int *p;
	int i, j, decisione, row, col;
	int limite1, limite2;

	p = matrice; //equivale a p = &matrice[0][0]
	
//INIZIALIZZARE UNA MATRICE A 0
	//NORMALMENTE
	/*for (i = 0; i < MAXROW; i++)
		for (j = 0; j < MAXCOL; j++)
			matrice[i][j] = 0;*/
	//CON I PUNTATORI
	for (i = 0; i < MAXROW * MAXCOL; i++)
		*(p + i) = 0;
	
	printf("Vuoi spostare il puntatore (1: si, 0:no)\\n");
	scanf ("%d", &decisione);
	
	row = 0;
	col = 0;
	while (decisione) //equivale a decisione != 0
	{
		printf("La posizione corrente e' (%d, %d)", row, col);
		
		limite1 = row * -1; //Massimo numero di righe tra le quali l'utente si può muovere
		limite2 = MAXROW - 1 - row; //Massimo numero di righe nel quale l'utente si può muovere
		do
		{
			printf("Inserire il numero di righe:");
			scanf("%d", &i);
			
			if (i < limite1 || i > limite2)
				printf("Il valore inserito deve essere compreso tra %d e %d", limite1, limite2);
		}while (i < limite1 || i > limite2);

		limite1 = col * -1;
		limite2 = MAXCOL - 1 - col;
		do
		{
			printf("Inserire il numero di colonne:");
			scanf("%d", &j);
			
			if (j < limite1 || j > limite2)
				printf("Il valore inserito deve essere compreso tra %d e %d", limite1, limite2);
		}while (j < limite1 || j > limite2);

		row = row + i;
		col = col + j;
		
		//SENZA PUNTATORI, PER PUNTARE AD UNA POSIZIONE SPECIFICA -> matrice[row][col]
		*(p + MAXCOL * row + col) = 1 //Mettiamo a 1 la posizione scelta dall'utente
		
		for (i = 0; i < MAXROW; i++)
		{
			for (j = 0; j < MAXCOL; j++)
				printf("\\t%d", *(p + MAXCOL * i + j));
			printf("\\n");
		}
		printf("Vuoi spostare ancora il puntatore? (1:si, 0:no)\\n");
		scanf("%d", &decisione);
	}
	return 0;
}

In una matrice [3][4], se ci troviamo nella posizione [0][0], e contiamo 4 colonne (3 colonne se partiamo da 0) verso destra ci troveremo nella posizione matrice[1][0].

Premi qui per scaricare il PDF

[adinserter block="5"]