#include <iostream>
#include <windows.h>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
char en[16],ch[16];
int score=0;
int a[3];
int n;
class word
{
private:
char eng[16];
char chi[16];
char e2[16];
public:
word (char e[16],char c[16])//建構式
{
strcpy(eng,e);
strcpy(chi,c);
strcpy(e2,e);
}
void Dis(int i)//判斷填空是否正確
{
char x;
for(int flag=0;;)
{
cin>>x;
if(x==eng[a[i]]){cout<<"Good!"<<endl;score+=5;break;}
else
{
cout<<"Try again?"<<endl;
flag++;
if(flag<=10||flag>3){cout<<chi[a[i]];}
else if(flag>10){cout<<"Oh my god!"<<endl;break;}
}
}
}
void deal(char a[]);
void display();
};
void word::display()//輸出函式
{
int i;
if(n<=4)i=0;
if(n<=7&&n>=5)i=1;
if(n>=11)i=3;
else i=2;
cout<<e2<<endl;
int j;
switch(i)
{
case(0): Dis(0);break;
case(1): for(j=0;j<2;j++)
Dis(j);
break;
case(2): for(j=0;j<3;j++)
Dis(j);
break;
case(3): for(j=0;j<4;j++)
Dis(j);
break;
}
}
void word::deal(char b[])//隱藏單詞的某字母
{
srand(time(NULL));
n=strlen(b);
cout<<b<<" "<<n<<endl;
a[0]=rand()%n;
e2[a[0]]='_';
if(strlen(b)>4)
{
retry: a[1]=rand()%strlen(b);
if(a[1]==a[0])goto retry;
else e2[a[1]]='_';
}
if(strlen(b)>=8)
{
retry1:
a[2]=rand()%strlen(b);
if(a[2]==a[0]||a[2]==a[1])goto retry1;
else e2[a[2]]='_';
}
if(strlen(b)>=11)
{
retry2:
a[3]=rand()%strlen(b);
if(a[3]==a[2]||a[3]==a[1]||a[3]==a[0])goto retry2;
else e2[a[3]]='_';
}
}
void word_add()//添加新詞匯
{
char new_word[32];
ofstream output("new.dat",ios::app);
cout<<"請輸入要添加的單詞(格式為 英文 中文):"<<endl;
cin>>new_word;
output<<new_word<<endl;
}
void readi(char* en,char* ch,int i)//讀取第i個單詞
{
ifstream infile("english");
while(i--)
{
infile.getline(en,16);
infile.getline(ch,16);
}
infile.close ();
}
void game()
{
srand(time(NULL));
for(int i=0;i<20;i++)
{
readi(en,ch,rand()%20);
cout<<en<<endl;
word w1(en,ch);
w1.deal(en);
/*w1.display();*/
}
}
int main()
{
int number;
cout<<"\n\n\n\n\n"<<endl;
cout<<"\t*************************************************************"<<endl;
cout<<"\t************************"<<"單詞小游戲"<<"***************************"<<endl;
cout<<"\t*************************************************************"<<endl;
cout<<"1.開始游戲"<<endl;
cout<<"2.添加詞匯"<<endl;
cout<<"0.結束游戲"<<endl;
cout<<"請輸入選項:"<<endl;
cin>>number;
system("cls");
while(cin.get()!=0)
{
switch(number)
{
case(0):cout<<"再見!"<<endl;exit(1);
case(1):game();
case(2): word_add();exit (1);
}
} return 0;
}
編譯無錯 運行1 就出錯 除錯時 顯示 上面標注的那行intger divided by 0 我就奇了怪了
uj5u.com熱心網友回復:
求模就是除法,如果n=0就會引發除零錯誤。uj5u.com熱心網友回復:
除錯時我試過 把這句注釋掉顯示的n不等于0
uj5u.com熱心網友回復:
int a[3];a[3]=rand()%strlen(b); 越界了。
其他未檢查。
uj5u.com熱心網友回復:
那要怎么修改呢?我c++不太懂 越界 什么的都聽過沒看過uj5u.com熱心網友回復:
int a[3]; //這里定義了陣列a,只有3個元素。a[3]=rand()%strlen(b); 越界了。 //C/C++中陣列下標是從0開始的,a[3]就是第4個元素了。
你只定義了3個元素,卻向第4個元素賦值,這種行為叫越界。會產生不可預測的行為。
改的方法很簡單,
int a[4]; //定義4個元素的陣列。就可以用到 a[3] 了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137459.html
標籤:基礎類
上一篇:誰能幫我看看這個檔案
