2012-07-03 27 views
0

我遇到此程序有问题。它打算做的是读一个单词列表,然后从这个长度的单词中获取单词的长度,计算它们中所有字母的总数,按最高频率对它们进行排序,然后询问用户为频率最高的用户。在它提出要求之前,它会检查该信件是否已经被要求通过数组prevguess循环。我的问题是,如果我输入'yesletter'为true,则在内联评论“此处出现问题”之后,此数组的内容会发生更改。我在此测试循环中输入的q的值不会改变,但值本身会发生变化。具有相同索引但未重新分配的阵列

我知道main中的循环现在是无限的,但程序没有完成。

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

int i(0),n(0),counter(0),limit(0),length,mastercount(0); 
int acount(0),bcount(0),ccount(0),dcount(0),ecount(0),fcount(0),gcount(0),hcount(0); 
int icount(0),jcount(0),kcount(0),lcount(0),mcount(0),ncount(0),ocount(0),pcount(0); 
int qcount(0),rcount(0),scount(0),tcount(0),ucount(0),vcount(0),wcount(0),xcount(0),ycount(0),zcount(0); 
int letters[2][26]; 
char prevguess[26]; 
char words[60000][30]; 


void initarray() { 

    int len(0); 
    string line; 
    char temp; 

    ifstream wordlist ("words.txt"); 

    if (wordlist.is_open()) 
    { 
     while (wordlist.good()) 
     { 
      getline (wordlist,line); 
      len=line.length(); 

      for (n=0;n<30;n++) 
      { 
       if (n<len){ 
        temp=line.at(n); 
        words[i][n]=temp; 
       } 
       else{ 
        words[i][n]='*'; 
       } 
      } 

      i++; 
      counter++; 
     } 
    } 
    else 
    { 
     cout<<"file not opened"; 
    } 
    wordlist.close(); 
} 

void selectlength() 
{ 
    int x(0),y(0); 
    bool shorter(false),longer(false); 

    cout <<"length of word"<<endl; 
    cin >> length; 

    limit=counter; 
    counter=0; 

    for (i=0;i<limit;i++){ 

     shorter=false; 
     longer=false; 

     for (n=0;n<length;n++){ 
      if (words[i][n]=='*') 
      { 
       shorter=true; 
       break; 
      } 
     } 

     if (words[i][length] != '*') 
     { 
      longer=true; 
     } 

     if (!longer && !shorter) 
     { 
       n=0; 
       for (y=0;y<30;y++) 
       { 
        if (n<length){ 
         words[x][y]=words[i][n]; 
         n++; 
        } 
        else{ 
         words[x][y]='*'; 
        } 
       } 
       x++; 
       counter++; 

     } 

    } 
} 

void mostletters(){ 
    char temp; 

    for (i=0;i<counter;i++){ 
     for (n=0;n<=length;n++){ 

      temp=words[i][n]; 
      switch (temp){ 
       case 'a': 
        acount++; 
        break; 
       case 'b': 
        bcount++; 
        break; 
       case 'c': 
        ccount++; 
        break; 
       case 'd': 
        dcount++; 
        break; 
       case 'e': 
        ecount++; 
        break; 
       case 'f': 
        fcount++; 
        break; 
       case 'g': 
        gcount++; 
        break; 
       case 'h': 
        hcount++; 
        break; 
       case 'i': 
        icount++; 
        break; 
       case 'j': 
        jcount++; 
        break; 
       case 'k': 
        kcount++; 
        break; 
       case 'l': 
        lcount++; 
        break; 
       case 'm': 
        mcount++; 
        break; 
       case 'n': 
        ncount++; 
        break; 
       case 'o': 
        ocount++; 
        break; 
       case 'p': 
        pcount++; 
        break; 
       case 'q': 
        qcount++; 
        break; 
       case 'r': 
        rcount++; 
        break; 
       case 's': 
        scount++; 
        break; 
       case 't': 
        tcount++; 
        break; 
       case 'u': 
        ucount++; 
        break; 
       case 'v': 
        vcount++; 
        break; 
       case 'w': 
        wcount++; 
        break; 
       case 'x': 
        xcount++; 
        break; 
       case 'y': 
        ycount++; 
        break; 
       case 'z': 
        zcount++; 
        break; 

      } 
     } 
    } 
} 

