2012-09-07 49 views
-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; 

} 
+0

数组和循环将使您无法进行所有输入。 –

+0

'a'|| 'A' - >真,'b'|| 'B' - > true ...这将是分隔 – sehe

+0

这是什么问题?哪里?告诉我们你“遇到了另一个错误”并不是一个问题。 – jalf

回答

3

这些条件语句中的每一个

if ('n' || 'N') 

将始终为true,因为它们是非零常数char值。因此,你用来计数的变量总是增加的。要测试某个角色的发生情况,您需要类似这样的东西

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

您目前总是增加您的计数。此外,您需要从文件中提取每个字符以进行测试。一旦你从getline得到string,你应该遍历它的单个字符并按照上面的方法测试它们。

+0

不知道我是否理解,这只是我的第二个学期,我不得不重新学习很多,因为他们不再教DarkGDK了。 –

+0

你需要从字符串中抽取每个字符,如果它等于你想要的字符,则从TEST中提取。你的测试正在做'if('n'!= 0 ||'N'!= 0)'此刻。很明显,它们从不是'0',所以if块中的每条语句都会被执行。无关 – mathematician1975

0

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

这将帮助它通过文件,通过字符char。您仍然必须弄清楚如何在文件末尾停止。

+0

现在有意义,所以使用char的字符测试无论它将测试每一个字符。所以疯狂的数字是由于我的节目同意一切。 –

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阅读而不是打开一个文件的),但是这毕竟是一个非常简单的工作 - 不要试图让AA比实际情况复杂得多。

+0

对不起,我不明白C,我正在学习C++。 –

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