标题:这是我用c++写的一个100以内四则运算一分钟竟猜!大家看看有什么地方要改的 ...
只看楼主
xshaitt
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-10-13
结帖率:0
 问题点数:0 回复次数:7 
这是我用c++写的一个100以内四则运算一分钟竟猜!大家看看有什么地方要改的!!
#include <iostream>
#include "xsh.h"
#include <string>
#include <cstdlib>//求随机数
#include <ctime>//保证随机数的随机性,以及统计时间
int plus(int one,int two)//如果把函数名起plus再using namespace std:会有冲突
{
  return one+two;
}
int subtract(int one,int two)
{
  return one-two;
}
int product(int one,int two)
{
  return one*two;
}
int multiply(int one,int two)
{
  return one/two;
}
int main()
{
  using std::cout;
  using std::endl;
  using std::cin;
  using std::string;
  string title;
  string name;
  string jxxhm;
  int one,two;
  int ending;//用来存放正确结果的
  int result;//用来存放用户输入的结果的
  int sum_diff=0;//用来存放做的加减题的正确的条数
  int pro_quo=0;//用来存放做的乘除题的正确的条数
  int x=0;//用来存放switch的控制变量,做那条运算
  clock_t delay = 10*CLOCKS_PER_SEC;
  title="欢迎来到老邢设计的100以内的四则运算竟猜游戏";
  show_title(title);  
  cout<<"游戏规则:"<<endl;
  cout<<"        "<<"时间为一分钟"<<endl;
  cout<<"        "<<"答对一题加减题得10分,答对一题乘除题得20分"<<endl;
  cout<<"        "<<"答错一题加减题减20分,答错一题乘除题减10分"<<endl;
  cout<<"大侠请您输入您的姓名!:";
  cin>>name;
  cout<<"输入play开始游戏:";
  srand((unsigned)time(NULL));
  while(name!="play")
   { cin>>name;
   }
  clock_t start_time = clock();
  while(1)
{//刚刚竟然因为这个花括号没写纠结了半天
  while(1)
  {
  one=rand()%100+1;
  two=rand()%100+1;
  x=rand()%4+1;
  switch(x)
    {
      case 1 : cout<<one<<"+"<<two<<"=?:";
           ending=plus(one,two);           
           break;
      case 2 : cout<<one<<"-"<<two<<"=?:";
           ending=subtract(one,two);
           break;
      case 3 : cout<<one<<"*"<<two<<"=?:";
           ending=product(one,two);
           break;
      case 4 : cout<<one<<"/"<<two<<"=?:";
           ending=multiply(one,two);
           break;         
    }
    cin>>result;
    if(result==ending)
      {
          if(x==1||x==2)
          {
            cout<<"恭喜你!答对了!加10分!!!!!"<<endl;
            ++sum_diff;
          }
          else
          {
            cout<<"恭喜你!答对了!加20分!!!!!"<<endl;
            pro_quo+=2;
          }
      }
      else
      {
          if(x==1||x==2)
          {
            cout<<"你ma坑爹啊!100以内的加减题都做错了!减你20分!!!!!"<<endl;
            sum_diff-=2;
          }
          else
          {
            cout<<"你小学没毕业吧!100以内的乘除题都做错了!减你10分!!!!!"<<endl;
            --pro_quo;
          }
      }
   if(clock()-start_time>delay) break;  
   }  
   cout<<"还要再继续吗?(输入yes继续非yes退出):";
   cin>>jxxhm;
   if(jxxhm!="yes") break;  
 }   
  cout<<"战绩统计:"<<endl;
  cout<<"          "<<"加减题得分:"<<sum_diff*10<<endl;
  cout<<"          "<<"乘除题得分:"<<pro_quo*10<<endl;
  cout<<"          "<<"总分:"<<sum_diff*10+pro_quo*10<<endl;
  system("pause");
  return 0;
}
搜索更多相关主题的帖子: one include product return 
2012-11-13 21:57
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
我只写个核心
程序代码:
#include <ctime>
#include <cstdlib>
#include <functional>
#include <iostream>
using namespace std;

int main()
{
    // ...
    srand( (unsigned)time(NULL) );
    std::function<int(int,int)> opt[] = { plus<int>(), minus<int>(), multiplies<int>(), divides<int>() };

    for( ;/*...*/; )
    {
        int a = rand()%100+1;
        int b = rand()%100+1;
        int c = rand()%4;
        cout << a << "+-*/"[c] << b << "=?: ";
        int result;
        cin >> result;
        if( opt[c](a,b) == result )
        {
            // ....
        }
    }

    return 0;
}
以上代码是符合C++标准的,可以用g++4.7.2编译通过
如果你用的是VS9.0 SP1,需要改std::function为std::tr1::function
2012-11-14 09:31
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
得分:0 
版主 能不能解释下
std::function<int(int,int)> opt[] = { plus<int>(), minus<int>(), multiplies<int>(), divides<int>() };
cout << a << "+-*/"[c] << b << "=?: ";


