Newsgroup: it.comp.programmare
Titolo: Esercizio C dal Deittel & Deitel

Riporto il testo dell'esercizio:
"Scrivere un programma che prenda in input un numero di cinque cifre, lo 
spezzetti nelle sue singole cifre e le visualizzi ognuna separata 
dall'altra da tre spazi. Per esempio, se l'utente digitasse 4239, il 
programma dovrebbe visualizzare 4   2   3   3   9".
Il problema è questo: l'esercizio è proposto alla fine del capitolo due, 
dove si sono studiate solo le istuzioni printf, scanf, e if semplice 
(cioè senza il ciclo if/else)....
Non ne riesco a venire a capo, mi sembra che con le poche istuzioni 
spiegate fino ad ora sia impossibile farlo.... ma se lo propongono ci
sarà il modo.... che non trovo!!!
HELP ME!!!
Grazie

qualcosa del genere? (non uso le funzioni per la shell da una vita e l'ho 
scritto al volo per cui è solo per dare un'idea)
char carattere;
do {
    scanf("%c",&carattere); // oppure getchar()
    printf("%3c",carattere);
}while(carattere!=VK_RETURN);

 }while(carattere!=VK_RETURN);
se non puoi usare do while semplicemente dovrai ripetere 5 volte lo stesso 
codice tipo...
scanf("%c",&carattere);
if(carattere==VK_RETURN)
 return 0;
printf("%3c",carattere);
scanf("%c",&carattere);
if(carattere==VK_RETURN)
 return 0;
printf("%3c",carattere);
...per altre 3 volte 

Per il momento grazie.... più tardi provo.

Gian ha scritto:

Secondo me non serve nessun if e nessun ciclo.
Prendi in input un numero di 5 cifre, numero, non stringa.
Poi scrivi la cifra delle decine di migliaia, tre spazi, la cifra delle 
migliaia, tre spazi, la cifra delle centinaia, tre spazi, etc...
Suppongo che nel capitolo 1 siano stati presentati i tipi di dati, tra i 
quali l'intero, e le operazioni che si possono fare con essi.
La conoscenza dell'aritmetica decimale e' un prerequisito per poter 
programmare, ma la si impara alle scuole elementari...

 ...
è un'altra possibile soluzione... 

Roberto Montaruli ha scritto:

Risolto... Grazie.
mi hai acceso la lampadina....
Domani posto il listato.

Ecco il listato.
/* Scompone un numero di 5 cifre nelle singole cifre separate */
/* da tre spazi.                                              */
#include <stdio.h>
main()
{
     int num, c1, c2, c3, c4, c5;
     printf("\nInserisci un numero di 5 cifre\n");
     printf("Verra' spezzettato nelle singole cifre\n\n");
     printf("Numero = ");
     scanf("%d", &num);
     c5 = num/10000;
     c4 =(num-(c5*10000))/1000;
     c3 =(num-(c5*10000 + c4*1000))/100;
     c2 =(num-(c5*10000 + c4*1000 + c3*100))/10;
     c1 =(num-(c5*10000 + c4*1000 + c3*100 + c2*10));
     printf("\n%d  %d  %d  %d  %d\n", c5, c4, c3, c2, c1);
     return 0;
}

     int num, c1, c2, c3, c4, c5;
forse č un po' piů compatto:
#include <stdio.h>
int main()
{
    int num;
    printf("\nInserisci un numero di 5 cifre\n");
    printf("Verra' spezzettato nelle singole cifre\n\n");
    printf("Numero = ");
    scanf("%d", &num);
    printf("\n%d  %d  %d  %d  %d\n", num / 10000,
                                     (num % 10000) / 1000,
                                     (num % 1000) / 100,
                                     (num % 100) / 10,
                                     num % 10);
    return 0;
}

 
Per mettere in evidenza che gli spazi di separazione sono 3, sapendo che 
  i numeri c1, c2, etc sono di una cifra, potresti risolvere togliendo 
gli spazi dalla stringa di format della printf() e mettere %4d%4d%4d...
Il newline prima del risultato se non e' richiesto e' meglio non 
metterlo: il risultato potresti volerlo usare in pipe con qualcos'altro 
e un newline prima del dato da' solo fastidio.

 programma dovrebbe visualizzare 4   2   3   3   9".
