Moje źle działające programy - temat zbiorczy

0

Jestem początkującym programistą języka C, naukę zacząłem w połowie października wraz z rozpoczęciem studiów.
Zakładam temat zbiorczy, w którym zamieszczać będę moje nie do końca działające programy.

Mój pierwszy problem: napisałem program tworzący histogram długości wpisywanych wyrazów i liczący białe znaki.
Program działa prawidłowo, ale tylko jeśli przed EOF zamieszczę znak spacji. Jeśli tego nie zrobię, program nie zliczy mi ostatniego wyrazu. Jak można to rozwiązać, w miarę prosty sposób, zrozumiały dla newbie?

#include <stdio.h>
                     /* program tworzy histogram dlugosci wyrazow */
int main()           /* oraz wylicza ilosc bialych znakow. */
                     /* white - ilosc bialych znakow (spacja || '\n' || '\t') */
{                    /* c - wpisywany znak; */
  int c, i, white;   /* i - ilosc liter w slowie; */
  int dlugosc[10];   

  for(i=0; i<10; ++i)
   dlugosc[i]=0;

  i=0;

  while((c=getchar())!= EOF)
    {
    if(c==' '||c=='\n'||c=='\t')
      if(i==0)
	++white;
      else if(i<9)
	{
	  ++dlugosc[i];
	  ++white;
	  i=0;
	}
      else
	{
	  i=9;
	  ++dlugosc[i];
	  ++white;
	  i=0;
	}
    else
      ++i;
    }

  printf("\nNapisales");

  for(i=1; i<10; ++i)
    printf(" %d", dlugosc[i]);

  printf(" wyrazow o dlugosciach 1, 2, 3, ..., 7, 8, (9 lub wiecej) znakow\noraz %d bialych znakow.\n", white);

  return 0;
}
0

Wczytuj liniami a nie pojedynczymi znakami.

0

Zamień while na do while, oraz dodaj go do listy białych znaków.

0
_13th_Dragon napisał(a):

Zamień while na do while, oraz dodaj go do listy białych znaków.

Zmieniłem program na:

#include <stdio.h>
                     /* program tworzy histogram dlugosci wyrazow */
int main()           /* oraz wylicza ilosc bialych znakow. */
                     /* white - ilosc bialych znakow (spacja || '\n' || '\t' || EOF) */
{                    /* c - wpisywany znak; */
  int c, i, white;   /* i - ilosc liter w slowie; */
  int dlugosc[10];   

  for(i=0; i<10; ++i)
   dlugosc[i]=0;

  i=0;

  do
    {
    c=getchar();
    if(c==' '||c=='\n'||c=='\t'||c==EOF)
      if(i==0)
	++white;
      else if(i<9)
	{
	  ++dlugosc[i];
	  ++white;
	  i=0;
	}
      else
	{
	  i=9;
	  ++dlugosc[i];
	  ++white;
	  i=0;
	}
    else
      ++i;
    }
  while(c!=EOF);

  printf("\nNapisales");

  for(i=1; i<10; ++i)
    printf(" %d", dlugosc[i]);

  printf(" wyrazow o dlugosciach 1, 2, 3, ..., 7, 8, (9 lub wiecej) znakow\noraz %d bialych znakow.\n", white);

  return 0;
}

I działa poprawnie, zlicza już ostatnie słowo.

0

mała uwaga jak chcesz zainicjalizować jakąś tablicę zerami to możesz napisać tak:
int dlugosc[10] = {0};
Kompilator automatycznie dopełni pozostałe elementy zerami.

0

Twój program nadal nie działa poprawnie: http://ideone.com/kQe0Iv

Może zrób to w ten sposób.
Zdefiniuj sobie dwie zmienne - jedna niech mówi o tym, czy poprzedni znak był znakiem białym, druga zmienna niech mówi nam czy aktualny znak jest znakiem białym. I teraz w pętli kolejno wykonuj:

  • jeśli poprzedni znak jest biały a aktualny nie jest to mamy początek wyrazu - zwiększ licznik wyrazów
  • jeśli aktualny znak jest biały - zwiększ licznik białych znaków
  • jeśli aktualny znak to EOF - przerwij pętlę
  • jeśli aktualny znak nie jest biały - zwiększ licznik długości ostatniego (aktualnego) wyrazu
0
adf88 napisał(a):

Twój program nadal nie działa poprawnie: http://ideone.com/kQe0Iv

U mnie, przy tym samym kodzie wejściowym, wyświetla poprawne wyniki:

   ala    ma   kota   
Napisales 0 1 1 1 0 0 0 0 0 wyrazow o dlugosciach 1, 2, 3, ..., 7, 8, (9 lub wiecej) znakow
oraz 14 bialych znakow.

Używam Ubuntu, kompiluję w terminalu systemowym (gcc -o hist histogram_dlugosci_wyrazow.c -Wall -pedantic), tam też odpalam program.

0

Nie zainicjowałeś zmiennej white.

1 użytkowników online, w tym zalogowanych: 0, gości: 1