View Full Version : [C] un neofita cerca aiuto, si chiude il prompt dei comandi
emanuele.g
30-09-2009, 17:18
Salve a tutti, spero di non aver sbagliato sezione, ma sono nuovo :)
Vado al dunque subito, frequento ing. civile, e stiamo facendo il corso di programmazione, per il momento non ci sono state spiegate molte cose, ma nonostante tutto volevo provare a fare qualcosa a casa...
Mi è venuto in mente un programma che visualizzasse semplicemente la somma di due numeri, vi posto il codice:
#include<stdio.h>
main()
{
printf("Inserire il primo numero");
scanf("x");
printf("Inserire il secondo numero");
scanf("y");
printf("x+y");
}
peccato che c'è un problema, non appena inserisco il primo numero e premo invio, non faccio quasi neanche in tempo a leggere inserire il secondo numero che il prompt dei comandi si chiude, come mai? come lo risolvo?
Energy++
30-09-2009, 17:39
a parte il fatto che quello non è assolutamente un codice funzionante :mbe:
sintassi di scanf, variabili e cose del genere, mai sentite eh? :stordita:
emanuele.g
30-09-2009, 17:45
usandolo con dev C++ sembra funzionare...
almeno l'inizio
Energy++, in effetti se ci pensi é vero :rotfl:
prima legge degli input dallo standard input (sconquassando lo stack :asd: ), poi stampa "x+y" e alla fine si chiude :sbonk:
bah, sono senza parole :asd:
la mia versione:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int x, y;
printf("inserire il primo numero: ");
scanf("%d", &x);
printf("inserire il secondo numero: ");
scanf("%d", &y);
printf("la somma é %d\n", x + y);
return 0;
}
emanuele.g
30-09-2009, 17:53
della serie perculiamo uno se non è capace, bel comportamento, complimenti
per il momento me l'han spiegata così,non credevo mancassero dei pezzi, del resto l'avevo detto che ero all'inizio...
cazzo sfottete poi...:-|
Energy++
30-09-2009, 18:10
della serie perculiamo uno se non è capace, bel comportamento, complimenti
per il momento me l'han spiegata così,non credevo mancassero dei pezzi, del resto l'avevo detto che ero all'inizio...
cazzo sfottete poi...:-|
il fatto è che, da quello che hai scritto, si capisce che:
1. o non hai letto nemmeno 1 pagina di teoria
2. o quelli che che ti hanno detto che si fa in quel modo sono degli incompetenti
3. o tu hai capito male e quindi ti consiglio di cominciare a prendere il bel libro di C e iniziare a studiare
yorkeiser
30-09-2009, 18:16
il fatto è che, da quello che hai scritto, si capisce che:
1. o non hai letto nemmeno 1 pagina di teoria
2. o quelli che che ti hanno detto che si fa in quel modo sono degli incompetenti
3. o tu hai capito male e quindi ti consiglio di cominciare a prendere il bel libro di C e iniziare a studiare
Vado al dunque subito, frequento ing. civile, e stiamo facendo il corso di programmazione, per il momento non ci sono state spiegate molte cose, ma nonostante tutto volevo provare a fare qualcosa a casa...
L'utente ha specificato che è alle prime basi (anzi, che non ha neanche quelle) ma nonostante ciò sta provando a fare qualcosa: mi pare un tentativo lodevole, perchè piuttosto non gli spiegate gli errori che ha commesso, così li capisce anche lui ?
Vincenzo1968
30-09-2009, 18:17
apparte il fatto che quello non è assolutamente un codice funzionante :mbe:
sintassi di scanf, variabili e cose del genere, mai sentite eh? :stordita:
e a parte che non si scrive "apparte" ma "a parte".
:bimbo:
Energy++
30-09-2009, 18:29
e a parte che non si scrive "apparte" ma "a parte".
:bimbo:
chiedo scusa per la svista
Ciao,
questo codice non può funzionare perchè non usi in modo appropriato le varie funzioni. Non ti compare la seconda stringa "Inserire il secondo numero" perchè il programma và in crash per via dell'utilizzo improprio, appunto, della funzione scanf.
Il mio consiglio, prima di continare è quello di cercare a mano a mano, su Google le varie funzioni e cercare di capire come si usano, quali parametri accettano e quali risultati restituiscono. Ovviamente la base, ovvero, i principi elementari di un programma, il significato di una return perchè si deve usare per forza main() etc, tra cui i tipi di dati esistenti nel C sono d'obbligo.
La prima riga:
#include <stdio.h>
è giusta, ed è una direttiva del preprocessore (presente nei maggiori compilatori oggi esistenti, appunto pre-processa il sorgente).
Praticamente gli dice includi nel sorgente da compilare il contenuto del file header di nome "stdio" (standard I/O).
Questo header contiene le dichiarazioni (che si differenzia dalla definizione, per maggiori info su wiki cerca i due termini) delle funzioni primarie per la gestione dello standard input e output (in C referenziati come stdin e stdout)
main()
io ti consiglio di cambiarlo con:
int main(){
int preposto al nome della funzione, specifica che la funzione restituisce un valore intero (return 0;). In vari compilatori la sua mancanza (non dell'int, ma del tipo di dato restituito -nel caso sia assente o indefinito è di tipo void-) genera un errore che impedisce di ottenere l'eseguibile -sinceramente non ricordo se è compito del compilatore o del linker-.
Il programma deve necessariamente contenere una funzione di nome main in quanto è l'entry point, la locazione di memoria da cui comincerà l'esecuzione del programma. In assenza riceverai un errore durante la compilazione dell'eseguibile.
printf("Inserire il primo numero");
Questa funzione è usata in modo proprio. Tieni a mente che verrà stampata esattamente com'è -al termine dell'istruzione non verrà effettuato il ritorno a capo-, pertanto potresti voler separare di almeno uno spazio la stringa dal numero che devi immettere
printf("Inserire il primo numero: ");
Ecco qui l'utilizzo improprio della funzione scanf.
Innanzitutto, la scanf è dichiarata come:
int scanf(char *format, args ...)
Accetta come primo parametro un identificatore del tipo di formato che verrà immesso dall'utente (nel tuo caso sarà %d -intero-) e come secondo argomento la variabile che conterrà il valore. In verità come vedi i puntini indicano che puoi immettere più variabili, ma tralasciamo le cose, attualmente, inutili.
Ora sapendo che: per forza di cose una variabile deve essere dichiarata PRIMA del suo utilizzo, capirai che prima di usare quella funzione te devi dichiarare una variabile per contenere il valore.
Per ordine le variabili andrebbero poste all'inizio del programma. Adesso con i nuovi standard è possibile mettere le varibili appena prima del loro utilizzo, ma, prendi con le pinze quanto stò per dirti, una volta era obbligatorio definire all'inizio del blocco di codice (un blocco è racchiuso tra {} -semplice terminologia, niente di chè-).
Alla fine ti mostro un esempio funzionante ora, invece, riscrivo solo la funzione in una funzionante:
scanf("%d", &x);//supponendo di aver già dichiarato X come int
//la e commerciale dice al compilatore di passare l'indirizzo della variabile anzichè passarne una copia.
Idem per il secondo printf e scanf che quindi tralascio ora.
printf("x+y");
E' errato in quanto stai dicendo: stampa la stringa (definita dalle virgolette, o doppi apici) "x+y".
Per ottenere il risultato che ti aspetti devi usare una piccola convenzione C:
printf("%d", (x+y))//ecco che ritorna %d che indica ancora una volta che verrà passato un intero
//per maggiori info basta una semplice impolverata sulle basi di I/O
A questo punto il sorgente è quasi pronto.
Quasi perchè manca la funzione return, che restituisce un valore intero. 0 indica terminazione con successo, altri valori indicano uno stato d'errore.
A questo punto il sorgente funzionante è:
#include <stdio.h>
int main()
{ //apro il blocco di istruzioni
int x,y; //la virgola mi permette di istanziare più variabili in una sola istruzione;
printf("Inserisci il primo numero: ");
scanf("%d", &x); //salvo il valore immesso nella var x
printf("Inserisci ora il secondo numero: ");// qui, curiosità ti trovi a capo la stringa
// poichè la pressione di Enter o Invio per la scanf causa un ritorno a capo.
scanf("%d", &y); //ora salvo in y
printf("Il risultato della addizione di x(%d) + y(%d) è:%d", x, y, (x+y));
// Come vedi per ogni occorrenza della sequenza di caratteri %d ho immesso
// dopo un valore del tipo intero (avendo usato %d). In caso contrario si
// solleverebbe una eccezione
return 0;//restituisco 0, terminazione con successo
}//chiudo il blocco di istruzioni
Questo è quanto. Aggiungo solo che // permette di scrivere commenti che terminano a fine riga.
Buona serata.
Chiedo scusa per il doppio post consecutivo. Ma ho sbagliato a cliccare tra modifica e quote.
Un consiglio:
ca**o sfottete poi...:-|
Non usare certe espressioni volgari, rischi di rimetterci solo tu sia come immagine che per eventuali interventi della moderazione. Semplicemente ignora ciò che ti infastidisce o segnala alla moderazione le repliche che ritieni fuori luogo o offensive, qualora dovessero mai esserci. Io non mi riferisco a nessuno in particolare, parlo in generale.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.