zoukankan      html  css  js  c++  java
  • 计算与软件工程 作业二

    作业二

    作业要求

    https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10402)

    遇到的问题

    1. 对于年级的选择不能放在一个程序里,逻辑顺序没有办法很好的运用。
    2. 难中易程度不能很好的分开。
    3. 计算答题时间有问题,只有等程序结束后在后台查看。程序的计算时间与实际情况不符

    代码

    #include<iostream>
    #include<stdlib.h>
    #include<time.h>
    #include <string.h>
    #include<cstdlib>
    using namespace std;
    int a;
    int ri = 0;//计算回答的正确率,定义全局变量 ri 来计算回答正确的题数
    //divisor (int a,int b) 函数通过辗转相除法求分子和分母的最大公约数
    int divisor (int a,int b)
    {
      int  temp;
      if(a<b)
      {
          temp=a;
          a=b;
          b=temp;
        }
       while(b!=0)
       {
          temp=a%b;
          a=b;
          b=temp;
        }
      return a;
    }
    //CheckResult(char result[]) 函数来判断输入的答案是否正确
    int CheckResult(char result[])
    {
        char answer[10] ;
        cin>>answer;
        if(strcmp(answer,result)==0)
        {
            cout<<"回答正确"<<endl<<endl;
            ri++;
        }
        else
        {
            cout<<"回答错误,正确答案为"<<result<<endl<<endl;
        }
    	return 0;
    }
    //integer() 函数来生成整数的四则运算
    void integer()
    {
        int x,y,z,temp;
        char result[10];
        srand(time(NULL));
        x = rand() % 10;
        y = rand() % 10+1;
        z = rand()%4;
        switch(z)
        {
            case 0 :
                cout<<x<<" + "<<y<<"=";
                temp = x + y;
                sprintf(result, "%d", temp);
                break;
            case 1 :
                if(x<y)
                {
                    temp=x;
                    x=y;
                    y=temp;
                }
                cout<<x<<" - "<<y<<"=";
                temp = x - y;
                sprintf(result, "%d", temp);
                break;
            case 2 :
                cout<<x<<" * "<<y<<"=";
                temp = x * y;
                sprintf(result, "%d", temp);
                break;
            case 3 :
                cout<<x<<" ÷"<<y<<"=";
                if(x%y==0)
                {
                    temp = x / y;
                    sprintf(result, "%d", temp);
                }
                else
                {
                    temp = divisor(x,y);
                    x = x/temp;
                    y = y/temp;
                    sprintf(result, "%d/%d", x, y);
                }
                break;
        }
        CheckResult(result) ;
    }
    // fraction() 函数来生成分数的四则运算
    void fraction()
    {
        int a,b,c,d,x,y,z,temp;
        char result[10];
        srand(time(NULL));
        a = rand() % 10;
        b = rand() % 10+1;
        c = rand() % 10;
        d = rand() % 10+1;
        z = rand() % 4;
        if(a>b)
        {
            temp=a;
            a=b;
            b=temp;
        }
        if(c>d)
        {
            temp=c;
            c=d;
            d=temp;
        }
        switch(z)
        {
            case 0 :
                cout<<a<<"/"<<b<<" + "<<c<<"/"<<d<<"=";
                x = a*d+b*c;
                y = b*d;
                temp = divisor(x,y);
                x = x/temp;
                y = y/temp;
                if(y==1)
                {
                    sprintf(result, "%d", x);
                }
                else
                {
                    sprintf(result, "%d/%d", x, y);
                }
                break;
            case 1 :
                if(a*d<b*c)
                {
                    temp = a;
                    a = c;
                    c = temp;
                    temp = b;
                    b = d;
                    d = temp;
                }
                cout<<a<<"/"<<b<<" - "<<c<<"/"<<d<<"=";
                x = a*d-b*c;
                y = b*d;
                temp = divisor(x,y);
                x = x/temp;
                y = y/temp;
                sprintf(result, "%d/%d", x, y);
                break;
            case 2 :
                cout<<a<<"/"<<b<<" * "<<c<<"/"<<d<<"=";
                if(a==0||c==0)
                {
                    temp = 0;
                    sprintf(result, "%d", temp);
                }
                else
                {
                    x = a*c;
                    y = b*d;
                    temp = divisor(x,y);
                    x = x/temp;
                    y = y/temp;
                    sprintf(result, "%d/%d", x, y);
                }
                break;
            case 3 :
                cout<<a<<"/"<<b<<" ÷"<<c<<"/"<<d<<"=";
                if((a*d)%(b*c)==0)
                {
                    x = a*d;
                    y = b*c;
                    temp = x / y;
                    sprintf(result, "%d", temp);
                }
                else
                {
                    x = a*d;
                    y = b*c;
                    temp = divisor(x,y);
                    x = x/temp;
                    y = y/temp;
                    if(y==1)
                    {
                        sprintf(result, "%d", x);
                    }
                    else
                    {
                        sprintf(result, "%d/%d", x, y);
                    }
                }
                break;
        }
        CheckResult(result);
    }
    int main()
    {
        int n,q;
        cout<<"输入要生成的题数:";
        cin>>n;
        for(int i=0;i<n;i++)
        {
            int a = rand()%2;
            switch(a)
            {
                case 0: integer();break;
                case 1: fraction();break;
            }
        }
        q=(ri*100)/n;
        cout<<"回答对了"<<ri<<"题"<<endl;
        cout<<"正确率为:"<<q<<"%"<<endl<<endl;
    	 clock_t start,finish;
        start=clock();
         
        cout << "花费的时间 " << endl;
     
        finish=clock();
     
        cout << finish-start   << "/" << CLOCKS_PER_SEC  << " (s) "<< endl;
    	system ("pause");
    }
    

    此程序没有混合运算,适用于低年级

    //判断运算符的优先级函数 
    int Precede(char a, char b) 
    { 
       switch (a) 
       { 
         case '*': 
         case '/': 
            if ((b == '+') || (b == '-')) 
            { 
               return 1; //a的优先级高于b 
            } 
            else 
            { 
               return 0; //a的优先级等于b 
            } 
         
    	 case '+': 
         case '-': 
    	    if ((b == '*') || (b == '/')) 
    	    { 
    	       return -1; //a的优先级低于b 
            }
    	    else 
    		{ 
    		   return 0; 
    		} 
       
    	default: 
    	     cout<<"运算符错误!"<<endl; 
    	     break; 
    	} 
    } 
     
     
    int Operate(int j, int k, char operater) 
    { 
    	switch (operater) 
    	{ 
    		case '+': 
    			return k + j; 
    		break;  
    		case '-': 
    			return k - j; 
    		break; 
    		case '*': 
    			return k * j; 
    		break;  
    		case '/':  
    			return k / j; 
    		break;  
    		default: printf("运算错误!
    "); 
    		         break; 
    	} 
    } 
     
    int calculate(int len, char *expStr) 
    { 
    	//表达式异常处理,注意len <= 0要加括号 
    	if ((len <= 0 ) || (expStr == NULL)) 
    	{ 
    		cout<<"表达式为空!"<<endl; 
    	} 
    	int i = 0, j = 0, k = 0; 
    	std::stack<int> date; 
    	std::stack<char> operate; 
    	while (i < len) 
    	{ 
    		if ((expStr[i] >= '0') && (expStr[i] <= '9')) 
    		{ 
    			date.push(expStr[i] - '0'); 
    			i++; 
    		} 
    		else if ((expStr[i] == '+') || (expStr[i] == '-') || expStr[i] == '*' || expStr[i] == '/') 
    		{ 
    			if (operate.empty()) 
    			{ 
    				operate.push(expStr[i]);
    				i++; 
    			} 
    			else 
    			{ 
    				//与栈顶运算符判断优先级 
    				switch (Precede(expStr[i], operate.top())) 
    				{ 
    				  case 0: 
    				  case -1: //栈顶运算符优先级高 
    					   j = date.top(); 
    					   date.pop(); 
    					   k = date.top(); 
    					   date.pop(); 
    					   date.push(Operate(j, k , operate.top()));
    					   operate.pop(); 
    					   //i++;  
    					   break; 
     
    				  case 1: //栈运算符顶优先级低 
    					   operate.push(expStr[i]); 
    					   i++; 
    					   break; 
    				  default: 
    					 cout<<"优先级判断错误!"<<endl;
    					   break; 
    				 } 
    			} 
    		} 
    		else 
    		{ 
    			cout<<"表达式无法识别!";
    			break; 
    		}
    	} 
    	
    	while (!operate.empty()) 
    	{ 
    		j = date.top(); 
    		date.pop(); 
    		k = date.top(); 
    		date.pop(); 
    		date.push(Operate(j, k , operate.top())); 
    		operate.pop(); 
    	} 
    	
    	return date.top(); 
    } 
     
    int main() 
    { 
       int len = 0; int i= 0, input_flag = 0; 
        
       while (!input_flag) 
       { 
    	  cout<<"请输入表达式的长度:"; 
    	  input_flag = scanf("%d", &len); 
    	  if (!input_flag) 
    	  { 
    		printf("输入有误,仅可输入数字!
    "); 
    	  } 
    	  flushall(); 
        } 
    	char *expStr = (char *)malloc(len * sizeof(char)); 
    	input_flag = 0;
    	
    	while (!input_flag) 
    	{ 
    		printf("请输入表达式:"); 
    		for (i = 0; i < len; i++) 
    		{ 
    			input_flag = scanf("%c", &expStr[i]); 
    			//scanf("%c", &expStr[i]);  
    			/*
    			if ((i < len) && (expStr[i] == '
    ')) 
    			{
    				printf("长度不够,请重新输入:"); 
    				i = 0; 
    			}
    			*/ 
    			if (!input_flag) 
    			{ 
    				cout<<"表达式输入有误!
    "; 
    				flushall(); 
    				break; 
    			} 
    		 } 
    	 } 
    	
    	 cout<<"表达式的计算结果为:%d
    "<< calculate(len, expStr); 
    	system("pause"); 
      return 0; 
    }
    

    此程序段有混合运算,适用于高年级。但不能自动出题。

    码云地址链接

    https://gitee.com/jiang_zi_yi/codes/trmbh9450nfa8cloysepw65

  • 相关阅读:
    C#3.0之神奇的Lambda表达式和Lambda语句
    Expression Tree 学习笔记(一)
    C#对象序列化与反序列化
    Linux Shell编程入门
    ora-03113或者ora-12573 通信通道的文件结束出现异常错误:核心转储
    如何实现文档在线预览
    使用npoi导入Excel
    判断时间(时:分)是否在某个时间段内
    程序员开发时遇到的那些缩写和名词(记录)
    git
  • 原文地址:https://www.cnblogs.com/jiangziyi/p/12373286.html
Copyright © 2011-2022 走看看