Easy

Esercizio 1 easy

struct

Se non sai cos’è una struct vai qui

Continua questo esercizio qui.

Esercizio 2 Easy

La vostra prima funzione con le struct: Ovviamente le regole per fare una funzione sono sempre le stesse: Chiedetevi cosa dovete prendere in input e che cosa volete come output. In questo caso è una funzione che stampa qualcosa, prendendo in input un punto…

Continua questo esercizio qui

Esercizio 3 easy

Allocare dinamicamente una struct: può succedere di voler allocare dinamicamente una struct. Per esempio:

Se non sai dove mettere le mani puoi studiare questa roba:

  1. allocazione dinamica della memoria in C
  2. Struct
Continua l’esercizio qui

Esercizio 4 easy

Stringhe! Okay, come avete visto a lezione con rossi le stringhe si dichiarano come un array di caratteri.

Se non sai di cosa sto parlando e vuoi ripassare studia questo.

Per continuare gli esercizi con le stringhe vai Esercizio 4 medium
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    char str1[6]={'p','y','t','h','o','n'};
    char str2[6]="python";
 
    printf("stringa 1:%s\tstringa 2:%s\n",str1,str2);
}

Medium

Esercizio 1 medium

Continua l’esercizio qui

Esercizio 2 medium

Fai una funzione che prende due punti e restituisce la distanza tra due punti

Per chi non si ricordasse la formula per calcolare la distanza fra due punti è:

Per fare la radice quadrata e la potenza dovete usare la funzione “sqrt” e “pow” che sono incluse nella libreria <math.h>, esempio:

#include <math.h>
#include<stdio.h>
 
int main(){
	printf("due alla terza è: %f\n", pow(2,3));
    printf("la radice di 25. è: %f\n", sqrt(25));
}

Esercizio 3 medium

Questo esercizio è il continuo di questo eserecizio: Esercizio 3 easy. Fai prima quello se ancora non l’hai fatto.

Adesso abbiamo allocato dinamicamente un punto. Fico, ma il punto è vuoto. Voglio assegnare al punto dei valori, facciamo P(1,3) E vorrei stampare questi valori per essere sicuro che il punto li abbia effettivamente.

A questo punto dovreste avere il seguente main:

#include<stdlib.h>
#include<stdio.h>
struct Punto {
    float x;
    float y;
};
 
int main(){
    struct Punto * puntatore_a_un_punto = malloc(sizeof(struct Punto));
}

Per assegnare i valori 3 e 4 dobbiamo accedere alla struttura tramite il puntatore. Se non hai idea di come si faccia: leggi qui Accedere ad una struttura allocata dinamicamente

Esercizio 4 medium

Ora che abbiamo allocato due stringhe vorrei una funzione che prese due stringhe le concatena una all’altra.

Purtroppo questo esercizio l’ha già fatto rossi oggi.

Quindi vi tocca un esercizio più difficile: Fai una funzione che prende in input 3 stringhe, e restituisce una stringa che è la concatenazione di queste tre stringhe dat questo main:

int main(){
	char *a="ciao ";
	char *b="come ";
	char *c="va?";
	printf("%s",concatena(a,b,c));
}
Soluzione guidata passo per passo

innanzitutto dobbiamo andare a capire il main.

#include<stdio.h>
 
int main(){
	char *a="ciao ";
	char *b="come ";
	char *c="va?";
	printf("%s",concatena(a,b,c));
}

In questo main definisco tre stringhe, e vado a stampare la loro concatenazione. Per fare questo devo definire la funzione “concatena”.

La funzione concatena prende in innput tre stringhe (quindi tre puntatori a caratteri) e restituisce una stringa (quindi un puntatore a char)

char * concatena(char * str1,char * str2, char * str3){}

Adesso andiamo a vedere che cosa deve fare questa funzione. Per prima cosa deve.

char * concatena(char * str1,char * str2, char * str3){
	//definisce una nuova stringa (quella concatenata)
 
	//inserisce nella nuova stringa i caratteri di stringa 1
 
	//inserisce nella nuova stringa i caratteri di stringa 2
 
	//inserisce nella nuova stringa i caratteri di stringa 3
	
}

Questo è lo scheletro della funzione. Andiamo a vedere come farlo

Definire una nuova stringa

La nuova stringa di output può essere definita staticamente? Tipo:

char output[10];

NOPE. Perchè non conosciamo a priori quanto deve essere lunga. Quindi prima devo capire quanto devo farla lunga, e poi, una volta capito, devo allocare dinamicamente la stringa.

char * concatena(char * str1,char * str2, char * str3){
//definisce una nuova stringa (quella concatenata)
	// trovo la lunghezza della stringa di output
	int lunghezza_totale = strlen(str1)+strlen(str2)+strlen(str3);
	//alloco la nuova stringa di output
	char * stringa_concatenata=malloc(sizeof(char)*lunghezza_totale);
 
 
	//inserisce nella nuova stringa i caratteri di stringa 1
 
	//inserisce nella nuova stringa i caratteri di stringa 2
 
	//inserisce nella nuova stringa i caratteri di stringa 3
	
}

Okay, quindi quello che ho fatto è stato trovarmi la lunghezza totale sommando la lunghezza di ogni singola stringa. Per farlo ho chiamato la funzione strlen() che è una funzione della libreria <string.h> (ricordatevi di includerla)

Inserire i caratteri nella stringa di output

Per fare questo basta iterare su ogni singolo carattere di ogni stringa ed aggiungerlo alla stringa di output. Lo facciamo con un ciclo for

char * concatena(char * str1,char * str2, char * str3){
//definisce una nuova stringa (quella concatenata)
	// trovo la lunghezza della stringa di output
	int lunghezza_totale = strlen(str1)+strlen(str2)+strlen(str3);
	//alloco la nuova stringa di output
	char * stringa_concatenata=malloc(sizeof(char)*lunghezza_totale);
 
 
	//inserisce nella nuova stringa i caratteri di stringa 1
	for (int i=0;i<strlen(str1);i++){
		stringa_concatenata[i]=str1[i];
	}
	//inserisce nella nuova stringa i caratteri di stringa 2
 
	//inserisce nella nuova stringa i caratteri di stringa 3
	
}

Quindi alla posizione 0 di “stringa concatenata” farò corrispondere il carattere all posizione 0 di str1.

Ora che ho finito di copiare la prima lista devo copiare anche la seconda. Però adesso non va più bene usare i per indicizzare la stringa concatenata. Cioè se facessimo così:

char * concatena(char * str1,char * str2, char * str3){
//definisce una nuova stringa (quella concatenata)
	// trovo la lunghezza della stringa di output
	int lunghezza_totale = strlen(str1)+strlen(str2)+strlen(str3);
	//alloco la nuova stringa di output
	char * stringa_concatenata=malloc(sizeof(char)*lunghezza_totale);
 
 
	//inserisce nella nuova stringa i caratteri di stringa 1
	for (int i=0;i<strlen(str1);i++){
		stringa_concatenata[i]=str1[i];
	}
	//inserisce nella nuova stringa i caratteri di stringa 2
	for (int i=0;i<strlen(str2);i++){
		stringa_concatenata[i]=str2[i];
	}
	//inserisce nella nuova stringa i caratteri di stringa 3
	
}

si andrebbe a copiare sulla stringa concatenata si, i valori di stringa 2, ma si andrebbero a sovrascrivere quelli scritti in precedenza, quindi serve un iteratore a parte per la stringa concatenata che non venga resettato a zero ogni volta che il ciclo for finisce

char * concatena(char * str1,char * str2, char * str3){
//definisce una nuova stringa (quella concatenata)
	// trovo la lunghezza della stringa di output
	int lunghezza_totale = strlen(str1)+strlen(str2)+strlen(str3);
	//alloco la nuova stringa di output
	char * stringa_concatenata=malloc(sizeof(char)*lunghezza_totale);
	int j=0; //iteratore per la stringa concatenata
 
	//inserisce nella nuova stringa i caratteri di stringa 1
	for (int i=0;i<strlen(str1);i++){
		stringa_concatenata[j]=str1[i];
		j++;
	}
	//inserisce nella nuova stringa i caratteri di stringa 2
	for (int i=0;i<strlen(str2);i++){
		stringa_concatenata[j]=str2[i];
		j++;
	}
	//inserisce nella nuova stringa i caratteri di stringa 3
	for (int i=0;i<strlen(str2);i++){
		stringa_concatenata[j]=str3[i];
		j++;
	}
	stringa_concatenata[j]='\0';
	return stringa_concatenata;
}

A questo punto basta farlo anche per l’ultima stringa e poi non scordatevi di aggiungere alla fine il carattere di fine stringa ‘\0’

Per migliorare ancora questa soluzione si può, prima di fare tutte queste operazioni, controllare che l’allocazione di memoria della stringa concatenata sia andata a buon fine, ad esempio con un if

char * concatena(char * str1,char * str2, char * str3){
//definisce una nuova stringa (quella concatenata)
	// trovo la lunghezza della stringa di output
	int lunghezza_totale = strlen(str1)+strlen(str2)+strlen(str3);
	//alloco la nuova stringa di output
	char * stringa_concatenata=malloc(sizeof(char)*lunghezza_totale);
	int j=0; //iteratore per la stringa concatenata
 
	if(stringa_concatenata!=NULL){
		//inserisce nella nuova stringa i caratteri di stringa 1
		for (int i=0;i<strlen(str1);i++){
			stringa_concatenata[j]=str1[i];
			j++;
		}
		//inserisce nella nuova stringa i caratteri di stringa 2
		for (int i=0;i<strlen(str2);i++){
			stringa_concatenata[j]=str2[i];
			j++;
		}
		//inserisce nella nuova stringa i caratteri di stringa 3
		for (int i=0;i<strlen(str2);i++){
			stringa_concatenata[j]=str3[i];
			j++;
		}
		stringa_concatenata[j]='\0';
	}
	return stringa_concatenata
}

Finito! Qui sotto trovate la soluzione completa da copiare ed incollare.

Esercizio 1 hard

Fai la funzione di concatenazione con un numero arbitrario di stringhe! Ci sono diversi modi per farlo, quello che consiglio è di passare un array di stringhe!! Pensa bene come potresti definire questo array di stringhe e come all’interno della funzione separare ogni singola stringa e fare le operazioni che abbiamo fatto nell’esercizio precedente.

SOLUZIONE:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
char * concatena(char ** array_di_stringhe,int numero_stringhe){
    int total_size=0;
    //trova la dimensione totale
    for(int i=0;i<numero_stringhe;i++){
        total_size +=strlen(array_di_stringhe[i]);
    }
    //printf("%d\n",total_size);
 
    //alloca la stringa
    char * stringa_concatenata= malloc(sizeof(char)*total_size);
 
    //controlla che l'allocazione sia andata a buon fine
    if(stringa_concatenata!=NULL){
        int k=0;
        for(int i=0;i< numero_stringhe;i++){ //per ogni stringa nell'array di stringhe
            for (int j=0;j<strlen(array_di_stringhe[i]);j++){//per ogni carattere della stringa
                stringa_concatenata[k]=array_di_stringhe[i][j];
                k++;
            }
        }
        stringa_concatenata[k]='\0';
    }
    return stringa_concatenata;
 
}
 
int main(){
    char * a="ciao ";
    char * b="come ";
    char * c="va?";
 
    char ** array_di_stringhe;
    array_di_stringhe[0]=a;
    array_di_stringhe[1]=b;
    array_di_stringhe[2]=c;
 
    printf("%s\n",concatena(array_di_stringhe,3));
}