• 第三次寒假作业(一)


    第三次寒假作业

    第三次寒假作业(二)
    卢恺翔031602230

    柯奇豪031602219

    实现设计思路

    我们将这个程序的设计分为四个部分:

    1、完成界面的设计

    2、完成随机题目的生成

    3、设计判断用户输入正确与否的算法

    4、将这些融入到一个项目之中

    订立的编码规范

    由于我们都是没学过C++的小弱鸡,也没学习过任何算法。所以对这方面不是很懂该怎么做。。。我们只想让设计的变量更能够让人一眼就看出这是干什么的。并且希望能够尽可能的按照面对对象的思想来完成项目(其实也对面对对象的思想也不是很清楚)

    d数组代表随机数

    c数组代表随机符号

    choice代表用户选择中英界面的符号

    answer数组代表用户输入结果

    randomd函数代表随机d数组的函数

    randomc函数代表随机c数组的函数

    gcd代表最大公约数函数

    (这里的A1,B1,B3,C1是我们之前商量好的结果)

    A1代表没有括号的函数

    B1代表包含第一个与第二个数的括号的函数

    B3代表包含第二个与第三个数的括号的函数

    C1代表包含第一个到第三个数的括号的函数

    D1代表包含第一个和第二个数,包含第三个数和第四个数的有两个括号的函数(由于太难所以放弃了)

    程序的实现和结果测试的截图

    界面设计

    说实话,这是我们在本次项目中最简单完成的,耗时也最少。

    char calculate2::choice()
    {
    	cout<<"Please choose the language that you need:(a.Simple Chinese; b.English)"<<endl;                                 //2种语言的切换     
    	int i;
    	char choice;
    	for(i=0;;i++)
    	{
    		cin>>choice;
    	    if(choice=='a')
    	        {cout<<"请输入你所想要的题目数(你可以输入'q'则结束程序):"<<endl;break;}
    	    else if(choice=='b') 
    		    {cout<<"Please enter the number of texts you want(You can enter'q'to end the program):"<<endl;break;}
    		else
    		    {cout<<"输入不当,请重新选择选项/Please select the option again if it is wrong"<<endl;continue;}
    	}
    	return choice;
    }
    
            else 
    		    if(ch=='q')break;	
    	
    	}
        if(ch=='a') 
    	{
    		cout<<"回答正确的的题数为 :"<<endl;
    	}
    	else if(ch=='b') 
        {
    		cout<<"The number of correct answers are:"<<endl;
    	}
    	cout<<count<<endl; 
    	return 0;
    	
    }
    



    随机题目的生成

    由于之前没有任何基础,完全不知道有随机函数这个函数。也是只有再百度之后才知道原来有伪随机这个东西。由于是完全陌生的东西,我们花了整整2天才完成这些东西

    int calculate2::randomd(int d[])
    {
    		d[0]=rand()%10+1;                      //整数数字随机函数 
    	    d[1]=rand()%10+1;
    	    d[2]=rand()%10+1;
    	    d[3]=rand()%10+1;
    }
    int calculate2::randomc(int c[])
    {
    	int j;
    	for(j=0;;j++)                         //+,-,*,/的随机 
    	{
    		c[0]=rand()%6+42;
    		if(c[0]!=44&&c[0]!=46)break;
    	}
    	    for(j=0;;j++)
    	    {
    		    c[1]=rand()%6+42;
    		    if(c[1]!=44&&c[1]!=46)break;
    	    }
    	    for(j=0;;j++)
    	    {
    		    c[2]=rand()%6+42;
    		    if(c[2]!=44&&c[2]!=46)break;
    	    }
    }
    

    这是我们一开始弄得,发现由于不懂伪随机的原理,所有随机的数字都是一样的。
    到后来发现是种子的问题。
    最后终于可以做到完全随机(可惜当时太激动,没有截图)

    判断用户的输入正确与否

    在这个阶段,我的同伴和我都有点晕晕乎乎的。应该是由于遭到本地各种风俗活动和班聚的影响,导致我们的交流出现了一些障碍。不能及时地传达自己想要表达的思想。
    一开始是由我来设计这个算法,但是因为自己的能力有限。最后还是选择一起合作。
    我们设计了各种各样的版本。但总是会有一些bug。在前几天,我们临时决定增加假分数的运算。当时的我们还不懂这个的难度,只是觉得很有意思。。。结果就是因为设计这个假分数的算法,导致我们原先计划在16号完成代码,拖到现在也只是一个半成品。
    但所幸的是,我们起码完成了假分数算法,也算是没有辜负自己的努力。
    下面是包含假分数的算法

    int calculate2::A1(int d[],int c[],int fenshu[])
    {
    	int j;
    	cout<<d[0]<<char(c[0])<<d[1]<<char(c[1])<<d[2]<<char(c[2])<<d[3]<<'='<<endl;
    	int k=0;
    	for(j=0;j<3;j++)
    	{
    		if(c[j]==45)  // '-'
    		{
    			d[j+1]=-d[j+1];
    			c[j]=43;
    		}
    	}		
    	for(j=0;j<3;j++)
    	{
    		
    		if(c[0]==47&&c[2]==47&&c[1]==43)
    		{
    			fenshu[0]=d[0]*d[3]+d[2]*d[1];
    			fenshu[1]=d[1]*d[3];
    		    c[1]=0;
    			break;
    		}
    		if(c[j]==42)
    		{	
    		    d[j+1]*=d[j];
    		    d[j]=0;
    		    c[j]=43;
    		}
    		 
    		if(c[j]==47)
    		{
    			
    			if(k==0)fenshu[0]=d[j];
    			fenshu[1]*=d[j+1];
    			d[j+1]=d[j];
    			d[j]=0;
    			k++;                                //防止分子被重置 
    			if(c[j+1]==42)
    			{
    				fenshu[0]*=d[j+2];
    				j++;
    			}
    		}
        }
    	for(j=0;j<3;j++)
    	{	
    		if(c[j]==43)
    			{
    				if(j==0)
    				    fenshu[0]+=d[0]*fenshu[1]; 
    				fenshu[0]+=d[j+1]*fenshu[1];			
    			}		
    	}
    	int r,x=fenshu[0],y=fenshu[1],t;
    	if(x>y){t=x;x=y;y=t;}
    	while(r!=0)
    	{
    		r=y%x;
    		y=x;
    		x=r;
    	}
    	fenshu[0]=fenshu[0]/y;
    	fenshu[1]=fenshu[1]/y;
    	  
     
    }
    
    		int answer[2];
    		cin>>answer[0];
    	    if(c[0]=='/'||c[1]=='/'||c[2]=='/')
    	    {
    	        if(fenshu[0]%fenshu[1]==0)                                               //结果不一定有除号 ,可能是整数 
                    if(answer[0]==fenshu[0]/fenshu[1])count++;
                else
    		    {
    			    if(answer[0]==fenshu[0])
    			    {
    			    	char fenhao;
    			    	cin>>fenhao;
    			    	if(fenhao=='/')
    			    	{
    			    		cin>>answer[1];
    			    		if(answer[1]==fenshu[1])count++;
    					}
    				}
    		    }         	        
            }
    

    效果其实还是非常好的


    整合

    就像刚才说的,由于没有好好估计时间,导致我们这个方面没有做好,虽然整合了,却老是无法运行。这也是本次项目最大的遗憾。

    main函数

    #include<iostream>
    #include<stdlib.h>
    #include<time.h>
    #include "calculate2.h"
    using namespace std;
    
    int main()
    {
    	srand((unsigned)time(NULL));
        calculate2 cal;
        char ch;
    	ch=cal.choice(); 
    	int N,i;
    	cin>>N;
    	int d[4],c[3],count=0,fenshu[2]={1,1};
    	for(i=0;i<N;i++)
    	{
    	    cal.randomd(d);
    	    cal.randomc(c);
     	    int k;
            k=rand()%4;
    	    switch(k)                          //随机4种函数类型
    	    {
    		    case 0:cal.A1(d,c,fenshu);break;
    		    case 1:cal.B1(d,c,fenshu);break;
    		    case 2:cal.B3(d,c,fenshu);break;
    		    case 3:cal.C1(d,c,fenshu);break;
    	    }
    	    if(ch=='a')
    	    {
    			cout<<"请输入你的答案:"<<endl;
    		}
    	    else if(ch=='b')
    		{
    			 cout<<"Please enter your answer :"<<endl;
    		}
    		int answer[2];
    		cin>>answer[0];
    	    if(c[0]=='/'||c[1]=='/'||c[2]=='/')
    	    {
    	        if(fenshu[0]%fenshu[1]==0)                                               //结果不一定有除号 ,可能是整数 
                    if(answer[0]==fenshu[0]/fenshu[1])count++;
                else
    		    {
    			    if(answer[0]==fenshu[0])
    			    {
    			    	char fenhao;
    			    	cin>>fenhao;
    			    	if(fenhao=='/')
    			    	{
    			    		cin>>answer[1];
    			    		if(answer[1]==fenshu[1])count++;
    					}
    				}
    		    }         	        
            }
            else 
    		    if(ch=='q')break;	
    	
    	}
        if(ch=='a') 
    	{
    		cout<<"回答正确的的题数为 :"<<endl;
    	}
    	else if(ch=='b') 
        {
    		cout<<"The number of correct answers are:"<<endl;
    	}
    	cout<<count<<endl; 
    	return 0;
    	
    }
    

    calculate2.h文件

    #ifndef CALCULATE1_H
    #define CALCULATE1_H
    
    class calculate2
    {
    	public:
    		int A1(int d[],int c[],int fenshu[]);
    	    int B1(int d[],int c[],int fenshu[]);
    	    int B3(int d[],int c[],int fenshu[]);
    	    int C1(int d[],int c[],int fenshu[]);
    	    int randomd(int d[]);
    	    int randomc(int c[]);
    	    int calculate(int d[],int c[]);
    	    char choice();
    		int gcd(int x,int y); 
    	private:
    		int d[4];
    		int c[3];
    		
    		
    };
    #endif
    

    由于calculate2.cpp的代码太长了,就不在此列出,详见GitHub。

    GitHub提交链接

    卢恺翔的GitHub最终文件为calculate2,其他文件均为之前上传的材料

    2位同学的分工和协作证据截图

    一开始我想我负责写算法,奇豪写界面。结果发现界面设计其实非常简单,而算法也很难。于是我们决定先一人写,当另一个人没有思路的时候,换另一个人写。但这可能就是我们本次项目制作失败的原因。可能这样子做导致效率太低。当然,自身能力的不足也是导致时间不足的原因。



  • 相关阅读:
    【宋红康程序思想学习日记5】数组排序之冒泡法
    求割点 poj 1523
    网络流 poj 3308 最小割
    网络流最小割 POJ 3469
    网络流 POJ2112
    网络流 HDU 3605
    网络流HDU 2883
    网络流 最大流HDU 3549
    微信公众平台开发者中心服务器配置Token验证失败问题
    排列熵算法简介及c#实现
  • 原文地址:https://www.cnblogs.com/leolkx/p/6412179.html
Copyright © 2020-2023  润新知