字母计数器给出错误的结果

时间:2012-09-07 23:13:10

标签: c++ conditional

我正在用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 个答案:

答案 0 :(得分:3)

这些条件中的每一个

 if ( 'n' ||  'N')

将始终求值为true,因为它们是非零常量char值。因此,您用于计数的变量总是递增。要测试角色的发生率,你需要这样的东西

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

你现在拥有的东西总是增加你的数量。此外,您需要实际从文件中提取每个字符才能进行测试。从string获得getline后,您应该迭代其各个字符并按上述方式对其进行测试。

答案 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;
}

答案 2 :(得分:0)

程序中没有任何内容可以确保它只读取每个字符一次。这类似于这个问题: http://www.cplusplus.com/forum/beginner/24492/ 你必须告诉程序什么时候结束。你要求程序做的是“当文件A ++中存在A时”它总是存在于文件中。你可以这样: http://www.cplusplus.com/reference/iostream/istream/get/

这将有助于它压缩文件,char by char。你仍然需要弄清楚如何让它停在文件的末尾。

答案 3 :(得分: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而不是打开文件),但这最终是一项非常简单的工作 - 不要试图让它变得比真正复杂得多是