Esercizio 1
Un array di reali di 20 elementi contiene il la quantità di miglia nautiche percorse da una barca ogni giorno. Scrivere una funzione che riceve questo array (già contenente i dati) e chiede all’utente un giorno di inizio e un giorno di fine e visualizza la somma delle miglia percorse in quei giorni (estremi inclusi). Si gestiscano con appositi messaggi situazioni di errore di immissione dei dati relativamente ai giorni richiesti (giorni “fuori campo”, inizio e fine invertite). Il primo giorno è il giorno 0 (zero).
#include <stdio.h>
#define DIM 13
void somma(float []);
int main()
{
float miglia[DIM] = {23,24,25,67,34,85,12,67,89,98,45,67,32};
somma(miglia);
}
void somma(float a[])
{
int giorno_inizio, giorno_fine, i;
float somma;
do
{
printf("Inserisci il giorno di inizio: ");
scanf("%d", &giorno_inizio);
if (giorno_inizio > DIM || giorno_inizio < 0)
printf("ATTENZIONE, giorno d'inizio errato\n");
}while(giorno_inizio > DIM || giorno_inizio < 0);
do
{
printf("\nInserisci il giorno di fine: ");
scanf("%d", &giorno_fine);
if (giorno_fine > DIM || giorno_fine < giorno_inizio)
printf("ATTENZIONE, giorno di fine errato\n");
}while(giorno_fine > DIM || giorno_fine < giorno_inizio);
somma = 0;
for (i = giorno_inizio; i <= giorno_fine; i++)
{
somma = somma + a[i];
}
printf("\nLa somma delle miglia percorse tra il giorno %d e il giorno %d, e': %f\n", giorno_inizio, giorno_fine, somma);
}
Esercizio 2
Dati A = (-47)10 e B = (110001)binario naturale rappresentarli entrambi in binario complemento a 2 utilizzando il numero minimo di bit necessario per la rappresentazione di entrambi i numeri e poi effettuare le operazioni A+B e A-B commentando il risultato

