PDA

View Full Version : Aiuto con primi programmi in c


terrys3
28-05-2003, 18:29
Studiando dal Kernighan-Ritchie mi sono imbattuto in questo semplice programmino che però presenta un aspetto a me non del tutto chiaro:
il programma serve per il conteggio dei caratteri di un flusso proveniente da tastiera:

#include <stdio.h>
main()
{long nc;
nc=0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);}

Quello che non mi è chiaro è il significato ed il funzionamento dell'EOF (end of file). Infatti scrivendo

while (getchar() != 'a')

non appena inserisco una 'a' da tastiera il programma mi da il conteggio dei caratteri. Usando l'EOF invece come faccio a visualizzare questo risultato? Aiutatemi per favore perchè l'EOF è presente nella maggiorparte dei programmi che il libro presenta (copia tra file, conteggio delle linee ecc...)

mjordan
28-05-2003, 19:16
Originally posted by "terrys3"

Studiando dal Kernighan-Ritchie mi sono imbattuto in questo semplice programmino che però presenta un aspetto a me non del tutto chiaro:
il programma serve per il conteggio dei caratteri di un flusso proveniente da tastiera:

#include <stdio.h>
main()
{long nc;
nc=0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);}

Quello che non mi è chiaro è il significato ed il funzionamento dell'EOF (end of file). Infatti scrivendo

while (getchar() != 'a')

non appena inserisco una 'a' da tastiera il programma mi da il conteggio dei caratteri. Usando l'EOF invece come faccio a visualizzare questo risultato? Aiutatemi per favore perchè l'EOF è presente nella maggiorparte dei programmi che il libro presenta (copia tra file, conteggio delle linee ecc...)

FEOF è un indicatore di "fine file", difatti EOF significa End Of File.
Quel libro è vecchissimo, utilizza un "dialetto" di C che va prima della standardizzazione che non usa + nessuno. Non so come intenda l'EOF quel libro, comunque sostituisci '\n' con EOF nel programma e vedi che con un semplice invio ricevi il risultato. Se vuoi imparare il C, compera un libro recente. Va in giro il C99, imparare il C Kernighan e Ritchie nel 2003 non so se mi sembra il caso, visto che molti compilatori stanno eliminando pure il supporto.

sergio83
28-05-2003, 19:24
Ti conta i caratteri fino a che non scrivi il carattere "eof" (che dovrebbe essere "CTRL+z" in linux, in windows non so) il quale ti fa uscire dal ciclo
A questo punto ti stampa il numero di caratteri premuti. Cmq se hai problemi ascolta i consigli di mjordan: sostituisci EOF con '\n' (che non è altro che l'enter) oppure :) cambia libro!
Ciao!

terrys3
28-05-2003, 19:26
Quello che ho io è la seconda ediziona basata sul linguaggio ansi C. Mi consigliate davvero di comprarne un altro? Potrebbe crearmi grossi problemi imparare da questo?

mjordan
28-05-2003, 19:28
Originally posted by "terrys3"

Quello che ho io è la seconda ediziona basata sul linguaggio ansi C. Mi consigliate davvero di comprarne un altro? Potrebbe crearmi grossi problemi imparare da questo?

Appunto è vecchio. L'ultimo standard lo ha fatto l'ISO :D

terrys3
28-05-2003, 19:32
Originally posted by "mjordan"



Appunto è vecchio. L'ultimo standard lo ha fatto l'ISO :D

potresti consigliarmi allora un buon libro che non sia difficile da trovare? Qui dalle mie parti già ho faticato non poco per trovare quello che ho!!!

maxithron
28-05-2003, 19:34
uno dei + semplici (per iniziare è ovvio ;) ) ritengo sia:

programmare in C di peter Aitken & Bradley L. Jones

terrys3
28-05-2003, 19:36
Originally posted by "maxithron"

uno dei + semplici (per iniziare è ovvio ;) ) ritengo sia:

programmare in C di peter Aitken & Bradley L. Jones

