Politecnico di Milano Esercizi Stringhe Ricerca binaria

Preview:

Citation preview

PolitecnicoPolitecnicodi Milanodi Milano

EserciziEsercizi

StringheStringheRicerca binariaRicerca 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 &

- - 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 ?

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

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

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

.

- - 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';

} .

- - 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 */

} .

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

} .

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

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

} .

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

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

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

}} .

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

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

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

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

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

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

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

- - 2222 - -

Ricerca binariaRicerca binaria

if (trovato) {

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

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

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

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

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

Recommended