Ti posto un mio vecchio listato. Non è proprio il massimo ma lascio
cosi com'è.
Ciao.
==============================
#include <stdio.h>
int dividiInt(int a);
int main()
{
   int num;
   printf("Inserire un numero intero 1 <= x <= 32767:\t");scanf("%d",
&num);
   printf("L'output e' ");
   dividiInt(num);
   system("PAUSE");
   return 0;
}
int dividiInt(int a)
{
   int   val1 = 0,
         val2 = 0,
         val3 = 0,
         val4 = 0,
         val5 = 0,
         parteIntera = 0,
         resto = 0;
   resto = a % 10;
   parteIntera = a / 10;
   val5 = resto;
   resto = parteIntera % 10;
   parteIntera = parteIntera / 10;
   val4 = resto;
   resto = parteIntera % 10;
   parteIntera = parteIntera / 10;
   val3 = resto;
   resto = parteIntera % 10;
   parteIntera = parteIntera / 10;
   val2 = resto;
   resto = parteIntera % 10;
   parteIntera = parteIntera / 10;
   val1 = resto;
   if (!(val1 == 0))
      printf("%d ", val1);
   if (!(val2 == 0))
      printf("%d ", val2);
   if (!(val3 == 0))
      printf("%d ", val3);
   if (!(val4 == 0))
      printf("%d ", val4);
   printf("%d\n", val5);
}

Grazie a tutti..... anche se in confronto a voi sono appena all'inizio.
Che percorso mi consigliate di seguire? Va bene il Deitel&Deitel?
E partire dal C per poi studiare il C++ e magari arrivare alla 
programmazione .Net ne vale la pena?
Grazie ancora a tutti.

 programmazione .Net ne vale la pena?
La programmazione dotnet e' vincolata ad una sola piattaforma.
Se non ti ci costringono per lavoro, resta negli spazi aperti del mondo 
unix.

programmazione .Net ne vale la pena?
Ormai non vale più la pena iniziare dal C. Tantomeno dal C++, se non
sei vincolato da requisiti specifici. Se vuoi programmare per lavoro,
approfondisci le piattaforme Java/J2EE e .NET, con le quali si riesce
a svolgere la gran parte dei compiti in maniera molto agile. La
conoscenza del C++ non fa male (e ti conviene comunque iniziare
direttamente dal C++ e non dal C) ma è da destinare a casi estremi in
cui servono performance elevatissime (anche se devo dire che i
compilatori JIT delle due piattaforme succitate generano codice
sufficientemente veloce per la gran parte dei compiti).

 unix.
Io programmo in C# su GNU/Linux... è sì vincolata (la programmazione .NET) ad
una sola piattaforma, se avessi inteso piattaforma != sistema operativo sarei
stato d'accordo, ma la frase successiva smentisce questa mia speranza.
Perché uno non potrebbe programmare usando .NET (eh ehm, Mono) su *nix?
David
-- 
 . ''`.  Debian maintainer | 
http://wiki.debian.org/DavidPaleino
 : :'  : Linuxer #334216 --|-- 
http://www.hanskalabs.net/
 `. `'`  GPG: 1392B174 ----|---- 
