Wczytywanie liczby znaków.

0

Witam mam za zadanie napisanie programu który będzie zliczał liczbę znaków wprowadzanych. W pierwszej linii znajduje się liczba wprowadzanych ciągów znakowych, a następne to już ciągi. np

Wejście:

2
Poczatek
23572,asd,329956!!!

Wyjście:

8 8 0
19 3 11

Wszystko ładnie pięknie, napisałem program lecz jeszcze muszę zliczać znaki spacji, moje arcydzieło jednak liczy ciągi znaków po spacji jako oddzielne ciągi. Podaje kod mojego programu:

#include<iostream>
#include<string.h>

using namespace std;


int main()
{
	int n, l=0, m=0, f=0;
	char t[100][100];

	cin>>n;

	for(int i=0; i<n; i++)
	{
		cin>>t[i];
	for(int i=0; i<n; i++)
	{
		for (int z=0;z<31;z++)
		{         
			if (t[i][z]>='0' && t[i][z]<='9')
			{
				l++;
			}
			if (t[i][z]>='a' && t[i][z]<='z')
			{
				m++;
			}
			if (t[i][z]>='A' && t[i][z]<='Z')
			{
				m++;
			}
			if (t[i][z])
			{
				f++;
			}
		
			t[i][z]=0;
		}
		
	}
				cout<<f<<" "<<m<<" "<<l<<"\n";
			l=0, m=0, f=0;
	}
	return 0;
}

Prosił bym o przedstawienie sposobu w jaki można zażegnać mój problem.

1

string s;
getline(cin,s);
int dlugosclinii = s.size();

1

Widze ze zadanie jakby ze spoja, wiec pare uwag. Lepiej operowac na tablicy 1 wymiarowej i na biezaco wczytywac i wyswietlac wyniki. Jesli chcesz pobierac spacje to musisz wczytac dane do chara najlepiej przez cin.getline np.

char tab[100];
cin.getline(tab,100); 

Teraz przegladasz sobie tablice i sprawdzasz znak po znaku(tylko nie cala tablice) czy isalpha isdigit isspace i wyswietlasz wyniki. Dlugosc ciagu zwraca strlen

1

podejście obiektowe jest wygodniejsze, zakładając że na początku kodu wrzucisz magiczną linijkę ios_base::sync_with_stdio(0); to szybkość będzie porównywalna i rzadko kiedy zaważy o tym czy Twoje zadanie wykona się w oczekiwanym czasie

0

Oczywiscie ze wygodniejsze, tylko na spoju czesto podana jest max dlugosc danych na wejsciu, wiec mozna to sobie z gory ograniczyc wtedy. Osobiscie tez wole korzystac z takiego podejscia.

0

No ok to było bardzo pomocne, dzięki za odpowiedź, jeżeli to nie jest problem to bym prosił o podanie funkcji dla stringa która będzie zliczać liczby oraz cyfry.

1

ischar sprawdza czy to znak
isnum sprawdza czy to liczba
Iterować umiesz. Teraz trzeba to połączyć.

0

Fajnie dzięki za tak szybką odpowiedz. Możecie mi podać gdzie najszybciej znaleźć takie funkcje wraz z objaśnieniami ?

0

jeszcze ostatnie pytanie. Jakiej biblioteki należy użyć przy tych funkcjach?

0

znaki możesz policzyc tak:

#include <cstdlib>
#include <iostream>

using namespace std;


int main(int argc, char *argv[])
{
    char tab[256];
    int counter[256];
    memset(counter,0,sizeof(counter));
    cin.getline(tab,256);
    
for(int i=0; i<strlen(tab); i++)
{
   counter[tab[i]]++;     
}

for (int i=0 ; i<256 ; i++ )
if (counter[i]){ cout << "znak  " <<(char)i << " wystapil "<<counter[i]<<" razy.\n" ;}
    system("PAUSE");
    return EXIT_SUCCESS;
}

potem oczywiscie mozna przeleciec po tablicy couter :

 int total_small = 0 ;

for (int i ='a' ; i<='z' ; i++)
{
if (counter[i]) total_small+= counter[i];
}
cout <<"malych liter jest " << total_small <<"\n";

 int total_big = 0 ;

for (int i ='A' ; i<='Z' ; i++)
{
 total_big+= counter[i];   //bez ifa tez mozna
}
cout <<"duzych liter jest " << total_big <<"\n";

 int total_digits = 0 ;

for (int i ='0' ; i<='9' ; i++)
{
 total_digits+= counter[i];
}
cout <<"cyfr jest " << total_digits <<"\n";

uwaga taka ze polskie krzaczki są w innym miejscu tablicy i nalezy je uwzglednic ale juz nie chce mi sie sprawdzać ich kodów;

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