Forum CDRinfo.pl

Forum CDRinfo.pl (https://forum.cdrinfo.pl/)
-   Off topic (https://forum.cdrinfo.pl/f5/)
-   -   c++ zliczanie liter (https://forum.cdrinfo.pl/f5/c-zliczanie-liter-68877/)

misiek767 29.11.2006 21:37

c++ zliczanie liter
 
witma mam do napisania program ktory liczy wystapienie poszczegolnych liter we wczytanym ciagu i wyswietla ich statystyke. na koncy jeszcze ma wyswietlac litery ktore najczesciej wystepowaly i napisze ile razy wystapily. efekt ma byc taki
To jest to
T 1
o 2
2
j 1
e 1
s 1
t 2
2
t 2
o 2
Najczesciej wystapily o,t po dwa razy

Przyszedl mi do glowy tylko jeden pomysl jak to napisac mianowicie chcialem ten tekst zapisac do tablicy a potem porownywac i-ty element tablicy z reszta elementow tej tablicy ale nie wiem za bardzo jak to napisac. Prosze o jakies wskazowki albo o inne pomysly do rozwiazania tego poroblemu z gory dzieki

andy 29.11.2006 21:40

Poszukaj rozwi***261;zania na forum 4programmers.net

pawelblu 30.11.2006 21:45

Zrob zliczanie wszystkiego od ! do ~ (wszystko, czyli litery, cyfry, znaki).

Zadeklaruj tablice output 94 elem. Zainicjalizuj na 0.

int output[94] = {}; //to chyba powinno zrobic co trzeba


i teraz taki pseudokod

FOR EVERY x_char IN input_string DO
++output[x_char - 33];

I teraz wypisujesz

FOR x_char FROM 0 TO 93 DO
PRINTCHAR(x_char+33);
PRINTINT(output[x_char]);
PRINTLN;

Tak bym to probowal robic.

misiek767 05.12.2006 18:53

Ok napisalem cos takiego
#include <cstdlib>
#include <iostream>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{

int tab[256]={0};
int m;
char tabi[m];
char itab[m];
int iMin,iMax,iMinInd,iMaxInd;
int i;
int j=0;
char z;
while (z!=13){

z=getche();
itab[j]=z;
j++;

}
cout<<endl;
for(i=0; i<=j; i++)
tab[itab[i]]++;

for(i=0; i<=(j-2); i++){
cout<<itab[i]<<" "<<tab[itab[i]]<<endl;}

iMin=iMax=tab[itab[0]];
for (i=0;i<=(j-1);i++){ if (tab[itab[i]]>=iMax){iMax=tab[itab[i]];iMaxInd=itab[i];}}
cout<<endl;
cout<<"najczesciej wystepowaly"<<endl;
cout<<char(iMaxInd)<<" "<<iMax<<" razy"<<endl;

cout<<endl;



system("PAUSE");
return EXIT_SUCCESS;
}
No i prawie dziala ale jest program z liczeniem max
chodzi o to ze jak jest kilka liter ktore wystapily najwiecej razy np w zdaniu
"ttttoooo" to on wyswietla tylko ta ostatnia

pawelblu 05.12.2006 20:54

Cytat:

Napisany przez misiek767 (Post 713077)
Ok napisalem cos takiego
#include <cstdlib>
#include <iostream>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{

int tab[256]={0};
int m; <-------------------------
char tabi[m]; <------------------------- CO TE LINIE MAJA ROBIC ??
char itab[m]; <-------------------------
int iMin,iMax,iMinInd,iMaxInd;
int i;
int j=0;
char z;
while (z!=13){ <------------------------- ZAMIAST 13 DALBYM '\n' lub '\0' - 13 ??

z=getche();
itab[j]=z; <------------------------- JAKIEJ WIELKOSCI JEST itab ??
j++;

}
cout<<endl;
for(i=0; i<=j; i++) <------------------------- DLACZEGO TUTAJ DO j ??
tab[itab[i]]++;

for(i=0; i<=(j-2); i++){ <------------------------- A TUTAJ DO j-2 ??
cout<<itab[i]<<" "<<tab[itab[i]]<<endl;}

iMin=iMax=tab[itab[0]];
for (i=0;i<=(j-1);i++){ if (tab[itab[i]]>=iMax){iMax=tab[itab[i]];iMaxInd=itab[i];}}

^^^^^ A TU LICZYSZ do j-1 POZA TYM POWINNO WYGLADAC RACZEJ TAK:
iMin = iMax = tab[itab[0]]; //krotnosc
iMaxInd = iMinInd = itab[0]; //znak
for (i=1;i<=j;i++){ if (tab[itab[i]]>=iMax){iMax=tab[itab[i]];iMaxInd=itab[i];}}

cout<<endl;
cout<<"najczesciej wystepowaly"<<endl;
cout<<char(iMaxInd)<<" "<<iMax<<" razy"<<endl;

cout<<endl;



system("PAUSE");
return EXIT_SUCCESS;
}
No i prawie dziala ale jest program z liczeniem max
chodzi o to ze jak jest kilka liter ktore wystapily najwiecej razy np w zdaniu
"ttttoooo" to on wyswietla tylko ta ostatnia

Ja to bym zreszta wogole robil inaczej :)

Acha ... zeby ten Twoj problem rozwiazac to musisz po prostu wziac iMax przed ta seria cout i przeleciec tablice i wypisac kazdy znak o krotnosci iMax.

luminat 06.12.2006 12:49

Ja sie tylko spytam na kit zapisujesz do tablicy ilosc wystepowania danych znakow, to jest absolutnie nie potrzebne. Najprosciej jest zrobic tak:

1. Zadeklarowac jedna tablice.
2. Wprowadzic do niej dane - za pomoca petli for
3.

Kod:

For j = 65 To 90 - ta petla zaczyna sprawdzanie znakow ascii od A do Z
            licznik = 0 - ilosc wystapien znaku A
            For i = 0 To 9 - tu sprawdzamy wszystkie pola tablicy w poszukiwaniu danej litery, gdy j =65, wtedy liczymy ilosc wystapien znaku A
                If tablica(i) = Chr(j) Then
                    licznik = licznik + 1
                End If

            Next
            If licznik > 0 Then
                Console.WriteLine(CStr(Chr(j)) + ": " + CStr(licznik)) - po zakonczeniu wykonywania petli 'For i' wypisujemy ilosc wystapien danego znaku gdy np j=65, wypisujemy ilosc wystapien litery A
            End If
        Next


pawelblu 06.12.2006 15:38

Po pierwsze:
To jest bez sensu bo przechodzisz caly tekst dla kazdej litery oddzielnie. Bardzo nieefektywne rozwiazanie.

Po drugie:
Poza tym zobacz jak ma wygladac wyjscie, a jak wyglada Twoje wyjscie (kolejnosc, powtarzanie).

Prawidlowo:

INPUT: To jest to
OUTPUT:
T 1
o 2
2
j 1
e 1
s 1
t 2
2
t 2
o 2

Nie dosc ze wyzsza zlonosc (tylko o stala, ale nie mala - on ma ok. 4n, Ty masz wielkosc_alfabetu*n). Poza tym nie zapewniasz tej funkcjonalnosci zeby podawac podawac wszystkie odpowiedzi o maks. wystapieniu i Twoje rozwiazanie nie jest latwo przerabialne do tej formy (w szczegolnosci i tak pewniu musialbys uzyc tablicy).


Wszystkie czasy w strefie CET. Aktualna godzina: 23:07.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2025, vBulletin Solutions Inc.