politecnico di milano esercizi stringhe ricerca binaria
TRANSCRIPT
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); } .