Esercizio 3
Date due liste di interi L1 e L2 scrivere una funzione riceve come parametri le due teste di lista (dichiarate nel main) e effettua la concatenazione di L1 ed L2, cioè la lista ottenuta da L1 attaccando in fondo ad L1 gli elementi della lista L2. Si scriva la definizione del tipo e si prevedano tutti i casi possibili (liste vuote, ecc…)
void concatena(lista *l1, lista *l2)
{
printf("\n");
lista *t, *testa3;
t = (lista*)malloc(sizeof(lista));
testa3 = (lista*)malloc(sizeof(lista));
testa3 = l1;
for (t = testa3; t->next != 0; t = t -> next);
t->next = l2;
printf("La stringa concatenata e': ");
while(testa3 != NULL) {
printf("%d ", testa3 -> num);
testa3=testa3->next;
}
}
#include < stdio.h>
#include < malloc.h>
typedef struct lista
{
int num;
struct lista *next;
}lista;
void concatena(lista *l1, lista *l2);
lista *testa1, *t1, *testa2, *t2;
int main()
{
int finito = 0;
int primo, secondo;
printf("Inserisci gli elementi della prima lista, 999 per terminare\n");
do
{
if(!testa1) //Se la testa è vuota => testa == NULL
{
testa1 = (lista*) malloc (sizeof(lista));
scanf("%d", &primo);
if (primo == 999)
finito = 1;
testa1 -> num = primo;
testa1 -> next = NULL;
}
else //Se ci sono altri elementi
{
t1 = testa1;
while (t1 -> next != NULL)
t1 = t1 -> next;
t1 -> next = (lista*)malloc(sizeof(lista));
t1 = t1->next;
scanf("%d", &primo);
if (primo == 999)
finito = 1;
t1 -> num = primo;
}
}while(!finito);
finito = 0;
printf("Inserisci gli elementi della seconda lista, 999 per terminare\n");
do
{
if(!testa2) //Se la testa è vuota => testa == NULL
{
testa2 = (lista*) malloc (sizeof(lista));
scanf("%d", &secondo);
if (secondo == 999)
finito = 1;
testa2 -> num = secondo;
testa2 -> next = NULL;
}
else //Se ci sono altri elementi
{
t2 = testa2;
while (t2 -> next != NULL)
t2 = t2 -> next;
t2 -> next = (lista*)malloc(sizeof(lista));
t2 = t2->next;
scanf("%d", &secondo);
if (secondo == 999)
finito = 1;
t2 -> num = secondo;
}
}while(!finito);
concatena(testa1, testa2);
return 0;
}
void concatena(lista *l1, lista *l2)
{
printf("\n");
lista *t, *testa3;
t = (lista*)malloc(sizeof(lista));
testa3 = (lista*)malloc(sizeof(lista));
testa3 = l1;
for (t = testa3; t->next != 0; t = t -> next);
t->next = l2;
printf("La stringa concatenata e': ");
while(testa3 != NULL) {
printf("%d ", testa3 -> num);
testa3=testa3->next;
}
}
Esercizio 4
Scrivere un programma in C che chiede all’utente il nome di due file che, se esistono, è garantito che contengano solo numeri interi (non si sa quanti). Il programma deve visualizzare il valore di ciascun numero contenuto nel primo file che NON sia contenuto nel secondo. Gestire con appositi messaggi, e successiva azione di terminazione del programma eventuali errori nell’apertura dei file. Si ottimizzi il tempo di esecuzione (anche eventualmente a scapito dell’occupazione di memoria).
#include < stdio.h>
#include < malloc.h>
typedef struct lista
{
int num;
struct lista *next;
}lista;
lista *testa1, *testa2, *t1, *t2;
void controllo(lista *testa1, lista *testa2);
int main()
{
FILE *fp = fopen("file1.txt", "r");
FILE *fa = fopen("file2.txt", "r");
if (!fp)
{
printf("ATTENZIONE, errore nell'apertura del file 1\n");
return 0;
}
if (!fa)
{
printf("ATTENZIONE, errore nell'apertura del file 2\\n");
return 0;
}
while(!feof(fp))
{
if(!testa1) //Se la testa è vuota => testa == NULL
{
testa1 = (lista*) malloc (sizeof(lista));
fscanf(fp, "%d\n", &testa1->num);
testa1 -> next = NULL;
}
else
{
t1 = testa1;
while (t1 -> next != NULL)
t1 = t1 -> next;
t1 -> next = (lista*)malloc(sizeof(lista));
t1 = t1->next;
fscanf(fp, "%d\n", &t1->num);
}
}
while(!feof(fa))
{
if(!testa2) //Se la testa è vuota => testa == NULL
{
testa2 = (lista*) malloc (sizeof(lista));
fscanf(fa, "%d\n", &testa2->num);
testa2 -> next = NULL;
}
else
{
t2 = testa2;
while (t2 -> next != NULL)
t2 = t2 -> next;
t2 -> next = (lista*)malloc(sizeof(lista));
t2 = t2->next;
fscanf(fa, "%d\n", &t2->num);
}
}
if(fclose(fp) == EOF)
{
printf("Errore nella chiusura del file 1 \n");
return 0;
}
if(fclose(fa) == EOF)
{
printf("Errore nella chiusura del file 2\n");
return 0;
}
printf("I numeri acquisiti lista 1 sono:\n");
t1 = testa1;
while(t1!=NULL) {
printf("%d ", t1 -> num);
t1=t1->next;
}
printf("\nI numeri acquisiti lista 2 sono:\n");
t2 = testa2;
while(t2!=NULL) {
printf("%d ", t2 -> num);
t2=t2->next;
}
controllo(testa1, testa2);
return 0;
}
void controllo(lista *testa1, lista *testa2)
{
printf("\nI numeri non presenti nel file 2 sono: ");
int verifica = 1;
lista *l2, *l1;
for(l1 = testa1; l1; l1 = l1 -> next)
{
for(l2 = testa2; l2; l2 = l2 -> next)
{
if (l1 -> num == l2 -> num)
verifica = 0;
}
if (verifica)
printf("%d ", l1->num);
verifica = 1;
}
}
Esercizio 5
Si definisca un tipo di dato atto a costituire una lista di Comuni di cui vanno memorizzati il nome (max 30 caratteri), il numero di abitanti (intero) e la quota altimetrica (reale). La testa della lista è dichiarata nel main (e quindi non è una variabile globale). Si scriva poi una funzione che riceve come parametro la testa di lista e chiede all’utente il numero minimo di abitanti e la quota minima, e visualizza tutti i dati dei comuni che un numero di abitanti maggiore o uguale a quello richiesto e con una quota strettamente superiore a quella richiesta. Solo qualora nessun Comune soddisfi i vincoli, la funzione visualizzerà un apposito messaggio.
void visualizza(comuni *t1)
{
int abitanti, verifica;
float altezza;
comuni *temp;
printf("Inserisci il numero minimo di abitanti del comune per essere visualizzato\n");
scanf("%d", &abitanti);
printf("Inserisci la quota altimetrica minima del comune per essere visualizzato\n");
scanf("%f", &altezza);
verifica = 0;
for(temp = t1; temp; temp = temp->next)
{
if (temp->num_abitanti >= abitanti && temp->quota >= altezza)
{
printf("Nome: %s\n", temp->nome);
printf("Abitanti: %d\n", temp->num_abitanti);
printf("Altezza: %f\n", temp->quota);
verifica = 1;
}
}
if (!verifica)
printf("Non esiste nessun comune che ha le caratteristiche richieste\n");
}
#include < stdio.h>
#include < string.h>
#include < malloc.h>
#define DIM 30
typedef struct comuni
{
char nome[DIM];
int num_abitanti;
float quota;
struct comuni *next;
}comuni;
void visualizza(comuni *t1);
comuni *testa1, *t1;
int main()
{
int i;
for(i = 0; i<3; i++) { if(!testa1) //Se la testa è vuota => testa == NULL
{
testa1 = (comuni*) malloc (sizeof(comuni));
printf("Inserisci il nome del comune: ");
gets(testa1->nome);
printf("Inserisci il numero di abitanti: ");
scanf("%d", &testa1->num_abitanti);
printf("Insersci la quota del comune: ");
scanf("%f", &testa1 -> quota);
getchar();
testa1 -> next = NULL;
}
else //Se ci sono altri elementi
{
t1 = testa1;
while (t1 -> next != NULL)
t1 = t1 -> next;
t1 -> next = (comuni*)malloc(sizeof(comuni));
t1 = t1->next;
printf("Inserisci il nome del comune: ");
gets(t1->nome);
printf("Inserisci il numero di abitanti: ");
scanf("%d", &t1->num_abitanti);
printf("Insersci la quota del comune: ");
scanf("%f", &t1 -> quota);
getchar();
}
}
visualizza(testa1);
return 0;
}
void visualizza(comuni *t1)
{
int abitanti, verifica;
float altezza;
comuni *temp;
printf("Inserisci il numero minimo di abitanti del comune per essere visualizzato\n");
scanf("%d", &abitanti);
printf("Inserisci la quota altimetrica minima del comune per essere visualizzato\n");
scanf("%f", &altezza);
verifica = 0;
for(temp = t1; temp; temp = temp->next)
{
if (temp->num_abitanti >= abitanti && temp->quota >= altezza)
{
printf("Nome: %s\n", temp->nome);
printf("Abitanti: %d\n", temp->num_abitanti);
printf("Altezza: %f\n", temp->quota);
verifica = 1;
}
}
if (!verifica)
printf("Non esiste nessun comune che ha le caratteristiche richieste\n");
}