Laboratorio 2 – Lezione del 27 ottobre 2020

Premi qui per scaricare il PDF

Laboratorio C - 02

In questa lezione di Laboratorio, vedremo degli esercizi in C riguardanti le matrici, le stringhe e il controllo sull’input dell’utente.

Prima di ogni esercizio svolto che può essere copiato e testato, troverete le tracce dell’esercizio. Se volete scaricare il pdf con gli esercizi risolti, premete sul bottone qui in alto o a fondo pagina.

Esercizio 1

Scrivere un programma in linguaggio C che legga una frase inserita da tastiera. La frase contiene al più 100 caratteri. Il programma deve svolgere le seguenti operazioni:

  • visualizzare la frase inserita.
  • costruire una nuova frase in cui tutte le vocali siano sostituire da un diverso carattere secondo la seguente tabella: ‘A’, ‘a’ = ‘4’; ‘E’, ‘e’ = ‘3’; ‘I’, ‘i’ = 1; ‘O’, ‘o’ = ‘0’; ‘U’, ‘u’ = ‘8’.
  • il programma deve memorizzare la nuova frase in una opportuna variabile diversa dalla variable nella quale è memorizzata la stringa originale.
  • visualizzare la nuova frase.
#include <stdio.h>
#include <string.h>

#define DIM 100
int main()
{
  char mystring [DIM+1], mystring_new[DIM+1];
  int lunghezza_str, i;

  printf("Inserisci la tua frase\\n");
  gets(mystring);

  printf("La frase inserita e' %s\\n", mystring);

  lunghezza_str = strlen(mystring);
  strcpy(mystring_new, mystring);

  for(i = 0; i < lunghezza_str; i++)
  {
    if (mystring[i] == 'A' || mystring[i] == 'a')
      mystring_new[i] = '4';
    else if (mystring[i] == 'E' || mystring[i] == 'e')
      mystring_new[i] = '3';
    else if (mystring[i] == 'I' || mystring[i] == 'i')
      mystring_new[i] = '1';
    else if (mystring[i] == 'O' || mystring[i] == 'o')
      mystring_new[i] = '0';
    else if (mystring[i] == 'U' || mystring[i] == 'u')
      mystring_new[i] = '8';
  }
  printf("La stringa con i caratteri sostituiti e' %s\\n", mystring_new);

  return 0;
}

Metodo 2

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

#define DIM 100
int main()
{
  char mystring [DIM+1], mystring_new[DIM+1];
  int lunghezza_str, i;

  printf("Inserisci la tua frase\\n");
  gets(mystring);

  printf("La frase inserita e' %s\\n", mystring);

  lunghezza_str = strlen(mystring);
  strcpy(mystring_new, mystring);

  for(i = 0; i < lunghezza_str; i++)
  {
    switch(mystring[i])
    {
      case 'A':
        case 'a':
        mystring_new[i] = '4';
        break;
      case 'E':
        case '3':
        mystring_new[i] = '3';
        break;
      case 'I':
        case 'i':
        mystring_new[i] = '1';
        break;
      case 'O':
        case 'o':
        mystring_new[i] = '0';
        break;
      case 'U':
        case 'u':
        mystring_new[i] = '8';
        break;
    }
  }
  printf("La stringa con i caratteri sostituiti e' %s\\n", mystring_new);

  return 0;
}

Esercizio 2

Scrivere un programma in C che, data una matrice di interi 5×5, richiede l’immissione dei dati da parte dell’utente (si supponga che l’utente immetta correttamente i dati). Successivamente all’immissione di tutti i valori, il programma analizza la matrice e verifica se sia o meno una matrice diagonale. Il programma visualizza il risultato attraverso un apposito messaggio. Si ricorda che una matrice diagonale è una matrice quadrata in cui solamente i valori della diagonale principale possono essere diversi da 0.

#include <stdio.h>
#define R 5
#define C 5

int main()
{
  int matrix [R][C];
  int i,j;

  for(i=0; i < R; i++)
    for(j=0; j < C; j++)
    {
      printf("Inserisci il valore %d, %d nella matrice\\n",i,j);
      scanf("%d",&matrix[i][j]);
    }
  
  for(i = 0; i < R; i++)
    for(j = 0; j < C; j++)
      if(matrix[i][j] != 0)
        if(i != j)
          printf("La matrice non e' diagonale\\n");

  printf("La matrice inserita e' diagonale\\n");
  for(i = 0; i < R; i++)
  {
    for(j = 0; j < C; j++)
      printf("%4d", matrix[i][j]);
    printf("\\n");
  }
    
  return 0;
}

