这个作业属于哪个课程 | 软件工程(福州大学至诚学院-计算机工程系) |
---|---|
这个作业要求在哪里 | 第一次个人编程作业 |
这个作业的目标 | 记录自己的代码行数,需求分析时间,编码时间;分解需求的思路,分解成多个模块,并阐述为什么这么分,优势在哪,可以附上代码片段;记录不会的知识的学习过程以及修改优化的过程;可以附上资料网站。 |
作业正文 | 第一次个人编程作业 |
其他参考文献 | 无 |
写在前面的话:
说实话,我属实有些不太理解这次作业的要求,如果是字面意思来看,就是写一个汉字表达的小算法,根本不需要老师说的花上五天时间来琢磨,甚至几分钟就可以完成。一向追求完美的我,想着不仅仅如此,以下是我用我所会的一点知识写的代码的总结
对不起,我确实理解错题目的意思了,想的太简单,还那么早提交。大错特错了!
今天(20/02/06)我又花了大半天时间,妄图用我所会的那点点C语言知识去完成这道题,我又大错特错了,C语言没有string! C语言没有string! C语言没有string!下午我又花了两个小时尝试把原有的string改成正常的C语言知识输入字符串。我又失败了。
不能怪别的,是我自己水平太低,没有掌握好知识,现在到用的时候才会现在这样子。加上这几天的准备考研的计划全给打乱了,整天脑子里面都是这么去完成这个作业,精神恍惚,有点神经衰竭。想放松,却也玩不安心,心里头总有这件事放不下。
20/02/06(作业完成进度0%)
C语言:
20/02/05 14:45:
我尝试着先用C语言这一基础编程语言,写了一段可以完美运行的代码。行数:29行,第一次编译时间: 1.59s。后续编译时间0.3s。耗时50分钟完成。其中有一次循环,有一个带参函数的调用。目前实现的功能为完成题目需求的钱包金额以及输出,还添加了一段2月份的收支情况,可以记录2月份的生活开销与收入。
20/02/05(作业完成进度0%)
后续可能会有所补充,至少再尝试写写Java的,python还不太会。
C++:
20/02/07
今天花了一上午的时间向学过c++的同学学习了如何使用C++来写这道题。确实C++可能是最适合来完成这道题的语言了。目前还只是学了几个写这道题的方法,当然在完成这道题后的时间里,我的每日任务就要多一项学习C++了。不为完成作业,也为考研需要,也为自己而学。
代码行数:还在思考如何实现双位数的输入和输出;205行
需求分析时间:2小时还未完成;3小时
编码时间:目前2小时,还未完成;3小时(完成两位数的实现占了一个多小时)
编程要求
请编写一个程序,制作一个简易的中文语言编译器,即使用中文语法进行编程,输入为逐行输入,每行为一个语句,一个语句代变一个操作,满足以下语法要求(括号内代变格式类型,具体参考样例):
变量定义:整数 (变量名) 等于 (数字)
运算(加法):(变量名) 增加 (数字)
运算(减法):(变量名) 减少 (数字)
输出:看看 (变量名) or 看看 “(字符串内容)”
附加要求:
选择:如果 (判断语句) 则 (操作语句) 否则 (操作语句)
若否则后没有任何操作使用(无)来进行填充(参考样例2)。
C++代码及思路
主函数部分将可能出现的汉字归类到一起,使用map函数将其一一对应
接着实现数字与汉字之间的转换,以便于计算加减。
中间则使用自定义函数定义空操作以及操作:符合如果的做操作,不符合做空操作。(例如输入的不是指定的“整数”、“增加”、“减少”等字眼则会提示“无此变量”;再或者满足条件的所有运算也都在这里实现)
(因为这个部分即主要部分,代码太长无法显示全部,具体代码我可以访问我的GitHub仓库:我的Github仓库)
运行结果及样例
样例一:
整数 气温 等于 十
气温 减少 三
气温 增加 二
看看 气温
如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”
输出
九
你好,世界
样例二:
整数 小杨年龄 等于 八
整数 小杨零花钱 等于 二
小杨年龄 增加 一
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
看看 小杨零花钱
输出
三
具体代码
#include<iostream>
#include<map>
#include<math.h>
using namespace std;
map<string,int>num;
map<int,string>R_num;
map<string,int>var;
int judge_num;
string op;
string equ = "等于";
string judge;
string op_var;
string op_var1;
string judg_var;
string judg_var1;
string judg_jump;
string op_var_val;
int change_to_num(string a) //一二三四 转化为 1234
{
int c;
int j=0;
for(int i=a.length()-2;i>=0;i-=2,j++){
string s3(a,i,2);
c+=num[s3]*pow(10,j);
}
return c;
}
string R_change_to_num(int c) //1234 转化为 一二三四
{
string a;
int i = 0;
int b;
for(;b>0;i++)
b = c / pow(10,i);
for(i=i-2;i>=0;i--){
b = int(c / pow(10,i)) % 10;
a += R_num[b];
}
return a;
}
void no_operation()
{
cin>>op;
if(op=="整数"){
cin>>op_var;
cin>>equ;
cin>>op_var_val;
}
else if(op=="看看"){
cin>>op_var;
}
else{
if(var.find(op) == var.end())
cout<<"无此变量";
else{
op_var = op;
cin >> op;
if(op == "增加"){
cin >> op_var1;
}
else if(op == "减少"){
cin >> op_var1;
}
}
}
}
void operation()
{
cin>>op;
if(op=="整数")
{
cin>>op_var;
cin>>equ;
cin>>op_var_val;
var[op_var] = change_to_num(op_var_val);
//cout<<"变量‘"<<op_var<<"’的值是"<<var[op_var]<<endl;//可以输出值
}
else if(op=="看看")
{
cin>>op_var;
/*去除引号 */
if (!var.count(op_var)) {
if (op_var[0] == '"' && op_var[op_var.size()-1] == '"')
cout << op_var.substr(1,op_var.size()-2) << endl;
else if (op_var.substr(0,2) == "“" && op_var.substr(op_var.size()-2,2) == "”")
cout << op_var.substr(2,op_var.size()-4) << endl;
}
//
else
cout<<R_change_to_num(var[op_var])<<endl;
}
else if(op=="如果")
{
cin >> judg_var;
cin >> judge;
if(judge=="等于")
{
cin >> judg_var1;
if(var.find(judg_var1) == var.end())
judge_num = num[judg_var1];
else
judge_num = var[judg_var1];
if(var[judg_var] == judge_num)
{
cin>>judg_jump;
operation();
cin>>judg_jump;
no_operation();
}
else
{
cin>>judg_jump;
no_operation();
cin>>judg_jump;
operation();
}
}
if(judge=="大于")
{
cin >> judg_var1;
if(var.find(judg_var1) == var.end())
judge_num = num[judg_var1];
else
judge_num = var[judg_var1];
if(var[judg_var] > judge_num)
{
cin>>judg_jump;
operation();
cin>>judg_jump;
no_operation();
}
else
{
cin>>judg_jump;
no_operation();
cin>>judg_jump;
operation();
}
}
else if(judge=="小于")
{
cin >> judg_var1;
if(var.find(judg_var1) == var.end())
judge_num = num[judg_var1];
else
judge_num = var[judg_var1];
if(var[judg_var] < judge_num)
{
cin>>judg_jump;
operation();
cin>>judg_jump;
no_operation();
}
else
{
cin>>judg_jump;
no_operation();
cin>>judg_jump;
operation();
}
}
}
else
{
if(var.find(op) == var.end())
cout<<"无此变量";
else
{
op_var = op;
cin >> op;
if(op == "增加")
{
cin >> op_var1;
if(var.find(op_var1) == var.end())
var[op_var] = var[op_var]+num[op_var1];
else
var[op_var] = var[op_var]+var[op_var1];
//cout<<R_num[var[op_var]]<<endl;//可以输出值
}
else if(op == "减少")
{
cin >> op_var1;
if(var.find(op_var1) == var.end())
var[op_var] = var[op_var]-num[op_var1];
else
var[op_var] = var[op_var]-var[op_var1];
//cout<<R_num[var[op_var]]<<endl;//可以输出值
}
}
}
}
int main()
{
num["零"]=0,num["一"]=1,num["二"]=2,num["三"]=3,num["四"]=4,num["五"]=5,
num["六"]=6,num["七"]=7,num["八"]=8,num["九"]=9,num["十"]=10;
R_num[0]="零",R_num[1]="一",R_num[2]="二",R_num[3]="三",R_num[4]="四",
R_num[5]="五",R_num[6]="六",R_num[7]="七",R_num[8]="八",R_num[9]="九",R_num[10]="十";
while(true)
{
operation();
}
return 0;
}
作业过程中遇到的困难:
讲真的,做这份作业的前两天,我整个人的状态就像我写在前言里的话。但是多少还是有些东西学会的,例如学会了GitHub仓库的创建删除以及GitHub Desktop的使用。当然,最重要的还是第三天请教了其他同学,学会了很多关于C++的知识。这份作业对于我来说,应该是属于我和他共同完成的,因为在这之前,我压根没接触过C++,再天才的人,也没法一天学会并写出这样的代码。在他的提点下,我才一步一步的实现了这段程序。
有的人肯定会说,那你这份作业根本不算是自己完成的,你这是在作弊。我想说的是,你所查阅的资料不也是别人的知识吗?但是,如果你能学到其中的知识,并且转换成自己的知识,这才叫做学习,哪怕只有一点,那也是在进步。从第一次创建博客园开始————装扮博客园,这也是让我们去学习,去学着使用。虽然这些后台的装扮代码是别人的,但是如果你能学会修改其中的一部分,使它成为自己的特色博园,那就是你自己东西。张老师也正面回答了,这门课的精髓就是在一边学习,一边完成。虽然这次我求助了其他同学,我也收获了很多,并且这几天抽空在B站学习C++。这次虽然做的不完美,但是下次一定。
参考资料
以下网址为参考过的网址:
[C++map函数的使用方法](https://blog.csdn.net/weixin_43828245/article/details/90214494)
[如何用C++输出汉字](https://bbs.csdn.net/topics/350150464)
我的GitHub
具体代码我可以访问我的GitHub仓库:我的Github仓库