C- objaśnienie gdzie się potknąłem

0

Cześć od niedawana zacząłm przygodę z programowaniem i staram się powoli iść z materiałem coraz szybciej ;)

W poniższym kodzie noe mogę dojść do wniosku jak uczynić by wypisany tekst na ekranie po zakończeniu porcesu pisanie podliczył mi zużyte znaki itp
Trochę tych pętli pojawiło się i nie jestem przekonany co do końca czy na pewno rozmieściłem dobrze nawiasy klamrowe

#include<stdio.h>
/* zliczanie cyfr,białych znaków,innych*/
int main(void)
    {
    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("cyfry=");
		   for(i=0;i<10;++i)
			{
			 printf("%d",ndigit[i]);
			}
	}	

   printf("białe znaki=%d, inne = %d,\n",nwhite,nother);
return 0;     
}
3
  1. Źle sformatowałeś kod. Powinien on wyglądać mniej więcej tak:
#include <stdio.h>
/* zliczanie cyfr,białych znaków,innych*/
int main(void)
{
    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("cyfry=");
        for (i = 0; i < 10; ++i) {
            printf("%d", ndigit[i]);
        }
    }

    printf("białe znaki=%d, inne = %d,\n", nwhite, nother);
    return 0;
}

Wtedy pewnie od razu zobaczyłbyś błąd: pętlę while zagnieździłeś w pętli for, co nie ma sensu.

Poprawka:

#include <stdio.h>
/* zliczanie cyfr,białych znaków,innych*/
int main(void)
{
    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("cyfry=");
    for (i = 0; i < 10; ++i) {
        printf("%d", ndigit[i]);
    }

    printf("białe znaki=%d, inne = %d,\n", nwhite, nother);
    return 0;
}
  1. Zauważ, jak wypisujesz informacje o cyfrach. cyfry=0111100000 Pyt. Co będzie, gdy któraś cyfra pojawi się kilkanaście razy? Również przydałaby się spacja między wypisywaniem liczby cyfr a liczby białych znaków.

  2. To drobiazg ale zamiast (c == ' ' || c == '\n' || c == '\t') mógłbyś użyć isspace: http://en.cppreference.com/w/c/string/byte/isspace Zobaczysz wtedy, że opuściłeś w tym ifie kilka białych znaków, np nie sprawdzasz '/v'. Użycie: Proste: if(isspace(c)) W tym celu musisz wcześniej #include <ctype.h>

0

Dzięki wielkie za pomoc i podzieleniem się jak zapewne mniemam szeroką wiedzą ;)
Chętnie się zapoznam z twoimi radami i nowymi typami(chyba tak to się nazywa? )
jednakowoż chciałbym się dowiedzieć w jaki sposób sprawdzić poprawność działania mojego programu
nie rozumiem jeśli odpalam go w terminalu i wypisuje znaki to czemu printf nie wypisuje mi ilości zużytych znaków?

1

nowymi typami(chyba tak to się nazywa? )

isspace to funkcja. Typ to np. int, float, char, etc.

nie rozumiem jeśli odpalam go w terminalu i wypisuje znaki to czemu printf nie wypisuje mi ilości zużytych znaków?

Przecież sam napisałeś:

        while ((c = getchar()) != EOF) {
            if (c >= '0' && c <= '9') {
                ++ndigit[c - '0'];
            }
            else if (c == ' ' || c == '\n' || c == '\t') {
                ++nwhite;
            }
            else {
                ++nother;
            }
        }

Program czyta wszystko, co wpiszesz z klawiatury, aż do EOF, nie aż do ENTERa. Jak wciśniesz ENTER, to program po prostu notuje go sobie jako kolejny biały znak i dalej czeka, co wpiszesz.

Możesz także wpisać z klawiatury EOF. Na Windowsach: CTRL+Z, na *nixach: CTRL+D (po uprzednim wciśnięciu ENTERa, inaczej zdaje się nie działać)

Alternatywnie możesz oczywiście przerobić program tak, by wypisywał podsumowanie po każdorazowym wczytaniu '\n'

0

Dzięki ;)
Właśnie zastanawiałem się jaki znak to ten EOF ;)
Jeszcze raz za pomoc ;)

0

EOF to End Of File, czyli Koniec Pliku. To w zasadzie nie jest osobny znak, ile raczej oznaczenie, że dane wejściowe się zakończyły.

Jak czytasz z pliku i natrafisz na EOF, to znaczy, że przeczytałeś już cały plik.

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