politecnico di milano esercizi stringhe ricerca binaria

25
Politecnico Politecnico di Milano di Milano Esercizi Esercizi Stringhe Stringhe Ricerca binaria Ricerca binaria

Upload: concetta-grillo

Post on 01-May-2015

230 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Politecnico di Milano Esercizi Stringhe Ricerca binaria

PolitecnicoPolitecnicodi Milanodi Milano

EserciziEsercizi

StringheStringheRicerca binariaRicerca binaria

Page 2: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 22 - -

StringheStringhe

Array di caratteriFunzioni: strcpy() strcmp() strlen()

char stringaA[10], stringaB[10];

strcpy(stringaA, stringaB);Copia

Confronti(if, while, for)

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 spaziNon usare &

Page 3: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 33 - -

StringheStringhe

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");

\0sE2esempio1

Inizializzazione: char esempio2[5] = "AbC";oppure: char esempio1[] = "2Es";

\0CbAesempio2 ?

Page 4: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 44 - -

Codice di CesareCodice 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’alfabetoScrivere un programma che:

Accetti in ingresso una stringa (composta da soli caratteri minuscoli e priva di spazi) e un codiceScriva la versione crittografata della stringaDecripti il risultato e visualizzi la stringa originale.

Page 5: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 55 - -

Codice di CesareCodice di Cesare

a0

b1

c2

d3

e4

f5

g6

h7

i8

j9

k10

l11

m12

n13

o14

p15

q16

r17

s18

t19

u20

v21

w22

x23

y24

z25

Page 6: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 66 - -

Codice di CesareCodice 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++){

.

Page 7: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 77 - -

Codice di CesareCodice 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';

} .

Page 8: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 88 - -

Codice di CesareCodice 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 */

} .

Page 9: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 99 - -

Codice di CesareCodice 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);

} .

Page 10: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 1010 - -

Indirizzi InternetIndirizzi 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 caratteriCompleti 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”.

Page 11: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 1111 - -

Indirizzi InternetIndirizzi 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);

} .

Page 12: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 1212 - -

Indirizzi InternetIndirizzi 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); .

Page 13: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 1313 - -

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

Page 14: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 1414 - -

Indirizzi InternetIndirizzi 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");

}} .

Page 15: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 1515 - -

Algoritmo di ricerca binariaAlgoritmo 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)/2If dato == vett[medio]

trovato nella posizione indicata da medioElse if dato < vett[medio],

il dato dovrà essere in vett[i] con i=iniz,iniz+1,...,medio-1 allora fine = medio-1Else

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

Page 16: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 1616 - -

Algoritmo di ricerca binariaAlgoritmo di ricerca binaria

inizio fine

Dato da trovare: 8

inizio fine

2 7 8 10 15 220 1 2 3 4 5

226

2 7 8 10 15 220 1 2 3 4 5

226

fineinizio

medio

2 7 8 10 15 220 1 2 3 4 5

226

Trovato? NOInizio > fine? NO medio

2 7 8 10 15 220 1 2 3 4 5

226

Trovato? SI

medioTrovato? NO

Inizio > fine? NO

Page 17: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 1717 - -

Algoritmo di ricerca binariaAlgoritmo di ricerca binaria

inizio fine

Dato da trovare: 12

inizio fine

medio

2 7 8 10 15 220 1 2 3 4 5

226

2 7 8 10 15 220 1 2 3 4 5

226

2 7 8 10 15 220 1 2 3 4 5

226

fineinizio

2 7 8 10 15 220 1 2 3 4 5

226

iniziofine

medioTrovato? NO

Inizio > fine? NO

Trovato? NOInizio > fine? NO

Inizio > fine? SI

medio

Page 18: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 1818 - -

Ricerca binariaRicerca binaria

Scrivere un programma che, utilizzando le funzioni, permetta di:

Inserire i dati della carta d’identità di alcune personeDato 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.

Page 19: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 1919 - -

Ricerca binariaRicerca binaria

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

typedef char Stringa[30];

typedef struct{ Stringa nome, cognome; unsigned int eta; Stringa indirizzo;} CartaIdentita; .

Page 20: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 2020 - -

Ricerca binariaRicerca 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; .

Page 21: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 2121 - -

Ricerca binariaRicerca 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);

Page 22: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 2222 - -

Ricerca binariaRicerca binaria

if (trovato) {

return medio; /* Si ferma alla prima */ } /* occorrenza trovata */ else {

return -1; }} /* Fine funzione cercaBin() */ .

Page 23: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 2323 - -

Ricerca binariaRicerca binariavoid 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"); }} .

Page 24: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 2424 - -

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

Page 25: Politecnico di Milano Esercizi Stringhe Ricerca binaria

- - 2525 - -

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