第三次作业 传送门
------ 一次从C语言到C++的迁徙
心路历程
看到这次题目,原来以为很简单就能实现的问题,但是过了几天后我才意识到这不是那么简单的事情。因为这不是我熟悉的c语言,而是一个完全不认识的新领域c++。
开学前,刚刚提交了没打完的代码,只知道用.h和main函数的链接,至于.h要加cpp的文件一无所知,于是自己的.h就打在了main cpp里。于是带着未完成的使命,开始了下学期的生活。一开始课程不紧,还会有时间去看下自己的代码如何改进,在那个时候我知道一个.h文件后要加一个cpp文件。所以一共需要五个文件,我很早就学到了public,private,protect一类的关于类的事物,但是我只知道他就是他,跟c语言并不知道该如何联系在一起,而当时我很感谢这道题目带我认识了string这个类型,让我在开学后的c语言作业里有了一些捷径,学习string甚至比char类型还要用心,和彻底
时间不遂人愿,课程变多了,也就没什么时间去管理。直到今天,我的舍友告诉了我之间的联系.h的cpp文件里的private就是相当于一个函数的局部变量,而public是全局变量,对于main函数而言,这个.h相当于c语言中写一个函数,将c语言和c++的联系摆在我的面前,那么这道题我觉得我可以了。其实这么看下来,我所不理解的就是c++这个变量的使用,以及一个初学者如何把他们联系在一起
以下是代码部分
scan.h
#include <iostream>
#include <queue>
#include <string>
using namespace std;
class Scan
{
public:
queue<string> ToStringQueue(string a); //定义一个类似于c语言的调用函数
queue<string>result_queue; //定义一个队列用于输出
private:
string a;
int i;
string b; //对于scan.h中的cpp文件的局部变量
protected:
};
scan.cpp
#include"Scan.h"
queue<string>Scan::ToStringQueue(string a)
{
for (i = 0; i < a.size(); i++) //遍历一遍输入的string
{
if (a[i] > 47 && a[i] < 58 || a[i] == '.') //0-9和.归入string b。
b += a[i];
else //一旦出现了非这些符号,把b推进队列
{
if (!b.empty())
result_queue.push(b);
b.clear();
b = a[i]; //另外要考虑到如果两个连续为比如‘*(’的情况下要检测是否b为空,否则会输出空格
if (!b.empty())
result_queue.push(b);
b.clear();
}
}
if (!b.empty())
{
result_queue.push(b);
}
return result_queue; //将结果的队列返回给主函数
}
print.h
#include<string>
#include<queue>
#include<iostream>
using namespace std;
class print
{
public:
void PrintStringQueue(queue<string>result_queue); //定义输出函数
private:
int i, a;
};
print.cpp
#include"print.h"
void print::PrintStringQueue(queue<string> result_queue)
{
a = result_queue.size();
for (i = 0; i < a; i++)
{
cout << result_queue.front() << endl; //循环输出队列首元素,然后用.pop删除首元素
result_queue.pop();
}
}
main.cpp
#include<iostream>
#include<string>
#include<queue>
#include"Scan.h"
#include"print.h"
using namespace std;
int pd(string str) //判断这个数字是否超过10位
{
int i, j = 0, k = 0;
for (i = 0; i < str.size(); i++)
{
if (str[i] <= '9'&&str[i] >= '0' || str[i] == '.')
{
j++;
if (str[i] == '.') //针对小数点的话,应该判断是否超过11位
{
k = 1;
}
if (k == 1 && j > 11)
{
return 1; //不符合要求返回1
break;
}
if (k == 0 && j > 10)
{
return 1;
break;
}
}
else
{
j = 0; //一个数结束清0
}
}
return 0;
}
int main()
{
queue<string>q; //定义一个新的队列q,用于交换scan的队列值,放入print里
Scan sc;
print pr;
string input;
cin >> input;
if (pd(input) == 0) //利用0 1 之间的关系,类似于bool但是不太会用,老老实实这样做了。
{
q = sc.ToStringQueue(input);
pr.PrintStringQueue(q);
}
else
{
cout << "error" << endl;
}
return 0;
}
章末总结
- 本次作业,真正的带我们走入了c++的世界,在这个世界中,我认识到了如何把一个零碎的文件,集合成一个强大的,完整的个体。另外string和queue对象的使用,尤其是前者,对我现在的c语言的代码编程,有了很大的帮助。同时感谢我的舍友对我的点拨和帮助。*