zoukankan      html  css  js  c++  java
  • 第三次作业— C++计算器项目的初始部分

    作业题目:

    C++计算器项目的初始部分

    仓库

    代码:###

    Scan.h

    #ifndef SCAN_H
    #define SCAN_H
    #include<string>
    #include<iostream>
    
    using namespace std;
    
    class Scan
    {
    	public:
            void ToStringQueue(string input);
    };
    
    #endif
    

    Scan.cpp

    #include "Scan.h"
    #include<string>
    #include<queue>
    #include<iostream>
    
    using namespace std;
    queue <char> Que;   
    int j = 0;    //定义全局变量,以便报错 
    
    void Scan::ToStringQueue(string input)   
    {
        int i = 0, k=0, len = input.size(); 
        for (i = 0; i < len; i++)
        {
            if (input[i] == '+' || input[i] == '-'
                ||input[i] == '*' || input[i] == '/'
                ||input[i] == '(' || input[i] == ')')
            {
                k = 0;              // 计数清零 
            }
            
            else                      
            {
                if (input[i]!='.')
                {   
                    if (input[i] >= '0' && input[i] <= '9')    
    	    {
    	        k++;		//计数
    	    }
    			
                    if (k>10)    
    	    {
    	        j++;		//用于报错
    	    }
                }
            }
    	
             Que.push(input[i]);     
        }
    };
    

    Print.h

        #ifndef PRINT_H
        #define PRINT_H
    
        class Print
        {	
            public:
                void print_str();
        } ;
    
        #endif
    

    Print.cpp

    #include "Print.h"
    #include"Scan.h"
    #include<string>
    #include<queue>
    #include<iostream>
    
    using namespace std;
    extern int j;
    extern queue <char> Que;
    
    void Print::print_str()
    {
        int T = 0;
    
        if(j != 0)   // 判断是否报错。 
        {
            cout << "Error!"<<endl;
        }
    
        else
        {
            while (!Que.empty()) 
            {
                if (Que.front() == '+' || Que.front() == '-'
                    || Que.front() == '*' || Que.front() == '/'
                    || Que.front() == '(' || Que.front() == ')')   
                {
                    if (T)
                    {
                        cout << endl; // 保证数字完整输出后及时换行.
                        T = 0;
                	}
                	cout << Que.front() <<endl;
                    Que.pop();  // 输出后清除队列中第一个元素 
                }
            
              	// 判断, 若不是运算符号或者括号, 
               //则不必输出 endl (
    ), 保持数字及小数 (包括小数点)输出的完整性。
    	  	
               else              
                {
                    cout << Que.front();
                    Que.pop();
                    T = 1;
                }
            }
        }
    };
    

    main.cpp

    #include "Scan.h"
    #include "Print.h"
    #include<string>
    #include<iostream>
    
    using namespace std;
    
    int main ()
    {
    	Scan Calculator;   // 对象实例化
    	Print Put;    
    	string str;	  // 定义 str 用来存储键入的字符串。 
    	cin >> str;
    	Calculator.ToStringQueue(str); //调用。 
    	Put.print_str();
    	return 0;
    }
    

    一、解题思路:

    过程主要采用<string><queue>. 相关用法可参考:string queue

    步骤(主要说下Scan和Print部分):

    1. Scan:

    • 设置全局变量 j = 0.
    • 通过 len = input.size() (主要要加上头文件 #include<string> 才能使用) 得出 input 的长度。
    • 使用循环,从 0-len ,将 input 的元素依次 push 入队列 Que。
    • 在 push 的过程中,判断是否数字继而开始计数 (k),直至push入的字符不是数字为止且同时令k=0 (清零)。若输入的数字超过10位,则 j++ 进而可以用于 Print 处判断是否输出 Error 。

    2. Print:

    • 通过 if(j != 0) 来决定输出 Error! 或者输出 队列 Que .
    • 若输出队列,则通过
        if (Que.front() == '+' || Que.front() == '-'
            || Que.front() == '*' || Que.front() == '/'
            || Que.front() == '(' || Que.front() == ')')   
        {
             if (T)
             {
                  cout << endl; // 保证数字完整输出后及时换行.
                  T=0;
              }
              cout << Que.front() <<endl;
              Que.pop();  // 输出后清除队列中第一个元素 
         }
         // 判断, 若不是运算符号或者括号, 
         // 则不必输出 endl ( 
       ), 保持数字及小数 (包括小数点)输出的完整性。 
         else
         {
              cout << Que.front();
              Que.pop();
              T=1;
          }
      
      来输出数字及小数,并能够按要求进行换行,每输出一个元素,使用 Que.pop() 删除队列的第一个数据元素 .

    二、过程的纠错:

        第一遍打完代码忘记将数字完整保留输出,于是在 Print 输出方面使用判断语句(判断是否连续是数字,
        是则不输出 endl)解决.
        
        紧接着我才发现题目要求当数字超出 10 位时报错(包括小数部分)。
        
        对于这个问题,我想了下,便在Scan ToStringQueue()设置了 j,k(均为局部变量),通过计数,来判断
        是否溢出。然后修改后的代码的运行结果并没有发生改变。于是我又重新查看了下代码才发现 j 应当设置成
        全局变量才能在 print_str() 中使用。
        
        刚开始的时候在 Scan ToStringQueue() 中我采用的是 
        
        if (input[i] >= '9' && input[i] <= '0')
        
        条件成立时 k++计数。但是想了想发现作为一个计算器,
        如果输入的字符与运算无关那是不是也应该报错呢。于是 便改成了 
    
        if (input[i] == '+'|| input[i] == '-'
            || input[i] == '*' || input[i] == '/'
            ||input[i] == '(' || input[i] == ')')
        {
            k = 0;                     // 计数清零 。 
        }
        else                         // 计数. 
        {
            if (input[i] != '.')
            {    
                k++;
                if (k > 10)
                {
                    j++;
                }
            }
        }
    
        最终 大功告成!
    

    三、小结:

    从大年初一开始到前几天,一直都处于浪的状态 -.- !这次的作业也就刚出来那天看了下(然而并没有看懂,只知道要用到类的知识)。估计是知道要开学了,才会突然想起还有作业,从昨天早上开始,整整一天的时间,看了类那一章节,以及<string><queue>的用法。又花了今天一整天才搞定了这份作业。想想刚放假时的豪言壮语,再看看现在,感觉整个寒假终究是惰性占据了一切。还是开学的好,比较有激情去学习。

    四、2.23修改总结:

    • 首先要说的是,关于多文件相互调用问题, 之前对于题目的理解有误,以为是建立一个 类 写俩个class (Scan和Print). 后来看了下才知道要建立俩个 类 。 对于俩个类之间变量值的调用我采用 extern 类型 变量名 ,前提是要加上头文件,比如我在Print类文件中要调用Scan类文件中的 整型 j 和 队列 Que , 就得在Print类头部加上 #include"Scan.h".

    • 接着,题目似乎要求的是将 字符串(string) push 入队列,虽然我使用的方法是将 字符(char) push 入队列。 但如果要使用前面那种方式的话,我的代码主要如下:

    Scan.cpp :

    queue<string>Que;
    string s;
    int j=0;//用于判断是否报错
    void Scan::ToStringQueue(string input)
    {
        int i,k=0, n=input.size();
        s=input[0];
        for (i=0; i<n; i++)
        {            
            if (input[i]=='+'||input[i]=='-'
                ||input[i]=='*'||input[i]=='/'
                ||input[i]=='('||input[i]==')')
            {
                  	Que.push(s); // 将字符串s push队列 (此时s要么是数字(包括小数),要么是单个字符)
                  	s.clear(); //清空 字符串s 
                  	k=0; //计数清零            	  	
             }
             else
            {
            	for (; i<n; i++)
            	{
            	 	if (input[i]=='+'||input[i]=='-'
                	    ||input[i]=='*'||input[i]=='/'
                	    ||input[i]=='('||input[i]==')')
                        {
                		break; 
                        }
                 	else
                 	{
                 		if(i!=0)    s += input[i]; //将数字连接起来 
                  		if(input[i]>='0'&&input[i]<='9')    k++;//计数
                  		if (k>10)    j++;//用于报错                     	
    		}
    		Que.push(s); // 将字符串s push队列 (此时s要么是数字(包括小数),要么是单个字符)
            s.clear(); //清空 字符串s 
    		s=input[i];
    		i=i-1;
                }
            }
    }
    

    Print.cpp :

        extern int j;
        extern queue <char> Que;
        void Print::print_str()
        {
        if(j != 0)   // 判断是否报错。 
        {
            cout << "Error!"<<endl;
        }
        else
        {
            while (!Que.empty())  // 队列非空,则继续循环输出 (若队列为空, 则 Que.empty() 的返回值为true)。
            {
                cout << Que.font() <<endl;//输出一个一个的字符串(单个字符或者数字)
                Que.pop();// 输出后清除队列中第一个元素 
            }
        }
    

    既然选择了远方,便只顾风雨兼程。

  • 相关阅读:
    FontAwesome动态旋转图标类(fa-spin&fa-pulse)
    心得体悟帖---200401(录课异常状态可以试讲,且一定试讲,然后等到好状态一举拿下)
    心得体悟帖---200401(别身在福中不知福,现在是多好的时机,做自己开心的事情)
    心得体悟帖---200401(你做任何事情,抉择和责任都在自己,而不是在别人)
    laravel疑难问题---4、phpstorm中如何配置phpunit(单元测试)
    phpstorm常用配置和快捷键
    phpstorm常用操作---5、phpstorm配置命令行环境
    phpstorm常用操作---4、phpstorm配置phpunit环境
    phpstorm常用操作---3、phpstorm修改默认快捷键
    phpstorm常用操作---2、phpstorm特别常用快捷键
  • 原文地址:https://www.cnblogs.com/FZUstu/p/5208567.html
Copyright © 2011-2022 走看看