Easy

Esercizio 1 easy

#puntatori Dato ill seguente scheletro di programma:

#include <stdio.h>

int main(){
	int x=5;
}

Esercizio 2 easy

#puntatori Dato il seguente scheletro di programma:

#include <stdio.h>

int main(){
	int x = 3;
	int *y = &x;
}

Esercizio 3 easy

#array Dato il seguente scheletro di programma

#include <stdio.h>

int main(){
	int a[4]={1,2,3,4};
	int *b;
	
	b=a;
}

Esercizio 4 easy

#malloc

Alloca dinamicamente un array di 4 elementi ed assegnagli i valori che vanno da 1 a 4 con un ciclo for

Esercizio 5 easy

#struct

Continua questo esercizio: da adesso in poi si alza la difficoltà: continua esercizio 4 medium

Medium

Esercizio 1 medium

#puntatori dato il seguente scheletro di programma

#include <stdio.h>

int main(){
	float pi=3.14;
	
	//aumenta
	
	printf("%f\n",pi);
}

Definisci la funzione “aumenta”. SENZA MODIFICARE LE ALTRE PARTI DEL MAIN (IN PARTICOLARE LA PRINT). “aumenta” prende in input un numero float e un intero, e aumenta il primo numero di tanto quanto specificato dall’intero. In questo caso, quindi dovrebbe aumentare il valore di “pi” di 1.

Esercizio 2 medium

#array

dato questo programma

#icnlude <stdio.h>

int main(){
	int a[3]={1,2,3};
	int *b=a;
	printf("%d",b);
	
	printf("%d",b+2);
}

La prima printf stampa l’indirizzo di memoria di b. Se non siete convinti di questo andatevi a vedere gli esercizi easy sugli array. Nel mio caso stampa l’indirizzo di memoria “1803711096”

Ma cosa stampa la seconda printf?

  • l’indirizzo di memoria di b più 2 (es: “1803711098”)
  • l’indirizzo di memoria di b più 2 x sizeof(int)

Ora che questa cosa è chiarita possiamo passare al vero esercizio.

Dato questo scheletro di programma, fai un ciclo for che stampa il contenuto di a, senza usare a, e SENZA USARE LE PARENTESI QUADRE.

#icnlude <stdio.h>

int main(){
	int a[3]={1,2,3};
	int *b=a;
}

Esercizio 3 medium

Definisci una funzione che prende in input un array di interi, somma tutti i numeri dell’array e alloca un nuovo array composto da tanti “1” quanto è il risultato della somma precedente

ESEMPIO: se l’array è

a[3]=[2,5,1]

la sua somma è 8 Io voglio un array fatto da otto “1”

risultato[8]=[1,1,1,1,1,1,1,1]

Parti dal seguente main

//scrivi qui la funzione array_di_uno

int main(){
	// definisco gli array
    int a[3]={1,2,3};
    int *b=NULL;

	//chiamo la funzione array di uno che dovete programmare voi
    b=array_di_uno(a,3);

	//stampo l'array di uni
    printf("Array di uni:[ "); //queste sono solo lì per bellezza
    for(int i=0;i<sizeof(b)/sizeof(int);i++){
        printf("%d,",b[i]); //stampa l'i esimo elemento dell'array di uni
    }
    printf("]\n"); //queste sono solo lì per bellezza
}
Soluzione
#include <stdio.h>
#include <stdlib.h>

int * array_di_uno(int* array, int dimensione_array){
    int somma=0;
    int * uni;
    for (int i=0;i< dimensione_array;i++){
        somma+=array[i];
    }
    //a questo punto somma contiene il valore di tutti gli elementi dell'array sommati, nel nostro esempio era 8

    //adesso voglio fare un array nuovo di 8 uni
    uni= malloc(sizeof(int)*somma);

    //una volta allocato l'array lo riempio di uni
    for (int i=0;i<dimensione_array;i++){
        uni[i]=1;
    }
    return uni;
}

int main(){
    int a[3]={1,2,3};
    int *b=NULL;
    b=array_di_uno(a,3);
    printf("Array di uni:[ ");

    for(int i=0;i<sizeof(b)/sizeof(int);i++){
        printf("%d,",b[i]);
    }

    printf("]\n");
}

Esercizio 4 medium

Questa è la continuazione dell’esercizio 5 easy Se non hai fatto quello, fallo prima di fare questo

<

Soluzione completa
#include <stdio.h>
#include <stdlib.h>

struct punto{

    int x;
    int y;
};

struct punto punto_medio(struct punto p1, struct punto p2){
    struct punto punto_medio;
    punto_medio.x=(p1.x+p2.x)/2;
    punto_medio.y=(p1.y+p2.y)/2;
    return punto_medio;
}

void stampa_punto(struct punto p){
    printf("(%d,%d)",p.x,p.y);
}

int main(){
    struct punto p1;
    struct punto p2;

    p1.x=1;
    p1.y=2;

    p2.x=1;
    p2.y=8;

    stampa_punto(punto_medio(p1,p2));
}

Hard

esercizio 1 hard

#array#puntatori#malloc Fai un programma che prende in input dall’utente continuamente un intero fino a quando non riceve in input qualcosa di diverso. Ogni intero che viene preso in input dall’utente deve essere inserito in un array. Ogni volta che inserisci l’intero stampa l’array.

soluzione completa da copiare e incollare per zombie

#include <stdio.h>
#include <stdlib.h>

void stampaArray(int *array, int size) {
    printf("Array: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

int main() {
    int *array = malloc(10 * sizeof(int));
    int dimensione_corrente_array = 0;
    int dimensione_massima_array=10;

    printf("Inserisci numeri interi. Inserisci un carattere non numerico per uscire.\n");
    while (1) {
        int input;
        printf("Inserisci un numero intero: ");
        if (scanf("%d", &input) != 1) {
            printf("Input non valido. Uscita dal programma.\n");
            break;
        }
        if (dimensione_corrente_array == dimensione_massima_array) {
            // Rialloca l'array se la dimensione massima è raggiunta
            dimensione_massima_array += 5;
            array = realloc(array, 10 * sizeof(int));
        }
        // Aggiunge il numero all'array e incrementa la dimensione
        array[dimensione_corrente_array] = input;
        dimensione_corrente_array++;
        // Stampa l'array
        stampaArray(array, dimensione_corrente_array);
    }
    // Libera la memoria allocata dinamicamente
    free(array);
    return 0;
}