Soluzione simulazione d’esame – 5

[adinserter block="5"]

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;
}
[adinserter block="7"]

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

[adinserter block="7"]

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;
}
[adinserter block="7"]

Esercizio 4

Scrivere un programma in C che chiede all’utente un numero intero num. Apre successivamente il file “origine.txt” in lettura e crea due file file1.txt e file2.txt mettendo nel primo file i primi num valori letti dal file “origine.txt”, ed in file2.txt i rimanenti valori letti dal file d’ingresso. Gestire opportunamente i casi di errore. Nel caso in cui il primo file non contenga almeno num valori, il secondo file viene creato vuoto. Non è nota la quantità di numeri interi contenti in “origine.txt”.

#include <stdio.h>

int main()
{
  int num, i, val, cont;
  FILE *fp, *f1, *f2;

  printf("Inserisci un numero intero: ");
  scanf("%d", &num);

  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;
}
[adinserter block="7"]

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 dei 10 studenti che hanno il voto più alto. In caso in lista ci siano meno di 10 studenti, la funzione visualizza un apposito messaggio (“non abbastanza studenti per la classifica”)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DIM 30
#define MIN_CLASSIFICA 10

typedef struct studente
{
  char cognome[DIM+1];
  int matricola;
  int voto;
  struct studente *suc;
  struct studente *pre;
}studente;

void inserisci(int );
void stampa(studente*);
int contaElementi(studente *);

studente *testa;

int main() {
  int numero, i, cont;

  printf("\nInserisci il numero di studenti: ");
  scanf("%d", &numero);
  getchar();

  for (i = 0; i < numero; i++)
    inserisci(numero);

  cont = contaElementi(testa);
    if (cont < MIN_CLASSIFICA)
      printf("Non abbastanza studenti per la classifica\n");
    else
      stampa(testa);
  return 0;
}

void inserisci (int num)
{
  studente *t1, *temp, *t2;
  int cont;

    if (!testa)
    {
      testa = (studente*)malloc(sizeof(studente));
      printf("Inserisci il cognome: ");
      gets(testa->cognome);
      printf("Inserisci la matricola: ");
      scanf("%d", &testa->matricola);  
      printf("Inserisci il voto: ");
      scanf("%d", &testa->voto);    
      getchar();   
      testa -> pre = NULL;
      testa -> suc = NULL;
      cont = contaElementi(testa);
      return;
    }

    temp = (studente*)malloc(sizeof(studente));
    printf("Inserisci il cognome: ");
    gets(temp->cognome);
    printf("Inserisci la matricola: ");
    scanf("%d", &temp->matricola);  
    printf("Inserisci il voto: ");
    scanf("%d", &temp->voto);    
    getchar();   
    t1 = testa;
    t2 = NULL;

    while(t1 && t1->voto > temp -> voto)
    {
      t2 = t1;
      t1 = t1 -> suc;
    }
    if (t2 == NULL)
    {
      temp -> suc = testa;
      temp -> pre = NULL;
      testa = temp;
      return;
    }
    else
    {
      t2->suc = temp;
      temp->suc = t1;
      temp->pre = t2;
      if (t1)
        t1->pre = temp;
    }
}
  
void stampa(studente* head)
{
  studente *t2;
  int i;

  t2 = head;
  i = 0;
  while(t2 != NULL && i < MIN_CLASSIFICA)  
  {
    printf("\n%d. Cognome: %s \t Matricola: %d", i+1, t2->cognome, t2->matricola);
    i++;
    t2 = t2 -> suc;
  } 
}

int contaElementi(studente *head)
{
  int cont;
  studente *t2;
  cont = 0;
  for (t2 = head; t2; t2=t2->suc)
    cont++;

  return cont;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DIM 30
#define MIN_CLASSIFICA 10

typedef struct studente
{
  char cognome[DIM+1];
  int matricola;
  int voto;
  struct studente *next;
}studente;

void visualizzaClassifica(studente*);
void stampa(studente *);
void ordina(studente *);
void swap(studente *, studente *);

studente *testa, *t1;

int main() {
  int i, numstud;

  printf("Quanti studenti vuole inserire?\\n");
  scanf("%d", &numstud);
  getchar();

  for(i = 0; i < numstud; i++)
  {
    if(!testa) //Se la testa è vuota => testa == NULL
    {
      testa = (studente*) malloc (sizeof(studente));
      printf("Inserisci il cognome: ");
      gets(testa->cognome);
      printf("Inserisci la matricola: ");
      scanf("%d", &testa->matricola);  
      printf("Inserisci il voto: ");
      scanf("%d", &testa->voto);    
      getchar();   
      testa -> next = NULL;
    }
    else //Se ci sono altri elementi
    {
      t1 = testa;
      while (t1 -> next != NULL)
        t1 = t1 -> next;
      t1 -> next = (studente*)malloc(sizeof(studente));
      t1 = t1->next;
      printf("Inserisci il cognome: ");
      gets(t1->cognome);
      printf("Inserisci la matricola: ");
      scanf("%d", &t1->matricola);  
      printf("Inserisci il voto: ");
      scanf("%d", &t1->voto);    
      getchar();   
    }
  }

  visualizzaClassifica(testa);

  return 0;
}

void visualizzaClassifica(studente *head)
{
  studente *t2;
  int cont;

  cont = 0;
  for (t2 = head; t2; t2=t2->next)
    cont++;
  printf("\\nNumero di elementi: %d", cont);
  if (cont < MIN_CLASSIFICA)
    printf("\\nImpossibile visualizzare la classifica, ci sono meno di %d studenti", MIN_CLASSIFICA);
  else
  {
    ordina(testa);
    stampa(testa);
  }
    
}

void ordina(studente *head)
{
    int swapped, i; 
    studente *t3; 
    studente *t4 = NULL; 
  
  if (head == NULL) 
    return; 

  do
  { 
    swapped = 0; 
    t3 = head; 
  
    while (t3->next != t4) 
    { 
      if (t3->voto < t3->next->voto) 
      {  
        swap(t3, t3->next); 
        swapped = 1; 
      } 
      t3 = t3->next; 
    } 
    t4 = t3; 
  } while (swapped); 
} 
  
void swap(studente *a, studente *b) 
{ 
  int temp = a->voto; 
  a->voto = b->voto; 
  b->voto = temp; 

  char tempo[DIM+1];
  strcpy(tempo, a->cognome);
  strcpy(a->cognome, b->cognome);
  strcpy(b->cognome, tempo);

  int mat;
  mat = a->matricola;
  a->matricola = b->matricola;
  b->matricola = mat;
}

void stampa(studente *head)
{
  studente *t2;
  int i;

  t2 = testa;
  while(t2 != NULL && i < MIN_CLASSIFICA)  
  {
    printf("\\n%d. Cognome: %s \\t Matricola: %d", i+1, t2->cognome, t2->matricola);
    i++;
    t2 = t2 -> next;
  } 
}
[adinserter block="5"]

Per altre simulazioni