• 第五次课程作业


    第五次课程作业

    作业要求

    本次作业要求将程序写成.cpp和.h分离的形式

    根据设计的类图进行编码,搭建主体框架

    Github链接

    对上次的第四次课程作业构思四则运算我分的是三个类,编码实现:

    三个类分别用.h声明函数用.cpp定义函数(实现分离);

    三个类声明

    表达式类:

    class Expression
    {
    private:
    	string expression;
    	string reversePolishNotation;
    	int value;
    public:
    
    	Expression();
    	~Expression();
    
    	int RandomNum();
    	char RandomOperator();
    
    	string & AddOperator(const char oper);
    	string RandomPart();
    	string & AddPart(const string & part);
    
    	int PartValue(const string & part);
    	Expression CreateInfixExpression();
    	Expression ReversePolishNotation();
    	int ExpressionValue();
    
    	friend ostream & operator<<(ostream & os, const Expression &e);//重载<<运算符
    };
    
    

    栈类:

    class Stack
    {
    private:
    	int *Data;
    	int posi;
    public:
    	Stack();
    	~Stack();
    	bool empty() const;
    	int top() const;
    	bool push(const int & item);
    	bool pop();
    	int size();
    };
    

    用户类:

    class User
    {
    
    public:
    	int n;
    	char language[200];
    	char Langpath[255] = "";
    	/*void setn(int number);
    	void setLanguage(char* lang);
    	void setLanpath(char* path);*/
    	User()
    	{}
    	~User()
    	{}
    	void WrongAgain();
    	void MakeResource();
    	void Print(int numRight, int numWrong, double accuracy);
    
    };
    

    这次的作业中遇到得问题:在进行类的.h和.cpp分离时,会出现报错,大体原因是程序中声明了多个.h文件,在调用的时候一个.h文件同时被多个.c调用的时候会出现重定义的问题,对这个我找了很久之后咨询了助教,然后意外的是问题没解决,却得知本次作业方向貌似出现了一些些小误差,但时间原因我就还是按照之前的理解完成的本次作业,之后再予以修改吧。
    重定义问题:.h文件多次被调用的时候会出现其中的一些变量多次定义;

    解决方案:

    1.将这几个调用的.cpp文件合成一个文件(那样就又回到了之前的没有函数分块化的情况了hhh)
    2. 项目 –> 属性 –> 链接器 –> 命令行 –> 附加选项中 加 /force (VS编译器,这是稍微较好的解决方案)这样使得编译器在遇到重定义的时候自动忽略二次定义,但是如果第二个定义才是需要的,那程序运行就会出错了。
    相关推荐博客:
    http://www.cnblogs.com/VVingerfly/p/6056042.html
    http://blog.sina.com.cn/s/blog_724ea5200100zhhd.html

    栈的学习:

    栈是特殊的线性表,满足先进后出原则;

    使用标准库中的栈:

    1.首先应包括相关的头文件:#include
    2.定义栈:stackstk
    3.有如下操作:

    s.empty()       如果栈为空返回true,否则返回false
    s.size()        返回栈中元素的个数
    s.pop()         删除栈顶元素但不返回其值
    s.top()         返回栈顶的元素,但不删除该元素
    s.push()        在栈顶压入新元素
    

    使用自定义的栈:

    1.首先定义一个栈类
    2.自行编写栈内各个功能函数;
    可参考以下代码:

    class Stack
    {
    private:
    	int *Data;
    	int posi;
    public:
    	Stack();
    	~Stack();
    	bool empty() const;
    	int top() const;
    	bool push(const int & item);
    	bool pop();
    	int size();
    };
    
    

    有关于栈的学习,这里直接贴一个我打的简单的程序代码:

    #include<iostream>
    #include<stack>
    
    using namespace std;
    int main()
    {
    	const int num_size = 10;
    	int num[num_size] = { 0,1,2,3,4,5,6,7,8,9 };
    	int i = 0;
    	stack<int>intStack;  
    	for (; i < num_size; i++)
    	{
    		intStack.push(num[i]);		//入栈
    	}
    	int error_count = 0;
    	if (intStack.size() != num_size)
    	{
    		cout << "oops!,invalid intStack size:" << intStack.size() << "	excepted:" << num_size << endl;
    	}
    	int value;
    	while (intStack.empty() == false)
    	{
    		value = intStack.top();		//取栈顶元素
    		if (value != -i)
    		{
    			cout << "oops!excepted " << i << "recieved " << value << endl;
    			error_count++;
    		}
    		intStack.pop();		//弹出栈顶元素
    	}
    	cout << "Our program ran with " << error_count << "errors!" << endl;
    	return 0;
    
    }
    

    有一个想法是之后自己重新实现一下这个四则运算软件的程序编码,定会学到更多。

  • 相关阅读:
    内存页面的各种属性(就是Read, Write, Execute的组合)
    分配粒度和内存页面大小(x86处理器平台的分配粒度是64K,内存页是4K,所以section都是0x1000对齐,硬盘扇区大小是512字节,所以PE文件默认文件对齐是0x200)
    NULL指针区域(NULL定义为0-65535之间的任何数都可以)
    Tiny Mapper是一个.net平台开源的对象映射组件
    表达式树动态拼接lambda
    VSC调试.NET Core 应用程序
    领域驱动设计之单元测试最佳实践
    web框架python
    无需安装Mono的Jexus
    分布式发布订阅消息系统Kafka
  • 原文地址:https://www.cnblogs.com/heihuifei/p/6896085.html
Copyright © 2020-2023  润新知