Alcuni dubbi (C++)

Programmazione, algoritmica, teoria dell'informazione, ...
Rispondi
L'ale
Messaggi: 49
Iscritto il: 14 set 2007, 13:10
Località: Pistoia

Alcuni dubbi (C++)

Messaggio da L'ale » 30 ott 2008, 19:32

Ciao a tutti.. Sono alle prime armi con il C++ e mi sono sorti dei dubbi, forse banali ma per me non così scontati..
Proverò ad esporveli, e se qualcuno avrà la pazienza e la voglia di aiutarmi gliene sarò molto grata.. :>

1) Questo programmino stampa n asterischi, con n dato:

#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
int n;
cout<<"Quanti asterischi?"<<endl>>n;
while (n--)
cout<<'*';
cout<<endl;
system("PAUSE");
return 0;
}

Mi è stato detto che in questa forma esso non termina se n<0. In che senso?


2) Perché per scrivere qualcosa in un file in append bisogna utilizzare la formula ios::out | ios::app ? Intendo dire, qual è il significato logico di inserire un OR qui dentro?

3) Il costrutto

while (ff.get(c))
cout<<c;

(dove c è di tipo char) a cosa si riferisce esattamente? Mi è stato detto che la funzione get permette di leggere anche gli spazi, ma cosa significa in questo caso? "Quali" spazi vengono letti se è riferita a un char?

4) Questo programma scrive 4 interi nel file "esempio". Poi apre il file in lettura e stampa su video il suo contenuto.

#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
fstream ff;
int num;
ff.open("esempio", ios::out);
if (!ff)
{
cerr<<"Il file non può essere aperto"<<endl;
exit(1);
}
for (int i=0; i<4; i++)
ff<<i<<endl;
ff.close();
ff.open("esempio", ios::in);
if(!ff)
{
cerr<<"il file non può essere aperto"<<endl>>num)
cout<<num<<'\t'<<endl;
system("PAUSE");
return 0;
}

L'uscita a video è effettivamente
0 1 2 3

ma perché non trovo gli stessi numeri scritti anche nel file "esempio"?


5) Qual è la differenza (se c'è) tra chiamata di una funzione e istanza di una funzione?

6) Il programma qui sotto apre in lettura il file "esempio" e legge N numeri interi. Poi controlla che le istruzioni di lettura non portino lo stream in stato di errore.

#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
fstream ff;
int i, num;
const int N = 6;
ff.open("esempio", ios::in);
if(!ff)
{
cerr<<"Il file non può essere aperto"<<endl;
exit (1);
}
for (i=0; i<N>>num; i++)
cout<<num<<'\t';
cout<<endl;
if (i != N)
cerr<<"Errore nella lettura del file"<<endl;
system("PAUSE");
return 0;
}

Il mio dubbio (l'ultimo!) è: perché in uscita ottengo sempre

0 1 2 3
Errore nella lettura del file

? Dove sta l'errore/l'inghippo?

Grazie mille anticipatamente a chi mi risponderà! :)

Avatar utente
SkZ
Messaggi: 3333
Iscritto il: 03 ago 2006, 21:02
Località: Concepcion, Chile
Contatta:

Messaggio da SkZ » 30 ott 2008, 20:09

1) se ~n<0 alla partenza, ottieni un loop infinito. Presupponi che l'utente dia solo valori sensati ergo positivi o nulli. Questo e' un grave errore nella programmazione. Pensa che l'utente fara' di tutto per crasharti il programma.

3) qualunque carattere e' un char, anche gli spazi (intesi come spazio, tab e newline). Diciamo che tutto cio' che e' rappresentato nella tabella ASCII puo' essere immagazzinato in un char (che di solito ha dimensione 1 byte)
se non sbaglio quel codice legge da un input e stampa a schermo il contenuto
impara il [tex]~\LaTeX[/tex] e mettilo da par[tex]\TeX~[/tex]

Software is like sex: it's better when it's free (Linus T.)
membro: Club Nostalgici
Non essere egoista, dona anche tu! http://fpv.hacknight.org/a8.php

Avatar utente
kn
Messaggi: 508
Iscritto il: 23 lug 2007, 22:28
Località: Sestri Levante (Genova)
Contatta:

Messaggio da kn » 30 nov 2008, 16:55

2) Perché si tratta di un OR di bit e non un OR logico (||)
serve a mettere insieme due numeri binari e quindi si presta bene a unire delle "flag" in un numero solo. Usalo così e prendilo come dogma se non hai voglia di approfondire
4)
cerr<<"il file non può essere aperto"<<endl>>num)
Hai saltato delle righe quindi non posso dire dov'è il problema...
6)
for (i=0; i<N>>num; i++)
Così fai uno shift a destra...
forse volevi scrivere

Codice: Seleziona tutto

for (i=0; i<ff>>num, num); i++) 
(ff>>num, num) significa "ricevi un numero da ff e mettilo in num, quindi usa num come risultato"
Spero di essere stato utile anche a un mese di distanza :roll:

gst_113
Messaggi: 53
Iscritto il: 03 feb 2008, 15:31
Località: Valdagno

Messaggio da gst_113 » 01 mag 2009, 13:37

già che ci sono faccio un paio di domande pure io:
1)esiste una funzione che permette di ottenere input da tastiera senza premere invio? (qualcosa come il readkey di pascal)
2)in C++ per fare programmi con output grafici elementari (linee, punti e simili) è proprio necessario appoggiarsi a librerie come le win API ?

Avatar utente
Tibor Gallai
Messaggi: 1776
Iscritto il: 17 nov 2007, 19:12

Messaggio da Tibor Gallai » 01 mag 2009, 13:47

gst_113 ha scritto:1)esiste una funzione che permette di ottenere input da tastiera senza premere invio? (qualcosa come il readkey di pascal)
Ci sarebbe la getchar(), anche se il mio consiglio è di scriverti sempre le cose da solo, se puoi.
2)in C++ per fare programmi con output grafici elementari (linee, punti e simili) è proprio necessario appoggiarsi a librerie come le win API ?
Ovviamente no, puoi fare a mano tutto quello che ti pare. Ma questo dipende molto dalla tua conoscenza a basso livello del computer e del sistema operativo.
[quote="Pigkappa"]Penso che faresti un favore al mondo se aprissi un bel topic di bestemmie da qualche parte in modo che ti bannino subito.[/quote]

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite