面向对象程序设计寒假第一次作业

面向对象程序设计第一次作业

这个作业属于哪个课程|2020年面向对象程序设计
-|-|-
这个作业要求在哪里|面向对象设计寒假作业1
这个作业的目标|安装c++开发环境,完成问答题,实践题以及编程题,并发布博客。
参考文献|《C程序设计》
-----|c语言汉字读取
-----|命令行使用
-----|汉字与Ascii码转换器
-----|c语言编译过程
-----|c语言指针概念

问答题:
如果你不了解C++请回答以下问题:你认为C语言有什么缺陷(你觉得哪里用的不顺手)。
一.指针,作为一名大学才接触计算机编程练打字都要看键盘的字母的小白,个人觉得c语言指针部分用得比较不太顺手,相对其它章节概念比较抽象,在一次pta平台作业中基本均涉及指针的情况下便运用数组解决问题,在其中相关要求构建螺旋方阵可以直接运用二维数组知识解决实际问题,当然对于代码小白想要运用指针来解决螺旋方阵我自己觉得上机考试要考这玩意首先想到的就是二维数组,还有连连看问题根据题目所述还是二维数组比较方便,虽然指针更便捷还是c语言的特色,运用还是取决于个人,个人觉得指针用来指向二维数组比较麻烦,直接用来取一维指针值而在用于处理二维数组中需要在(f+x)+y(假定f就是指向二维数组的指针,y,x均为常数)此时仅获得该元素的地址需要在加上*获取值,就简洁度而言还是二维数组比较吃香,体现在构建函数时需要输入的形式参数的值是地址(因为自己老是输入值引起运行结果与例子不符合debug半天才发现是地址的锅)总是令我难受地去寻找error(绝大部分原因还是菜(滑稽doge))。
二.递归,联想到这玩意基本就想到汉诺塔的应用,递归用途多可以应用于斐波那契列数列,爬楼梯经典问题。![]

编译:
c程序设计一书提及为解决低级语言不普遍发明高级语言贴近人类语法习惯,由于机器无法直接识别高级语言需要编译软件进行编译,编译就是将高级语言转换成汇编语言在转换为二进制的机器语言符合机器识别的机器指令,过程中涉及字符替换,删除无用注释,添加文件标示和行号,读取C语言源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理,生成可执行应用程序。

实践题:
实践题中不熟悉win+r的方式输入cmd打开DOS面板,多次在未输入cd的前提条件下输入文件路径导致无法查看gcc版本,以及需要将记事本中写的源程序文件转换为exe格式,以及输入路径后直接访问c程序时出现错误需要访问exe文件,以及64位windows不支持16位条件下的exe文件导致无法运行所属文件,主要问题应该是直接打开与cpp文件伴随生成的exe相关,着实无法解决在64位Windows系统下生成的可执行程序无法在64位Windows环境下运行,以及未在高级环境变量中构建c运行的环境导致源程序在cmd面板中不能转换为相应的exe,应是在此电脑下构建相应的Path环境系统变量插入对应的文件路径,未构建相应的include,lib变量,以及构建完环境后无法执行程序存在无法将源程序转换为exe可执行程序导致无法运行(在未添加Path系统变量,lib,include变量),以及与百度经验上所提到Windows默认生成a.exe相悖仍然生成与c源程序相同名的可执行程序。



编程题:
编程要求:编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
经过查阅知道由汉字可以是两个ascii码组成,而字符仅占一字节与一ascii码所占据空间等价,将汉字转换为字符数组进行储存调取相关有用字符数组中的几个便可知道进行什么操作,先创建4个字符数组针对题目要求,开辟空间足够大容纳汉字,后对第一行字符数组16,17,第二三行字符数组6,7,8,9,11,12重点关注,提取ascii码,与字母,数字对应的acsii码可能进行加减后再进行转换尚且可以有效换算出结果不同此时得到的ascii码并没有太多用处,对于处理汉字的ascii码不大好使,而且经过初步在Devc++上针对汉字“一”的转换得到“-46 -49”后放到网页版ascii码转换器进行转换后得到结果不同。

参考C程序设计数组章节内容strcmp函数用法,字符串比较的规则是将两个字符串自左向右逐个相比,若两字符串相等则函数值为0,其余为正反数,则只需看看输入字符串与“钱包 增加 四”“此类的函数值是否为0即可(总计40种)考虑到一次性判断整个字符串存在不能找到程序停止的指令,故需要对第一行表明钱包的初始钱数单独考虑,后面输入由于涉及何时停止程序,把第一个输入内容独立出来考虑对输入的字符串是否是“看看”是的话终止交易,不是继续运行,针对计算符号和数字单独分析。
第一阶段代码部分如下:


