środa, 11 grudnia 2013

Kod C++ - histogram

// Program, który rysuje histogram wystąpień dużych liter w danym pliku tekstowym.

#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
#include <stdlib.h>

using namespace std;

int main() {
    string filename; // Nazwa pliku, z którego program ma czytać.
    ifstream stream; // Definicja strumienia do pracy z plikiem.
    char alphabet[25]; // Licznik wystąpień znaków.

    // Zerowanie licznika.

    for (int iterator = 0; iterator < 25; iterator++)
        alphabet[iterator] = 0;

    cout << "Podaj sciezke do pliku: ";

    cin >> filename;

    stream.open(filename.c_str(), ios::out);

    if (!stream) {
        cout << "Nie udalo sie otworzyc podanego pliku.";

        exit(-1);
    }

    char actual; // Aktualny znak z pliku wejściowego.

    try {
        while (stream.get(actual)) {
            switch (actual) {
            case 'A':
                alphabet[0]++;

                break;

            case 'B':
                alphabet[1]++;

                break;

            case 'C':
                alphabet[2]++;

                break;

            case 'D':
                alphabet[3]++;

                break;
            
            case 'E':
                alphabet[4]++;

                break;
            
            case 'F':
                alphabet[5]++;

                break;
            
            case 'G':
                alphabet[6]++;

                break;
            
            case 'H':
                alphabet[7]++;

                break;
            
            case 'I':
                alphabet[8]++;

                break;
            
            case 'J':
                alphabet[9]++;

                break;
            
            case 'K':
                alphabet[10]++;

                break;
            
            case 'L':
                alphabet[11]++;

                break;
            
            case 'M':
                alphabet[12]++;

                break;
            
            case 'N':
                alphabet[13]++;

                break;
            
            case 'O':
                alphabet[14]++;

                break;
            
            case 'P':
                alphabet[15]++;

                break;
            
            case 'R':
                alphabet[16]++;

                break;
            
            case 'S':
                alphabet[17]++;

                break;
            
            case 'T':
                alphabet[18]++;

                break;
            
            case 'U':
                alphabet[19]++;

                break;
            
            case 'W':
                alphabet[20]++;

                break;
            
            case 'V':
                alphabet[21]++;

                break;
            
            case 'X':
                alphabet[22]++;

                break;
            
            case 'Y':
                alphabet[23]++;

                break;
            
            case 'Z':
                alphabet[24]++;

                break;
            
            default:
                    break;
            }
        }
    }
    catch (ios::failure const & exception) {
        cout << "Nie udalo sie przeczytac z pliku poniewaz: " << exception.what() << ".";
    }

    // Sprawdz jaka wartość jest najwyższa.

    unsigned int highest;

    highest = alphabet[0];

    for (int iterator = 0; iterator < 25; iterator++) {
        if (alphabet[iterator] > highest)
            highest = alphabet[iterator];
    }

    // Rysowanie histogramu.

    for (int iterator0 = highest; iterator0 >= 1; iterator0--) {
        // Szukamy które litery mają aktualną wartość zmiennej "i".

        for (int iterator1 = 0; iterator1 < 25; iterator1++) {
            if (alphabet[iterator1] >= iterator0)
                cout << "*";
            else
                cout << " ";
        }

        cout << endl;
    }

    cout << "ABCDEFGHIJKLMNOPRSTUWVXYZ" << endl;
}