Newsgroup: it.comp.lang.c++
Titolo: Programmino da newbie

Avendo appena completato con successo la lettura in inglese dei primi 2
capitoli di "Thinking in C++" di Bruce Eckel, dopo essermi sciroppato 6 mesi
fa due terzi del Lippman/Lajoie (del quale avevo capito poco niente) e dopo
essermi divorato un anno fa il "Visual C++ for Dummies" della APOGEO
(interessante e di lettura piacevole, peccato che sbrodoli codice arido e
che non insegni nulla oltre), mi sono prefissato l'obiettivo di scrivere un
programmino *al di la'* dei comuni esempi ed esercizietti proposti, e cosi'
ho optato per un basilare generatore di numeri primi...
Essendo io un umilissimo studente liceale, un anno fa presi al balzo
l'offerta studenti-docenti della Microsoft e acquistai a prezzo
stra-scontato la versione completa di Visual Studio 6.0, del quale fin ora
ho usato solo Visual C++ 6.0 e un po' di Basic.
Riporto in coda a questo post il programma per intero e vorrei gentilmente
ricevere da voi critiche, ammonimenti, consigli e suggerimenti vari atti a
riportarmi *sulla retta via* in vista della ripresa della lettura del
capitolo 3 etc. , tenendo conto che, per ora, le mie conoscenze sono
limitate a interi, stringhe, puntatori, vettori e funzioni e qualcos'altro
che non mi viene in mente, ma sicuramente ignoro le classi, le templates, le
strutture e altri giochetti avanzati.
Il codice potra' essere sicuramente riscritto in meno di 10 righe e con
calcoli molto piu' ottimizzati, ma questa e' tutta farina del mio sacco (e
ne sono orgoglioso!), e quindi e' banalissima...
(Tra l'altro mi sono reso conto dopo averlo scritto che potevo suddividere
il programma in 3 funzioni (getlimite(), numerinonprimi(limite),
numeriprimi(limite) ) che l'avrebbero reso molto piu' elegante e leggibile,
e probabilmente in una versione futura lo faro'...)
In particolar modo mi interessava avere delle risposte alle seguenti
domande:
a) Perche' e' sconsigliabile l'utilizzo della dichiarazione " using
namespace std; "?
b) Ho utilizzato " void main(void) {...} " e saro' sicuramente bacchettato,
ma vorrei sapere anche qui perche' si preferisce " int main " che a mio
parere e' un inutile spreco di seppur piccolissima parte di memoria, visto
che void me lo accetta senza problemi?
Ovviamente il compilatore non ha dato alcun errore ne' warning.
Ecco il codice:
------------------------------------------------------------------------
// vv Direttive necessarie per Visual C++ 6.0 vv
// Compile options needed: /GX
#pragma warning(disable: 4786)
#define for if (0); else for
// ^^ Direttive necessarie per Visual C++ 6.0 ^^
#include <iostream>
#include <vector>
using namespace std;
void main(void) {
 int limite = 0;
 int a = 0;
 int b = 0;
 int n = 0;
 vector<int> nonprimi;
 vector<int> output;
 /* Ricava il limite superiore dell'intervallo
 di numeri naturali positivi da analizzare */
 while (limite <= 1) {
  cout << "Indicare il limite superiore per la ricerca dei numeri primi: ";
  cin >> limite;
  if (limite <= 1)
   cout << "\nSpiacente, non posso accettare valori negativi, ne' zero, ne'
uno.\n";
 }
 /* Esegue tutte le moltiplicazioni che
 determinano i numeri sicuramente non primi
 e li inserisce in fondo al vettore "elenco"
 solo se nessuno dei due fattori e' = 1
 (altrimenti includerebbe anche i numeri
 potenzialmente primi) */
 for (int i = 1; i < limite; i++) {
  a = i;
  for (int i = 1; i <= (limite / a); i++)
   if ( a != 1 && i != 1)
    nonprimi.push_back(a * i);
 }
 cout << "\n";
 /* Per tutti i valori compresi tra 1 e "limite"
 controlla se il valore e' presente nel vettore
 "nonprimi", nel caso sia assente (il contatore
 "n" sia uguale a zero) inserisce il numero in
 fondo al vettore "output" */
 for (int i = 1; i <= limite; i++) {
  b = i;
  n = 0;
  for (int i = 0; i < nonprimi.size(); i++) {
   if (nonprimi[i] == b)
    n++;
  }
  if (n == 0)
   output.push_back(b);
 }
 /* Stampa tutti i numeri primi sullo schermo */
 cout << "I Numeri primi compresi tra 1 e " << limite << " sono:\n";
 cout << "{ " << output[0];
 for (int i = 1; i < output.size(); i++)
  cout << ", " << output[i];
 cout << " }.\n\n\n\n";
}
------------------------------------------------------------------------
Alessandro Gardi
ICQ # 45112424

  for (int i = 1; i < output.size(); i++)
come sopra.
--
Gerolamo

 come sopra.
Ok grazie di tutto, a risentirci!
--
Alessandro Gardi
ICQ#: 45112424

 infinitamente grato!)
Questo dipende dal sistema operativo.
Ogni SO si puo' comportate come vuole all'uscita di un programma
a seconda del valore che questo programma restituisce.
Solitamente non credo sia compito tuo controllare questo valore.
--
Gerolamo

 infinitamente grato!)
Ad esempio da console Unix è molto utile. Esempio: do make (per compilare un 
programma), e se funziona voglio che lo installi automaticamente. Ma se ci 
sono stati errori di compilazione non voglio che me lo installi, perchè 
tanto sarebbe una installazione non funzionante. Come faccio a sapere se 
make ha funzionato? Semplice: se make funziona il suo main ritorna 0, 
altrimenti ritorna X != 0. Quindi io testo se make ha ritornato 0. Capio?
PS: questo su Unix si traduce con:
make && make install
da root. Ciao.
-- 
Andrea Bergia - studente          Linux Registred User #281550
Per favore non mandatemi allegati in Word o PowerPoint.
Si veda 
http://www.fsf.org/philosophy/no-word-attachments.html

 Spero che ora ti sua tutto più chiaro.
Chiarissimo! Quindi l'uso della direttiva "using..." e' a lungo andare
dannoso perche' puo' facilmente produrre ambiguita'-ambivalenze
catastrofiche...
Certo durante la scrittura di programmini didattici come questi, molto brevi
da concepire, può consentirti di risparmiare una *seppur minima* parte di
tempo sulla digitazione [ e ora mi becco la *seppur minima* dose di
pernacchie che merito :-)) ]
Pero' e' a tutti gli effetti conveniente abituarsi sin da subito a non
abusarne, altrimenti andando avanti sarebbero dolori...
Grazie di nuovo.


 da root. Ciao.
Una volta mi sono trovato a dover digitare ./configure poi make poi make
install su bash linux per installare un serverino, ma allora non avevo idea
che fossero cosi' strettamente collegati con il linguaggio....
Grazie anche a te e ciao!


 idea che fossero cosi' strettamente collegati con il linguaggio....
Non proprio con il linguaggio... Più che altro col metodo di funzionamento 
dell'OS. Anche da assembler, ad esempio, puoi ritornare 0, 1 eccetera al 
sistema operativo (anche da dos MOV AX, 4C01h INT 21h per ritornare, ad 
esempio, 1).