#include <stdio.h>
#include <string.h>
int main(void)
{
	int sumcomputer(char num[20]);
	int how(char how[20]);
	void change(int number);
	int sum,witness,first,second;
	char a[20],b[20],c[20],d[20];
	scanf("%s %s %s %s",a,b,c,d);
	sum=sumcomputer(d);
    while(1)
	{
		scanf("%s ",a);
		if(strcmp(a,"看看")==0)break;
		scanf("%s %s",b,c); 
		witness=how(b);
		if(witness)sum+=sumcomputer(c);
		else sum-=sumcomputer(c);
	}
	if(sum<=10)change(sum);
	else if(sum>99)printf("但凡有一粒头孢"); 
	else 
	{
		second=sum%10;
		first=(sum/10)%10;
		change(first);
		printf("十");
		change(second); 
	}
}
int sumcomputer(char num[20])
{
	if(strcmp(num,"零")==0)return 0; 
	else if(strcmp(num,"一")==0)return 1;
	else if(strcmp(num,"二")==0)return 2; 
	else if(strcmp(num,"三")==0)return 3; 
	else if(strcmp(num,"四")==0)return 4; 
	else if(strcmp(num,"五")==0)return 5; 
	else if(strcmp(num,"六")==0)return 6; 
	else if(strcmp(num,"七")==0)return 7; 
	else if(strcmp(num,"八")==0)return 8; 
	else if(strcmp(num,"九")==0)return 9; 
	else if(strcmp(num,"十")==0)return 10;  
}
void change(int number)
{
	if(number==0)printf("零");
	else if(number==1)printf("一"); 
	else if(number==2)printf("二"); 
	else if(number==3)printf("三"); 
	else if(number==4)printf("四"); 
	else if(number==5)printf("五"); 
	else if(number==6)printf("六"); 
	else if(number==7)printf("七"); 
	else if(number==8)printf("八"); 
	else if(number==9)printf("九"); 
	else if(number==10)printf("十"); 
}
int how(char how[20])
{
	if(strcmp(how,"减少")==0)return 0;
	else return 1; 
}

其中how函数用于判断所需要进行的操作,change函数用于控制输出,sumcomputer函数用于计算sum的值用于输出结果。
实践结果:



不过当输入的值大于十时无法得到sum的值,可以通过判断输入的汉字提取首尾,可以通过计算输入函数的字节进而判断输入汉字的个数,将输入的汉字转换成三个档位进行判断用ascii码进行判断大于10的数,此时又得用到前面提及的汉字数字ascii码;

第二阶段代码部分如下:


#include <stdio.h>
#include <string.h>
int main(void)
{
	int sumcomputer(char num[20]);
	int how(char how[20]);
	int sums(int num);
	void change(int number);
	int sum,witness,first,second,count,f;
	char a[20],b[20],c[20],d[20];
	scanf("%s %s %s %s",a,b,c,d);
	count=strlen(d);
	if(count==4)
	{
		f=d[0];
		sum=sums(f)*10;
	}
	if(count==6)
	{
		f=d[0];
		sum=sums(f)*10;
		f=d[4];
		sum+=sums(f);
	}
	if(count==2)sum=sumcomputer(d);
    while(1)
	{
		scanf("%s ",a);
		if(strcmp(a,"看看")==0)break;
		scanf("%s %s",b,c); 
		witness=how(b);
		if(witness)sum+=sumcomputer(c);
		else sum-=sumcomputer(c);
	}
	if(sum<=10)change(sum);
	else if(sum>99)printf("但凡有一粒头孢"); 
	else 
	{
		second=sum%10;
		first=(sum/10)%10;
		change(first);
		printf("十");
		change(second); 
	}
}
int sumcomputer(char num[20])
{
	if(strcmp(num,"零")==0)return 0; 
	else if(strcmp(num,"一")==0)return 1;
	else if(strcmp(num,"二")==0)return 2; 
	else if(strcmp(num,"三")==0)return 3; 
	else if(strcmp(num,"四")==0)return 4; 
	else if(strcmp(num,"五")==0)return 5; 
	else if(strcmp(num,"六")==0)return 6; 
	else if(strcmp(num,"七")==0)return 7; 
	else if(strcmp(num,"八")==0)return 8; 
	else if(strcmp(num,"九")==0)return 9; 
	else if(strcmp(num,"十")==0)return 10;  
}
void change(int number)
{
	if(number==0)printf("零");
	else if(number==1)printf("一"); 
	else if(number==2)printf("二"); 
	else if(number==3)printf("三"); 
	else if(number==4)printf("四"); 
	else if(number==5)printf("五"); 
	else if(number==6)printf("六"); 
	else if(number==7)printf("七"); 
	else if(number==8)printf("八"); 
	else if(number==9)printf("九"); 
	else if(number==10)printf("十"); 
}
int how(char how[20])
{
	if(strcmp(how,"减少")==0)return 0;
	else return 1; 
}
int sums(int num)
{
	if(num==-46)return 1;
	if(num==-74)return 2;
	if(num==-56)return 3;
	if(num==-53)return 4;
	if(num==-50)return 5;
	if(num==-63)return 6;
	if(num==-58)return 7;
	if(num==-80)return 8;
	if(num==-66)return 9;
}


