-5

テキストドキュメントの文字数を数えるプログラムをC++で作成しています。私は自分が間違っていることを知る必要があります、私は結果のために狂った数を得ています。前回はお世話になりましたが、カウント後に「頻度[?]」を入れました。カウント自体に何か問題がありますが、何ですか?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

const int ALPHA_SIZE = 26;

void open_file ( ifstream & );

void process ( ifstream &, int [], string lineBuffer);

void draw ( int [] );

void printchar ( int[] );

string lineBuffer;


int main()
{
    string lineBuffer;
    ifstream infile;
    open_file ( infile );

    int frequency [ALPHA_SIZE];

    process ( infile, frequency, lineBuffer);
        draw ( frequency );


    system("Pause");
    return 0;
}

void open_file ( ifstream & inf )
{
    char infilename[50]; //actual file name
    cout << "File name for input? ";
    cin >> infilename;
    inf.open(infilename);
}

void process (ifstream &infile, int frequency[], string lineBuffer)
{

    int A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z;
    A = 0;
    B = 0;
    C = 0;
    D = 0;
    E = 0;
    F = 0;
    G = 0;
    H = 0;
    I = 0;
    J = 0;
    K = 0;
    L = 0;
    M = 0;
    N = 0;
    O = 0;
    P = 0;
    Q = 0;
    R = 0;
    S = 0;
    T = 0;
    U = 0;
    V = 0;
    W = 0;
    X = 0;
    Y = 0;
    Z = 0;
    if (infile.is_open())
    {

        while(getline(infile, lineBuffer))

        {

        if ( 'a' ||  'A')
            { A++;
            }
        if ( 'b' ||  'B')
            {  B++;
            }
        if ( 'c' ||  'C')
            {  C++;
            }
        if ( 'd' ||  'D')
            {  D++;
            }
        if ( 'e' ||  'E')
            {  B++;
            }
        if ( 'f' ||  'F')
            {  F++;
            }
        if ( 'g' ||  'G')
            {  G++;
            }
        if ( 'h' ||  'H')
            {  H++;
            }
        if ( 'i' ||  'I')
            {  I++;
            }
        if ( 'j' ||  'J')
            {  J++;
            }
        if ( 'k' ||  'K')
            {  K++;
            }
        if ( 'l' ||  'L')
            {  L++;
            }
        if ( 'm' ||  'M')
            {  M++;
            }
        if ( 'n' ||  'N')
            {  N++;
            }
        if ( 'o' ||  'O')
            {  O++;
            }
        if ( 'p' ||  'P')
            {  P++;
            }
        if ( 'q' ||  'Q')
            {  Q++;
            }
        if ( 'r' ||  'R')
            {  R++;
            }
        if ( 's' ||  'S')
            {  S++;
            }
        if ( 't' ||  'T')
            {  T++;
            }
        if ( 'u' ||  'U')
            {  U++;
            }
        if ( 'v' ||  'V')
            {  V++;
            }
        if ( 'w' ||  'W')
            {  W++;
            }
        if ( 'x' ||  'X')
            {  X++;
            }
        if ( 'y' ||  'Y')
            {  Y++;
            }
        if ( 'z' ||  'Z')
            {  Z++;
            }
          }
        infile.close();
        frequency [0] = A;
        frequency [1] = B;
        frequency [2] = C;
        frequency [3] = D;
        frequency [4] = E;
        frequency [5] = F;
        frequency [6] = G;
        frequency [7] = H;
        frequency [8] = I;
        frequency [9] = J;
        frequency [10] = K;
        frequency [11] = L;
        frequency [12] = M;
        frequency [13] = N;
        frequency [14] = O;
        frequency [15] = P;
        frequency [16] = Q;
        frequency [17] = R;
        frequency [18] = S;
        frequency [19] = T;
        frequency [20] = U;
        frequency [21] = V;
        frequency [22] = W;
        frequency [23] = X;
        frequency [24] = Y;
        frequency [25] = Z;


    }
}

