Innanzitutto spero che la seguente domanda sia un po' più intelligente di quelle che ho postato di recente. Stavolta ciò che non capisco è come si comporta un'istruzione else sotto ad un ciclo while che non ha le parentesi graffe. Per capire meglio ciò che intendo prediamo in considerazione il seguente algoritmo di ricerca, guardate sotto al commento "RICERCA SEQUENZIALE":
- Codice: Seleziona tutto
#include <stdio.h>
#include <time.h>
int main() {
srand(time(NULL)); /*inizializzo la funzione rand con l'orario corrente per avere numeri ogni volta diversi*/
const int N=20; /*dichiaro la dimensione N del vettore*/
const int MAX=50; /*dichiaro il valore massimo contenuto nelle celle del vettore*/
int vet[N]; /*dichiaro un vettore di N interi*/
int x;
int numero_da_cercare; /*dichiaro la variabile che conterrà il valore da cercare*/
/*RIEMPIMENTO DEL VETTORE*/
for(x=0; x<N; x++) {
vet[x]=rand()%MAX; /*assegno un valore casuale tra 0 e MAX-1 alla cella vet[x]*/
printf("vet[%2d] = %2d\n", x, vet[x]); /*visualizzo i valori del vettore*/
}
/*INSERIMENTO DEL VALORE DA RICERCARE*/
do {
printf("\nInserisci il valore da cercare (valore tra 0 e %d): ", MAX-1);
scanf("%d", &numero_da_cercare);
}while(numero_da_cercare<0 || numero_da_cercare>MAX-1); /*finché non è tra 0 e MAX continuo a chiedere
l'inserimento*/
/*RICERCA SEQUENZIALE*/
x=0;
while(vet[x]!=numero_da_cercare && x<N) /*scandisco il vettore finché non trovo il valore cercato o sono in
fondo*/
x++;
/*COMUNICAZIONE DEL RISULTATO DELLA RICERCA*/
/*verifico la condizione d'uscita dal ciclo*/
if(vet[x]==numero_da_cercare) { /*se sono uscito perché ho trovato il valore cercato*/
printf("\nIl valore %d e' presente in posizione %d.\n", numero_da_cercare, x);
}else { /*se sono uscito perché ho scandito tutto il vettore*/
printf("\nIl valore %d non e' stato trovato.\n", numero_da_cercare);
}
return 0;
}
perché il printf di else non viene stampato per tutte le volte che "vet[x]!=numero_da_cercare" ? Se si fanno 5 paragoni e tutti e 5 sono che "vet[x]!=numero_da_cercare", com'è scritto il codice, io mi aspetto che il printf di else venga stampato 5 volte (ed è ciò che accade se metto le parentesi graffe al ciclo while), in realtà però così come è stato scritto il codice (senza le parentesi graffe) il ciclo while fa prima tutti i paragoni, poi se tutti i valori risultano che "vet[x]!=numero_da_cercare" allora si attiva else. Però non ne comprendo il motivo (tale codice l'ho preso da questo sito, lo trovate come primo allegato, verso la fine)...
Io per esempio per creare un algoritmo di ricerca mi sono arrangiato così:
- Codice: Seleziona tutto
#include <stdio.h>
/*determinare se un carattere è già presente all’interno di un vettore*/
#define MAX_ELE 99 /*limite del vettore*/
main(void) {
int x, grandezza_vettore;
int volte=0;
char carattere;
char vettore[MAX_ELE];
/*inserimento della grandezza del vettore*/
printf("Inserisci la grandezza del vettore (massimo %d): ", MAX_ELE);
scanf("%d", &grandezza_vettore);
if(grandezza_vettore>MAX_ELE || grandezza_vettore<1) {
do {
printf("Grandezza non valida. Inserisci una grandezza valida: ");
scanf("%d", &grandezza_vettore);
}while(grandezza_vettore>MAX_ELE || grandezza_vettore<1);
}
/*inserimento dei caratteri all'interno del vettore*/
printf("\nInserisci i caratteri all'interno del vettore:\n");
for(x=0; x<grandezza_vettore; x++) {
vettore[x]=EOF;
printf("Posizione %2d: ", x);
while(vettore[x]=='\n' || vettore[x]==EOF) {
scanf("%c", &vettore[x]);
}
}
/*inserimento del carattere da cercare*/
carattere=EOF;
printf("\nInserisci il carattere da cercare: ");
while(carattere=='\n' || carattere==EOF) {
scanf("%c", &carattere);
}
/*ricerca del carattere inserito*/
for(x=0; x<grandezza_vettore; x++) {
if(carattere==vettore[x]) {
volte++;
}
}
if(volte==1) {
printf("\nLa ricerca ha prodotto un risultato. Il carattere %c si trova nella posizione n.", carattere);
for(x=0; x<grandezza_vettore; x++) {
if(carattere==vettore[x]) {
printf("%d.", x);
}
}
}else if(volte>1) {
printf("\nLa ricerca ha prodotto %d risultati. Il carattere %c si trova nelle seguenti posizioni:", volte,
carattere);
for(x=0; x<grandezza_vettore; x++) {
if(carattere==vettore[x]) {
printf("\nPosizione n.%d", x);
}
}
}else {
printf("\nIl carattere %c risulta assente.", carattere);
}
printf("\n");
return 0;
}
Ci sono i famosi EOF poiché sennò le variabili char danno problemi. Comunque l'algoritmo di ricerca è semplicissimo: c'è una variabile che ho chiamato "volte" (forse non è proprio un nome adatto) che è inizializzata a 0. C'è un ciclo for che incrementa la variabile "x" per un numero di volte pari alla grandezza del vettore. All'interno del ciclo for c'è un'istruzione if che dice: "se il carattere da cercare è uguale al valore di vettore[x] allora la variabile "volte" viene incrementata di 1", poi proseguono le altre istruzioni if-else che si basano sulla variabile "volte"...
Tale algoritmo però non è tra i migliori... comunque ritornando alla domanda, potete spiegarmi il meccanismo che regola l'istruzione else presente nel ciclo while di cui ho parato prima?

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)







