PDA

View Full Version : [C] Problema programma conta spazi, caratteri e cifre


stevanovic73
24-06-2012, 17:27
Buongiorno a tutti...

Sto imparando da autodidatta il C dal manuale K&R e studiando gli array il testo mi presenta il seguente codice

#include <stdio.h>
/* count digits, white space, others */
main()
{
int c, i, nwhite, nother;
int ndigit[10];

nwhite = nother = 0;

for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf("digits =");
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n",nwhite, nother);
}

Qualsiasi input io dia al programma sul terminale appare il testo "digits =" e niente più.

Vi ringrazio anticipatamente per il vostro aiuto.

Filly95
25-06-2012, 09:16
Se non sbaglio non hai inizializzato bene le variabili nwhile e nother.

stevanovic73
25-06-2012, 14:29
Se non sbaglio non hai inizializzato bene le variabili nwhile e nother.

Ho provato anche ad inizializzarle una alla volta ma non cambia niente...

AllerITA
25-06-2012, 21:13
Prova questo:

#include <stdio.h>
/* count digits, white space, others */
main()
{
int c, i, nwhite, nother;
int ndigit[10];

nwhite = nother = 0;

for (i = 0; i < 10; i++)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf("digits =");
for (i = 0; i < 10; i++)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n",nwhite, nother);
}

stevanovic73
25-06-2012, 21:43
Prova questo:

#include <stdio.h>
/* count digits, white space, others */
main()
{
int c, i, nwhite, nother;
int ndigit[10];

nwhite = nother = 0;

for (i = 0; i < 10; i++)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf("digits =");
for (i = 0; i < 10; i++)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n",nwhite, nother);
}

Le differenze sono solo nel post-incremento di i giusto?

AllerITA
26-06-2012, 09:53
si perché l'incremento postfisso esegue l'operazione successivamente all'uscita dalla sequenza di istruzioni che sono coinvolte nella linea di codice, mentre l'incremento prefisso la esegue immediatamente prima di eseguire la riga di codice. Almeno se mi ricordo bene. Correggetemi se sbaglio.
Ecco la documentazione:

http://msdn.microsoft.com/en-us/library/aa299422(v=VS.60).aspx

potrebbe però non essere questo, dovresti usare il debugger e provare a controllare lo stato delle variabili mettendo un breakpoint quando ti deve
stampare il vettore dei tasti numerici. Controllando come te lo ha popolato.:)

stevanovic73
26-06-2012, 11:05
si perché l'incremento postfisso esegue l'operazione successivamente all'uscita dalla sequenza di istruzioni che sono coinvolte nella linea di codice, mentre l'incremento prefisso la esegue immediatamente prima di eseguire la riga di codice. Almeno se mi ricordo bene. Correggetemi se sbaglio.
Ecco la documentazione:

http://msdn.microsoft.com/en-us/library/aa299422(v=VS.60).aspx

potrebbe però non essere questo, dovresti usare il debugger e provare a controllare lo stato delle variabili mettendo un breakpoint quando ti deve
stampare il vettore dei tasti numerici. Controllando come te lo ha popolato.:)

Ciò che hai detto sul preincremento e il postincremento è giusto, ma il codice non funziona lo stesso.

E' come se si interrompesse al primo printf. Per il debug sono un po' nuovo in materia e non lo so so usare bene, ma l'inizializzazione dell' array tramite il for avviene correttamente.

AllerITA
26-06-2012, 11:17
Dipende da che ide usi, se e' Visual Studio 2010 Express o superiori, il breakpoint lo puoi inserire visivamente cliccando in fondo a sinistra della riga del codice, poi una volta che lo hai intercettato nell'eseguire il programma basta portare il cursore sulla variabile da analizzare per ottenere una preview o uno specchietto del contenuto della variabile nella finestra del controllo in basso chiamata Watch (o in italiano credo sia osserva).
Comunque se devi utilizzare il compilatore per esercitarti, è quasi fondamentale che impieghi un po di tempo a studiare il debugger e' vitale per capire se stai facendo degli errori per causa di dimenticanze.:)

AllerITA
26-06-2012, 11:43
Ho provato in Visual Studio con una piccola modifica a me funziona:


#include <stdio.h>

int main()
{
int c, i, nwhite, nother;
int ndigit[10];

nwhite = nother = 0;

for (i = 0; i < 10; i++)
ndigit[i] = 0;
while (((c = getchar()) != EOF) && (c!='\n'))
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf("digits =");
for (i = 0; i < 10; i++)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n",nwhite, nother);
getchar();
return 0;
}


non so se però così ti ho stravolto il programma.:D

stevanovic73
26-06-2012, 17:34
Ho provato in Visual Studio con una piccola modifica a me funziona:


#include <stdio.h>

int main()
{
int c, i, nwhite, nother;
int ndigit[10];

nwhite = nother = 0;

for (i = 0; i < 10; i++)
ndigit[i] = 0;
while (((c = getchar()) != EOF) && (c!='\n'))
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf("digits =");
for (i = 0; i < 10; i++)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n",nwhite, nother);
getchar();
return 0;
}


non so se però così ti ho stravolto il programma.:D

Grazie mille per il tuo aiuto... Il C mi sta dando alla testa ormai xD

Ti ringrazio di nuovo, "C" si becca sul forum :D