Una delle possibili soluzioni della simulazione d’esame di informatica. Esercizi risolti in C sulle liste e sulle struct.
Esercizio 1
Si scriva un programma che salva in un vettore (max 20 elementi) i caratteri immessi dall’utente finché viene immesso il carattere ‘#’ o si raggiunge il limite dell’array. Quindi stampa il numero di caratteri immessi (escluso il carattere ‘#’) e quanti di questi sono caratteri numerici (0-9).
#include <stdio.h>
#define DIM 20
int main()
{
char nums[DIM], i;
int contn = 0, finito;
i = 0;
finito = 0;
do
{
printf("Inserisci il %d elemento (# per terminare)\n", i+1);
scanf("%c", &nums[i]);
getchar();
if(nums[i] <= 57 && nums[i] >= 48)
contn++;
if(nums[i] == '#')
finito = 1;
i++;
}while(i < DIM && !finito);
printf("I caratteri immessi sono:\n");
for(i = 0; i < DIM && nums[i] != '#'; i++)
printf("%c\n", nums[i]);
printf("Di questi, %d sono numeri", contn);
return 0;
}
Esercizio 2
Dati A = (25)10 e B = (-18)10 convertirli in binario complemento a 2 utilizzando il numero minimo di bit necessario per rappresentare entrambi i numeri, effettuare l’operazione A-B in complemento a due e, qualora non si verifichi overflow, convertire il risultato in decimale. Mostrare i passaggi.

Su 6 bit c’è overflow. Per rappresentare la somma, il numero di bit minimo da utilizzare è 7.
Esercizio 3
Si definisca una struttura dati per contenere un carattere e un numero intero.
Si scriva programma che legge da un file di testo “contenuto.txt” una serie di caratteri (non si facciano ipotesi sul numero di caratteri contenuti nel file) e crea una lista dove ogni elemento rappresenterà un carattere presente nel file con la rispettiva frequenza.
Il programma poi deve chiamare una funzione che visualizzerà tutti gli elementi della lista (o emetterà un messaggio qualora la lista risultasse vuota a causa di un file vuoto o inesistente)
#include <stdio.h>
#include <malloc.h>
typedef struct contenuto
{
char carattere;
int num;
struct contenuto *next;
}contenuto;
void stampalista(contenuto *lista);
contenuto *testa, *t1, *t2;
int main()
{
FILE *fp = fopen("contenuto.txt", "r");
int contcar = 0;
if (!fp) //fp == NULL
printf("ATTENZIONE, errore nell'apertura del file\n");
else
{
while(feof(fp) == 0)
{
if(!testa) //Se la lista è vuota
{
testa = (contenuto*) malloc(sizeof(contenuto));
fscanf(fp, "%c", &testa->carattere);
testa -> next = NULL;
}
else //Se la lista ha già elementi
{
t1 = testa;
while (t1 -> next != NULL)
t1 = t1 -> next;
t1 -> next = (contenuto*) malloc(sizeof(contenuto));
t1 = t1 -> next;
fscanf(fp, "%c", &t1->carattere); //t1->carattere = (char) fgetc(fp);
}
}
}
if(fclose(fp) == EOF)
printf("Errore nella chiusura del file\n");
for(t1 = testa; t1; t1 = t1 -> next) //t1 equivale a t1 != 0 - Scandisco tutta la lista
{
for (t2 = testa; t2; t2 = t2 -> next) //Scandisco tutta la lista confronto t1 con ogni elemento della lista
if (t1-> carattere == t2 -> carattere)
contcar++;
t1 -> num = contcar; //Inserisco il numero di caratteri di quell'elemento in t1
contcar = 0; //azzero il contatore dei caratteri
}
stampalista(testa);
return 0;
}
void stampalista(contenuto *lista)
{
t2 = lista;
if(t2 == NULL)
printf("ERRORE, nella visualizzazione della lista\n");
printf("I caratteri nella lista sono:\n");
while(t2!=NULL)
{
if (t2->carattere != ' ' && t2->carattere != '\0')
printf("%c: %d\n", t2 -> carattere, t2->num);
t2=t2->next;
}
}
Esercizio 4
typedef struct elemento { char nome[50]; char cognome[50]; char CF[17]; struct elemento* next; } nodo;Si scriva una funzione che chiede all’utente: • Cognome • Nome • Codice fiscale (ricordando che il codice fiscale è lungo 16 caratteri) e controllando quindi che non ne vengano immessi in numero diverso, in caso richiedendo l’immissione Dopo l’inserimento, genera (alloca) un nodo atto ad essere inserito in una lista contenente questi dati e restituisce al chiamante l’indirizzo di tale nodo.
#include < stdio.h>
#include < malloc.h>
#include < string.h>
typedef struct elemento {
char nome[50];
char cognome[50];
char CF[17];
struct elemento* next;
} nodo;
nodo *elem;
nodo dati;
void inserimento();
int main()
{
inserimento();
elem = (nodo*) malloc (sizeof(nodo));
elem = &dati;
printf("Indirizzo del nodo: %p\n", elem);
printf("Nome: %s, Cognome: %s, CF: %s", elem->nome, elem->cognome, elem->CF);
}
void inserimento()
{
printf("Inserisci il nome: ");
gets(dati.nome);
printf("\nInserisci il cognome: ");
gets(dati.cognome);
do
{
printf("\nInserisci il Codice fiscale: ");
gets(dati.CF);
if(dati.CF[16] != '\0')
printf("Codice Fiscale errato, riprova!\n");
} while (dati.CF[16] != '\0');
}
Esercizio 5
Si scriva una funzione che riceve un numero N intero positivo strettamente maggiore di zero e stampa, per ogni numero minore o uguale a N, i suoi divisori e se N è primo (tramite un asterisco a fine linea).
Se il numero fosse uguale o minore di zero, stampa un apposito messaggio di errore.
Per esempio, dato il numero 7, dovrà risultare una stampa di questo tipo:
1
12*
13*
124
15*
1236
17*
#include < stdio.h>
int main() {
int num, i, j, cont = 0;
do
{
printf("Inserisci un numero intero\n");
scanf("%d", &num);
if (num <= 0)
printf("Attenzione, Inserisci un numero maggiore di 0\n");
} while (num <= 0);
for(i = 1; i <= num; i++)
{
cont = 0;
for(j = 1; j <= num; j++)
if(i % j == 0)
{
printf("%d\t", j);
cont++;
}
if(cont == 2)
printf("*");
printf("\n");
}
return 0;
}