[Impariamo il C] Lezione 5

ma nessuno posta la soluzione dell'esercizio per pigrizia o perché l'ho fatto troppo difficile?


Ho capito per me è un po' come star wars sto capendo adesso il perché di certe cose in java...una cosa incredibile è che se passi un array a una funzione e lo modifichi, le modifiche si ripercuotono anche sull'array originale...perché il nome di un array è un puntatore all'array stesso e questa cosa è rimasta in java

Comunque interesserebbe anche a me (in futuro) una parte riguardante i driver


Sono al lavoro che sto programmando in java...tra un lavoro e l'altro mi dedico al C e adesso mi hanno appena dato un lavoro moolto lungo


dopo pranzo mi ci metto


imparare java senza conoscere C e'

edit:

addendum all'esercizio, dopo che avete provato con quei valori, se avete usato una scanf(), provare a inserire "prova valore1" e "prova valore2".

Provare a spiegare perche' il programma non si comporta come dovrebbe. (sempre che aresio non abbia gia' fatto una parentesi sui controlli sull'input ma non mi pare)

Provare a spiegare l'utilita' del pezzo di codice

while(getchar()!='\n'); e come potrebbe essere utilizzato per la validazione dei dati in ingresso

HINT1:

Spoiler

while(getchar()!='\n'); permette di pulire il buffer, poiche' la scanf() utilizza come terminatore non solo l'invio ma anche un semplice spazio, sappiamo che ...




HINT2

Spoiler

...quel while non esegue niente ma chiama la getchar finche' non incontra il terminatore di invio, quindi se l'utente ha inserito "prova valore" la scanf si ferma al primo spazio per poi ...


a me interessano le lezioni un pelo piu avanti.. aspetto con impazienza..
qualche commento. Anche se non ci sono studenti postanti, sarebbe brutto interrompere anche perchè è ina cosa che rimane e grazie ad un wiki-raccoglitore può essere più utile del solito.

Cerco di ottimizzare i consumi e non capisco perchè dovrei navigare con un pc quando un cell con wifi mi permette le stesse cose, quasi, e visto che ora sono sulla tazza non posso fare l'esercizio. La roba del 16 milioni mi ha, tuttavia, sorpreso, devo pensarci un secondo.

Per pascal, i metodi virtuali hanno la particolarità di essere definibili dopo, o nella stessa classe (o file) o nelle classi che estendono. In sostanza funzionano come i prototipi, però mi hai fatto venire il dubbio (l'ultima volta che ho aperto lazarus è stato l'anno scoso), forse anche in pascal ci sono i prototipi ed io li ho confusi.

Infine ogni linguaggio di un certo tipo (funzionale, imperativo, bla bla) si basa sugli stessi concetti, il resto è zucchero sintattico (anche se non sempre, la tipizzazione forte, la parametrizzazione, la gestione della memoria, etc... Non sono differenze banali).

Io, anche se non posto, lurko (e credo che lo faranno in molti, anche in futuro) perchè, ad esempio, con C (più che c++) puoi programmare per calcolatrici (hp50g hpgcc), per palmari (cegcc), etc...

PS. Anche se volessi, se dovessi studiare seriamente, in termini di esercizi / espansione della wiki piuttosto che leggere la discussione e basta (seppur attentamente), mi metterei a fare le 10k cose che ancora devo terminare, quindi per adesso mi mantengo aggiornato senza intervenire.
eh sì, in C ci fai davvero tutto. ed è vero, tanti linguaggi non fanno altro che rendere più "fruibile" il C indorando la supposta. infatti l'ultima lezione (se mai ci arriveremo) vorrebbe proporre degli esempi di come funzionino linguaggi più moderni e di quanto evitino sbattimenti ai programmatori (e con quali trade-off).
non riesco a capire dove sbaglio

il compilatore mi evidenzia la 7a riga e dice:


Codice:

Spoiler

#define
#define

int somma(int val1, int val2) {
int y;
y = val1*val1+val2*val2 + 1
return y;
}

int main(int argc, char* argv[]){
/* dichiari le variabili in uso nel main */
int numero1;
int numero2;
int totale;
int risultato;

/* leggo il primo valore */
printf("Inserisci un primo valore intero: ");
scanf("%d\n", &numero1);

/* leggo il secondo valore */
printf("Inserisci un secondo valore intero: ");
scanf("%d\n", &numero2);

/* stampo a video il risultato */
risultato = somma(numero1, numero2);
printf("Il risultato è: %d", risultato);

/* exit */
system("pause");
return 0;
}




EDIT:
il codice ve lo lascio per farvi 4 grasse risate...
dimenticato un ;
AHHHHHHHHHHHHHHHHHHHHHHH
ma nell'errore di compilazione non posso semplicemente scrivere "pirla hai dimenticato di concludere la riga!" ??

