Esercizio 1
Dato un array di 100 elementi interi dichiarato e riempito di valori interi positivi nel main, scrivere una funzione (non è necessario scrivere anche il main) che riceve l’array e un intero num e che restituisce al chiamante: 1) la somma dei primi “num” elementi dell’array se num è strettamente maggiore di 0 e strettamente minore di 100, 2) -1 altrimenti.
#include < stdio.h>
#define DIM 100
int somma(int num, int []);
int main() {
int sum, num, v[DIM];
int i;
for (i = 0; i < DIM; i++)
{
printf("Inserisci il %d numero\n", i+1);
scanf("%d", &v[i]);
}
printf("Inserisci un numero per la somma\n");
scanf("%d", &num);
sum = somma(num, v);
if (sum == -1)
printf("Non è stato possibile eseguire la somma\n");
else
printf("La somma dei primi %d numeri dell'array, e': %d\n", num, sum);
return 0;
}
int somma(int num, int a[])
{
int i, somma = 0;
if (num < DIM && num > 0)
{
for(i = 0; i < num; i++)
somma += a[i]; //somma = somma + a[i]
return somma;
}
else
return -1;
}
Esercizio 2
Dati A = (-67)10 e B = (110001)modulo e segno 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 un programma C per che visualizza il triangolo di Floyd. L’utente inserisce quante righe del triangolo stampare.
Ad esempio, le prime quattro file del triangolo di Floyd sono:
1
2 3
4 5 6
7 8 9 10
Nel triangolo di Floyd, l’ennesima riga contiene n numeri
#include <stdio.h>
int main() {
int num, i, j, cont = 1;
printf("Insersci il numero di righe che si vuole stampare: ");
scanf("%d", &num);
for (i = 0; i < num; i++)
{
for(j = 0; j <= i; j++, cont ++)
printf("%d\t", cont);
printf("\n");
}
return 0;
}
Esercizio 4
Scrivere un programma in C che chiede all’utente un numero intero num che deve essere forzatamente maggiore di 0 (il programma continua a chiederlo fino a che questa condizione non è soddisfatta). Apre successivamente il file “origine.txt” in lettura e crea due file “file1.txt” e “file2.txt” scrivendo in “file1.txt i primi “num” valori letti dal file “origine.txt”, ed in file2.txt i rimanenti valori letti dal file dal file “origine.txt”. Il file “origine.txt” non deve essere modificato”. Gestire opportunamente i casi di errore nell’apertura dei file. Nel caso in cui il file “origine.txt” non contenga almeno num valori, il secondo file (“file2.txt”) viene creato vuoto. Non è nota la quantità di numeri interi contenuti in “origine.txt”.
#include <stdio.h>
int main()
{
int num, i, val, cont;
FILE *fp, *f1, *f2;
do
{
printf("Inserisci un numero intero: ");
scanf("%d", &num);
if (num < 0)
printf("Inserisci un numero maggiore di 0\n");
}while (num < 0);
fp = fopen("origine.txt", "r");
if (!fp)
printf("Errore nell'apertura del file origine\n");
f1 = fopen("file1.txt", "w");
if (!f1)
printf("Errore nell'apertura del file 1\n");
f2 = fopen("file2.txt", "w");
if (!f2)
printf("Errore nell'apertura del file 2\n");
cont = 0;
while(!feof(fp))
{
fscanf(fp, "%d ", &val);
cont++;
}
rewind(fp);
if (cont > num)
{
for (i = 0; i < num; i++)
{
fscanf(fp, "%d ", &val);
fprintf(f1, "%d ", val);
}
fseek(fp, num*2, SEEK_SET);
while(!feof(fp))
{
fscanf(fp, "%d ", &val);
fprintf(f2,"%d ", val);
}
}
else
{
for (i = 0; i < num && i < cont; i++)
{
fscanf(fp, "%d ", &val);
fprintf(f1, "%d ", val);
}
}
if (fclose(fp) == EOF)
printf("Errore nella chiusura del file di origine\n");
if (fclose(f1) == EOF)
printf("Errore nella chiusura del file 1\n");
if (fclose(f2) == EOF)
printf("Errore nella chiusura del file 2\n");
return 0;
}
Esercizio 5
Si definisca un tipo di dato atto a costituire una lista di studenti di cui vanno memorizzati il cognome (max 30 caratteri), la matricola (intero) e il voto di laurea (intero). 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 visualizza il cognome e la matricola dello studente con il voto più alto e il cognome e la matricola dello studente con il voto più basso (si supponga che non esistano studenti con voto uguale)
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define DIM 30
#define NUMSTUD 3
typedef struct studente
{
char cognome[DIM];
int matricola;
int voto_laurea;
struct studente *next;
}studente;
void visualizza (studente *testa);
studente *testa1, *t1;
int main()
{
int i;
for (i = 0; i < NUMSTUD; i++)
{
if(!testa1) //Se la testa è vuota => testa == NULL
{
testa1 = (studente*) malloc (sizeof(studente));
printf("Inserisci il cognome del %d studente\n", i+1);
gets(testa1 -> cognome);
printf("Inserisci la matricola del %d studente\n", i+1);
scanf("%d", &testa1 -> matricola);
printf("Inserisci il voto del %d studente\n", i+1);
scanf("%d", &testa1 -> voto_laurea);
getchar();
testa1 -> next = NULL;
}
else //Se ci sono altri elementi
{
t1 = testa1;
while (t1 -> next != NULL)
t1 = t1 -> next;
t1 -> next = (studente*)malloc(sizeof(studente));
t1 = t1->next;
printf("Inserisci il cognome del %d studente\n", i+1);
gets(t1 -> cognome);
printf("Inserisci la matricola del %d studente\n", i+1);
scanf("%d", &t1 -> matricola);
printf("Inserisci il voto del %d studente\n", i+1);
scanf("%d", &t1 -> voto_laurea);
getchar();
}
}
visualizza(testa1);
return 0;
}
void visualizza (studente *testa)
{
studente *t2;
int max, min;
char maxcog[DIM], mincog[DIM];
max = testa->voto_laurea;
strcpy(maxcog, testa->cognome);
min = testa->voto_laurea;
strcpy(mincog, testa->cognome);
t2 = testa;
while(t2 != NULL)
{
if(t2->voto_laurea > max)
{
max = t2->voto_laurea;
strcpy(maxcog, t2->cognome);
}
if (t2->voto_laurea < min)
{
min = t2->voto_laurea;
strcpy(mincog, t2->cognome);
}
t2 = t2->next;
}
printf("Lo studente %s ha il voto di laurea più alto, pari a %d\n", maxcog, max);
printf("Lo studente %s ha il voto di laurea più basso, pari a %d\n", mincog, min);
}