250 likes | 449 Vues
Esercizi. Stringhe Ricerca binaria. Stringhe. Array di caratteri Funzioni: strcpy() strcmp() strlen() char stringaA[ 10 ], stringaB[ 10 ]; strcpy(stringaA, stringaB);. Copia.
E N D
Esercizi StringheRicerca binaria
Stringhe • Array di caratteri • Funzioni: strcpy()strcmp() strlen() char stringaA[10], stringaB[10];strcpy(stringaA, stringaB); Copia if (strcmp(stringaA, stringaB) < 0)…if (strcmp(stringaA, stringaB) == 0)…if (strcmp(stringaA, stringaB) > 0)… • Specificatore di formato: "%s" • Note per la scanf(): • La stringa letta non può contenere spazi • Non usare & Confronti(if, while, for)
esempio1 2 E s \0 esempio2 A b C \0 ? Stringhe • Terminatore ‘\0’ usato dalle funzioni standard di string.h per segnalare la fine della stringa: char esempio1[4], esempio2[5];strcpy (esempio1, "2Es");strcpy (esempio2, "AbC"); • Inizializzazione: char esempio2[5] = "AbC";oppure: char esempio1[] = "2Es";
Codice di Cesare • La codifica crittografica di Cesare consiste nel sostituire ogni carattere con quello che si trova nella k-esima posizione successiva dell’alfabeto. Il numero k rappresenta la chiave (0 < k < 26). • Es. k = 2 : ‘a’ ‘c’, ‘e’ ‘g’, ‘z’ ‘b’ • Per decriptare, basta sostituire ogni carattere con quello che si trova nella k-esima posizione precedente dell’alfabeto • Scrivere un programma che: • Accetti in ingresso una stringa (composta da soli caratteri minuscoli e priva di spazi) e un codice • Scriva la versione crittografata della stringa • Decripti il risultato e visualizzi la stringa originale.
Codice di Cesare #include <stdio.h> #include <string.h> const unsigned int CRIPTA = 0; const unsigned int DECRIPTA = 1; void codificaCesare (char parola[], unsigned int k, unsigned int azione) { int i = 0, temp; for (i = 0; i < strlen(parola); i++) { .
Codice di Cesare if (azione == CRIPTA) { parola[i] = parola[i] - 'a'; temp = parola[i] + k; if (temp < 26) { parola[i] = temp; } else { parola[i] = temp - 26; } parola[i] = parola[i] + 'a'; } .
Codice di Cesare else/* decripta */ { parola[i] = parola[i] - 'a'; temp = parola[i] - k; if (temp >= 0) { parola[i] = temp; } else { parola[i] = temp + 26; } parola [i] = parola[i] + 'a'; } } /* fine ciclo for */ } .
Codice di Cesare void main() { char parola[20]; unsigned int chiave, i; printf ("Parola: "); scanf ("%s", parola); printf ("Chiave: "); scanf ("%u", &chiave); codificaCesare(parola, chiave, CRIPTA); printf ("Criptata: "); printf ("%s\n", parola); codificaCesare(parola, chiave, DECRIPTA); printf ("Decriptata: %s", parola); } .
Indirizzi Internet • Scrivere un programma basato su funzioni che: • Chieda all’utente di inserire degli indirizzi Internet(per es: “www.polimi.it, ftp.pippo.com”)controllando che siano lunghi almeno quattro caratteri • Completi l’indirizzo con il relativo protocollo(es: “http://www.polimi.it, ftp://ftp.pippo.com”) • Scriva gli indirizzi sul monitor. Se l’indirizzo da stampare è “http://www.polimi.it”,il programma dovrà visualizzare “SITO DEL POLI”.
Indirizzi Internet • #include <stdio.h> • #include <string.h> • typedef char Stringa[100]; • void leggiInd (Stringa indirizzi[],unsigned int nInd); • void scriviInd(Stringa indirizzi[],unsigned int nInd); • void main() • { • const unsigned int NUMIND = 4; • Stringa indirizzi[NUMIND]; • leggiInd (indirizzi, NUMIND); • scriviInd (indirizzi, NUMIND); • } .
Indirizzi Internet • void leggiInd (Stringa indirizzi[], unsigned int nInd) • { • unsigned int i; • Stringa protocollo; • for (i = 0; i < nInd; i++) • { • do • { • printf ("Indirizzo %d: ", i); • scanf ("%s", indirizzi[i]); /* NO & */ • } while (strlen (indirizzi[i]) < 4); .
Indirizzi Internet • if (strstr (indirizzi[i], "ftp.") != NULL) • { • strcpy (protocollo, "ftp://"); • } • else • { • strcpy (protocollo, "http://"); • } • strcat (protocollo, indirizzi[i]); • strcpy (indirizzi[i], protocollo); • } • } /* Fine funzione leggiInd() */ .
Indirizzi Internet • void scriviInd (Stringa indirizzi[],unsigned int nInd) • { • unsigned int i; • for (i = 0; i < nInd; i++) • { • printf ("Indirizzo: %s ", indirizzi[i]); • if (strcmp (indirizzi[i],"http://www.polimi.it") == 0) • { • printf ("E’ il sito del Poli!"); • } • printf ("\n"); • } • } .
Algoritmo di ricerca binaria L’algoritmo funziona sse l’utente inserisce i dati già ordinati (in senso crescente nell’esempio che segue) Algoritmo per trovare dato in vett[LUNGH]: inizio=0, fine=LUNGH–1 Do Calcola punto di mezzo dell'elenco: medio=(inizio+fine)/2 Ifdato == vett[medio]trovato nella posizione indicata da medio Elseifdato < vett[medio], il dato dovrà essere in vett[i] con i=iniz,iniz+1,...,medio-1 allora fine = medio-1 Else il dato cercato può essere soloin vett[i] con i=medio+1,medio+2,...,fine allora inizio=medio+1 While (dato non trovato and tra inizio e fine ci sono celle).
0 1 2 3 4 5 6 0 1 2 3 4 5 6 2 7 8 10 15 22 22 2 7 8 10 15 22 22 inizio medio inizio fine fineinizio fine medio medio 0 0 1 1 2 2 3 3 4 4 5 5 6 6 2 2 7 7 8 8 10 10 15 15 22 22 22 22 Algoritmo di ricerca binaria Dato da trovare: 8 Trovato? NOInizio > fine? NO Trovato? NOInizio > fine? NO Trovato? SI
0 1 2 3 4 5 6 0 1 2 3 4 5 6 2 7 8 10 15 22 22 2 7 8 10 15 22 22 inizio medio inizio fine inizio fine fineinizio fine medio medio 0 0 1 1 2 2 3 3 4 4 5 5 6 6 2 2 7 7 8 8 10 10 15 15 22 22 22 22 Algoritmo di ricerca binaria Dato da trovare: 12 Trovato? NOInizio > fine? NO Trovato? NOInizio > fine? NO Inizio > fine? SI
Ricerca binaria • Scrivere un programma che, utilizzando le funzioni, permetta di: • Inserire i dati della carta d’identità di alcune persone • Dato un cognome, cercare se corrisponde ad una persona nel vettore. In caso positivo, visualizzare la posizione nel vettore e tutti i dati personali • Utilizzare l’algoritmo di ricerca binaria. Si assume che le carte d’identità siano inserite già ordinate per cognome. • In caso di cognome duplicato, la ricerca si fermerà alla prima occorrenza trovata.
Ricerca binaria • #include <stdio.h> • #include <string.h> • typedef char Stringa[30]; • typedef struct • { • Stringa nome, cognome; • unsigned int eta; • Stringa indirizzo; • } CartaIdentita; .
Ricerca binaria • /* Ricerca binaria (array ordinato) */ • int cercaBin (CartaIdentita persone[],unsigned int lungh, Stringa cerca) • { • typedef enum {falso, vero} Booleano; • int iniz, fine, medio; • Booleano trovato; • iniz = 0; • fine = lungh - 1; • trovato = falso; .
Ricerca binaria • do • { • medio = (iniz + fine) / 2; • if(strcmp(cerca,persone[medio].cognome)<0) • { fine = medio - 1; • } • else if(strcmp(cerca,persone[medio].cognome)>0) • { • iniz = medio + 1; • } • else • { • trovato = vero; • } • } while (!trovato && iniz <= fine);
Ricerca binaria • if (trovato) • { return medio; /* Si ferma alla prima */ • } /* occorrenza trovata */ • else • { return-1; • } • } /* Fine funzione cercaBin() */ • .
Ricerca binaria • void stampa (int p, CartaIdentita persone[]) • { • if (p != -1) • { printf ("Trovato in posiz: %d\n", p); • printf ("Cognome: %s\n",persone[p].cognome); • printf ("Nome: %s\n", persone[p].nome); • printf ("Età: %u\n", persone[p].eta); • printf ("Indirizzo: %s\n", persone[p].indirizzo); • } • else • { • printf ("Non trovato\n"); • } • } .
Ricerca binaria • void main() • { • const int LUNGH = 5; • CartaIdentita listaPersone[LUNGH]; • Stringa cognomeCercato; • int posiz; • unsigned int i; • for (i = 0; i < LUNGH; i++) • { • printf ("Cognome: "); • scanf("%s",listaPersone[i].cognome);/* NO & */ • printf ("Nome: "); • scanf("%s",listaPersone[i].nome); /* NO & */.
Ricerca binaria printf ("Età: "); • scanf ("%u", &listaPersone[i].eta); /* con & */ • printf ("Indirizzo: "); • scanf("%s",listaPersone[i].indirizzo);/*NO & */ • } • printf ("Cognome da cercare: "); • scanf ("%s", cognomeCercato); /* NO & */ • posiz=cercaBin(listaPersone,LUNGH,cognomeCercato); • stampa (posiz, listaPersone); • } .