Controlla doppia parola in una stringa

Un interessante esercizio in C con le stringhe. Letta una stringa di testo in input, vogliamo controllare se è costituita da una ripetizione di parole. Es. CiaoCiao è una parola doppia, mentre CiaoPippo non lo è. Implementiamo una soluzione in C usando i vettori di char con tutte le funzione e caratteristiche a loro connessi.

Il lettore non si spaventi. Si tratta niente poco di meno che di un problema di ricerca come se ne fanno tanti quando si inizia a programmare. L’idea algoritmica che ci dobbiamo porre alla base è che la parola può essere doppia solo se la stringa completa è pari: due parole di lunghezza pari fanno infatti una stringa ancora pari, e due parole di lunghezza dispari assieme fanno comunque una stringa ancora pari!

Procediamo quindi ad escludere il caso notevole appena descritto. Consiglio sempre agli studenti di individuare i casi particolari dei problemi che affrontano per escluderli in modo semplice ed istantaneo. Ne giova sicuramente la computazione. Per chi sta facendo una verifica, rappresenta anche un punteggio maggiore qualora non si riuscisse ad individuare ed implementare il caso generico.

Unica accortezza: se usiamo leggere le stringhe con la funzione gets o fgets, dobbiamo ricordarci che l’ultimo carattere inserito è quello del tasto invio, che dobbiamo quindi escludere dal conteggio della lunghezza reale.

Il restante problema generico è semplice: dividendo in due la stringa tengo due contatori uno che controlla la parola iniziale, uno che controlla la seconda parola che parte da metà. Se nei controlli emerge almeno una lettera diversa, la funzione ritorna segnalando che la stringa non è doppia.

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


int strigaDoppia(char *s)
{
  int i;
  int lunghezza = strlen(s) -1;
  int metapiuuno = lunghezza / 2;

   printf("%d",lunghezza);
  //se è dispari non può essere doppia!
  if (lunghezza %2 != 0 )
    return 0;

  
  for(i=0; i < lunghezza/2; i++)
  {
    if (s[i] != s[i + metapiuuno])
    {
      printf("%d %c %c",i, s[i],s[i + metapiuuno]);
      return 0;     
    }  
  }  
  return 1;
}


int main() 
{
  char stringa[100]; 
  printf("Inserisci una frase ");
  fgets(stringa, 100, stdin);
  //puts(stringa);

  if (strigaDoppia(stringa) == 0)
  {
    printf("Non e' doppia");
  }  
  else
  {
    printf("E' doppia");
  }  
  return 0;
}

Ultima modifica 17 Giugno 2022