void draw(int frequency[])
{
    cout << "A:" << frequency[0] << endl;
    cout << "B:" << frequency[1] << endl;
    cout << "C:" << frequency[2] << endl;
    cout << "D:" << frequency[3]<< endl;
    cout << "E:" << frequency[4] << endl;
    cout << "F:" << frequency[5] << endl;
    cout << "G:" << frequency[6] << endl;
    cout << "H:" << frequency[7] << endl;
    cout << "I:" << frequency[8] << endl;
    cout << "J:" << frequency[9] << endl;
    cout << "K:" << frequency[10] << endl;
    cout << "L:" << frequency[11] << endl;
    cout << "M:" << frequency[12] << endl;
    cout << "N:" << frequency[13] << endl;
    cout << "O:" << frequency[14] << endl;
    cout << "P:" << frequency[15] << endl;
    cout << "Q:" << frequency[16] << endl;
    cout << "R:" << frequency[17] << endl;
    cout << "S:" << frequency[18] << endl;
    cout << "T:" << frequency[19] << endl;
    cout << "U:" << frequency[20] << endl;
    cout << "V:" << frequency[21] << endl;
    cout << "W:" << frequency[22] << endl;
    cout << "X:" << frequency[23] << endl;
    cout << "Y:" << frequency[24] << endl;
    cout << "Z:" << frequency[25] << endl;

}
4

4 に答える 4

3

これらの各条件

 if ( 'n' ||  'N')

ゼロ以外の定数char値であるため、常にtrueと評価されます。したがって、カウントに使用している変数は常にインクリメントされます。キャラクターの発生率をテストするには、次のようなものが必要です

char char_to_test;
if (char_to_test == 'n' || char_to_test == 'N') {
    N++;
}

あなたが現在持っているものは常にあなたのカウントを増やします。さらに、テストを行うには、ファイルから各文字を実際に抽出する必要があります。stringfromを取得したらgetline、個々の文字を繰り返し処理して、上記のようにテストする必要があります。

于 2012-09-07T23:15:54.200 に答える
1

あなたのコードには多くの問題があります。

それらの 1 つは、ファイルを開く関数を呼び出しているという事実です。

void open_file ( ifstream & inf )

この関数は、スコープがなくなるとファイルを閉じます。

すべての変数には、ループを使用すると簡単にコンパクトにできる反復コードがたくさんあります。

#include <string>
#include <iostream>
#include <algorithm>
#include <fstream>
#include <cctype>
#include <map>

int main() {
    std::map<char,int> alpha;
    //Fills the map with A-Z with 0 as the value.
    for(char k = 65; k <= 90; k++) {
        alpha.insert(std::pair<char,int>(k,0));
    }
    //opens example.txt contains "the quick brown fox jumped over the cow"
    std::ifstream in("example.txt");
    std::string str;
    if(in.is_open()) {
        //loops through every line in the file.
        while(std::getline(in,str)) {
            //removes all whitespace
            str.erase(std::remove_if(str.begin(),str.end(), ::isspace),str.end());
            //capitalizes the string
            std::transform(str.begin(),str.end(),str.begin(), ::toupper);
            //loops through the string
            for(auto& i : str) {
                if(isalpha(i))
                    alpha[i]++; //Increments the frequency.
            }
        }
    }
    for(auto& i : alpha)
        std::cout << i.first << " " << i.second << std::endl;
}
于 2012-09-08T00:22:12.400 に答える
0

プログラムには、各文字を一度だけ読み取るようにするものは何もありません。これは次の問題に似ています: http://www.cplusplus.com/forum/beginner/24492/ プログラムにいつ終了するかを伝える必要があります。プログラムに実行を求めるのは、「A がファイル A++ に存在する間」です。ファイルには常に存在します。これができます: http://www.cplusplus.com/reference/iostream/istream/get/

これは、文字ごとにファイルを圧縮するのに役立ちます。ファイルの最後で停止させる方法を理解する必要があります。

于 2012-09-07T23:22:49.690 に答える
0

もっと怠け者になるように努力する必要があると思います。Cのバージョンは次のとおりです。

unsigned counts[UCHAR_MAX];

int main() {  
    int ch;

    while (EOF != (ch=getchar()))
        ++counts[toupper((unsigned char)ch)];

    for (int i=0; i<UCHAR_MAX; i++)
        if (isupper(i))
            printf("%c: %u\n", i, counts[i]);

    return 0;
}

少し単純化しました (たとえば、stdinファイルを開く代わりに読み取るなど) が、これは最終的には非常に単純な作業です。実際よりもはるかに複雑にしようとしないでください。

于 2012-09-07T23:45:41.460 に答える