Soluzione simulazione d’esame 3

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

Per altre simulazioni