preferirei un libro che pur partendo dagli elementi basilari (che cmq ho già studiato in passato da altre fonti) giunga fino a cose di una certa complessità!

terrys3
28-05-2003, 19:47
Nessuno sa dirmi come si da l'EOF sotto Windows?
Dovrebbe essere ctrl+z (oppure ctrl+d) ma ho provato ed esce scritto ^Z (oppure ^D)... sapete aiutarmi?

skyblaze
29-05-2003, 02:17
Originally posted by "mjordan"



Appunto è vecchio. L'ultimo standard lo ha fatto l'ISO :Dsi ma ISO ha solamente adottato lo standard ANSI rimarchiandolo iso99...lo standard è sempre ANSI.....almeno cosi ho letto da molte parti....no dico questo perche pure io sto imparando da un libro scritto da 2 italiani che si rifa all'ansi ;)

mjordan
29-05-2003, 09:08
Originally posted by "skyblaze"

si ma ISO ha solamente adottato lo standard ANSI rimarchiandolo iso99...lo standard è sempre ANSI.....almeno cosi ho letto da molte parti....no dico questo perche pure io sto imparando da un libro scritto da 2 italiani che si rifa all'ansi ;)

E ovvio che se fai un nuovo standard prendi prima quello che c'era già, o no? :D
Comunque il C99 aggiunge diverse cose al C.
Innanzitutto potenzia notevolmente la libreria matematica.
Aggiunge il supporto per il numeri complessi e numeri immaginari.
Elimina la regola dell'int implicito (unsigned long non vale più, bisogna scrivere unsigned long int), così come non specificare il tipo di ritorno di una funzione non vale +.
Aggiunge il tipo di dati 'bool' per variabili booleane.
Consente la dichiarazione di variabili in cicli e in mezzo a codice. Per esempio:


...
...
for (int i = 0; i < 10; i++) {
fai_qualcosa();
...
}

è perfettamente valido in C99, cosi anche come:

int
main(int argc, char ** argv)
{
int i; /* Variabile */

printf("Ciao a tutti!\n"); /* Istruzione */

char ch; /* Altra variabile */

return 0;
}


Aggiunge i commenti su una sola riga, stile C++
Aggiunge gli array di lunghezza variabile. Per esempio:


void
my_func(int x, int y)
{
int my_array[x,y];

...
}


Aggiunge la nuova parola riservata "restrict", che consente di fare ciò che in C90 bisognava dire a parole (che magari due oggetti puntati non dovevano sovrapporsi).

Aggiunge la parola riservata 'inline' per il function inlining.

Aggiunge un pozzo di altra roba ....

Un bel linguaggio. Il C è sempre + forte.

mjordan
29-05-2003, 09:11
Originally posted by "terrys3"



preferirei un libro che pur partendo dagli elementi basilari (che cmq ho già studiato in passato da altre fonti) giunga fino a cose di una certa complessità!

Benissimo. Se hai già delle basi il libro che fa al caso tuo è l'Herbert Schildt, Guida completa C, McGrawHill.
Mi pare sia l'unico attualmente a trattare lo standard C99, inoltre presenta gli argomenti in maniera semplice, ma procede fino ad esempi + complessi. Gli ultimi capitoli sono una figata, anche se seguirli attentamente richiede moltissimo tempo.

Ciao.

mjordan
29-05-2003, 09:14
Originally posted by "maxithron"

uno dei + semplici (per iniziare è ovvio ;) ) ritengo sia:

programmare in C di peter Aitken & Bradley L. Jones

L'ho letto anch'io. Per cominciare è un libro fantastico. Confermo anch'io questo libro per chi è alle prime armi.

skyblaze
29-05-2003, 12:34
Originally posted by "mjordan"



E ovvio che se fai un nuovo standard prendi prima quello che c'era già, o no? :D
Comunque il C99 aggiunge diverse cose al C.
Innanzitutto potenzia notevolmente la libreria matematica.
Aggiunge il supporto per il numeri complessi e numeri immaginari.
Elimina la regola dell'int implicito (unsigned long non vale più, bisogna scrivere unsigned long int), così come non specificare il tipo di ritorno di una funzione non vale +.
Aggiunge il tipo di dati 'bool' per variabili booleane.
Consente la dichiarazione di variabili in cicli e in mezzo a codice. Per esempio:


...
...
for (int i = 0; i < 10; i++) {
fai_qualcosa();
...
}

è perfettamente valido in C99, cosi anche come:

int
main(int argc, char ** argv)
{
int i; /* Variabile */

printf("Ciao a tutti!\n"); /* Istruzione */

char ch; /* Altra variabile */

return 0;
}


Aggiunge i commenti su una sola riga, stile C++
Aggiunge gli array di lunghezza variabile. Per esempio:


void
my_func(int x, int y)
{
int my_array[x,y];

...
}


Aggiunge la nuova parola riservata "restrict", che consente di fare ciò che in C90 bisognava dire a parole (che magari due oggetti puntati non dovevano sovrapporsi).

Aggiunge la parola riservata 'inline' per il function inlining.

Aggiunge un pozzo di altra roba ....

Un bel linguaggio. Il C è sempre + forte.Lo so che un nuovo standard si rifa a quello vecchio ma quello che volevo dire è che in questo caso ha solo adotatto lo standard ansi senza aggiungere niente e lo ha rinominato iso infatti si chiama anche ansi/iso...ma a quanto hai detto non è cosi......ma...PORC :muro:
E io che sto studiando su un libro ansi c che faccio ora? :eek: :cry:

terrys3
29-05-2003, 13:00
Originally posted by "skyblaze"

Lo so che un nuovo standard si rifa a quello vecchio ma quello che volevo dire è che in questo caso ha solo adotatto lo standard ansi senza aggiungere niente e lo ha rinominato iso infatti si chiama anche ansi/iso...ma a quanto hai detto non è cosi......ma...PORC :muro:
E io che sto studiando su un libro ansi c che faccio ora? :eek: :cry:

:cry: siamo nella stessa situazione :cry: per fortuna ho iniziato da poco a studiare, anche se acquistare un nuovo libro e buttare (in senso metaforico) quello che ho non è una bella cosa!!! Mi ero fidato di un amico che studia programmazione da un sacco di anni... ma a quanto pare non era aggiornato!!!

mjordan
29-05-2003, 13:06
Originally posted by "skyblaze"

Lo so che un nuovo standard si rifa a quello vecchio ma quello che volevo dire è che in questo caso ha solo adotatto lo standard ansi senza aggiungere niente e lo ha rinominato iso infatti si chiama anche ansi/iso...ma a quanto hai detto non è cosi......ma...PORC :muro:
E io che sto studiando su un libro ansi c che faccio ora? :eek: :cry:

Le aggiunte sono tante ma non preoccuparti. Non è stato aggiunto nulla che rompa la compatibilità con lo standard ANSI, a parte le nuove funzionalità particolari.
Il qualificatore restrict non cambia la semantica dei programmi.
Certo, se vuoi conoscere le nuove funzionalità devi comperare un libro che le descriva, come quello che ho consigliato prima, ma, in sostanza, il linguaggio non è stato cambiato.

skyblaze
29-05-2003, 13:07
Originally posted by "terrys3"



:cry: siamo nella stessa situazione :cry: per fortuna ho iniziato da poco a studiare, anche se acquistare un nuovo libro e buttare (in senso metaforico) quello che ho non è una bella cosa!!! Mi ero fidato di un amico che studia programmazione da un sacco di anni... ma a quanto pare non era aggiornato!!!Anche io sono all'inizio.....oddio ho fatto 2 capitoli che non sono proprio pochini :cry:
Il libro me lo ha dato mio cugino che lo aveva usato per l'universita di informatica :muro:
A sto punto cosa mi consigliate?Devo veramente cambiare libro e prendere uno ultimo che parla di iso c?Mi pare che le differenze siano abbastanza sostanziali a partire dalle variabili logiche(o booleane)....pensate che nel mio libro a un certo punto dice:"In c non esistono variabili logiche come nel basic" :cry:

mjordan
29-05-2003, 13:21
Calmi calmi, state attenti tutti.
Il tipo bool è soltanto un typedef ad un intero, quindi in realtà non è strettamente necessario.
Le regole abolite, come quelle dell'int implicito, sono state eliminate, ma sono differenze veramente marginali. In sostanza, a parte chi usa il Kernighan e Ritchie non deve "buttare" nulla. Tutto è applicabile e funzionante.
Inoltre bisogna considerare che la totalità dei compilatori di default accetta la versione ANSI C 89 e successiva revisione C90 e quindi, per compilare programmi "strict C99" bisogna passare dei flag particolari.

Per esempio, il seguente programma in ISO C 99:

#include <stdio.h>
#include <stdbool.h> // Il nuovo header per i tipi booleani.

int
main(void)
{
bool b[10]; // Array booleano. Questo è un commento su una sola riga.

for (int i = 0; i < 10; i++) // Dichiarazione di variabil ein un ciclo.
b[i] = false;

return 0;
}


sotto GCC per essere compilato correttamente necessita del flag `-std=c99' , questo fino a quando il C99 non diverrà "widely adopted", dopo il quale sarà lo standard accettato di default.

Chi usa invece il C traditional (pre-ANSI K&R) dovrebbe aggiornarsi. Molti compilatori stanno eliminando i supporti. Per esempio gcc 3.4 eliminerà gran parte del supporto per il C traditional e molti costrutti non compileranno +, come ad esempio i prototipi del tipo:


void my_func(int, int);

mjordan
29-05-2003, 13:29
Originally posted by "skyblaze"

Anche io sono all'inizio.....oddio ho fatto 2 capitoli che non sono proprio pochini :cry:


Se vuoi davvero imparare a programmare altro che 2 capitoli :D :D

mjordan
29-05-2003, 13:32
Originally posted by "mjordan"

Calmi calmi, state attenti tutti.
Il tipo bool è soltanto un typedef ad un intero, quindi in realtà non è strettamente necessario.


Anzi per essere precisi bool è una macro che utilizza il tipo _Bool che è un typedef ad un int.
Anche se il tipo quindi è _Bool, nei nuovi programmi dev'essere usato bool.
Il fatto è che al momento dello standard si era visto che già diversi compilatori avevano già implementato il proprio tipo di dati booleano, quindi è stato scelto il nome _Bool per non rompere la compatibilità con le caratteristiche già esistenti. Per il resto, per il nuovo codice, basta usare bool.

mjordan
29-05-2003, 13:50
Vi faccio un esempio del qualificatore restrict:


int my_func(const void * restrict param1, const void * restrict param2);


In questo prototipo si utilizzano 2 qualificatori: const e restrict
const indica che il puntatore non può modificare l'oggetto puntato. Pertanto se all'interno della funzione un puntatore modifica un oggetto, si ottiene un errore.
restrict indica che agli oggetti si può accedere solo mediante i puntatori e che tali puntatori devono contenere indirizzi "distinti", quindi è anche un modo per dire che gli oggetti non devono puntare a oggetti che in memoria sono sovrapposti.

Una bella idea direi, visto che aggiunge consistenza ai prototipi e consente ai libri di eliminare la frase "Se gli oggetti sono sovrapposti il comportamento è indefinito" :D
Difatti è stato aggiunto a molte funzioni della libreria standard.

skyblaze
29-05-2003, 16:41
Originally posted by "mjordan"



Se vuoi davvero imparare a programmare altro che 2 capitoli :D :DNon ho fretta...sto imparando per il gusto della conoscenza....non ho l'obbiettivo di imparare a programmare per scrivere a tutti i costi programmi tra 1 mese :sofico: ;)

skyblaze
29-05-2003, 16:43
Approposito...meno male che ci hai chiarito gia ero andato in crisi.....quindi meglio cosi che sto imparando l'ansi c perche da come dici è ancora lo standard.Infatti leggevo che addirituttra si puo dare l'opzione al compilatore GCC -ANSI(se non sbaglio) per forzare le direttive ansi appunto.
Riprendo lo studio hehehehe :)

P.S.
Cosa ne pensi del java?

mjordan
29-05-2003, 16:48
Originally posted by "skyblaze"

Approposito...meno male che ci hai chiarito gia ero andato in crisi.....quindi meglio cosi che sto imparando l'ansi c perche da come dici è ancora lo standard.Infatti leggevo che addirituttra si puo dare l'opzione al compilatore GCC -ANSI(se non sbaglio) per forzare le direttive ansi appunto.
Riprendo lo studio hehehehe :)

P.S.
Cosa ne pensi del java?

gcc -ansi -pedantic per essere + precisi.

Cosa penso del Java? Un altro linguaggio. Il concetto di linguaggio di programmazione a due visioni: quello propriamente detto e quello commerciale. Java rientra nel secondo.
E' innegabile che semplifica la vita ad un sacco di problemi e che ha portato diverse innovazioni. Non lo condanno, ma neanche lo venero.

terrys3
29-05-2003, 18:15
Originally posted by "mjordan"

Calmi calmi, state attenti tutti.
Il tipo bool è soltanto un typedef ad un intero, quindi in realtà non è strettamente necessario.
Le regole abolite, come quelle dell'int implicito, sono state eliminate, ma sono differenze veramente marginali. In sostanza, a parte chi usa il Kernighan e Ritchie non deve "buttare" nulla. Tutto è applicabile e funzionante.
Inoltre bisogna considerare che la totalità dei compilatori di default accetta la versione ANSI C 89 e successiva revisione C90 e quindi, per compilare programmi "strict C99" bisogna passare dei flag particolari.

Per esempio, il seguente programma in ISO C 99:

#include <stdio.h>
#include <stdbool.h> // Il nuovo header per i tipi booleani.

int
main(void)
{
bool b[10]; // Array booleano. Questo è un commento su una sola riga.

for (int i = 0; i < 10; i++) // Dichiarazione di variabil ein un ciclo.
b[i] = false;

return 0;
}


sotto GCC per essere compilato correttamente necessita del flag `-std=c99' , questo fino a quando il C99 non diverrà "widely adopted", dopo il quale sarà lo standard accettato di default.

Chi usa invece il C traditional (pre-ANSI K&R) dovrebbe aggiornarsi. Molti compilatori stanno eliminando i supporti. Per esempio gcc 3.4 eliminerà gran parte del supporto per il C traditional e molti costrutti non compileranno +, come ad esempio i prototipi del tipo:


void my_func(int, int);


Quindi tutto sommato io che che sto studiando dalla 2° edizione del K&R (ansi C per intenderci) posso stare tranquillo e non preoccuparmi più di tanto, visto che i compilatori attuali continuano a supportare senza problemi l'ANSI C. Cmq in quanto a chiarezza dell'esposizione pensi sia preferibile il K&R o l'Herbert Schildt? Se quest'ultimo fosse migliore potrei decidermi cmq a comprarlo (visto che cmq è più aggiornato)
Grazie per l'aiuto

mjordan
29-05-2003, 18:20
Originally posted by "terrys3"



Quindi tutto sommato io che che sto studiando dalla 2° edizione del K&R (ansi C per intenderci) posso stare tranquillo e non preoccuparmi più di tanto, visto che i compilatori attuali continuano a supportare senza problemi l'ANSI C. Cmq in quanto a chiarezza dell'esposizione pensi sia preferibile il K&R o l'Herbert Schildt? Se quest'ultimo fosse migliore potrei decidermi cmq a comprarlo (visto che cmq è più aggiornato)
Grazie per l'aiuto

