这个作业属于哪个课程 | 2020福大面向对象程序设计 |
这个作业要求在哪里 | <https://www.cnblogs.com/jhy16193335/p/12212380.html> |
这个作业的目标 | 安装C++开发环境,了解编译过程,实现编程,发表博客 |
作业正文 | 问答题,实践题,编程题 |
问答题:
一.如果你不了解C++请回答以下问题:你认为C语言有什么缺陷(你觉得哪里用的不顺手)。
如果你已经了解C++请回答以下问题:你觉得C++和C语言比有什么优点。
不了解C++,C语言缺陷如下:
1.C程序设计是面向过程的,侧重算法与数据结构
2.数组使用过程中容易发生越界现象
3.对于字符串数据的处理繁杂,缓冲区的数据输入处理麻烦
二.查阅相关资料,简述一下C语言/C++的编译过程。
1.预处理
- 展开宏定义并删除#define语句
- 处理条件编译指令 如#if
- 处理#include
- 输出注释语句
- 添加行号和文件名标识
2.编译阶段
编译阶段,编译阶段时整个过程中比较复杂的部分,编译器会将预处理之后的文件的内容,经过词法分析,得到所需要的Tokens,然后作对于的语法解析,语义解析,最后产生 .s结尾的汇编文件。
3.汇编阶段
4.连接阶段
实践题
1.查看自己的c++编译器版本
打开vs,点击工具-命令行-开发者命令提示,弹出窗口后输入“cl.exe"即可
2.使用命令行编译一份C语言/C++代码。
启动命令行窗口,win+R,输入cmd
应用指令cd(打开),输入所要示例程序的程序地址进入文件,执行文件
编程题
题目描述
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
1.思考题目
- 将其拆分成几块相对独立的模块,将输入函数,处理函数,输出结果函数置于主函数中
- 思考如何将数据进行恰当处理转换
- 字符串以及金额sum,判断标志flag统一使用全局变量,便于调用
2.输入函数模块
- l 由于本体输入的数据为汉字,采用C语言函数库自带的gets函数进行输入
3.处理函数模块
- l 对首行输入语句“整数 钱包 等于 X”进行处理,首先明确此处的X初始值可能不为示例中所给的"0"也就是存在多种可能的取值情况,所以对其进行以下处理以便得到钱包里金额”sum”的初始值.之所以采用”return”的方式进行赋值是因为一旦检测到符合条件的数据直接返回而不必继续判断
int chushizhi() { if (strcmp("整数 钱包 等于 零",qianbao)==0) return 0; if (strcmp("整数 钱包 等于 一",qianbao)==0) return 1; if (strcmp("整数 钱包 等于 二",qianbao)==0) return 2; if (strcmp("整数 钱包 等于 三",qianbao)==0) return 3; if (strcmp("整数 钱包 等于 四",qianbao)==0) return 4; if (strcmp("整数 钱包 等于 五",qianbao)==0) return 5; if (strcmp("整数 钱包 等于 六",qianbao)==0) return 6; if (strcmp("整数 钱包 等于 七",qianbao)==0) return 7; if (strcmp("整数 钱包 等于 八",qianbao)==0) return 8; if (strcmp("整数 钱包 等于 九",qianbao)==0) return 9; if (strcmp("整数 钱包 等于 十",qianbao)==0) return 10; }
- 接下来对”钱包 增加/减少 X”进行处理,由于这类语句可能出现多次,所以采用while语句,并且设置终止条件,当输入”看看 钱包”时不再循环.钱包增加或减少,在这里我继续统一采用暴力枚举.
int add() { if (strcmp("看看 钱包",qianbao)==0) flag = 0; else { if (strcmp("钱包 增加 零",qianbao)==0) sum +=0; if (strcmp("钱包 增加 一",qianbao)==0) sum += 1; if (strcmp("钱包 增加 二",qianbao)==0) sum += 2; if (strcmp("钱包 增加 三",qianbao)==0) sum += 3; if (strcmp("钱包 增加 四",qianbao)==0) sum += 4; if (strcmp("钱包 增加 五",qianbao)==0) sum += 5; if (strcmp("钱包 增加 六",qianbao)==0) sum += 6; if (strcmp("钱包 增加 七",qianbao)==0) sum += 7; if (strcmp("钱包 增加 八",qianbao)==0) sum += 8; if (strcmp("钱包 增加 九",qianbao)==0) sum += 9; if (strcmp("钱包 增加 十",qianbao)==0) sum += 10; if (strcmp("钱包 减少 零",qianbao)==0) sum -= 0; if (strcmp("钱包 减少 一",qianbao)==0) sum -= 1; if (strcmp("钱包 减少 二",qianbao)==0) sum -= 2; if (strcmp("钱包 减少 三",qianbao)==0) sum -= 3; if (strcmp("钱包 减少 四",qianbao)==0) sum -= 4; if (strcmp("钱包 减少 五",qianbao)==0) sum -= 5; if (strcmp("钱包 减少 六",qianbao)==0) sum -= 6; if (strcmp("钱包 减少 七",qianbao)==0) sum -= 7; if (strcmp("钱包 减少 八",qianbao)==0) sum -= 8; if (strcmp("钱包 减少 九",qianbao)==0) sum -= 9; if (strcmp("钱包 减少 十",qianbao)==0) sum -= 10; flag = 1; } return (flag); }
4.结果输出函数模块
在得到最终结果sum的值后,我首先思考的是将其分为>10以及<=10两块(原先还想讨论值<0以后的两种情况,但是考虑到实际意义,钱包里的金额是不会出现负数的)
- l <=10的情况较为简单,代码如下
else { switch(sum) { case 0 :printf("零");break; case 1 :printf("一");break; case 2 :printf("二");break; case 3 :printf("三");break; case 4 :printf("四");break; case 5 :printf("五");break; case 6 :printf("六");break; case 7 :printf("七");break; case 8 :printf("八");break; case 9 :printf("九");break; } }
- >10的情况下,考虑将sum进行拆分,得到它的位数以及各位上的值
①采用switch语句对各位上值的多种情况进行输出
②输出值的对应中文后,输出其位数对应的计量单位,在这里我简化了情况,只考虑到五位数,依然利用switch语句
③特殊情况,个位上的值为0,此时不输出.
int len,a[5],i; if (sum>10) { for (i = 0;sum!=0;i++) { a[i] = sum % 10; sum /= 10; } len = i; for (i = len-1;i>=0;i--) { if (i==0&&a[i]==0) break; else { switch (a[i]) { case 0 :printf("零");break; case 1 :printf("一");break; case 2 :printf("二");break; case 3 :printf("三");break; case 4 :printf("四");break; case 5 :printf("五");break; case 6 :printf("六");break; case 7 :printf("七");break; case 8 :printf("八");break; case 9 :printf("九");break; } switch (i) { case 4 :printf("万");break; case 3 :printf("千");break; case 2 :printf("百");break; case 1 :printf("十");break; } } } }
5.完整代码如下
#include<stdio.h> #include<string.h> int sum,flag = 1; char qianbao[20]; int chushizhi() { if (strcmp("整数 钱包 等于 零",qianbao)==0) return 0; if (strcmp("整数 钱包 等于 一",qianbao)==0) return 1; if (strcmp("整数 钱包 等于 二",qianbao)==0) return 2; if (strcmp("整数 钱包 等于 三",qianbao)==0) return 3; if (strcmp("整数 钱包 等于 四",qianbao)==0) return 4; if (strcmp("整数 钱包 等于 五",qianbao)==0) return 5; if (strcmp("整数 钱包 等于 六",qianbao)==0) return 6; if (strcmp("整数 钱包 等于 七",qianbao)==0) return 7; if (strcmp("整数 钱包 等于 八",qianbao)==0) return 8; if (strcmp("整数 钱包 等于 九",qianbao)==0) return 9; if (strcmp("整数 钱包 等于 十",qianbao)==0) return 10; } int add() { if (strcmp("看看 钱包",qianbao)==0) flag = 0; else { if (strcmp("钱包 增加 零",qianbao)==0) sum +=0; if (strcmp("钱包 增加 一",qianbao)==0) sum += 1; if (strcmp("钱包 增加 二",qianbao)==0) sum += 2; if (strcmp("钱包 增加 三",qianbao)==0) sum += 3; if (strcmp("钱包 增加 四",qianbao)==0) sum += 4; if (strcmp("钱包 增加 五",qianbao)==0) sum += 5; if (strcmp("钱包 增加 六",qianbao)==0) sum += 6; if (strcmp("钱包 增加 七",qianbao)==0) sum += 7; if (strcmp("钱包 增加 八",qianbao)==0) sum += 8; if (strcmp("钱包 增加 九",qianbao)==0) sum += 9; if (strcmp("钱包 增加 十",qianbao)==0) sum += 10; if (strcmp("钱包 减少 零",qianbao)==0) sum -= 0; if (strcmp("钱包 减少 一",qianbao)==0) sum -= 1; if (strcmp("钱包 减少 二",qianbao)==0) sum -= 2; if (strcmp("钱包 减少 三",qianbao)==0) sum -= 3; if (strcmp("钱包 减少 四",qianbao)==0) sum -= 4; if (strcmp("钱包 减少 五",qianbao)==0) sum -= 5; if (strcmp("钱包 减少 六",qianbao)==0) sum -= 6; if (strcmp("钱包 减少 七",qianbao)==0) sum -= 7; if (strcmp("钱包 减少 八",qianbao)==0) sum -= 8; if (strcmp("钱包 减少 九",qianbao)==0) sum -= 9; if (strcmp("钱包 减少 十",qianbao)==0) sum -= 10; flag = 1; } return (flag); } void shuchu() { int len,a[5],i; if (sum>10) { for (i = 0;sum!=0;i++) { a[i] = sum % 10; sum /= 10; } len = i; for (i = len-1;i>=0;i--) { if (i==0&&a[i]==0) break; else { switch (a[i]) { case 0 :printf("零");break; case 1 :printf("一");break; case 2 :printf("二");break; case 3 :printf("三");break; case 4 :printf("四");break; case 5 :printf("五");break; case 6 :printf("六");break; case 7 :printf("七");break; case 8 :printf("八");break; case 9 :printf("九");break; } switch (i) { case 4 :printf("万");break; case 3 :printf("千");break; case 2 :printf("百");break; case 1 :printf("十");break; } } } } else { switch(sum) { case 0 :printf("零");break; case 1 :printf("一");break; case 2 :printf("二");break; case 3 :printf("三");break; case 4 :printf("四");break; case 5 :printf("五");break; case 6 :printf("六");break; case 7 :printf("七");break; case 8 :printf("八");break; case 9 :printf("九");break; } } } int main() { gets(qianbao); sum = chushizhi(); while (flag) { gets(qianbao); add(); } shuchu(); }
6.程序的不足
- 采用暴力枚举法,较为繁杂
- 如果钱包中增加/减少的金额并不是”零一二三四五六七八九十”这类特殊的数据,就无法进行处理,不知道该怎么对语句进行拆分(原先有考虑过使用strlen函数进行测量,但发现,一个中文字符占据两个长度,不知该如何进行处理)