意思到时明白,是不是重载了[],根据c的值来决定输出那个符号,这段代码是用到了C++里面的那些知识?




以下是引用rjsp在2012-11-14 09:31:31的发言:

我只写个核心
#include <ctime>
#include <cstdlib>
#include <functional>
#include <iostream>
using namespace std;

int main()
{
    // ...
    srand( (unsigned)time(NULL) );
    std::function<int(int,int)> opt[] = { plus<int>(), minus<int>(), multiplies<int>(), divides<int>() };

    for( ;/*...*/; )
    {
        int a = rand()%100+1;
        int b = rand()%100+1;
        int c = rand()%4;
        cout << a << "+-*/"[c] << b << "=?: ";
        int result;
        cin >> result;
        if( opt[c](a,b) == result )
        {
            // ....
        }
    }

    return 0;
}以上代码是符合C++标准的,可以用g++4.7.2编译通过
如果你用的是VS9.0 SP1,需要改std::function为std::tr1::function

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-11-14 12:04
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
得分:0 
opt[] 是数组,不是重载,那段代码用到了<functional>中的函数对象模版,
 plus<int>(), minus<int>(), multiplies<int>(), divides<int>() 是STL中的预定的算术类函数对象,还有关系,逻辑,证同等各类常用函数对象。
需要研究STL库你才会明白。
function<int(int,int)> 的意思就是返回值是int型且带两个参数(int, int)的函数对象,
2012-11-14 12:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 3楼 mmmmmmmmmmmm
如果我这么写,你看得懂吧
程序代码:
#include <ctime>
#include <cstdlib>
#include <functional>
#include <iostream>
using namespace std;

int my_plus       ( int a, int b ) { return a+b; }
int my_minus      ( int a, int b ) { return a-b; }
int my_multiplies ( int a, int b ) { return a*b; }
int my_divides    ( int a, int b ) { return a/b; }

int main()
{
    // ...
    srand( (unsigned)time(NULL) );
    int (*opt[])(int,int) = { &my_plus, &my_minus, &my_multiplies, &my_divides };

    for( ;/*...*/; )
    {
        int a = rand()%100+1;
        int b = rand()%100+1;
        int c = rand()%4;
        cout << a << "+-*/"[c] << b << "=?: ";
        int result;
        cin >> result;
        if( opt[c](a,b) == result )
        {
            // ....
        }
    }

    return 0;
}
也就是定义了一个函数指针的数组
2楼的代码只是直接使用了std中已有的加减乘除这四个函数对象

2012-11-14 12:33
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
得分:0 
感谢两位版主的热心解释,STL还没学。楼上的写法我就明白了。

再请教一下
cout << a << "+-*/"[c] << b << "=?: ";

这个代码的"+-*/"[c],会根据c的值来判断输出其中一个符号。这么理解吗?

"+-*/"为一个string对象,然后直接通过[c]来访问string?

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-11-14 12:55
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
得分:0 
白菜了 无视我上面的提问吧

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-11-14 13:42
Autow
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-4-12
得分:0 
//添加内容    较复杂的四则运算
int oopcalc::mixed()
{
    int rtn=mul();
    while(shizi[pos]=='+'||shizi[pos]=='-')
    {
        int op=shizi[pos++];
        int opr2=mul();
        if(op=='+')
            rtn+=opr2;
        else
            rtn-=opr2;
    }
    return rtn;
}
int oopcalc::mul()
{
    int rtn=number();
    while(shizi[pos]=='*'||shizi[pos]=='/')
    {
        int op=shizi[pos++];
        int opr2=number();
        if(op=='*')
            rtn*=opr2;
        else
            rtn/=opr2;
    }
    return rtn;
}
int oopcalc::number()
{
    int rtn;                    //这里看不懂
    if(shizi[pos]=='(')
    {
        pos++;
        rtn=mixed();
        pos++;
    return rtn;                             //到这里  这段到底有什么用
    }
    rtn=atoi(shizi+pos);
    while(isdigit(shizi[pos]))
        pos++;
    return rtn;
}


void main()
{
    oopcalc a ;
    a.menu();
}


2014-04-12 08:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-386960-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.052022 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved