面向对象程序设计寒假作业2

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

这个作业属于哪个课程|2020年面向对象程序设计
-|-|-
这个作业要求在哪里|面向对象设计寒假作业2
这个作业的目标|继续完成编程题,新建一个github仓库,并把作业推送到该仓库,发布博客
参考文献|github怎么创建代码仓库
---|怎么通过git登录以及上传代码怎么上传代码到github仓库
---|解决--系统上禁止运行脚本
---|windows批处理常用命令
---|关于解决编译生成的应用程序闪退问题解决
---|freopen函数用法
实践题:
不得不说百度真是个好东西,尤其是在解决没接触的这玩意,就建立github仓库而言本身难度
不大只需要去Repositories点击New便可建立空仓库,关键是如何把代码及其所属文件上传下载
git后按照搜索得到的提示上传相关文件即可,坑点就来了有的网站并没有提示登陆的操作当误
认输入仓库地址后就认为已经登陆便可以在自己文件建立空仓库时GitBash就会提示并没有登
所以选择好参考网站就可以减少键盘的损坏度,登陆后按照网站提示便可以上传文件到空仓库


编程题:
main.cpp函数部分定义了大部分所需要的函数以及函数的调用,sums初钱包钱数,在
gaibian函数则用于对钱包数变化进行计算,sumfenlei函数则是根据sum最后的大小进行文字输出判断。


#include <stdio.h>
#include <string.h>
int sum = 0,witness,first,second,count, f;
int main(void)
{
    int how(char how[20]);
    void sumfenlei(int sum);
    int originalsum(void);
    int gaibian(int sums);
   sum=originalsum();
   sum =gaibian(sum);
    sumfenlei(sum);
}

originalsum函数作用和它的英译汉意思相当计算钱包初始钱数需要先对输入的初始钱数进行判断小于十时直接调用sums函数,大于十小于二十一以及整十的数先判断是介于十到二十的数还是整十的数,是介于十到二十的数调用sums函数提取第二个汉字数字后运用sums函数转换成阿拉伯数字再进行加十处理,对于大于二十且非整十数字即字节数为六的汉字串提取首尾数字运用转换函数sums转换后进一步操作得到初始值。


int originalsum(void)
{
    int sum, count, f;
    int numberchange(int num);
	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 && strcmp(d, "零") != 0)sum =sums(d[0]);
    else sum = 0;
    return sum;
}

numberchange则是对对输入的汉字转换成数字,利用汉字存储ascii码判断
由于六和零存储的ascii码在第一位相同均为-63,首先便在oringinalsum
函数进行排除零由于输入零尽可能出现在单个汉字“零”,利用strcmp便
可排除,毕竟没人会输入三十零

int numberchange(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;
    if (num == -54)return 10;
    return 11;
}

how函数通过获取整个字符串用于判断钱的变化方式。

int how(char how[20])
{
    if (strcmp(how, "减少") == 0)return 0;
    if(strcmp(how,"增加")==0)return 1;
    return 2;
}

针对最后的钱数进行输出,需要在sumfenlei函数作用下控制输出。


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("十");
}

gaibian函数用于计算钱数的变化,该函数作用时需要借助sums
转换输入的汉字。


int gaibian(int sumsh)
{
    int witness;
    int how(char how[20]);
    int sums(int num);
    char a[20], b[20], c[20], d[20];
    while (1)
    {
        scanf("%s ", a);
        if (strcmp(a, "看看") == 0)break;
        scanf("%s %s", b, c);
        witness = how(b);
        if (witness==1&&strcmp(b,"零")!=0)sumsh+= sums(c[0]);
        if(witness==0&& strcmp(b, "零") != 0) sumsh-= sums(c[0]);
    }
    return sumsh;
}

由于最后钱数需要转换成汉字输出,存在小于十的数直接利用change函数输出
介于十和二十的数先输出汉字十后利用change函数对个位上的数字利用change
函数控制输出,对于整十函数则对十位上的数字利用函数转换后直接再输出汉
字十。


void sumfenlei(int sum)
{
    int first,second;
    void change(int number);
    if (sum <= 10)change(sum);
    if (sum >= 20){
        second = sum % 10;
        first = (sum / 10) % 10;
        if(second!=0){
        change(first);
        printf("十");
        change(second);}
        else {change(first);printf("十");}}
    if (sum > 10 && sum < 20){
        printf("十");
        second = sum % 10;
        change(second);}
}

运行结果:

<font face="黑体 size=6>脚本部分:
编译脚本部分起初还以为这玩意上网查就有了,结果还是自己动手写的,起初用
windowspowershell,后来还是用的windows批处理,不过写出来的脚本并不会运行
查询之后得知需要利用powershell输入get-executionpolicy查看运行脚本权限再
输入set-executionpolicy remotesigned来修改脚本运行权限。
利用如下脚本可以生成exe,前提是一定存在源程序,在对添加判断是否存在源程
序会出现闪现然后不会出现编译结束等词语,即使在源程序添加system("pause")
后也不能出现编译结束等词语,索性就不判断。

@echo off
title Traveller
    echo Witnessthebreakfrom2002编译开始
    cl 函数集合体.cpp
    echo Hubble Telescope编译结束
pause

运行结果:

