自娱自乐:

大概是终于做到没做完的部分了,第三步助教学长的评论还没去改,感觉那个把读取文件放到Scan里面比较麻烦,其他大概还好。以上。

文件读写:

先是原来的残留问题,都是和fstream :: open这个函数有关的。这个函数用来打开文件,它有两个参数,一个是打开的文件的路径,一个是打开文件的方式,然后问题都出在路径上。其一:ifstream infile("D:\text.txt", ios :: in)中的斜杠要写成双斜杠才能成功的打开文件,一个可以接受的解释是:因为 C++ 编译系统将单斜杠理解为转义字符。其二:用一个string的对象来接收键盘输入的路径,然后把这个对象放在第一个参数的位置上,会报错说没有适合的重载函数,可是看写函数时候的参数提示,除了const char*,明明也有const string&。原来是看了别人的,用string :: c_str()函数,把string的对象变成c中的字符串样式(大概是字符数组吧,那个函数会返回一个指向字符的指针),大概是变成了调用参数为const char*的那种。然后网上有人说这是个bug,c++ 11就支持直接用string的对象。不过现在是用命令行调用,那我直接用char* argv[]的元素当参数就好。大概就是这样了。

代码修改:

Main.cpp

#include"Scan.h"
#include"Print.h"
#include"Calculation.h"
#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
int main(int argc, char* argv[])
{
Scan CScan;
Print CPrint;
Calculation CCalculate;
    string arg_1 = argv[1];	//储存第一个参数
queue<string> qs; //数字和运算符分开的队列
string s_input; //输入的字符串
double ans; //四则算式的答案
    if (arg_1.compare("-f") == 0)
{
//打开读,写文件
ifstream ifile(argv[2], ios :: in);
ofstream ofile(argv[3], ios :: out);
        if (ifile.is_open() && ofile.is_open())
{
while (!ifile.eof())
{
s_input = CScan.GetFileString(ifile);
qs = CScan.ToStringQueue(s_input);
ans = CCalculate.CalculateStringQueue(qs);
CPrint.PrintToFile(ofile, ans);
}
}
else
{
cout << "文件打开失败!" << endl;
}
        //关闭读,写文件
ifile.close();
ofile.close();
}
else
{
s_input = argv[argc - 1];
qs = CScan.ToStringQueue(s_input);
ans = CCalculate.CalculateStringQueue(qs);
        if (arg_1.compare("-a") == 0)
{
CPrint.PrintExpreesion(s_input, ans);
}
else
{
CPrint.PrintAns(ans);
}
}
    return 0;
}

主要就是main里面的修改比较大,其他的就是添了一些简单的函数或是又考虑了一些情况而已,像算式有了等号,还有就是支持不带括号的负数(看了助教学长发到群里的那个测试文件之后。。。)。主要的修改是围绕着学长的建议来的,全部读写完成之后再关闭文件,然后打开文件之后在Scan里面读取(现在大概算吧),还有用上了c++自己的字符串比较string::compare。

实际测试的时候,一直报错说文件打开错误,后来发现是文件名打错了。。。打对名字之后,它还是会迷之停止运行啊,我的天,到底是为什么。不过啊,输出文件里倒是真的有输出,然后破罐子破摔试了下十万个数据那个。唔,大概有输出十万个答案吧,不过用cmd里面的fc来和正确答案的文件比较啊,还是有很多不一样的地方(看下图侧边那长长的进度条。。。):

啊,大概是我的答案四舍五入了?哪里忘记用double了吗。。。原来第三次的代码会停止运行好像就是因为有个double写错了,然后下面是完善过程。

关于找停止运行的地方,断点调试还是很迷啊,表示没成功过几次,感觉应该很简单的啊,大概是dev c++抽了,不管,反正用傻办法(大概是加一堆的提示输出。。。)也知道为什么会停止运行了。大概是fstream::eof的锅,它让循环多了一次,然后是文件里找不到可以输入的东西而崩溃。百度了一下,eof貌似没什么用啊,它在没有东西可输的时候才会从false变成true,然而这个时候代码不是也崩溃了嘛,没起到下次没东西输这样的预测的作用。唔,虽然在别人博客有看到这么用(大概当初就是直接看过来的,然后我还用错了。。。),不管,不再去研究别人为什么可以,我用自己的想法。然后我的想法大概就是这样:

//实际上等价于while (ifile >> s_input)。。。
while (CScan.GetFileString(ifile, s_input))
{
qs = CScan.ToStringQueue(s_input);
ans = CCalculate.CalculateStringQueue(qs);
CPrint.PrintToFile(ofile, ans);
}

唔,反正不崩溃就好,然后是原来那个double的四舍五入的问题。写了个简单的输入输出来测试,发现cout默认输出的double的有效数字是六位(啊,大概是上课没认真听)。于是继续百度改有效数位的方法,改成10位就够了吧,原来第一步就说不支持数位超过十位的。下面是修改后cmd里面的fc比较结果:

居然出现了-0耶,试了下输入-0到double类型的a,输出的a真的是-0。然后好像想起了貌似有上过《计算机导论》,好像有说double里的0和-0表示不一样的?啊,不去深究,再稍微改改代码。下面是最终的结果:

哈,大概是完成了计算器第三步了吧,开心,代码已上传github,这是链接:点我啊