Esercizio 3

Data una matrice 4×4 di numeri interi, scrivere un programma in C che trovi la riga e la colonna con somma più alta e visualizzi due messaggi del tipo “La riga la cui somma degli elementi è la più alta è la riga …” e “La colonna la cui somma degli elementi è la più alta è la colonna …”. Se due righe o colonne hanno lo stessa somma, il programma visualizza quella con indice più basso.

#include <stdio.h>
#define R 4
#define C 4

int main()
{
  int matrix [R][C];
  int somma_colonne[C], somma_righe[R];
  int i, j;
  int max_righe, max_colonne, indice_righe, indice_colonne;

  for(i=0; i < R; i++)
    for(j=0; j < C; j++)
    {
      printf("Inserisci il valore %d, %d nella matrice\\n",i,j);
      scanf("%d",&matrix[i][j]);
    }
  
  for(i=0; i < R; i++)
    for (j=0; j < R; j++)
      somma_righe[i] += matrix[i][j];

    for(i=0; i < C; i++)
      for (j=0; j < C; j++)
        somma_colonne[i] += matrix[j][i];

  max_righe = somma_righe[0];
  indice_righe = 0;
  max_colonne = somma_colonne[0];
  indice_colonne = 0;

  for(i = 0; i < R; i++)
    if(max_righe < somma_righe[i])
    {
      max_righe = somma_righe[i];
      indice_righe = i;
    }

  printf("La riga la cui somma degli elementi e' la più alta e' la riga %d ed e' %d\\n", indice_righe+1, max_righe);

  for(i = 0; i < C; i++)
    if(max_colonne < somma_colonne[i])
    {
      max_colonne = somma_colonne[i];
      indice_colonne = i;
    }

  printf("La colonna la cui somma degli elementi e' la più alta e' la colonna %d ed e' %d\\n", indice_colonne+1, max_colonne);

	//STAMPO LA MATRICE 
  for(i=0; i < R; i++)
  {
    for(j=0; j < C; j++)
      printf("%4d", matrix[i][j]);
    printf("\\n");
  }
  
	return 0;
}

Esercizio 4

Scrivere un programma in C che acquisisca una matrice di caratteri alfabetici minuscoli di dimensioni 4×5 e stampi a video il carattere che compare più volte nella matrice. Nel caso l’utente inserisca un valore non valido, il programma deve richiedere il valore fino a che non è corretto. Se più caratteri compaiono con lo stesso numero di occorrenze, il programma stampa a video quello con il codice ASCII più alto.

#include <stdio.h>
#define R 4
#define C 5
#define NUMCHAR 26 //Numero di caratteri validi
#define ASCIIBASE 97 //numero minimo ascii valido, 'a'
int main()
{
  char mystring[R][C];
  int i, j;
	int conteggio[NUMCHAR];
	int maxConteggio;
	char carattereMaxConteggio;

  for (i = 0; i < R; i++)
    for (j = 0; j < C; j++)
      do
      {
        printf("Inserisci il valore della matrice %d, %d\\n", i, j);
        scanf("%c", &mystring[i][j]);
				getchar();
				
				if(mystring[i][j] < 'a' || mystring[i][j] > 'z')
					printf("Il valore inserito non e' corretto\\n");
      } while (mystring[i][j] < 'a' || mystring[i][j] > 'z');
  
  //STAMPO LA MATRICE
  for (i = 0; i < R; i++)
  {
    for (j = 0; j < C; j++)
      printf("%4d", mystring[i][j]);
    printf("\\n");
  }
 
	for (i = 0; i < NUMCHAR; i++)
		conteggio[i] = 0;
	
	for (i = 0; i < R; i++)
		for (j = 0; j < C; j++)
			conteggio[mystring[i][j] - ASCIIBASE]++;

	maxConteggio = conteggio[0];
	carattereMaxConteggio = 'a';

	for (i = 1; i < NUMCHAR; i++)
		if (conteggio[i] >= maxConteggio)
			carattereMaxConteggio = i + ASCIIBASE;

	printf("Il carattere che compare piu' volte nella matrice e' %c (%d)", carattereMaxConteggio, maxConteggio);

	return 0;
}

Premi qui per scaricare il PDF