不过对于介于十和二十之间的数得看输入方式,按照一十九输入可以得到正确答案

要是按照十九输入就得更改核心内容将判断四个字节的汉字第一个字首先进行判断是否是十是的话直接对第二个汉字进行处理,增加num-54的判断(当值为十时输出结果为-54 -82);
仅需加上对介于10和20的独立输出即可
增加if(sum>10&&sum<20)
{
printf("十");
second=sum%10;
change(second);
}
以及在change函数中加上if(num
-54)return 10;
在count4(即输入格式为十九,十八,十七此类)判断部分更改为 if(f!=-54)sum=sums(f)*10;
if(f
-54)sum=10+sums(d[2]);

经过修改后认为对于输入小于十一的汉字数字均可以列入用ascii码判断数字,可直接省去在初始值小于11单独讨论代码,最终思路(前提是输入11·19格式是十九)先分析输入汉字的字节数输入汉字字节数为6时通过汉字数字的ascii码提取十左右两侧的数字进而获得初始钱数,输入汉字字节数为2时直接根据汉字数字ascii码转换成初始钱数,输入汉字数为4时先提取第一个汉字的ascii码判断是否是汉字十进而根据是来转换第二个汉字,否直接提取第一个汉字使用。
最终代码如下:

#include <stdio.h>
#include <string.h>
int main(void)
{
	int how(char how[20]);
	int sums(int num);
	void change(int number);
	int sum,witness,first,second,count,f;
	char a[20],b[20],c[20],d[20];
	scanf("%s %s %s %s",a,b,c,d);
	count=strlen(d);
	if(count==4)
	{
		f=d[0];
		if(f!=-54)sum=sums(f)*10;
		if(f==-54)sum=10+sums(d[2]);
	}
	if(count==6)
	{
		f=d[0];
		sum=sums(f)*10;
		f=d[4];
		sum+=sums(f);
	}
	if(count==2)sum=sums(d[0]);
    while(1)
	{
		scanf("%s ",a);
		if(strcmp(a,"看看")==0)break;
		scanf("%s %s",b,c); 
		witness=how(b);
		if(witness)sum+=sums(c[0]);
		else sum-=sums(c[0]);
	}
	if(sum<=10)change(sum);
	if(sum>99)printf("但凡有一粒头孢"); 
	if(sum>=20)
	{
		second=sum%10;
		first=(sum/10)%10;
		change(first);
		printf("十");
		change(second); 
	}
	if(sum>10&&sum<20)
	{
		printf("十");
		second=sum%10;
		change(second); 
	}
}
void change(int number)
{
	if(number==0)printf("零");
	else if(number==1)printf("一"); 
	else if(number==2)printf("二"); 
	else if(number==3)printf("三"); 
	else if(number==4)printf("四"); 
	else if(number==5)printf("五"); 
	else if(number==6)printf("六"); 
	else if(number==7)printf("七"); 
	else if(number==8)printf("八"); 
	else if(number==9)printf("九"); 
	else if(number==10)printf("十"); 
}
int how(char how[20])
{
	if(strcmp(how,"减少")==0)return 0;
	else return 1; 
}
int sums(int num)
{
	if(num==-63)return 0;
	if(num==-46)return 1;
	if(num==-74)return 2;
	if(num==-56)return 3;
	if(num==-53)return 4;
	if(num==-50)return 5;
	if(num==-63)return 6;
	if(num==-58)return 7;
	if(num==-80)return 8;
	if(num==-66)return 9;
	if(num==-54)return 10;
}
原文地址:https://www.cnblogs.com/pekkasuper/p/12220589.html