PDA

Visualizza versione completa : primi problemi col c


ozzy78
28-05-2003, 01.39.39
Salve ragazzi, per varie necessità mi son dovuto cimentare da autodidatta con la programmazione in c. Sto davvero alle prime armi non riesco a capire cosa non va in questo programmino di esempio.
Il codice è il seguente:
#include <stdio.h>
int main ()
{
float lire, euro;
char scelta1,scelta2;
printf ("benvenuti nel programma di conversione dell'euro\n");
printf ("\n\n\n\n\n");

do

{

printf ("vuoi convertire da euro->lire o viceversa? Immetti da

tastiera a o b:\n");
scanf ("%c", &scelta1);
switch (scelta1) {
case 'a': {printf ("\n\n\nImmetti la cifra in euro:");
scanf ("%f", &euro);
lire=euro*1936.27;
printf("\n\n\nL\'equivalente in lire e\': %f", lire);}

break;
case 'b': { printf ("\n\n\nImmetti la cifra in lire:");
scanf ("%f", &lire);
euro=lire/1936.27;
printf("\n\nLa cifra equivalente in euro

e\': %f", euro);} break;

default: printf ("scelta errata");break;}
printf("\n\n\nVuoi fare un\'altra conversione? s o n:\n");
scanf ("%c", &scelta2);

}
while (scelta2 =='s');


printf ("\n\n\n\n\narrivederci e grazie");
return 0;
}


Si accettano consigli

P8257 WebMaster
28-05-2003, 09.48.37
Qual'è il problema nello specifico? ..

Errori di compilazione? .. Errori a run-time?.. Risultati strani?..

Bye :cool:

LoryOne
28-05-2003, 10.09.37
Come primo consiglio direi che è sempre buona norma indentare il codice che posti.

Come secondo consiglio al posto di scanf() per effettuare l'input di un singolo carattere da tastiera, io utilizzo sempre getch() o getche().L'utilizzo di uno o dell'altra dipende dal fatto se si voglia o meno visualizzare il carattere immesso sullo schermo.

Come terzo consiglio imposta sempre il valore delle variabili numeriche al momento della dichiarazione (come il WebMaster ha più volte sottolineato), ossia int a=0; al posto di int a;

Ciao :)

LoryOne
28-05-2003, 10.14.18
Ancora una cosa...

Al posto di

int main()
{
......
........
..........
return 0;
}


se non si ha nessun valore di ritorno, è sempre meglio questa forma:

void main(void)
{
.......
........
...........
}

ozzy78
28-05-2003, 17.00.08
Il problema è che compila bene, ma funziona male nel senso che la scanf che mi legge la scelta dello switch funziona perfettamente, ma quando devo immettere da tastiera la scelta se fare o meno un'altra operazione di conversione non mi fa neanche immettere il carattere ma mi esce direttamente.
Non capisco perchè...

P8257 WebMaster
28-05-2003, 17.32.35
Così funziona:


#include <stdio.h>
int main ()
{
float lire=0, euro=0;
char scelta1,scelta2;
printf ("benvenuti nel programma di conversione dell'euro\n");
printf ("\n\n\n\n\n");

while (scelta2 != 'n')
{

printf ("vuoi convertire da euro->lire o viceversa? Immetti da tastiera a o b:\n");
scelta1 = getch();

switch (scelta1) {
case 'a': printf ("\n\n\nImmetti la cifra in euro:");
scanf ("%f", &euro);
lire=euro*1936.27;
printf("\n\n\nL\'equivalente in lire e\': %f", lire);
break;


case 'b': printf ("\n\n\nImmetti la cifra in lire:");
scanf ("%f", &lire);
euro=lire/1936.27;
printf("\n\nLa cifra equivalente in euro e\': %f", euro);
break;

default: printf ("scelta errata");break;

}
printf("\n\n\nVuoi fare un\'altra conversione? s o n:\n");
scelta2 = getch();
}

printf ("\n\n\n\n\narrivederci e grazie");
return 0;
}



Usa 'getch', è più stabile di 'scanf' e poi il buffering è più gestibile .. inoltre stabilizza il ciclo while.

Bye :cool:

LoryOne
28-05-2003, 20.18.21
Si potrebbe fare anche così:


#include <stdio.h>
#include <stdlib.h>

void main(void)
{
float Importo=0,Risultato=0;
int Indice=0;
char Scelta='0',Scelta1='s';
char *Moneta[]={"Lire","Euro"};
while(Scelta1=='s')
{
clrscr();
printf("PROGRAMMA DI CONVERSIONE\n");
printf("Scegli:\n1 Lire->Euro\n2 Euro->Lire");
do
{
printf("\nScegli il nø ?");
Scelta=getche();
}
while((Scelta!='1')&&(Scelta!='2'));
Indice=atoi(&Scelta);
printf("\nImporto in %s ?",Moneta[Indice-1]);
scanf("%f",&Importo);
Risultato=(Indice==1?Importo/1936.27:Importo*1936.27);
printf("Equivalgono a %10.2f %s\n",Risultato,Moneta[Indice==2?0:1]);
printf("Ancora (s/n)?");
Scelta1=getch();
}
}


Puoi andare un po più a fondo con la conoscenza del linguaggio, il che è sempre una buona cosa.

Ciao :)

LoryOne
28-05-2003, 20.19.53
...bleah
ci riprovo


#include <stdio.h>
#include <stdlib.h>

void main(void)
{
float Importo=0,Risultato=0;
int Indice=0;
char Scelta='0',Scelta1='s';
char *Moneta[]={"Lire","Euro"};
while(Scelta1=='s')
{
clrscr();
printf("PROGRAMMA DI CONVERSIONE\n");
printf("Scegli:\n1 Lire->Euro\n2 Euro->Lire");
do
{
printf("\nScegli il nø ?");
Scelta=getche();
}
while((Scelta!='1')&&(Scelta!='2'));
Indice=atoi(&Scelta);
printf("\nImporto in %s ?",Moneta[Indice-1]);
scanf("%f",&Importo);
Risultato=(Indice==1?Importo/1936.27:Importo*1936.27);
printf("Equivalgono a %10.2f %s\n",Risultato,Moneta[Indice==2?0:1]);
printf("Ancora (s/n)?");
Scelta1=getch();
}
}

ozzy78
29-05-2003, 02.05.41
Ho risolto semplicemente sostituendo alla scanf getchar() ma il dubbio mi permane anche perchè se dichiaro come int l'id della variabile che mi controlla il ciclo while il programma funziona normalissimamente...è solo per la lettura del char che mi sbrocca...boh?!
Cmnq dove posso rimediare un po' di informazioni sulle librerie dell'ANSI C?
Tra l'altro vi sarei grato se mi sapreste indicare qualche indirizzo dove trovare spiegate in maniera decente le system call per winnt e affini.
Grazie per la pazienza ragazzi

P8257 WebMaster
29-05-2003, 12.46.47
ozzy78 ha scritto:
Ho risolto semplicemente sostituendo alla scanf getchar() ma il dubbio mi permane anche perchè se dichiaro come int l'id della variabile che mi controlla il ciclo while il programma funziona normalissimamente...è solo per la lettura del char che mi sbrocca...boh?!


Nessun mistero o ragione soprannaturale o esoterica .. entrambe le funzioni di lettura che derivano da getch sono prototipate come INT è chiaro quindi che restituiscano ed operino in condizioni ideali senza vincoli sul tipo in return.
Sono poi più stabili di 'scanf' e i suoi "derivati" :D

Consiglio di utilizzare gli stream (iostream.h) per acquisire input e mandare output:


cin << x
cout >> y


x e y sono i valori in input e output.

Bye :cool:

LoryOne
29-05-2003, 23.41.56
Partiamo dalla certezza (e non dal presupposto) che il computer non considera i caratteri in quanto tali (ossia a,b,c) ma come sequenze di bit.

Ad ogni carattere corrisponde un numero ricavabile dalla tabella dei codici ASCII, quindi:
a=97 -->1100001
b=98 -->1100010
c=99 -->1100011

Ricordatevi sempre che la verifica di una condizione impostata, quale può essere il verificarsi di un evento alla pressione di un tasto, sarà interpretata come numero o sequenze di bit.

Es:
Scrivere If(variabile=='a') implicherà la trasformazione del carattere 'a' nel suo corrispettivo numerico.
Il compilatore, quindi, nel compilare il codice trasformerà quel carattere in 97 e lo gestirà come tale.

Scrivere If(variabile=97) sarà come "dare una mano" al compilatore.
Si otterranno ben due benefici.
Il primo:
Si compileranno meno istruzioni.
Il secondo:
Si otterrà una maggiore esecuzione del codice.

Detto questo, veniamo al dunque.
Quando si effettua un input da tastiera, è necessario eseguire tre operazioni fondamentali:
La prima è quella di cancellare il buffer, la seconda è quella di predisporlo ad accettare uno o più caratteri da tastiera e la terza è quella di renderlo disponibile alla lettura del contenuto. (He he he, ce l'avete grassa voi principianti, altrochè !!! Il WebMaster invece si salva. :D ;))

Scanf() è una bella funzione ma bisogna conoscerla a fondo per poterla usare nel modo appropriato.
Visto che il codice postato dall'amico ozzy78 è in C, vediamo il tutto in C.

Il linguaggio in questione ci offre una marea di funzioni per effettuare l'input da tastiera .Eccone alcune: getch(),getche(),cin>> e la famigerata famiglia scanf()

Cominciamo dall'inizio
Definiamo una variabile (scelta) di tipo char così:

char scelta;

Attenzione che scelta sarà sempre numerico, badate bene.
Definirla come char, ci potrà consentire di fare il giochetto di cui sopra, ossia:
if(scelta='a') ...oppure if(scelta=97)...

Poi dovremo usarla nel modo approriato.Allora guardiamo il codice seguente:

#include <stdio.h>
void main(void)
{
char scelta;

clrscr();
printf("Inserisci qualcosa:");
scanf("%c",&scelta);
printf("\nHai inserito: %c",Scelta);
}


Bene, quel %c in scanf implicherà la lettura del primo carattere di ciò che avrete immesso.
Se aveste immesso "ambarabaciccicoccò"+invio per confermare l'immissione, scelta conterrà "a".Si ma nel buffer ci stanno ancora "mbarabaciccicoccò"+invio.
Comunque a questo punto chi se ne frega, non ci sono altre istruzioni e quella "}" finale mi termina il programma, scaricando la memoria, il buffer e tutto il resto.

E che succede adesso ?
(Mi raccomando...fate sempre tutte le prove possibili ed immaginabili per imparare davvero un linguaggio, non mi stancherò mai di dirvelo !)


#include <stdio.h>
void main(void)
{
char scelta,scelta1;

clrscr();
printf("Inserisci qualcosa:");
scanf("%c",&scelta);
printf("\nHai inserito: %c",Scelta);
printf("\nInserisci qualcosaltro:");
scanf("%c",&scelta1);
printf("\nHai inserito: %c",Scelta1);
}


Beh, perchè non mi esegue il secondo scanf ?
La risposta è semplice ma neanche tanto:
Scanf ti lascia riempire il buffer con tutti i caratteri che vuoi fino a quando non premi invio. Ahhhhh invio, ecco qual'è il carattere che mi termina la stringa in ingresso.

Se il buffer non è vuoto, qualunqe altra chiamata alla funzione scanf() con "%c" mi farà saltare a quella successiva.
Infatti, scelta1 conterrà il valore numerico di invio (Provare per credere).

Le cose cambiano se al posto di %c si usa %d (Numeri, non caratteri)

A valle di tutto ciò, se volete eseguire un input di un solo carattere, utilizzate getch().
E' più sicuro, anche perchè esegue i tre passaggi fondamentali che ho accennato poco fa.

Ora fatemi andare a dormire che domani ce l'ho dura...
Nel frattempo buona notte e...USATE scanf() SOLO QUANDO E' STRETTAMENTE NECESSARIO.

Bye bye. :cool:

ozzy78
30-05-2003, 01.44.43
beh, più chiaro di così si muore. Ti ringrazio infinitamente per i chiarimenti...la tua spiegazione me la sono messa da parte perchè neanche sul libro che ho rimediato c'è spiegato il tutto. Grazie ancora :-)

P8257 WebMaster
30-05-2003, 02.00.17
LoryOne ha scritto:
Partiamo dalla certezza (e non dal presupposto) che il computer non considera i caratteri in quanto tali (ossia a,b,c) ma come sequenze di bit.

Ad ogni carattere corrisponde un numero ricavabile dalla tabella dei codici ASCII, quindi:
a=97 -->1100001
b=98 -->1100010
c=99 -->1100011

Ricordatevi sempre che la verifica di una condizione impostata, quale può essere il verificarsi di un evento alla pressione di un tasto, sarà interpretata come numero o sequenze di bit.

Es:
Scrivere If(variabile=='a') implicherà la trasformazione del carattere 'a' nel suo corrispettivo numerico.
Il compilatore, quindi, nel compilare il codice trasformerà quel carattere in 97 e lo gestirà come tale.

Scrivere If(variabile=97) sarà come "dare una mano" al compilatore.
Si otterranno ben due benefici.
Il primo:
Si compileranno meno istruzioni.
Il secondo:
Si otterrà una maggiore esecuzione del codice.

Detto questo, veniamo al dunque.
Quando si effettua un input da tastiera, è necessario eseguire tre operazioni fondamentali:
La prima è quella di cancellare il buffer, la seconda è quella di predisporlo ad accettare uno o più caratteri da tastiera e la terza è quella di renderlo disponibile alla lettura del contenuto. (He he he, ce l'avete grassa voi principianti, altrochè !!! Il WebMaster invece si salva. :D ;))

Scanf() è una bella funzione ma bisogna conoscerla a fondo per poterla usare nel modo appropriato.
Visto che il codice postato dall'amico ozzy78 è in C, vediamo il tutto in C.

Il linguaggio in questione ci offre una marea di funzioni per effettuare l'input da tastiera .Eccone alcune: getch(),getche(),cin>> e la famigerata famiglia scanf()

Cominciamo dall'inizio
Definiamo una variabile (scelta) di tipo char così:

char scelta;

Attenzione che scelta sarà sempre numerico, badate bene.
Definirla come char, ci potrà consentire di fare il giochetto di cui sopra, ossia:
if(scelta='a') ...oppure if(scelta=97)...

Poi dovremo usarla nel modo approriato.Allora guardiamo il codice seguente:

#include <stdio.h>
void main(void)
{
char scelta;

clrscr();
printf("Inserisci qualcosa:");
scanf("%c",&scelta);
printf("\nHai inserito: %c",Scelta);
}


Bene, quel %c in scanf implicherà la lettura del primo carattere di ciò che avrete immesso.
Se aveste immesso "ambarabaciccicoccò"+invio per confermare l'immissione, scelta conterrà "a".Si ma nel buffer ci stanno ancora "mbarabaciccicoccò"+invio.
Comunque a questo punto chi se ne frega, non ci sono altre istruzioni e quella "}" finale mi termina il programma, scaricando la memoria, il buffer e tutto il resto.

E che succede adesso ?
(Mi raccomando...fate sempre tutte le prove possibili ed immaginabili per imparare davvero un linguaggio, non mi stancherò mai di dirvelo !)


#include <stdio.h>
void main(void)
{
char scelta,scelta1;

clrscr();
printf("Inserisci qualcosa:");
scanf("%c",&scelta);
printf("\nHai inserito: %c",Scelta);
printf("\nInserisci qualcosaltro:");
scanf("%c",&scelta1);
printf("\nHai inserito: %c",Scelta1);
}


Beh, perchè non mi esegue il secondo scanf ?
La risposta è semplice ma neanche tanto:
Scanf ti lascia riempire il buffer con tutti i caratteri che vuoi fino a quando non premi invio. Ahhhhh invio, ecco qual'è il carattere che mi termina la stringa in ingresso.

Se il buffer non è vuoto, qualunqe altra chiamata alla funzione scanf() con "%c" mi farà saltare a quella successiva.
Infatti, scelta1 conterrà il valore numerico di invio (Provare per credere).

Le cose cambiano se al posto di %c si usa %d (Numeri, non caratteri)

A valle di tutto ciò, se volete eseguire un input di un solo carattere, utilizzate getch().
E' più sicuro, anche perchè esegue i tre passaggi fondamentali che ho accennato poco fa.

Ora fatemi andare a dormire che domani ce l'ho dura...
Nel frattempo buona notte e...USATE scanf() SOLO QUANDO E' STRETTAMENTE NECESSARIO.

Bye bye. :cool:

-- PRE CI SO -- (Y)

Bye :cool: