1 / 25

Esercizi

Esercizi. Stringhe Ricerca binaria. Stringhe. Array di caratteri Funzioni: strcpy() strcmp() strlen() char stringaA[ 10 ], stringaB[ 10 ]; strcpy(stringaA, stringaB);. Copia.

addison
Télécharger la présentation

Esercizi

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Esercizi StringheRicerca binaria

  2. 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)

  3. 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";

  4. 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.

  5. Codice di Cesare

  6. 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++) { .

  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); } .

  10. 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”.

  11. 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); • } .

  12. 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); .

  13. 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() */ .

  14. 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"); • } • } .

  15. 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).

  16. 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

  17. 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

  18. 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.

  19. Ricerca binaria • #include <stdio.h> • #include <string.h> • typedef char Stringa[30]; • typedef struct • { • Stringa nome, cognome; • unsigned int eta; • Stringa indirizzo; • } CartaIdentita; .

  20. 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; .

  21. 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);

  22. Ricerca binaria • if (trovato) • { return medio; /* Si ferma alla prima */ • } /* occorrenza trovata */ • else • { return-1; • } • } /* Fine funzione cercaBin() */ • .

  23. 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"); • } • } .

  24. 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 & */.

  25. 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); • } .

More Related