Esercitazione #2



Esercizi su stringhe e funzioni

  • [9] Scrivere un programma tabellaASCII.c che legga due interi n e m e poi stampi la tabella di conversione ASCII per i caratteri compresi tra n e m.
    Nota: a seconda del sistema i codici ASCII significativi possono andare da 0 a 255, oppure da -128 a +127. Per scoprirlo potete provare ad includere il file <limits.h> e stampare i valori delle costanti CHAR_MIN e CHAR_MAX.

  • Soluzione: tabella


  • [10] Scrivere un programma maiuscole.c che legga una stringa di lunghezza inferiore a 100 e visualizza la stringa ottenuta sostituendo le lettere minuscole dell'alfabeto con lettere maiuscole.
    Suggerimento: per trasformare in carattere da minuscolo in maiuscolo operate direttamente sulla codifica ASCII.

  • Soluzione: maiuscole


  • [11] Scrivere la funzione void dollarize(char* str) che ricevuta la stringa str, la modifichi in modo che ogni vocale venga sostituita dal simbolo '$'.

    Soluzione: dollarize.c


  • [12] Scrivere un programma merge.c che legga due stringhe di lunghezza inferiore a 100 e costruisca una nuova stringa formata dai caratteri alternati delle due stringhe lette.
    Nota: Se una stringa ha lunghezza maggiore dell'altra, alternare i caratteri finché possibile e poi copiare quello che rimane della stringa più lunga.

  • Soluzione: merge


  • [13] Scrivere un programma che legga N interi e ne determini minimo e massimo sfruttando opportune funzioni ausiliarie min e max che prendono due interi e restituiscono il minimo / massimo tra i due.

  • Soluzione: testMinMax


  • [14] Scrivere un programma esponente.c che legga due interi positivi n e m e poi calcoli il valore nm sfruttando una funzione ausiliaria definita dall'utente, SENZA ricorrere a librerie matematiche.

  • Soluzione iterativa: esponente
    Soluzione ricorsiva: esponenteRic


  • [15] Un array di interi è un pianoro se è formato da tre parti in sequenza, di cui la prima strettamente crescente, la seconda "pianeggiante" (cioè composta da elementi tutti uguali), e la terza strettamente decrescente. Ognuna di queste parti puņ essere vuota.

    Ad esempio, sono pianori i seguenti array:

    • [ -2, 3, 5, 5, 5, 4, 2], dove la prima parte č [ -2, 3, 5], la seconda è [ 5, 5, 5], e la terza è [ 5, 4, 2];
    • [ 5, 5, 5, 4, 2], in cui la prima parte è vuota e le altre due sono ovvie;
    • [ 1, 2, 3], in cui la prima parte è ovvia, e le altre due sono vuote. Si noti che con la definizione data qualunque array di lunghezza minore o uguale a 2 è un pianoro. Un esempio di array che non è un pianoro è [2, 1, 3].

    Si scriva la funzione:

    int pianoro(int arr[], int size)

    dove size è la lunghezza di arr. La funzione pianoro deve restituire 1 (true) se e solo se l'array arr passato per argomento è un pianoro.

    Per testare la funzione, scrivere un main che senza chiedere alcun dato in input all'utente mostra il risultato dell'invocazione del metodo pianoro su diversi array, tra cui almeno gli esempi mostrati sopra e l'array vuoto (cioè con size 0). Per ognuno di questi array stampare prima il contenuto e poi il risultato dell'invocazione di pianoro con un opportuno commento.

  • Soluzione: pianoro.c


  • [16] In Russia i biglietti degli autobus sono numerati con numeri a 6 cifre. Si dice che un russo possa augurarsi una buona giornata se quando sale sul bus la mattina possiede un biglietto in cui somma delle prima 3 cifre e la stessa delle ultime 3.

    Sviluppare un programma che calcoli la probabilità di avere una buona giornata.

    Definire una funzione fortunato che verifica se un biglietto a 6 cifre è fortunato o meno.

    Contare il numero di biglietti fortunati totali e calcolare la probabilità (biglietti fortunati / biglietti totali).

    Calcolare la probabilità per biglietti da 2; 4; 6; 8; 10 cifre e concludere quindi quale sia il numero migliore di cifre perché i russi siano si sentano più fortunati.

    Soluzione: buonaGiornata.c


  • [17] Definire un nuovo tipo di dato, tramite il costrutto struct, capace di rappresentare una data come tre numeri (giorno, mese, anno).

    Scrivere una funzione che ricevuta una data (per riferimento) la aggiorni al giorno successivo (ignorando gli anni bisestili).

    Soluzione: date.c


  • [18] Scrivere un programma segmentoMassimo.c che calcola il segmento di somma massima di un array. Ad esempio, applicato all'array tmp, dato da

      int tmp [6] = {2, -4, 2, -1, 6, -3}
    
    restituisca il seguente segmento, di somma 7
      {2, -1, 6} .
  • Soluzione: segmentoMassimo


  • [19] Scrivere un programma ordinaStudenti.c che legge una sequenza di elementi di tipo studente da tastiera, nel formato

      nome  cognome  numero_matricola
    
    (tre stringhe di caratteri), li memorizza in un array di strutture opportunamente definito e li stampa in ordine alfabetico.
  • Soluzione: ordinaStudenti