Guarda io non conosco la seconda edizione del K&R, comunque so che è tutt'altro che completo come libro. Ma considerando che un libro solo non basta mai per apprendere a fondo un linguaggio (è utile confrontare l'opinione di almeno 2 autori diversi per farsi una propria idea) e considerando che lo Schildt non è proprio per principianti, ti conviene terminare quello e poi passare a qualcosa di + tecnico. Se stai studiando il K&R evidentemente posso capire che muovi i primi passi con questo linguaggio, e quindi ti consiglio vivamente questo percorso. Termina quello e poi passa allo Schildt. Ma una volta che avrai terminato il K&R avrai anche qualche elemento in + per giudicare tu stesso che libro leggere come seconda lettura.

Ciao.

EDIT: Il C conviene impararlo come Dio comanda per diversi motivi: rendersi agiati con la sua sintassi rende molto piu' semplice apprendere la sintassi di altri linguaggi di programmazione, visto che la tendenza attuale è quella di basarsi sempre su questa tipologia di sintassi.
Secondo motivo: sforzarsi di risollvere i problemi in C usando la libreria standard è un buon modo per imparare a programmare davvero. Usare le API + assurde di Java, per esempio, consente di risolvere un problema in modo molto veloce, ma lascia chi le usa (almeno che non sia già un esperto) con una visuale limitata del problema.
Terzo motivo: La maggior parte delle librerie + interessanti sono scritte in C/C++. Inoltre una buona conoscenza di C apre le porte ad uno studio + approfondito dei sistemi Unix, che sono scritti in C e che sono la piattaforma base della maggiorparte dei programmatori professionisti.

skyblaze
29-05-2003, 19:41
io sto imparando da questo libro che mi ha prestato mio cugino(che ha usato all'inizio per l'universita) e devo dire che è il primo libro tecnico che leggo che è veramente chiaro in ogni aspetto; mi ci trovo benissimo, tutto è spiegato con un linguaggio semplice e a portata di principiante come me.
Il libro(che non credo sia tanto giovane) è "Guida al linguaggio c" della Mc Graw Hill scritto da Alessandro bellini e Andrea Guidi, uno è un ingegnere elettronico l'altro laureato in scienze dell'informazione è stato per 3 anni docente di informatica nell'universita dell'equador :rolleyes: :D
Conoscete questo libro?E' valido e completo per il c?

gokan
29-05-2003, 21:16
Originally posted by "skyblaze"

io sto imparando da questo libro che mi ha prestato mio cugino(che ha usato all'inizio per l'universita) e devo dire che è il primo libro tecnico che leggo che è veramente chiaro in ogni aspetto; mi ci trovo benissimo, tutto è spiegato con un linguaggio semplice e a portata di principiante come me.
Il libro(che non credo sia tanto giovane) è "Guida al linguaggio c" della Mc Graw Hill scritto da Alessandro bellini e Andrea Guidi, uno è un ingegnere elettronico l'altro laureato in scienze dell'informazione è stato per 3 anni docente di informatica nell'universita dell'equador :rolleyes: :D
Conoscete questo libro?E' valido e completo per il c?
Ho studiato su questo testo un poco di C e devo dire che mi trovai piuttosto bene (infatti ho comprato anche un libro sul pascal scritto dagli stessi autori).Ho usato anche il K&R e devo dire che ho trovato delle parti più chiare e ben spiegate rispetto ad altri.
E' da un'pò che non studio il C, adesso sono concentrato sul Pascal e Delphi :D
Ciao

terrys3
29-05-2003, 21:24
Originally posted by "gokan"


Ho studiato su questo testo un poco di C e devo dire che mi trovai piuttosto bene (infatti ho comprato anche un libro sul pascal scritto dagli stessi autori).Ho usato anche il K&R e devo dire che ho trovato delle parti più chiare e ben spiegate rispetto ad altri.
E' da un'pò che non studio il C, adesso sono concentrato sul Pascal e Delphi :D
Ciao

Non ho capio cosa vuoi dire! Ti ha soddisfatto il K&R?

Edde
05-06-2003, 23:23
Ciao a tutti :)

Mi sto avvicinando a questo linguaggio per un esame dell'universita'.
Mi sapete consigliare qualche buon sito (magari con dei manuali scaricabili gratuitamente) sul C?
In italiano ;)

Grazie :p