Newsgroup: it.comp.lang.c
Titolo: 1-13 K&R

Riposto dopo svariato tempo che l'ho fatto il codice di questo esercizio
perchč compilando ed eseguendo mi sono accorto che ha un bug che non
riesco a risolvere:
nclude <stdio.h>
#define OUT 0
#define IN 1
int main (void)
{
        int c, i, j, state = OUT, wcount = 0;
	        int word [10];
 
	for (i = 0; i < 10; ++i)
		word [i] = 0;
	while ((c = getchar ()) != EOF)
	{
		if (c == ' ' || c == '\n' || c == '\t')
		{
			state = OUT;
		}
		else if (state == OUT)
		{
			state = IN;
			++wcount;
		}
		else
			++word [wcount];
	}
	for (i = 0; i < 10; ++i)
	{
		if (word [i] == 0);
		else
		{
			for (j = 0; j <= word [i]; ++j)
				putchar ('*');
			putchar ('\n');
		}
	}
}
gsam@debian:~/C/krcap1$ ./histogram
ciao a tutti
****
*****
Come potete vedere non conteggia il singolo carattere. L'errore č molto
probabilmente concettuale (la classica idiozia) ... la situazione in cui 
hai tutto sotto gli occhi ma proprio no, non lo trovi... sono certo che 
sarą una stupidata...
Grazie per l'attenzione, attendo una risposta per darmi la solita mega
pacca sulla fronte :)))
(sempre distratto) Nicholas

 			for (j = 0; j <= word [i]; ++j)
				   ^^^^^^^^
				sbagliato: o fai partire j da 1, oppure fai un
				controllo come "minore di", altrimenti ciclera`
				sempre almeno una volta (anche quando il
				conteggio delle lettere e` 0)				
Come l'ho riscritto io:
<CODE>
#include <stdio.h>
#define OUT 0
#define IN 1
int main (void)
{
        int c, i, j, state = OUT, wcount = 0;
	int word [10];
 
	for (i=0; i<10; ++i)
	word[i] = 0;
 
	while ((c = getchar ()) != EOF)
	{
		if (c == ' ' || c == '\n' || c == '\t')
		{
			state =	OUT;
			continue;
		}
		else if (state == OUT)
		{
			state = IN;
			wcount++;
		}
		++word[wcount];
	}
 
	for (i=0; i<10; ++i)
	{
		if (word[i] ==	0)
			;
		else
		{
			for (j=0; j<word[i]; ++j)
				putchar('*');
			putchar('\n');
		}
	}
}
</CODE>
Quando non riesci a capire dove stia il bug, di solito vai molto meglio se
farcisci il codice con delle printf() che ti chiariscono la situazione nel
mentre ;)
Adieu,
-- 
Lestat de Lioncourt                               |          Ciro Mattia Gonano
  JabberID: 
les...@jabber.students.cs.unibo.it
    |    Undergraduate Student in
  ICQ#: 52631406                                  |         Computer Science at
  URL: 
http://www.CS.UniBO.It/~gonano
             |       University of Bologna
            <powered by Linux Slackware 8.1 on Kernel 2.4.18-xfs>

Ok, anche oggi ho usato inutilmente un po' di banda...
#include <stdio.h>
#define OUT 0
#define IN 1
int main (void)
{
        int c, i, j;
	int word [10];
	int wordc = 0;
	int state = OUT;
        for (i = 0; i < 10; ++i)
                word [i] = 0;
	while ((c = getchar ()) != EOF)
	{
		if (c == ' ' || c == '\n' || c == '\t')
			state = OUT;
		else if (state == OUT)
		{
			state = IN;
			++word [++wordc];
		}
		else
			++word [wordc];
	}
	for (i = 0; i < 10; ++i)
	{
		if (word [i] == 0);
		else
		{
			for (j = 0; j < word [i]; ++j)
				putchar ('*');
			putchar ('\n');
		}
	}
}
Scusate il 3ad inutile e la perdiata di tempo...
Ciao !
Nicholas

 Adieu,
Esattamente quello che ho fatto, il punto era appunto che non processavo
la prima lettera...
Merci beaucoup :)
Ciao !
Nicholas

        }
Ti propongo la mia soluzione:
#include <stdio.h>
#define MAX_LEN 15
int main() {
        enum { OUT, IN };
        int c, i = 0;
        int state = OUT;
        int len[MAX_LEN] = {0, };
        while((c = getchar()) != EOF) {
                /* White space? */
                if (c == ' ' || c == '\t' || c == '\n') {
                        /* Non considero parole di zero caratteri (ie.
                         * sequenze di spazi
                         */
                         if (state == IN) {
                                state = OUT;
                                len[i - 1]++;
                                i = 0;
                        }
                } else if (state == OUT) {
                        state = IN;
                        i++;
                } else if (state == IN)
                        i++;
        }
        for (c = 0; c < MAX_LEN; c++) {
                printf("%2d ", c + 1);
                for (i = 0; i < len[c]; i++)
                        putc('*', stdout);
                putc('\n', stdout);
        }
}
kronos:~/c$ gcc -std=c99 -Wall -g -op p.c
kronos:~/c$ p
foobar   quuux quux   bar a foo   kronos rulez  thisisalongword
 1 *
 2
 3 **
 4 *
 5 **
 6 **
 7
 8
 9
10
11
12
13
14
15 *
 
 
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"New processes are created by other processes, just like new
 humans. New humans are created by other humans, of course,
 not by processes." -- Unix System Administration Handbook

 riesco a risolvere:
http://www.crackinguniversity2000.it/kandr2/krx113.html

>        }
Se il carattere è differente da quelli sopracitati siamo all'interno di
una parola quindi state IN. Il mio errore era proprio qui: ++wcount
aggiungeva 1 alla variabile che volevo utilizzare per conteggiare le
parole ma non conteggiava un carattere. Per la soluzione vedi l'altro
post (che credo sia arrivato... altrimenti reposto...).

Scusami, ho probabilmente sbagliato a non postare la consegna ma si
trattava di creare un istogramma che stampasse la lunghezza della parole
(ciao = ****). Non capisco se la stampa risulta orizzontale o verticale.
Nelle soluzioni del K&R che avevo trovato la stampa verticale ma mi
sembra una complicazione assurda, tant'è che essendo un programma da
console non si riusciva a vedere la reale lunghezza della stringa
(scrolla ^^).
In ogni caso cmq tentavo di risolvere con i mezzi che il K&R fornisce
fino a quel momento senza aggiungere nulla (poca cosa in realtà...)
quindi niente putc o continue/break come nell'altro post.
L'output che ho io è:
gsam@debian:~/C/krcap1$ ./histogram
ciao a tutti io sto moooooooolto bene
****
*
*****
**
***
************
****
 0   4   1   5   2   3   12   4   0   0
e mi sembra che vada bene... (c'è un controllo che non stampa gli
elementi == 0).
Grazie per gli interventi, se il feedback è sempre questo faccio 3 post
al giorno ^^
Ciao !
Nicholas