c++计算器后续(1)
自娱自乐:
大概是一直在说的代码规范,大概是玩一玩,以上。
代码规范:
参考原文:链接
相关节选:
4 程序的版式
4.4规则:较长的语句(>80字符)要分成多行书写。
4.5规则:不允许把多个短语句写在一行中,即一行只写一条语句。
4.6 规则:if、for、do、while、case、switch、default等语句自占一行,
且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。4.7规则:代码行之内应该留有适当的空格
象if、for、while 等关键字之后应留一个空格再跟左括号‘( ’, 以突出关键字。
2)函数名之后不要留空格, 紧跟左括号’(’ , 以与关键字区别。
4)‘ ,’ 之后要留空格, 如Function(x, y, z)。如果‘ ;’ 不是一行的结束符号, 其后也要留空格
二元操作符的前后应当加空格。5 注释
5.1规则:源文件头部应进行注释,列出:生成日期、作者、模块目的/功能等。
/************************************************************
FileName: test.cpp
Author: Version : Date:
Description: // 模块描述
Version: // 版本信息
Function List: // 主要函数及其功能
1. -------
History: // 历史修改记录
David 96/10/12 1.0 build this moudle
***********************************************************/5.2规则:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值等。
/*************************************************
Description: // 函数功能、性能等的描述
Input: // 输入参数说明,包括每个参数的作
// 用、取值说明及参数间关系。
Output: // 对输出参数的说明。
Return: // 函数返回值的说明
Others: // 其它说明
*************************************************/5.6建议:注释的主要目的应该是解释为什么这么做,而不是正在做什么。
如果从上下文不容易看出作者的目的,说明程序的可读性本身存在比较大的问题,应考虑对其重构。5.7建议:避免非必要的注释。
6 标识符命名
6.1规则:命名尽量使用英文单词,力求简单清楚,避免使用引起误解的词汇和模糊的缩写,使人产生误解。
说明:
较短的单词可通过去掉“元音”形成缩写;
较长的单词可取单词的头几个字母形成缩写;
一些单词有大家公认的缩写。
示例:如下单词的缩写能够被大家基本认可。
temp 可缩写为 tmp
flag 可缩写为 flg
statistic 可缩写为 stat
increment 可缩写为 inc
message 可缩写为 msg6.4规则:常量、宏和模板名采用全大写的方式, 每个单词间用下划线分隔。
6.9建议:函数名以大写字母开头,采用谓-宾结构(动-名),且应反映函数执行什么操作以及返回什么内容。
6.10建议:类、结构、联合、枚举的命名须分别以C、S、U、E开头,其他部分遵从一般变量命名规范。
7 可读性
- 7.3规则:涉及物理状态或者含有物理意义的常量,避免直接使用数字,必须用有意义的枚举或常量来代替。
8 变量、结构
- 8.2规则:变量,特别是指针变量,被创建之后应当及时把它们初始化,以防止把未被初始化的变量当成右值使用。
9 函数、过程
9.7尽量写类的构造、拷贝构造、析构和赋值函数 ,而不使用系统缺省的。
9.8建议:对于不需要拷贝构造函数时,应显式地禁止它,避免编译器生成默认的拷贝构造函数。
9.10建议:禁止编写依赖于其他函数内部实现的函数。
9.12建议:函数实现中不改变内容的参数要定义成const。
10 c++专用规范
10.3规则:主动使用const,避免使用宏。
10.5规则:尽可能局部地声明变量。
具体代码:
Main.cpp
/***************************************************************
FileName: Main.cpp Author:newmoon
Version :2.0
Date:16/07/25 Description:
输入一个字符串算式,拆分数字和运算符并输出 Function List:
int main() 输入一个字符串算式,拆分数字和运算符并输出 History:
<author> <time> <version > <desc>
newmoon 16/07/25 2.0 代码规范相关
**************************************************************/ #include"Scan.h"
#include"Print.h"
#include<iostream>
#include<queue>
using namespace std; int main()
{
Scan getStr;
Print printQue; string s_input; //输入的字符串
queue<string> qs_output; //输出的队列 cin >> s_input;
//调用Scan类的对象中的相应函数
//以获取拆分好的队列
qs_output = getStr.ToStringQueue(s_input);
//调用Print类的对象中的相应函数
//以输出拆分好的队列
printQue.PrintStringQueue(qs_output); return 0;
}
Scan.h
#ifndef SCAN_H
#define SCAN_H #include<iostream>
#include<queue>
using namespace std; class Scan
{
public:
//接收一个字符串算式,
//将算式中的数字和运算符拆分并存入一个队列,
//最后返回这个队列。
queue<string> ToStringQueue(string s_input);
}; #endif
Scan.cpp
/**************************************************************************
FileName: Scan.cpp Author:newmoon
Version :2.0
Date:16/07/25 Description:
定义实现Scan类中的相关方法 Function List:
queue<string> ToStringQueue(string s_input) 拆分算式中数字和运算符 History:
<author> <time> <version > <desc>
newmoon 16/07/25 2.0 代码规范相关
**************************************************************************/ #include"Scan.h"
#include<iostream>
#include<queue>
using namespace std; /********************************************************
Description:接收一个字符串算式,
将算式中的数字和运算符拆分并存入一个队列,
最后返回这个队列。
Input:一个字符串类型的算式
Output:无
Return:一个元素为string对象的队列
Others:算式中的数字位数(包括小数位)超过十位则报错
********************************************************/ queue<string> Scan::ToStringQueue(string s_input)
{
queue<string> qs_output; //返回的队列
string t_str; //暂存连接起来的数字的中间变量
int cnt = 0; //统计数字位数的变量 //遍历整个算式字符串以拆分数字和运算符
//碰到数字先接到中间变量上
//碰到运算符则先前的数字入队
for (int i = 0; i<s_input.size(); i++)
{
//遍历到运算符
if (s_input[i] == '+' || s_input[i] == '-'
|| s_input[i] == '*' || s_input[i] == '/'
|| s_input[i] == '(' || s_input[i] == ')')
{
//中间变量若不为空(如以"-"开头)
//中间变量里接起来的数字入队
if (!t_str.empty())
{
qs_output.push(t_str);
//清空中间变量以便下次连接
t_str.clear();
//重置位数统计以便下次统计
cnt = 0;
} //遍历到的运算符入队
switch (s_input[i])
{
case'+':
qs_output.push("+");
break;
case'-':
qs_output.push("-");
break;
case'*':
qs_output.push("*");
break;
case'/':
qs_output.push("/");
break;
case'(':
qs_output.push("(");
break;
case')':
qs_output.push(")");
break;
}
} //遍历到数字
else
{
//接到中间变量上以组成数字
t_str = t_str + s_input[i]; //统计数字位数
if (s_input[i] != '.')
{
cnt++;
} if (cnt > 10)
{
cout << "数字位数超过十位" << endl;
exit(1);
} //以数字结尾的算式需要特判
//避免漏掉最后一个数字
if (i == s_input.size()-1)
{
qs_output.push(t_str);
}
}
} return qs_output;
}
Print.h
#ifndef PRINT_H
#define PRINT_H #include<iostream>
#include<queue>
using namespace std; class Print
{
public:
//输出接收的队列
void PrintStringQueue(queue<string> qs_output);
}; #endif
Print.cpp
(明明是一样的星号。。。)
/*************************************************************************
FileName: Print.cpp Author:newmoon
Version :2.0
Date:16/07/25 Description:
定义实现Print类中的相关方法 Function List:
void PrintStringQueue(queue<string> qs_output) 输出一个接收的队列 History:
<author> <time> <version > <desc>
newmoon 16/07/25 2.0 代码规范相关
**************************************************************************/ #include"Print.h"
#include<iostream>
#include<queue>
using namespace std; /************************************
Description:输出一个接收的队列
Input:元素类型为string对象的队列
Output:队列中的元素,即string对象
Return:无
Others:无
*************************************/ void Print::PrintStringQueue(queue<string> qs_output)
{
//循环输出直到队列为空
//以此来输出整个队列
while(!qs_output.empty())
{
cout << qs_output.front() << endl;
//弹出已输出的队首元素以准备下一次输出
qs_output.pop();
}
}
顺便附带:
大概是又去看了看git相关的东西,原来只是为了完成上传代码的任务,不知道是什么东西,反正就照着教程一步一步做就是了,现在再回过头去看,感觉比一脸懵逼好点。下面只是一些自己的理解,助教学长后来倒是给了一些很不错的教程,适合小白,还有学长自己写的,链接如下:学长、廖雪峰、其他一、其他二、其他三(没必要全看,只是有些有时莫名不能访问,所以多列几个)
git大概是个分布式的版本控制系统,感觉写论文或代码的话可能会用到。所谓版本控制,就是一个东西改来改去有很多个版本,然后它会帮你记录各个版本,可以看版本间的不同,还可以回退到各个版本。分布式大概是这些版本就存在自己的电脑上,而不是存在一个中心服务器,当然也可以上传到远程的仓库,比如传到github上(免费的,还开源 ,感觉很厉害)。
使用的话,目前只用到了一些命令(也是命令行吧,长得和cmd挺像),现在是大概知道这些命令到底做了什么。git init 会在当前的目录下初始化一个仓库,大概就是用来存各个版本的地方,是会被隐藏起来的.git文件。git add 会把文件添加到仓库的缓存区,文件也会被追踪起来(不是很懂)。git commit 会把仓库缓存区的文件正式变成仓库里的一个版本,还要跟上版本信息。git push 就是把文件传到远程的仓库上,当然你要先添加一个远程的仓库。还有git status 可以看当前目录下状态,有哪些文件没被追踪,有哪些文件追踪还没存到仓库里,全部存到仓库里的话那工作目录就是干净的(clear)。目前基本这几个就够用了。
c++计算器后续(1)的更多相关文章
- 使用HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
之前发布了一款简易的计算器,今天做了一下修改,添加了键盘监听事件,不用再用鼠标点点点啦 JS代码: var yunSuan = 0;// 运算符号,0-无运算;1-加法;2-减法;3-乘法;4-除法 ...
- c++计算器后续(5)
自娱自乐: 大概是重新开始玩qt,然后MFC和第四步附加的作业大概不会去玩了.以上. QT相关: 阶段一: 原来作业里举了qt和mfc这两个做界面的东西,网上都说qt容易上手,学了mfc再来看qt简直 ...
- c++计算器后续(4)
自娱自乐: 大概是终于做到没做完的部分了,第三步助教学长的评论还没去改,感觉那个把读取文件放到Scan里面比较麻烦,其他大概还好.以上. 文件读写: 先是原来的残留问题,都是和fstream :: o ...
- c++计算器后续(2)
自娱自乐: 大概是了解了一下前缀.中缀.后缀表示法是啥,并没有去深究,比如考虑实现啊,然后Calculation类里面的计算方法还是选用原来的直接对中缀表达式求值,只是把代码改得规范点,以上. 各表示 ...
- c++计算器后续(3)
自娱自乐: 本来只是想改改第二次的代码规范的,然后好像把原来的代码玩坏了,真是尴尬...然后大概是又发现了一些东西.以上. main的参数: 大概是说main函数的括号里是可以带参数的,写成这个样子: ...
- 微信小程序计算器后后续
改的眼睛都要瞎了,总算是知道问题出哪了 最后一段 在等号里面计算输入的数组,这个判断的主要操作是将输入的数据的数组进行数和符号的拆分然后再计算,把数按字符串输入数组,然后将数和符号进行拆分 ,最后通过 ...
- 微信小程序计算器模拟后续
今天按着自己的思路又重打了一遍 wxml没什么说的,就是分块起名,显示数字和结果的作为屏幕,数字键盘一行四块 <view class="onTop"> <view ...
- 【IOS开发笔记03-视图相关】简单计算器的实现
UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...
- Js函数初学者练习(一)switch-case结构实现计算器。
前 言 JRedu 给大家介绍一点JS函数的练习题希望初学者多做一些练习能够更好的掌握JS的函数,以及能够提升大家的逻辑思维.(我也是个渣渣希望路过的大神多提建议或意见) 希望能够对大家有所帮助 ...
随机推荐
- 一文带你入门图像分析,成为AI专家不是梦!
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云AI中心发表于云+社区专栏 腾讯云高级研究员讲述,从成像到图像分析如何入门 文︱冀永楠 "AI来了"邀请到我 ...
- redis系统和通用函数
construct函数: 用来创建一个redis客户端. redis = new Redis(); connect函数:连接到一个redis实例. 参数如下: host:字符串类型 可以使一个HO ...
- weblogic.rjvm.PeerGoneException
并发weblogic异常,报错如下: weblogic.rjvm.PeerGoneException: ; nested exception is: weblogic.utils.net.Socket ...
- Understanding JVM Internals---不得不转载呀
http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/ http://architects.dzone.com/art ...
- tr td 移动变色
jsp <table id="tableList" class="table table-hover"></table> css .t ...
- 验证是否是正整数,是否是mail,是否是正确的身份证
/// <summary> /// 通用验证类 /// </summary> class DataValidate { /// <summary> /// 验证正整 ...
- .net下 本地锁、redis分布式锁、zk分布式锁的实现
为什么要用锁? 大型站点在高并发的情况下,为了保持数据最终一致性就需要用到技术方案来支持.比如:分布式锁.分布式事务.有时候我们在为了保证某一个方法每次只能被一个调用者使用的时候,这时候我们也可以锁来 ...
- JS实现最小生成树之克鲁斯卡尔(Kruskal)算法
克鲁斯卡尔算法打印最小生成树: 构造出所有边的集合 edges,从小到大,依次选出筛选边打印,遇到闭环(形成回路)时跳过. JS代码: //定义邻接矩阵 let Arr2 = [ [0, 10, 65 ...
- winform程序限制只能打开一个进程
有很多方案,先来最傻瓜式的 : static class Program { /// <summary> /// 应用程序的主入口点. ...
- Oracle数据库基本操作(一) —— Oracle数据库体系结构介绍、DDL、DCL、DML
一.Oracle数据库介绍 1.基本介绍 Oracle数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/ ...