参考其他同学的作业后才知道怎么去测试,需要对程序中有返回值的函数作用进行判
断,有输出的函数可以直接根据输出结果进行判断函数是否发挥作用,则只需对sums
和how函数进行测试便可,感谢大佬拯救。
由于运行脚本存在闪现调用system("pause")解决,测试代码如下:


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int num=0; 
	char hows[20],what[20];
	int how(char how[20]); 
	int whats(char how[20]);
	strcpy(hows,"减少"); 
	strcpy(what,"增加"); 
	if(!how(hows))num++;
	if(!whats(what))num++;
	if(num==2)printf("测试正常");
	else printf("测试异常"); 
	system("pause");
	return 0;
}
int how(char how[20])
{
    if (strcmp(how, "减少") == 0)return 0;
    else return 1; 
}
int whats(char how[20])
{
    if (strcmp(how, "增加") == 0)return 0;
    else return 1; 
}

脚本如下:


@echo off
title how函数测试脚本
call Thow.exe
pause

还是call用的香直接跳出运行界面,用start跳出两个窗口。
加个pause保险防止运行后不出现结果就迅速关闭,运行结果如下:

增加how测试异常即输入不规范,不按照增加或减少输入将测试how的
strcmp(how,"增加")改成strcmp(how,"增大");即可
也亏有测试异常才发现原函数在输入增大,减小等不规范词语均当增加处理得以及时
更改how函数代码。
对于how函数仅需要对汉字减少和增加在这一函数模块中是否发挥作用,而sums函数
测试就比较麻烦,代码如下:

#include<stdio.h>
#include<stdlib.h>
int sum_test=0;
int main()
{
	void judge_test();
	int sums(int num);
	judge_test();
	if(sum_test==10)printf("测试正常");
	else printf("测试异常");
	system("pause");
	return 0;
}
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;
    if (num == -54)return 10;
    return 11;
}
void judge_test()
{
	int judge_result(int num,int number2);
	judge_result(sums(-63),-63);
	judge_result(sums(-46),-46);
	judge_result(sums(-74),-74);
	judge_result(sums(-56),-56);
	judge_result(sums(-53),-53);
	judge_result(sums(-50),-50);
	judge_result(sums(-58),-58);
	judge_result(sums(-80),-80);
	judge_result(sums(-66),-66);
	judge_result(sums(-54),-54);
}
int judge_result(int num,int number2)
{
	if(number2==-63&&num==6)sum_test++;
	if(number2==-46&&num==1)sum_test++;
	if(number2==-74&&num==2)sum_test++;
	if(number2==-56&&num==3)sum_test++;
	if(number2==-53&&num==4)sum_test++;
	if(number2==-50&&num==5)sum_test++;
	if(number2==-58&&num==7)sum_test++;
	if(number2==-80&&num==8)sum_test++;
	if(number2==-66&&num==9)sum_test++;
	if(number2==-54&&num==10)sum_test++;
}

脚本如下:

@echo off
title 钱包初始数字测试脚本
call Tsums.exe
pause

运行结果如下:

通过命令行读取文件后将文件内容充当输入的内容,运用到freopen("文件绝对或者相对路径","r",stdin)
r代表只读,接下来的程序中的scanf均输入txt中的内容,遇到回车键停止,文件结束时停止。
总代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int sum = 0,witness,first,second,count, f;
int main()
{
    int how(char how[20]);
    void sumfenlei(int sum);
    int originalsum(void);
    int gaibian(int sums);
    freopen("C:\\Running\\diamond.txt","r",stdin);
   sum=originalsum();
   sum =gaibian(sum);
    sumfenlei(sum);
    system("pause");
    return 0;
}
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;
    if (num == -54)return 10;
    return 11;
}
void sumfenlei(int sum)
{
    int first,second;
    void change(int number);
    if (sum <= 10)change(sum);
    if (sum >= 20){
        second = sum % 10;
        first = (sum / 10) % 10;
       if(second!=0){
        change(first);
        printf("十");
        change(second);}
        else {change(first);printf("十");}}
    if (sum > 10 && sum < 20){
        printf("十");
        second = sum % 10;
        change(second);}
}
int originalsum(void)
{
    int sum, count, f;
    int sums(int num);
	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 && strcmp(d, "零") != 0)sum = sums(d[0]);
    return sum;
}
int how(char how[20])
{
    if (strcmp(how, "减少") == 0)return 0;
    if (strcmp(how, "增加") == 0)return 1;
    return 2;
}
int gaibian(int sumsh)
{
    int witness;
    int how(char how[20]);
    int sums(int num);
    char a[20], b[20], c[20], d[20];
    while (1)
    {
        scanf("%s ", a);
        if (strcmp(a, "看看") == 0)break;
        scanf("%s %s", b, c);
        witness = how(b);
        if (witness==1&&strcmp(b,"零")!=0)sumsh+= sums(c[0]);
        if(witness==0&& strcmp(b, "零") != 0) sumsh-= sums(c[0]);
    }
    return sumsh;
}
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("十");
}

system("pause")用于防止编译脚本运行时不显示相应的编译开始和编译结束等提示词,
由于添加验证编译的对象程序使得脚本运行时不出现相应的提示词于是并没有添加。
运行结果如下:

对应的文本内容为

整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包

运行结果之二如下:

对应的文本内容为:

整数 钱包 等于 二十
钱包 增加 四
钱包 减少 三
看看 钱包

开始时没有注意到文件路径输入格式的错误,直接输入C:\Running\diamond.txt,导致编译错误
更改后就变成了stdafx头文件不存在,后发现不借助stdafx也能完成对文件内容的输入。

posted @ 2020-02-04 10:51  Pekkanight  阅读(236)  评论(0)    收藏  举报