non l'ho ancora testato ma il codice ora è:

Spoiler

#define
#define

int somma(int val1, int val2) {
return val1*val1+val2*val2 + 1;
}

int main(int argc, char* argv[]){
/* dichiari le variabili in uso nel main */
int numero1;
int numero2;
int totale;
int risultato;

/* leggo il primo valore */
printf("Inserisci un primo valore intero: ");
scanf("%d\n", &numero1);

/* leggo il secondo valore */
printf("Inserisci un secondo valore intero: ");
scanf("%d\n", &numero2);

/* stampo a video il risultato */
risultato = somma(numero1, numero2);
printf("Il risultato è: %d", risultato);

/* exit */
system("pause");
return 0;
}




EDIT2:
alt stop...spe
sono un pirla xD
altri 5min per scoprire che ho scritto #define invece di #include
ho tolto anche i \n dentro a scanf che non andavano bene...
La seconda versione rivista del codice e' corretta

edit:

Ricordati che volendo puoi dichiarare piu' variabili dello stesso tipo separandole da una virgola così:

int a,b,c,d;


che è piu' compatto.
ok tra l'altro ho dichiarato una variabile che poi non uso. lol
Se compili a mano (su devc++ ora non ricordo come si faccia) ti consiglio di passare anche il parametro -Wall a gcc così che ti segnali anche i warnings (tipo le variabile non usate oppure lette ma non inizializzate) oltre agli errori


certo. ma come fa a sapere se hai concluso la riga?
hehehehe infatti.
ora ho imparato che syntax error vuol dire che ho dimenticato qualcosa... :P

ps.
non ho capito perché con i due valori a 16777216 poi mi da quel risultato..
io credo perché va oltre il limite dell'int ma è solo una supposizione.
il problema è che cambiando tutto in qualcosa con "più spazio" tipo double o float etc...poi il risultato è 0...
ma non ho indagato sul perché ^^


Spoiler


Esatto






Spoiler


Dipende da come l'hai fatto, credo
Se i due dati in partenza erano int lui comunque li avrebbe sommati come e int e poi convertito il risultato in float.
Prova con

float somma(float val1, float val2) {
return val1*val1+val2*val2 + 1;
}

così dovrebbe andare

mentre così non dovrebbe

float somma(int val1, int val2) {
return val1*val1+val2*val2 + 1;
}

Perchè C cerca di risparmiare memoria




fuochino, il problema è legato proprio ai limiti del range degli interi.

il giochino funziona ancora meglio con 65536. avete provato anche con altri numeri? cosa succede?
faccio il mio timido ingresso nel corso, se permesso.
quest'anno ho iniziato il corso di informatica triennale all'unipmn e stiamo facendo giusto queste cose.
le lezioni di teoria chiaramente sono di più che quelle di laboratorio e la prof (diversa da quella di lab) spiega cose inconcepibili, tanto che quando chiede come fare un esercizio a noi, dopo 2 minuti di silenzio risponde uno che ste cose le ha già fatte.
Tipo ora siamo ai puntatori con * e & non ci azzecco niente e vabè.
Non mi sono mai ritenuto intelligente (chiamatela bassa autostima, come volete)

bando alle ciance, mi permetto di fare qualche domanda:
quella del void main e int main non l'ho ancora capita.
io scrivo semplicemente main(){ e vado a inserire quello che devo nel corpo del main.
senza return (che non ho capito) e senza errori o warning di compilazione sia su gcc in linux che in dev-cpp (che usa gcc anche lui) su win7.
sbaglio?

perchè aggiungete tutti system("pause"); alla fine? bisogna pure implementare una lib in più (stdlib.h mi pare). è sbagliato utilizzare getchar(); al suo posto? così comunque basta premere invio per chiudere il tutto alla fine...
btw quando faccio ste cose sto in linux e non mi serve metterlo dato che apro direttamente i programmi nel terminale e quando terminano non mi si chiude... si può fare anche in win volendo: basta aprire il cmd e trascinare dentro i file compilati e premere invio per eseguirli. ma non credo di dovervele dire io ste cose

seguo tutto con interesse...
ps se volete vi passo i pdf con gli esercizi che ci danno in lab così scegliete quelli da mettere qua come prove...
bella fappino, vedi are', avevo ragione!


lol

chiedo scusa ma non capisco di cosa si stia disquisendo...
non ho avuto modo di leggere tutti i reply delle altre lezioni e mi sono inserito a gamba tesa in questa lezione, perchè tra quote e contro-quote mi perdo facilmente
io ancora non ho letto, dopo se mi piglia a leggere posto la soluzione