[C++] Wprowdzanie tekstu -> zliczanie liter
Ostatnio zmodyfikowano 2013-11-17 11:56
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. #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. |
|
pekfos |
» 2013-11-16 20:51:26 Dodaj break w switch. |
|
Buby |
» 2013-11-16 20:51:31 W instrukcji switch --> case zapomniałeś o dopisaniu break.
@Edit: W tym samym momencie Pekfos :) |
|
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 ] << ": "; |
|
pekfos |
» 2013-11-16 21:05:03 std::cout << std::setw( n ) |
|
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? |
|
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. std::cout << std::setfill( 'x' ); std::cout.fill( 'x' );
std::cout << std::cout.fill( 'x' ); |
|
« 1 » |