void guessmost(){ 
    int x,y,temp,temp2,q; 

    for (x=0;x<26;x++){ 

     letters[0][x]=x; 

     switch (x){ 
      case 0: 
       letters[1][x]=acount; 
       break; 
     case 1: 
      letters[1][x]=bcount; 
      break; 
     case 2: 
      letters[1][x]=ccount; 
      break; 
     case 3: 
      letters[1][x]=dcount; 
      break; 
     case 4: 
      letters[1][x]=ecount; 
      break; 
     case 5: 
      letters[1][x]=fcount; 
      break; 
     case 6: 
      letters[1][x]=gcount; 
      break; 
     case 7: 
      letters[1][x]=hcount; 
      break; 
     case 8: 
      letters[1][x]=icount; 
      break; 
     case 9: 
      letters[1][x]=jcount; 
      break; 
     case 10: 
      letters[1][x]=kcount; 
      break; 
     case 11: 
      letters[1][x]=lcount; 
      break; 
     case 12: 
      letters[1][x]=mcount; 
      break; 
     case 13: 
      letters[1][x]=ncount; 
      break; 
     case 14: 
      letters[1][x]=ocount; 
      break; 
     case 15: 
      letters[1][x]=pcount; 
      break; 
     case 16: 
      letters[1][x]=qcount; 
      break; 
     case 17: 
      letters[1][x]=rcount; 
      break; 
     case 18: 
      letters[1][x]=scount; 
      break; 
     case 19: 
      letters[1][x]=tcount; 
      break; 
     case 20: 
      letters[1][x]=ucount; 
      break; 
     case 21: 
      letters[1][x]=vcount; 
      break; 
     case 22: 
      letters[1][x]=wcount; 
      break; 
     case 23: 
      letters[1][x]=xcount; 
      break; 
     case 24: 
      letters[1][x]=ycount; 
      break; 
     case 25: 
      letters[1][x]=zcount; 
      break; 
     } 
    } 


    for (y=0;y<26;y++){ 



     //problem occurs here (I think) 

     for (q=mastercount-1;q>=0;q--){ 
        cout<<"for array index:"<<q; 
        cout << " the value of prevguess is "<<prevguess[q]<<endl; 
     } 





     for (x=26;x>=1;x--){ 
      if (letters[1][x]>letters[1][x-1]) 
      { 
       temp=letters[1][x-1]; 
       letters[1][x-1]=letters[1][x]; 
       letters[1][x]=temp; 

       temp2=letters[0][x-1]; 
       letters[0][x-1]=letters[0][x]; 
       letters[0][x]=temp2; 
      } 
     } 

    } 
} 

void letterguess(){ 
    int x(0),z; 
    char guess; 
    bool goodletter(false),yesletter(false),alreadyguess(false); 

    while (!goodletter){ 

     guess=letters[0][x]+97; 

     if (mastercount==0){ 
      alreadyguess=false; 
     } 
     else{ 
      for (z=mastercount-1;z>=0;z--){ 
       if (guess==prevguess[z]){ 
        alreadyguess=true; 
       } 
      } 
     } 

     if (!alreadyguess){ 
      cout<<"is your letter "<< guess<<endl; 
      cin >> yesletter; 
      prevguess[mastercount]=guess; 
     } 

     if (yesletter && !alreadyguess){ 
      goodletter=true; 
     } 
     else { 
      cout<<"wrong"<<endl; 
      x++; 
     } 

     mastercount++; 

     if (mastercount>26){ 
        break; 
       } 
    } 

} 

int main() { 
    bool found(false); 
    initarray(); 
    selectlength(); 
    while (!found){ 
     mostletters(); 
     guessmost(); 
     letterguess(); 
     if (mastercount>26){ 
      break; 
     } 

    } 
} 
+0

每个字母(char)都有一个唯一的ascii值,你最好把你的字母转换成一个包含ascii值的int值,然后用一个数组引用每个字母的数量,而不是定义大量的变量和一个巨大的switch语句。我还会考虑使用#ifdef DEBUG和or assert语句将一些调试代码放入程序中。有人可能会给你答案,但你最好用这些工具。 –

+0

进一步以上:申报int信[26]; 替换mostletters()切换: int temp =(int)words [i] [n] -97; if(temp> = 0 and temp <26)letter [temp] ++; 替换guessmost()开关; letters [1] [x] = letter [x]; –

+1

你应该真的缩小问题范围。我甚至不确定你在问一个问题。 –

回答

0

我相信问题开始比您的评论低一点。

for (x=26;x>=1;x--){ 
       if (letters[1][x]>letters[1][x-1]) 

x是26,letters[1][x]会超出范围。

+0

哇,这是对的,谢谢。但如果你能帮助我理解为什么它首先被打破,那会很棒。刚刚提到的代码上方的数组返回不同的值,即使q的起始值始终相同,并且直到这些循环完成后才会访问它输出的数组。这是为什么?再次感谢! – user1418214

+0

当您尝试访问数组中存在的更多元素时,您会得到随机值(最好)。如果您在数组外部写入,可能会影响其他变量并将所有内容混淆。我们不知道*以后会发生什么。 –

+0

好的,这是很好的知道。太棒了! – user1418214

相关问题