Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Wprowdzanie tekstu -> zliczanie liter

Ostatnio zmodyfikowano 2013-11-17 11:56
Autor Wiadomość
Asalas77
Temat założony przez niniejszego użytkownika
[C++] Wprowdzanie tekstu -> zliczanie liter
» 2013-11-16 20:48:00
Witam, mam takie zadanie:

Napisz program, który będzie wczytywał i analizował tekst (ciąg liter) wprowadzany z klawiatury aż do momentu naciśnięcia klawisza ESC. Po zakończeniu wczytywania program powinien wyświetlić na ekranie histogram występowania poszczególnych liter alfabetu. Do gromadzenia informacji o ilości podanych liter wykorzystaj tablicę 26 liczników.

C/C++
#include <iostream>
#include <cstdlib>
#include <conio.h>

using namespace std;

int main()
{
    int znak[ 26 ], litera[ 26 ];
    litera[ 0 ] = 'A';
    for( int i = 0; i < 26; i++ )
    {
        znak[ i ] = 0;
    }
    for( int i = 0; i < 26; i++ )
    {
        litera[ i + 1 ] = litera[ i ] + 1;
    }
    char z;
    do
    {
        z = getch();
        switch( z )
        {
        case 'a': znak[ 0 ] ++;
        case 'b': znak[ 1 ] ++;
        case 'c': znak[ 2 ] ++;
        case 'd': znak[ 3 ] ++;
        case 'e': znak[ 4 ] ++;
        case 'f': znak[ 5 ] ++;
        case 'g': znak[ 6 ] ++;
        case 'h': znak[ 7 ] ++;
        case 'i': znak[ 8 ] ++;
        case 'j': znak[ 9 ] ++;
        case 'k': znak[ 10 ] ++;
        case 'l': znak[ 11 ] ++;
        case 'm': znak[ 12 ] ++;
        case 'n': znak[ 13 ] ++;
        case 'o': znak[ 14 ] ++;
        case 'p': znak[ 15 ] ++;
        case 'q': znak[ 16 ] ++;
        case 'r': znak[ 17 ] ++;
        case 's': znak[ 18 ] ++;
        case 't': znak[ 19 ] ++;
        case 'u': znak[ 20 ] ++;
        case 'v': znak[ 21 ] ++;
        case 'w': znak[ 22 ] ++;
        case 'x': znak[ 23 ] ++;
        case 'y': znak[ 24 ] ++;
        case 'z': znak[ 25 ] ++;
        }
    }
    while( z != 27 );
   
    for( int k = 0; k < 26; k++ )
    {
        cout <<( char ) litera[ k ] << ": " << znak[ k ] << ": ";
        for( int j = 0; j < znak[ k ]; j++ )
        {
            cout << "#";
        }
        cout << endl;
    }
   
    system( "pause" );
}


Problem jest taki:
Jeżeli np. nacisnę A BB CCC FFFFFFFFFF to D i E wyświetla tyle co C, a wszystko od F w dół wyświetla się jako 10 a nie 0.
P-96377
pekfos
» 2013-11-16 20:51:26
Dodaj break w switch.
P-96378
Buby
» 2013-11-16 20:51:31
W instrukcji switch --> case zapomniałeś o dopisaniu break.

@Edit:
W tym samym momencie Pekfos :)
P-96379
Asalas77
Temat założony przez niniejszego użytkownika
» 2013-11-16 21:02:50
ok dzieki teraz dziala.

a jeszcze jedna rzecz, jak zrobic zeby lewa krawedz tego wykresu byla zawsze rowna? W sensie zeby sie nie przesuwaly linie pojedncze jak dam 10+ lub 100+ znaku jakiegos. Chyba jakos z cout.width() przy wypisywaniu liczb ale nie chce mi to wyjsc

cout <<( char ) litera[ k ] << ": " << cout.width( 3 ) << znak[ k ] << ": ";
P-96382
pekfos
» 2013-11-16 21:05:03
std::cout << std::setw( n )
P-96383
Asalas77
Temat założony przez niniejszego użytkownika
» 2013-11-16 21:37:39
ok zrobilem tak

cout <<( char ) litera[ k ] << ":" << cout.fill( '_' ) << setw( 4 ) << znak[ k ] << ": ";
 i taka kosmetyczna sprawa: przy A jest o jedno "_" mniej niz przy reszcie. Czemu?
P-96386
pekfos
» 2013-11-17 11:56:57
Bo ios::fill() to nie manipulator, wyświetlasz wartość zwróconą przez wywołanie metody fill(), która zwraca stary znak wypełnienia.
C/C++
std::cout << std::setfill( 'x' );
std::cout.fill( 'x' );
//Ale nie tak:
std::cout << std::cout.fill( 'x' );
P-96410
« 1 »
  Strona 1 z 1