http://snipr.com/qa_page
   `-   2BAB C625 4E66 E7B8 450A C3E1 E6AA 9017 1392 B174

La programmazione dotnet e' vincolata ad una sola piattaforma.
Non è assolutamente vero. Allo stato attuale esiste almeno
un'implementazione .NET per Linux e comunque, in generale, nulla vieta
di portare .NET su qualunque sistema (la CLI è standard
internazionale).

 Perché uno non potrebbe programmare usando .NET (eh ehm, Mono) su *nix?
Si che potrebbe, ma chi te lo fa fare?
Mono non e' un progetto per creare una piattaforma portabile, ma solo un 
progetto per poter tentare di superare la limitazione che ha dotnet di 
essere un framework solo per il suo sistema operativo.
Sarebbe come dire che siccome c'e' wine allora le applicazioni per 
windows sono portabili.
No!

 a svolgere la gran parte dei compiti in maniera molto agile.
Sarebbe come dire: "ormai non vale piu' la pena imparare a scrivere a 
penne e imparare la grammatica, visto che esistono gli elaboratori di 
testi e i correttori ortografici."
Approfondire il C e il C++ rende piu' facile in seguito adottare Java.
Non e' invece vero il contrario.

windows sono portabili.
Ti sbagli. Il paragone è errato. In questo caso non si tratta di
emulazione, si tratta di avere un vero e proprio framework di sviluppo
scritto per una piattaforma parallela.

Approfondire il C e il C++ rende piu' facile in seguito adottare Java.
Opinabile. Io ho seguito la strada del Pascal, del C, del C++ e di
Java (imparati nell'ordine) ma ho conosciuto ottimi programmatori Java
o C# che non hanno mai visto una riga di C. Imparare correttamente la
programmazione non dipende dai linguaggi pregressi ma dalle proprie
capacità mentali e di ragionamento. Oltretutto, imparare a programmare
OGGI richiede con urgenza l'apprendimento di concetti che vanno molto
oltre quelli che si possono apprendere con uno scarno linguaggio
procedurale. Il C++ è poi del tutto inadeguato a piazzarsi in
posizione intermedia in una curva di apprendimento. Va imparato solo
se STRETTAMENTE necessario, altrimenti se ne può fare tranquillamente
a meno (risparmiando dolorosi mal di capo).

 a meno (risparmiando dolorosi mal di capo).
Su questo sono perfettamente daccordo: in tanti anni in cui mi e' 
capitato di fare di tutto, mai una volta mi sono trovato in condizione 
di usare il C++ in quanto tale.
Di fatto il C ti permette di pensare a come sono organizzati i dati in 
memoria, che per quanto mi riguarda e' un concetto fondamentale, mentre 
gia' in pascal questa consapevolezza la perdi, e in java non esiste proprio.
Magari dal tuo punto di vista e' opinabile pure questo concetto, ma a 
questo punto e' opinabile tutto.
Dal punto di vista pratico io lavoro, tu lavori, quindi se la finalita' 
deve essere il lavorarci, con la programmazione, vuol dire che tutti 
questi concetti sono solo disquisizioni filosofiche.
Pero' per me la finalita' della programmazione non e' il lavoro, ma 
qualcosa di un po' piu' elevato.

qualcosa di un po' piu' elevato.
Puntare ad essere un programmatore professionista è un'aspirazione
sufficientemente nobile. Questo richiede la conoscenza approfondita di
moltissimi concetti. Che lavorare significhi non partecipare a
disquisizioni filosofiche, ancora una volta, è una tua opinione. Anzi,
ragionare sui concetti è un'operazione quotidiana per chi programma di
mestiere. Quando dico che ciò che affermi è "opinabile" non sto
contemplando alcuna correttezza possibile; significa che, dal mio
punto di vista, il tuo punto di vista è semplicemente errato.


I libri Deitel&Deitel sono ottime introduzioni perché partono da zero.
Ti consiglio di farti un'infarinatura di C e di studiare il C++ sui
loro libri perché ritrovarai praticamente gli stessi esempi e le
stesse tracce di esercizio, così da vedere un aspetto o un problema da
due punti di vista differenti. Non commettere il comune errore di
considerare C e C++ come cose quasi uguali. Sono linguaggi molto
differenti! La "programmazione .NET" significa tante cose. Ti
consiglio di lasciare perdere al momento la cosa e di concentrarti su
applicazioni console. Non mettere troppa carne a cuocere!
Per i libri fondamentali sul C e sul C++ basta navigare un po' ché i
libri sono sempre quelli.
ciao.

applicazioni console.
Non so a cosa tu pensi quando si cita la piattaforma Microsoft, ma ti
garantisco che le applicazioni console sono ugualmente scrivibili con
qualunque ambiente riesca a compilare codice per il framework .NET.

nibble ha scritto:

Cosa sono le applicazone console???????

>> Grazie ancora a tutti.
basta solo leggere questo:
http://www.stsc.hill.af.mil/CrossTalk/2008/01/0801DewarSchonberg.html
un estratto:
Java programming courses did not prepare our students for the first
course in systems, much less for more advanced ones. Students found it
hard to write programs that did not have a graphic interface, had no
feeling for the relationship between the source program and what the
hardware would actually do, and (most damaging) did not understand the
semantics of pointers at all, which made the use of   pointers at all,
which made the use of C in systems programming very challenging.
Let us propose the following principle: The irresistible beauty of
programming consists in the reduction of complex formal processes to a
very small set of primitive operations. Java, instead of exposing this
beauty, encourages the programmer to approach problem-solving like a
plumber in a hardware store: by rummaging through a multitude of drawers
(i.e. packages) we will end up finding some gadget (i.e. class) that
does roughly what we want. How it does it is not interesting!
THE RESULT IS A STUDENT HO KNOWS HOW TO PUT A SINGLE PROGRAM TOGETHER,
BUT DOES NOT KNOW HOW TO PROGRAM (il maiuscolo è mio)
e questo lo dicono due professori universitari membri (presidente e vice
) dell' AdaCore . E secondo me a ragione :)

bruce ha scritto:

aggiungo e preciso con professori universitari non intendevo addurre
certo  un principio di auctoritas..

 Cosa sono le applicazone console???????
Che tristezza!
Sono applicazioni da usare da linea di comando, e che possono leggere 
l'input dallo stdin e scrivono l'output sullo stdout.
Applicazioni che possono funzionare senza interfaccia interattiva con 
l'utente, e che costituiscono i mattoni dei batch file.

 programmazione .Net ne vale la pena?
No. Per una serie di ragioni. Questo non vuole dire che non valga la
pena di imparare C e C++. Ma se l'obiettivo è C#...
-- 
-riko

 programmazione moderni.
Forse il punto è che "programmazione .Net" è davvero una cosa vasta e
vaga. Esattamente come dire "programmazione Linux"[0].
In .Net, come fai notare sotto, fai veramente di tutto. Hai
semplicemente indicato una tecnologia. E io sono convinto che una
tecnologia debba essere un mezzo, non un fine. 
Io devo fare "un sito web". La tecnologia sarà Django. Devo fare
un'applicazione GUI cross-platform? C++/Python e Qt mi piace. Se posso
limitarmi a OS X sarà Cocoa, se è Windows prenderei in serissima
considerazione proprio .Net (magari attravero IronPython, il bello di
.Net è che poi uno sceglie il linguaggio come gli pare). 
Non parto con l'idea di "fare un'applicazione Python".
-----
[0] in questo senso vedere la roba di .Net come macchina astratta per
cui si lavora non è differente che vedere un generico OS.
-- 
-riko

 wrote:

Dibattuto. Per dire su Wikipedia indica come applicazioni Console
precisamente il contrario: applicazioni *testuali* con interfaccia
utente testuale (tipo ncurses).
Ora io non mi butterei nel contenzioso, ma indicare le sole applicazioni
pensate per essere pipate come app console mi pare abbastanza
fuorviante.
-- 
-riko

 gia' in pascal questa consapevolezza la perdi, e in java non esiste proprio.
Uhm... in primo luogo non capisco perchè in Pascal perdi la
consapevolezza di come i dati sono organizzati in memoria.
Oltretutto lo standard C è piuttosto reticente su come bisogna piazzare
le cose, per lasciare all'implementatore la libertà di fare le cose più
veloci. Questo vuole dire che si potrebbe fare un'implementazione C
conforme che piazza le cose in modo completamente non intuitivo per
quello ce ti riguarda. 
Non ultimo, con le macchine moderne, multicomputer e compagnia cantante
l'organizzazione dei dati in memoria "ad alto livello" è piuttosto
impossibile da prevedere.
-- 
-riko

 farlo in maniera ottimale.
Quanto ti quoto.
-- 
-riko

 consapevolezza di come i dati sono organizzati in memoria.
Usando il Pascal in quanto tale, puoi fare a meno dei puntatori, anzi 
tendi proprio a farne a meno, fino ad arrivare al punto che se usi il 
Pascal non ti servono i puntatori.
E senza puntatori non ti poni il problema di come siano organizzati i 
dati in memoria.
Nel caso piu' banale, le stringhe, che in C sai essere terminate da un 
carattere \0.
In Pascal non te lo so proprio dire come sono organizzate le stringhe in 
memoria.

 memoria.
Questo è, direi, un problema tuo. Se avessi letto la documentazione, lo
sapresti. 
-- 
-riko

 
L'ho letta la documentazione, e proprio per questo so che non si puo' 
sapere.
Basta solo il fatto che in pascal si puo' definire un
array of char e un packed array of char per capire che sono organizzati 
in memoria in modo differente, ma trasparente al programmatore.

 pena di imparare C e C++. Ma se l'obiettivo è C#...
Mi proponi un percorso valido per imparare a programmare?
E il C# è una valida prospettiva?
Grazie

 Mi proponi un percorso valido per imparare a programmare?
Impara prima i concetti cardine della programmazione. Non avere
fretta. Il C e il C++ sono ottime scuole a cui aggiungo il Python:
linguaggio estremamente potente. Dopo che hai tirato su una certa
esperienza, sulla base di quello che vuoi fare, sceglierai il
linguaggio/piattaforma più adatto alle tue esigenze di studio/lavoro.
ciao.

 E il C# č una valida prospettiva?
Io ho scelto di non guardarlo nemmeno. Conosco Java abbastanza bene e lo
schivo appena possibile (cioč quasi sempre). Questo sono io. Tu sei tu.
-- 
-riko