Politecnico di Milano Esercizi Stringhe Ricerca binaria
- 2 - Stringhe Array di caratteri Funzioni: strcpy() strcmp() strlen() char stringaA[10], stringaB[10]; strcpy(stringaA, stringaB); Copia Confronti (if, while, for) if (strcmp(stringaA, stringaB) 0)… Specificatore di formato: "%s" Note per la scanf() : La stringa letta non può contenere spazi Non usare &
- 3 - 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"); \0sE2 esempio1 Inizializzazione: char esempio2[5] = "AbC"; oppure: char esempio1[] = "2Es"; \0CbA esempio2 ?
- 4 - Codice di Cesare La codifica crittografica di Cesare consiste nel sostituire ogni carattere con quello che si trova nella k-esima posizione successiva dellalfabeto. 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 dellalfabeto 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.
- 5 - Codice di Cesare a0a0 b1b1 c2c2 d3d3 e4e4 f5f5 g6g6 h7h7 i8i8 j9j9 k 10 l 11 m 12 n 13 o 14 p 15 q 16 r 17 s 18 t 19 u 20 v 21 w 22 x 23 y 24 z 25
- 6 - Codice di Cesare #include 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++) {.
- 7 - 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'; }.
- 8 - 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 */ }.
- 9 - 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 allutente di inserire degli indirizzi Internet (per es: ftp.pippo.com) controllando che siano lunghi almeno quattro caratteriwww.polimi.itftp.pippo.com Completi lindirizzo con il relativo protocollo (es: ftp://ftp.pippo.com) Scriva gli indirizzi sul monitor. Se lindirizzo da stampare è il programma dovrà visualizzare SITO DEL POLI.
Indirizzi Internet #include 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, " } 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], " == 0) { printf ("E il sito del Poli!"); } printf ("\n"); } }.
Algoritmo di ricerca binaria Lalgoritmo funziona sse lutente inserisce i dati già ordinati (in senso crescente nellesempio 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 If dato == vett[medio] trovato nella posizione indicata da medio Else if dato < 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 solo in 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).
Algoritmo di ricerca binaria inizio fine Dato da trovare: 8 inizio fine fine inizio medio Trovato? NO Inizio > fine? NO medio Trovato? SI medio Trovato? NO Inizio > fine? NO
Algoritmo di ricerca binaria inizio fine Dato da trovare: 12 inizio fine medio fine inizio iniziofine medio Trovato? NO Inizio > fine? NO Inizio > fine? SI medio
Ricerca binaria Scrivere un programma che, utilizzando le funzioni, permetta di: Inserire i dati della carta didentità 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 lalgoritmo di ricerca binaria. Si assume che le carte didentità siano inserite già ordinate per cognome. In caso di cognome duplicato, la ricerca si fermerà alla prima occorrenza trovata.
Ricerca binaria #include 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); }.