Ordina maiuscole e minuscole in C

Un esercizio interessante in C con le stringhe. Vogliamo inserire una stringa in input e ordinare le lettere maiuscole mettendole nelle prime posizioni al posto delle minuscole.

Leggere una stringa in input

La lettura di una stringa in ingresso può essere fatta in due modi. Il primo leggiamo lettera per lettera da input con scanf e carichiamo un vettore di char corrispondete. Scomodo decisamente. Oppure possiamo utilizzare i metodi gets o fgets. Il primo prende in ingresso la stringa senza chiedere dimensione del buffer, molto comodo, ma ritenuto poco sicuro negli ultimi compilatori. L’alternativa è usare fgets che prende tre parametri, la variabile su cui posizionare la stringa, la sua dimensione almeno forfettaria sovrastimata e da che input leggere se file o da console con la dicitura stdin.

Occhio: la lettura con gets/fgets, aggiunge un carattere in più, quello del pulsante di invio. Dobbiamo tenerne conto quando andiamo a conteggiare la lunghezza reale della parola.

L’ordinamento

In realtà c’è il trucco. L’esercizio di ordinamento si rifà molto all’algoritmo di selection sort classico con due cicli annidati e gli scambi successivi. Anche qui procediamo quindi in modo molto simile. I controlli sulle lettere possiamo farli o utilizzando direttamente gli intervalli a-z e A-z o rifarci alla mappa ASCII con i numeri interi corrispondenti ai range di lettere che ci interessano. La cosa interessante sta che possiamo utilizzare i simboli di > e < con i caratteri come se fossero numeri, proprio perché è implicito il valore numerico della tabella ASCII corrispondente.

Se il doppio ciclo individua una lettera maiuscola da scambiare, scambiamo subito. Occhio per scambiare due variabili occorre sempre una terza variabile di appoggio per non sovrascrivere e perdere i valori.ordinamento ma

/**
 * Letta in input una stringa di testo, ordina la stringa posizionando 
 * in testa le lettere maiuscole
 */
#include <stdio.h>
#include <string.h>

int main(void) 
{
  char stringa[100];
  char tmp;
  int i,j;
  int lunghezza;
  
  printf("Inserisci la stringa da ordinare ");
  fgets(stringa, sizeof(stringa), stdin);
  lunghezza = strlen(stringa) -1;
  
  for (i=0; i < lunghezza; i++)
  {
    //controllo se la lettera è minuscola, quindi cerco di scambiarla 
    if (stringa[i] >= 'a' && stringa[i] <= 'z' )
    {
      //printf("%c", stringa[i]); //DEBUG
      for (j= i + 1; j < lunghezza; j++)
      {
        //cerco una maiuscola successiva
        if (stringa[j] >= 'A' && stringa[j] <= 'Z' )
        {
          //se trovo la maiuscola, la scambio con la minuscola
          tmp = stringa[i];
          stringa[i]=stringa[j];
          stringa[j]=tmp;
        }  
      }  
    }  
  } 

  puts(stringa);
  return 0;
}

Listati

Provalo su Replit -> qui

Ultima modifica 21 Giugno 2022