Errori in ANSI C
Salve a tutti raga...dovrei creare un errore di digitazione all'interno di un programma...ma ho un piccolo problemino...
Vi spiego: i soli numeri ke possono essere digitati sono 1, 2, 3, tutto l'altro resto può andarsi a farsi fottere!!!!...il ciclo while ripeterà l'operazione di parametro errato finkè il valore inserito nn sia quello giusto!
Questa implememntazione lo fa, ma manda a farsi fottere anke i valori ke possono essere digitati 1, 2, 3....mi spiegate dove sbaglio????...grazie mille...ciao!!!!
Vi spiego: i soli numeri ke possono essere digitati sono 1, 2, 3, tutto l'altro resto può andarsi a farsi fottere!!!!...il ciclo while ripeterà l'operazione di parametro errato finkè il valore inserito nn sia quello giusto!
Questa implememntazione lo fa, ma manda a farsi fottere anke i valori ke possono essere digitati 1, 2, 3....mi spiegate dove sbaglio????...grazie mille...ciao!!!!
#include <stdio.h> int main() { int g, f; int s[30]; printf("\nAccetto solo 1, 2, 3: \n"); scanf("%s", s); if(s != 1 || s != 2 || s != 3) { while(s != 1 || s != 2 || s != 3) { printf("\nParametro errato!\n"); scanf("%s", s); } } else { printf("\nCian\n"); } return 0; }[/quote]
Risposte
Prova a mettere la condizione del while (e forse anche dell'if) in AND invece che OR.
Ciao
Ciao
no mi disp ma nn va...cmq nella compilazione mi da 3 warning, indipendentemente se faccio cm dici tu o no:
warning: comparison between pointer and integer
un modo nn dico x risolverlo, ma per capire!!!!...cmq ti ringrazio x l'aiuto...ringrazio ki mi può aiutare o ki cmq si interessa...CIAO!!!!
warning: comparison between pointer and integer
un modo nn dico x risolverlo, ma per capire!!!!...cmq ti ringrazio x l'aiuto...ringrazio ki mi può aiutare o ki cmq si interessa...CIAO!!!!
stai facendo confusione tra il puntatore e un intero.
prova a mettere
s!=1 (e poi 2 e 3)
ovviamente poi devi ciclare sulla i.
ciao
prova a mettere
s!=1 (e poi 2 e 3)
ovviamente poi devi ciclare sulla i.
ciao
wedge.innanzitutto graie x l'interessamento...ma mi devi comprendere sn ancor alle prime armi....
intendevi questo???
xkè nn va????...sapresti correggermi????...nn mi accetta nemmeno i parametri 1, 2 3...ufff!!!!!.....ciao e grazie ancora![/code]
intendevi questo???
#include <stdio.h> int main() { int g, f, i; char s[30]; printf("\nAccetto solo 1, 2, 3: \n"); for(i = 0; i < 20; ++i) { scanf("%c", &s); if(s[i] != 1 || s[i] != 2 || s[i] != 3) { while(s[i] != 1 || s[i] != 2 || s[i] != 3) { printf("\nParametro errato!\n"); scanf("%c", &s); } } else { printf("\nCian\n"); } } return 0; }[/quote]
xkè nn va????...sapresti correggermi????...nn mi accetta nemmeno i parametri 1, 2 3...ufff!!!!!.....ciao e grazie ancora![/code]
"giocala88":
wedge.innanzitutto graie x l'interessamento...ma mi devi comprendere sn ancor alle prime armi...
Stai studiando il linguaggio C su qualche manuale ? Se sì, qual è ? In caso contrario, rifletti seriamente sul fatto che è impossibile imparare il proprio primo linguaggio di programmazione da neofita "ad orecchio", perché in questa prima fase si sommano le difficoltà di apprendimento della sintassi e semantica di un linguaggio artificiale (nulla di trascendentale, ma c'è sempre l'effetto "prima volta") con l'acquisizione della forma mentis logico-matematica richiesta dalla programmazione.
Questo è doppiamente vero per il linguaggio C, che oltretutto è anche denso di concetti "informatichesi" strettamente legati al dominio della soluzione, cioè ai calcolatori Von Neumann del mondo reale ed a tutte le loro peculiarità...
Il linguaggio C è una sorta di macroassembler, non "facilita la vita" a chi inizia (e neppure a molti esperti in tutt'altri linguaggi di alto livello), non dispone di funzioni complesse e a "prova di scimmia" per l'input e l'output sofisticato al quale sono abituati gli utenti di PC, sebbene siano disponibili miriadi di librerie di terze parti per realizzare gli scopi più vari.
Nel tuo sorgente si evidenzia una certa confusione tra char e interi (sì, è vero che i char sono piccoli interi, ma c'è di mezzo la rappresentazione ASCII). Ti propongo un listato "scolastico", che certo nessun professionista userebbe mai

#include <stdio.h> #include <stdlib.h> //#include <string.h> int main() { char s[16]; int val; puts("\nDigita una cifra, scelta dall'insieme {1, 2, 3}: "); while (1) { scanf("%s", s); val = atoi(s); //if (strlen(s) > 2) continue; if ((val > 0) && (val < 4)) { puts("Inserimento effettuato correttamente"); break; } else { puts("Errore ! Prova ancora."); } } return 0; }
Nota: se abiliti il controllino ridondante sulla lunghezza della stringa, ricordati anche di de-commentare lo statement per l'inclusione dello header "string.h". Buon divertimento...

nn so cm ringraziarti...cmq sn al primo anno di informatica...studio all'università!!!!...grazie...ciao!!!
Andrea69..ti ringrazio ma un' ultima cosa se mi permetti...il breack all'interno di una istruzione che non sia uno switch il mio prof nn lo vuole...cm posso sostituiirlo????....risp ragazzi...ciao e grazie ancora!!!!
"giocala88":
Andrea69..ti ringrazio ma un' ultima cosa se mi permetti...il breack all'interno di una istruzione che non sia uno switch il mio prof nn lo vuole...cm posso sostituiirlo????....risp ragazzi...ciao e grazie ancora!!!!
Puoi utilizzare la sana, vecchia variabile booleana o pseudo-booleana di controllo (che un compilatore con un ottimizzatore peephole appena decente farà magicamente "sparire" nel binario generato):
unsigned int finito = 0; ... while (!finito) { ... if (...) { ... finito = 1; } }
PS: permettimi di dire che sovente le motivazioni dei docenti per "non volere" questo o quello, come pure le rampogne di chi si lamenta quando vede utilizzare features "non standard" in casi chiaramente vincolati quanto a compilatore + architettura + SO, mi fanno sempre bonariamente sorridere.

Meglio riservare tanto zelo e pedanteria a miglior causa (come ad esempio i subset e i dialetti C utilizzati nei sistemi critici, vedi MISRA/C).
scusi prof Andrea69...ma io il codice booleano nn lo capisco!!!...nn so nemmeno cos'è?!...nn l'ho studiato per niente!!!...cmq potresti essere un po'+esplicito...nn pensare ke voglia tutto pronto...cerco solo di capire x una prox volta...cmq grazie...Ciao!!!...risp
"giocala88":
scusi prof Andrea69...ma io il codice booleano nn lo capisco!!!...nn so nemmeno cos'è?!...nn l'ho studiato per niente!!!...cmq potresti essere un po'+esplicito...nn pensare ke voglia tutto pronto...cerco solo di capire x una prox volta...cmq grazie...Ciao!!!...risp
Semplificando all'osso, noi denotiamo come booleana una variabile "binaria", i cui valori significativi sono soltanto due, complementari: tipicamente, VERO e FALSO, tali che VERO = NOT(FALSO) e così via. Ponendo a margine argomenti avanzati come le algebre booleane più evolute (es. a 3 e 4 valori, Lukasiewicz, con ordini parziali etc.), in informatica applicativa si parla spesso di queste variabili anche come "variabili logiche", senza (troppa) perdita di precisione.
Il linguaggio C (nello standard originario C'89, l'unico ad oggi pienamente supportato da tutti i compilatori e cross-compilatori e quindi l'unico sul quale si possano con relativa tranquillità fare affermazioni generiche) offre un supporto molto limitato alle variabili booleane: non esiste un tipo elementare "bool" in C'89, anche se esso è supportato dai più recenti compilatori per i SO personal oggi più diffusi. In C'89 un test come
if (boolvar) { a = b; action(); another_action(); }
si limita a ritornare un valore logico TRUE e quindi ad eseguire il blocco di codice sotteso se e solo se la variabile (intera) boolvar ha un contenuto non nullo. Dunque il linguaggio C, laddove non c'è supporto specifico per i tipi booleani, si limita a mappare 0 su FALSE e non-zero su TRUE.
Un accorgimento molto utilizzato in passato, ed in generale negli ambienti privi del tipo elementare bool, è il seguente:
typedef enum {FALSE, TRUE} boole_t;
Vi sarebbe molto altro da dire, ad esempio sui bitfield nelle strutture, sui char utilizzati come bit-array, sulle estensioni (spesso embedded) che supportano anche il tipo "bit" o "flag".
PS: non sono "Professore", anche se questo termine pare oggi informalmente invalso per designare chiunque svolga funzioni di formatore o tutor, in qualsivoglia contesto pubblico, privato, aziendale.
EDIT: stardanrd -> standard
prof ma io studio l'ANSI C...no quello ke hai detto lei...interessante cmq l'argomento ma nn capisco ancora cm tradurre i passi in C...dovrò aspettare la lezione 2...o mi dice cm si fa in qst lezione???...!!!....skerzi a parte...cmq grazie...di tutto!!!!...fammi sapere...ciao andrea!
"giocala88":
prof ma io studio l'ANSI C...no quello ke hai detto lei...interessante cmq l'argomento ma nn capisco ancora cm tradurre i passi in C...dovrò aspettare la lezione 2...o mi dice cm si fa in qst lezione???...!!!....skerzi a parte...cmq grazie...di tutto!!!!...fammi sapere...ciao andrea!
Penso che nella nostra "lezione"

Non voglio abusare di questi spazi o diventare inutilmente pedante, pertanto ti invito a consultare i siti ANSI e ISO/IEC per ulteriori dettagli e per la storia dei comitati di standardizzazione, delle date di adozione degli standard dai due lati dell'oceano, della intersezione con C++, e via curiosando.
Senza alcuna vena polemica, occorre però rimarcare che nessun compilatore - commerciale o meno - implementa appieno lo standard C'99, con la singola possibile eccezione di Comeau C/C++ (che peraltro è un front-end, non un compilatore vero e proprio: produce codice C o C++ da ricompilare poi con VC, GCC, o anche Intel C, Borland C...).
Ti riporto inoltre qui, per comodità di consultazione, il codice d'esempio modificato.
#include <stdio.h> #include <stdlib.h> typedef enum {FALSE, TRUE} boole_t; int main() { char s[16]; int val; boole_t finito = FALSE; puts("\nDigita una cifra, scelta dall'insieme {1, 2, 3}: "); while (!finito) { scanf("%s", s); val = atoi(s); if ((val > 0) && (val < 4)) { puts("Inserimento effettuato correttamente"); finito = TRUE; } else { puts("Errore ! Prova ancora."); } } return 0; }
Buon lavoro !
prof la ringrazio!!!!...c sentiremo credo x altri aiuti, anke se un bel po' di cose le ho capite...ed imparate...ciao andrea69...grazie mille!!!!