Esercizio 1
Scrivere una funzione in C che riceve una stringa. La funzione dovrà restituire al chiamante il numero di parole presenti. Una parola è definita come un insieme qualsiasi di caratteri seguiti dal carattere “spazio” o seguiti dal carattere “null”.
#include < stdio.h>
#include < string.h>
#define DIM 50
int main(void) {
char mystring[DIM];
int i, contp = 1;
printf("Inserisci una stringa:\n");
gets(mystring);
for(i = 0; i < DIM; i++)
if(mystring[i] == ' ' || mystring[i] == "NULL")
contp ++;
printf("Le parole presenti nella stringa sono:%d", contp);
return 0;
}
Esercizio 2
Dati A = (-87)10 e B = (110101)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
Scrivere una funzione in C che riceve in ingresso due teste di lista T1 e T2 utilizzate per rappresentare numeri interi. La funzione restituisce al chiamante il numero di elementi della lista T1 che non compaiono nella lista T1. Le liste NON sono ordinate.
int numeri(lista *testa, lista *testa2)
{
int cont = 0, verifica = 1;
lista *l2, *l1;
for(l2 = testa2; l2; l2 = l2 -> next)
{
for(l1 = testa; l1; l1 = l1 -> next)
{
if (l2 -> num == l1 -> num)
verifica = 0;
}
if (!verifica)
cont++;
verifica = 1;
}
return cont;
}
#include < stdio.h>
#include < malloc.h>
typedef struct lista
{
int num;
struct lista *next;
}lista;
int numeri(lista *testa, lista *testa2);
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);
printf("I numeri diversi sono: %d\n", numeri(testa1, testa2));
return 0;
}
int numeri(lista *testa, lista *testa2)
{
int cont = 0, verifica = 1;
lista *l2, *l1;
for(l2 = testa2; l2; l2 = l2 -> next)
{
for(l1 = testa; l1; l1 = l1 -> next)
{
if (l2 -> num == l1 -> num)
verifica = 0;
}
if (!verifica)
cont++;
verifica = 1;
}
return cont;
}
Esercizio 4
Scrivere un programma in C che chiede all’utente un numero intero num. Successivamente apre il file “input.txt” che, se esiste, contiene dei numeri interi (non si sa quanti).
Al termine del programma il file input.txt non deve più contenere alcun valore pari a num (ma gli altri valori devono essere nello stesso ordine iniziale) e il programma deve visualizzare la quantità di valori “cancellati”. Se il file non esiste deve essere visualizzato unicamente un messaggio “file non esistente”
#include < stdio.h>
#include < string.h>
int main(void) {
FILE *fp = fopen("input.txt", "r");
FILE *fa = fopen("output.txt", "w");
int num, num_file;
if (!fp)
printf("\nfile non esistente\n");
else
{
printf("Inserisci un numero intero\n");
scanf("%d", &num);
while(feof(fp)==0)
{
fscanf(fp, "%d", &num_file);
printf("%d" ,num_file);
if (num_file == num)
{
fprintf(fa, "%s", "\n");
}
else
{
fprintf(fa, "%d", num_file);
fprintf(fa, "%s", "\n");
}
num_file = 0;
}
}
fclose(fp);
fclose(fa);
fa = fopen("output.txt","r");
fp = fopen("input.txt", "w");
while (!feof(fa))
{
fscanf(fa, "%d", &num_file);
fprintf(fp, "%d", num_file);
fprintf(fp, "%s", "\n");
}
return 0;
}
Esercizio 5
Una matrice di interi di 40 righe per 50 colonne rappresenta la platea di un teatro e ogni elemento vale 0 se il posto è libero, 1 se occupato. Scrivere una funzione che riceve come parametro la matrice (già riempita di valori da un’altra parte di codice), chiede all’utente quanti posti contigui vuole (massimo 3 e se l’utente immette un valore non consentito continua a chiederlo fino a che non è corretto) e poi visualizza l’indice della la riga in cui esiste la prima sequenza di posti contigui disponibile a partire dalla riga 0 (più vicina al palcoscenico). Emette un messaggio se invece non esistono i posti contigui richiesti in tutto il teatro.
Funzione richiesta:
void disponibile (int m[][COL])
{
int num, i, j, posto = 0;
do
{
printf("Quanti posti contigui vuole riservare?\n");
scanf("%d", &num);
if (num > 3 || num < 1)
printf("ATTENZIONE, si possono prenotare massimo 3 posti contigui\n");
}while(num > 3 || num < 1);
for (i = 0; i < ROW && !posto; i++)
for (j = 0; j < COL && !posto; j++)
{
switch(num)
{
case 1:
if(!(m[i][j]))
posto = i+1;
break;
case 2:
if(!(m[i][j]) && !(m[i][j+1]))
posto = i+1;
break;
case 3:
if(!(m[i][j]) && !(m[i][j+1]) && !(m[i][j+2]))
posto = i+1;
break;
}
}
if (posto)
printf("I %d posti contigui richiesti sono disponibili alla %d fila\n", num, i);
else
printf("Non è stato possibile trovare %d posti contigui\n", num);
}
#include < stdio.h>
#define ROW 4
#define COL 5
void disponibile (int m[][COL]);
int main() {
int matrix[ROW][COL];
int i, j;
for(i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
printf("Inserire l'elemento riga %d, colonna %d: ", i + 1, j+1);
scanf("%d", &matrix[i][j]);
}
}
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++) printf("%d\t", matrix[i][j]); printf("\n"); } disponibile(matrix); return 0; } void disponibile (int m[][COL]) { int num, i, j, posto = 0; do { printf("Quanti posti contigui vuole riservare?\n"); scanf("%d", &num); if (num > 3 || num < 1) printf("ATTENZIONE, si possono prenotare massimo 3 posti contigui\n"); }while(num > 3 || num < 1);
for (i = 0; i < ROW && !posto; i++)
for (j = 0; j < COL && !posto; j++)
{
switch(num)
{
case 1:
if(!(m[i][j]))
posto = i+1;
break;
case 2:
if(!(m[i][j]) && !(m[i][j+1]))
posto = i+1;
break;
case 3:
if(!(m[i][j]) && !(m[i][j+1]) && !(m[i][j+2]))
posto = i+1;
break;
}
}
if (posto)
printf("I %d posti contigui richiesti sono disponibili alla %d fila\n", num, i);
else
printf("Non è stato possibile trovare %d posti contigui\n", num);
}