除了有些缩进传上去它又乱来(大概是dev c++的锅),其他感觉完美(哈哈)。。。

c++计算器后续(4)的更多相关文章

  1. 使用HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)

    之前发布了一款简易的计算器,今天做了一下修改,添加了键盘监听事件,不用再用鼠标点点点啦 JS代码: var yunSuan = 0;// 运算符号,0-无运算;1-加法;2-减法;3-乘法;4-除法 ...

  2. c++计算器后续(5)

    自娱自乐: 大概是重新开始玩qt,然后MFC和第四步附加的作业大概不会去玩了.以上. QT相关: 阶段一: 原来作业里举了qt和mfc这两个做界面的东西,网上都说qt容易上手,学了mfc再来看qt简直 ...

  3. c++计算器后续(2)

    自娱自乐: 大概是了解了一下前缀.中缀.后缀表示法是啥,并没有去深究,比如考虑实现啊,然后Calculation类里面的计算方法还是选用原来的直接对中缀表达式求值,只是把代码改得规范点,以上. 各表示 ...

  4. c++计算器后续(3)

    自娱自乐: 本来只是想改改第二次的代码规范的,然后好像把原来的代码玩坏了,真是尴尬...然后大概是又发现了一些东西.以上. main的参数: 大概是说main函数的括号里是可以带参数的,写成这个样子: ...

  5. c++计算器后续(1)

    自娱自乐: 大概是一直在说的代码规范,大概是玩一玩,以上. 代码规范: 参考原文:链接 相关节选: 4 程序的版式 4.4规则:较长的语句(>80字符)要分成多行书写. 4.5规则:不允许把多个 ...

  6. 微信小程序计算器后后续

    改的眼睛都要瞎了,总算是知道问题出哪了 最后一段 在等号里面计算输入的数组,这个判断的主要操作是将输入的数据的数组进行数和符号的拆分然后再计算,把数按字符串输入数组,然后将数和符号进行拆分 ,最后通过 ...

  7. 微信小程序计算器模拟后续

    今天按着自己的思路又重打了一遍 wxml没什么说的,就是分块起名,显示数字和结果的作为屏幕,数字键盘一行四块 <view class="onTop"> <view ...

  8. 【IOS开发笔记03-视图相关】简单计算器的实现

    UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...

  9. Js函数初学者练习(一)switch-case结构实现计算器。

      前  言 JRedu 给大家介绍一点JS函数的练习题希望初学者多做一些练习能够更好的掌握JS的函数,以及能够提升大家的逻辑思维.(我也是个渣渣希望路过的大神多提建议或意见) 希望能够对大家有所帮助 ...

随机推荐

  1. 10种jquery选择器操作详解(转)

    jquery选择器大体上可分为4 类: 1.基本选择器2.层次选择器3.过滤选择器4.表单选择器 其中过滤选择器可以分为:1.简单过滤选择器2.内容过滤选择器3.可见性过滤选择器4.属性过滤选择器5. ...

  2. 《Think Python》第15章学习笔记

    目录 <Think Python>第15章学习笔记 15.1 程序员定义的类型(Programmer-defined types) 15.2 属性(Attributes) 15.3 矩形( ...

  3. vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据

    在vue项目中组件间相互传值或者后台获取的数据需要供多个组件使用的情况很多的话,有必要考虑引入vuex来管理这些凌乱的状态,今天这边博文用来记录这一整个的过程,后台api接口是使用webpack-se ...

  4. 解决java获取系统时间差8个小时 专题

    在WIN7下发现一些Java的程序获取系统时间比真实时间差了8个小时,怀疑是Java程序沿用了低版本的JDK,获取时间时取的GSM 0时区,而中国是GSM +8,所以查了8个小时,解决办法如下: 修改 ...

  5. [转]SSRS: Checking for Divide By Zero Using Custom Code

    本文转自:http://salvoz.com/blog/2011/11/25/ssrs-checking-for-divide-by-zero-using-custom-code/ I encount ...

  6. 文件流FileStram类

    本节课主要学习三个内容: 创建FileStram流 读取流 写入流 文件流FileStram类,是用来实现对文件的读取和写入.FileStram是操作字节的字节数组,当提供向文件读取和写入字节的方法时 ...

  7. 使用MUI框架,模拟手机端的下拉刷新,上拉加载操作。

    套用mui官方文档的一句话:“开发者只需关心业务逻辑,实现加载更多数据即可”.真的是不错的框架. 想更多的了解这个框架:http://dev.dcloud.net.cn/mui/ 那么如何实现下拉刷新 ...

  8. Jquery Easy UI初步学习(一)

    Easy UI 1.3.2 以前听说Easy UI很不错,当了一个dome,闲着没事就看了一下,也整理一下为了自己更好的记忆,也希望对象我这样小菜有帮助吧 先从后台管理的主页面开始,如要要做主页需要了 ...

  9. 二、socket编写简单BIO的HTTP服务器

    一.目标 诸如tomcat等web服务器中间件简化了我们web的开发成本,但有时候我们或许并不需要这么一个完备的服务器,只是希望做一个简单地处理或者做特殊用途的服务器. 本文将提供一个HTTP的服务器 ...

  10. 笔记本(华硕UL80VT)软件超频setFSB

    Warning !!!If you are a beginner, do not use this software. This software is for power users only. U ...