DOMANDA Linguaggio C,Aiuto!!!

pabloski

Utente Èlite
2,868
916
É moralmente sbagliato usare il break all'interno del ciclo for , sarebbe più opportuno che riguardassi il codice e trovassi un alternativa , perché mettendo quel brak andresti a contraddire la definizione stessa del ciclo for.

In pratica una cosa del genere?

C:
for(i=0; (strcmp(nuovo[i].titolo,ricerca)!=0), i<numero;i++) {}

Questo qui esce in due casi:
  1. viene effettivamente trovato il libro, cioè strcmp == 0
  2. non viene trovato il libro e i == numero
All'uscita di può verificare se il libro è stato trovato così

C:
if (i==numero) printf("Libro non trovato");
else printf("Libro trovato");

Un'altra possibilità sarebbe

C:
for(i=0; i<numero;i++)
    if (strcmp(nuovo[i].titolo,ricerca)==0) {
             printf("Libro trovato");
             i = numero-1;
    }

In entrambi i casi devi giocare con l'indice e numero, cosa che può causare bug e disastri appena distogli lo sguardo.

Imho break è la soluzione più elegante e sicura.
 

Andretti60

Utente Èlite
6,440
5,091
...
Un'altra possibilità sarebbe

C:
for(i=0; i<numero;i++)
    if (strcmp(nuovo[i].titolo,ricerca)==0) {
             printf("Libro trovato");
             i = numero-1;
    }

In entrambi i casi devi giocare con l'indice e numero, cosa che può causare bug e disastri appena distogli lo sguardo.
quella versione e' proprio orribile :) ma ovviamente funziona.

Del resto ho visto cose peggiori, tipo:
Codice:
short i;

for (i = 0; i >= 0; i++)
{
    ....
}

Cerco sempre di evitare cose del genere
 

pabloski

Utente Èlite
2,868
916
Del resto ho visto cose peggiori, tipo:
Codice:
short i;

for (i = 0; i >= 0; i++)
{
    ....
}

Cerco sempre di evitare cose del genere

E' in questi casi che si vede il valore dei linguaggi ad alto livello nell'educare correttamente il programmatore. Il C pone pochissime restrizioni sui tipi di dati e sugli operatori e la probabilità di sbagliare diventa molto alta.

Però appunto è utile per capire il valore dei linguaggi formali all'estremo, come Haskell.
 

Andretti60

Utente Èlite
6,440
5,091
E' in questi casi che si vede il valore dei linguaggi ad alto livello nell'educare correttamente il programmatore. Il C pone pochissime restrizioni sui tipi di dati e sugli operatori e la probabilità di sbagliare diventa molto alta.

Però appunto è utile per capire il valore dei linguaggi formali all'estremo, come Haskell.
Non c’è nulla di sbagliato nel codice da me postato, che esegue un loop esattamente 32767 volte
Il problema del C è che permette di scrivere codice illeggibile, come quello sopra. Molti ragazzi qui sbagliano perché non usano un buon compilatore che avvisa probabili errori (tipo variabili utilizzate ma non inizializzate) e usano C standard invece di Ansii. Se ben insegnato, il linguaggio C può funzionare bene come linguaggio educativo, molto meglio di Python per esempio, che è più semplice da imparare ma poi utilizzarlo bene è una bella sfida.
Altro esempio: mi stupisco sempre che qui c’è gente che impara a programmare ma a cui non hanno ancora insegnato come usare un debugger la maggior parte dei problemi che hanno verrebbero risolti in pochi minuti. E come saprai il debugger è lo strumento che ormai il programmatore utilizza più di ogni altro nel suo lavoro giornaliero, indipendentemente dal linguaggio che si utilizza.
 

pabloski

Utente Èlite
2,868
916
Non c’è nulla di sbagliato nel codice da me postato, che esegue un loop esattamente 32767 volte

il codice è ok

è il linguaggio che non aiuta a capire facilmente la semantica delle istruzioni

quello che hai fatto è un esempio innocuo, ma in altri casi è facile perdersi un unsigned che non c'è ( per esempio )...se non sbaglio proprio questa fu la ragione di un bug nel pacchetto Debian di OpenSSL

e non apriamo il capitolo dei comportamenti non definiti

e infine ci ritroviamo con i compilatori che devono improvvisarsi geni per riuscire ad ottimizzare pezzi di codice che capiscono poco o niente
 
  • Mi piace
Reazioni: Andretti60

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili