namespace strings_2; class Program { static void Main(string[] args) { Menu(); } static void Menu() { Console.Clear(); int scelta; do { Console.WriteLine("Inserire un'opzione:"); Console.WriteLine("1. Verifica parola palindroma"); Console.WriteLine("2. Verifica frase palindroma"); Console.WriteLine("3. Conta occorrenze"); Console.WriteLine("4. Sostituisci lettera"); Console.WriteLine("5. Prima lettere pari, poi dispari"); Console.WriteLine("0. Esci"); Console.Write("Scelta: "); scelta = Convert.ToInt32(Console.ReadLine()); switch (scelta) { case 0: break; case 1: Console.Clear(); if (Palindromo()) { Console.WriteLine("La parola è palindroma"); } else{ Console.WriteLine("La parola non è palindroma"); } Pausa(); break; case 2: Console.Clear(); Pausa(); break; case 3: Console.Clear(); Console.Clear(); break; case 4: Console.Clear(); Pausa(); break; case 5: Console.Clear(); Pausa(); break; default: Console.WriteLine("Opzione non valida."); Pausa(); break; } } while (scelta != 0); } static void Pausa() { Console.WriteLine("Premere un tasto per continuare. . ."); Console.ReadKey(); Console.Clear(); } static char[] InsertionSort(char[] p_array) { //implementazione ufficiale copiata da Classroom int i, j; char temp; for (i = 1; i < p_array.Length; i++) { temp = p_array[i]; j = i - 1; while (j >= 0 && p_array[j] > temp) { p_array[j + 1] = p_array[j]; j--; } p_array[j + 1] = temp; } return p_array; } static bool Palindromo() { string stringa; bool ritorno; do { Console.Write("Inserire una parola: "); stringa = Console.ReadLine().ToLower(); //convertita in minuscolo per identificare palindromi case insensitive if (stringa.Contains(' ')) { Console.WriteLine("È consentito inserire solo una parola. Per inserire una frase scegliere l'opzione 2."); Pausa(); } } while (stringa.Contains(' ')); char[] metà1 = stringa.Substring(0, stringa.Length / 2).ToCharArray(); //divido la stringa a metà, prendo la prima e la converto in array di char per riordinarne le lettere char[] metà2 = stringa.Substring(stringa.Length/2, stringa.Length/2).ToCharArray(); //divido la stringa a metà, prendo la seconda e la converto in array di char per riordinarne le lettere string metàOrdinata1 = string.Join("", InsertionSort(metà1));//ordino la prima metà della stringa e la riconverto da array di char in stringa string metàOrdinata2 = string.Join("", InsertionSort(metà2));//ordino la secondo metà della stringa e la riconverto da array di char in stringa //le due metà prima vengono convertite in array di char per riordinarle, poi vengono convertite in stringa dopo essere state ordinate per calcolarne l'hash con il metodo integrato if (metàOrdinata1.GetHashCode() == metàOrdinata2.GetHashCode()) {//se l'hash delle due metà ordinate coincide ritorno = true; } else { ritorno = false; } return ritorno; } }