当前位置: 首页 > news >正文

程序设计第二次作业1

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

Github 链接:https://github.com/Wasdns/object-oriented

题目:

885822-20160125224152270-1428234272.png

<1>第一次尝试

我立马认识到这是典型的a+b题目,这里我注意到了第一个点:-1000000<=a,b<=1000000 但是令我困惑的是,在编写过程中好像并没有什么作用。

代码:

#include<stdio.h>

int main()

{

int a,b,c,m=0,n=0;

scanf("%d %d",&a,&b);

c=a+b;

printf("%d\n",c);

return 0;

}

评测结果:

885822-20160125224559723-1226640398.png

小结:

第一次审题总是漏洞百出,大概是受之前的题目影响,把前面一大段非常有用的题目提示忽略掉了,这次我找出了题目中非常关键的一点:"that is,the digits must be separated into groups of three by commas(unless there are less than four digits)."

审题粗心和不严谨拿到题目没有认真审题是一件非常令我惋惜的错误。

<2>第二次尝试

有了第一次尝试的教训以后,我注意到题目的要求,并做出了如下改正。

代码 1:

#include<stdio.h>
int main()
{
    int a,b,c,m=0,n=0;
    scanf("%d %d",&a,&b);
    c=a+b;
        m=c/1000;
    n=c/1000000;
    if(m==0&&n==0)
    printf("%d\n",c);
    else if(m!=0&&n==0)
    printf("%d,%d\n",m,c%1000);
    else if(m!=0&&n!=0)
    printf("%d,%d,%d\n",n,(c%1000000)/1000,c%1000);
        
    return 0;
}

评测结果:

885822-20160126192703660-1475584082.png

小结:

有了第一次的尝试,我进行了重复的审题,掌握了大致的题意,类似银行支票上的数字,超过一千的类似九千九百九十九需要写成9,999,而超过一百万的数字例如九百九十九万需要写成9,990,000。但是在评测过程中仍然出现了错误。

代入我的几个测试数据,我发现出现了如下情况:
885822-20160126193231988-580500508.png

很明显,在代码行:

m=c/1000;
n=c/1000000;

处,m与n的符号并没有发生改变,也就是说,如果输入的是-1000000和9,输出结果是-999,-991。

我此时想到了该题的大致思路:

想法1:c是a与b的和,先将n记录c绝对值的百万位及以上的位数,m记录c绝对值的万位及以上的位数。输出的时候依据m与n是否等于0判断c的大小。

于是我进行了如下修改。

代码 2:

#include<stdio.h>
int main()
{
    int a,b,c,m=0,n=0;
    scanf("%d %d",&a,&b);
    c=a+b;
        m=c/1000;
    n=c/1000000;
    if(c<0)
    {
        c=-c;
        printf("-");    
    }
    
    if(m==0&&n==0)
    printf("%d\n",c);
    else if(m!=0&&n==0)
    printf("%d,%d\n",m,c%1000);
    else if(m!=0&&n!=0)
    printf("%d,%d,%d\n",n,(c%1000000)/1000,c%1000);
        
    return 0;
}

评测结果:

885822-20160126194325348-2138302344.png

小结:

我输入样例:
885822-20160126194624004-1045426046.png
发现样例是错误的。问题在哪里呢?

再一次输入另一个例子:
885822-20160126194500254-1785520280.png
恍然大悟:m与n的符号并没有改变。

代码 3:

#include<stdio.h>
int main()
{
    int a,b,c,m=0,n=0;
    scanf("%d %d",&a,&b);
    c=a+b;
    if(c<0)
    {
        c=-c;
        printf("-");    
    }
    m=c/1000;
    n=c/1000000;
    if(m==0&&n==0)
    printf("%d\n",c);
    else if(m!=0&&n==0)
    printf("%d,%d\n",m,c%1000);
    else if(m!=0&&n!=0)
    printf("%d,%d,%d\n",n,(c%1000000)/1000,c%1000);
        
    return 0;
}

评测结果:

885822-20160126201026895-1907685542.png

小结:

评测结果的跑分是15/20,说明我大体的方向是正确的,但是仍然有错误。我也百思不得其解,进行了一些测试。

测试样例1:
885822-20160126202333770-1480375231.png
测试样例2:
885822-20160126202359660-959536645.png
测试样例3:
885822-20160126202444082-1533975566.png

最后,在测试样例4的测试过程中,我发现了问题所在:

测试样例4:
885822-20160126202759879-1104188913.png

输入:100000 9 我编写的程序输出:100,9 正确输出:100,009

那么问题来了:怎么样才能输出9前面的两个0呢?

请原谅笔者的C语言能力不大扎实,通过咨询他人和查阅相关的资料,我得到了我想要的解决方案。

改正之后:

代码 4:

#include<stdio.h>
int main()
{
    int a,b,c,m=0,n=0;
    scanf("%d %d",&a,&b);
    c=a+b;
    if(c<0)
    {
        c=-c;
        printf("-");    
    }
    m=c/1000;
    n=c/1000000;
    if(m==0&&n==0)
    printf("%d\n",c);
    else if(m!=0&&n==0)
    printf("%d,%03d\n",m,c%1000);
    else if(m!=0&&n!=0)
    printf("%d,%03d,%03d\n",n,(c%1000000)/1000,c%1000);
        
    return 0;
}
/*-100000 9
-10 9
-9 10
100000 9
-1000 9
9 -1000*/

评测结果:

885822-20160126210923926-1154675838.png

小结:

令人欣喜的AC。

这里我温习了一遍C语言中遗漏的知识点:格式输出

参考博客:《printf格式化输出符号详细说明》博主:freemantse
链接 :http://blog.csdn.net/xiexievv/article/details/6831194

代码四与代码三我做出最大的改变:

printf("%d,%03d,%03d\n",n,(c%1000000)/1000,c%1000);

%03d输出的时候用数字0补充位数。之前很少注意到这个知识点,做这道题也是温习了一遍格式输出。

在解题的过程中,我认为利用m,n进行对c的范围判断过于麻烦和粗糙。于是我打算直接对c进行范围判断,有了如下新的解题思路和第三次尝试。

<3>第三次尝试

想法2:
取c的绝对值,分成0~999,1000~999999,>=1000000三个大小范围

代码:

#include <stdio.h>
int main()
{
    int a, b,c;
    scanf("%d %d",&a,&b);
    c=a+b;
    if(c<0)
    {
        printf("-");
        c=-c;
    }
    if(c<1000) printf("%d\n",c );
    else if(c<1000000) printf("%d,%03d\n",c/1000,c%1000 );
    else printf("%d,%03d,%03d\n",c/1000000,c%1000000/1000,c%1000 );
    return 0;
}
/*-100000 9
-10 9
-9 10
100000 9
-1000 9
9 -1000*/

评测结果:

885822-20160126215646942-1071441426.png

小结:

以上的代码是不是比较简洁和明了呢?答案是显然的。

总结:
1.审题需要仔细认真,不能马虎。
2.样例输出是对的,但是结果不一定是正确的,需要大量的样例来测试证明。
3.有时候不同的思路写出来的代码往往具有更好的简洁度和可读性。
------
以上即是笔者解题的过程和大体思路,不足之处还望大家多多指正。时值猴年新春,祝各位新年快乐!

                                                                              2016.1.26.

转载于:https://www.cnblogs.com/qq952693358/p/5158960.html

相关文章:

  • 作业一
  • 【数论】关于乘法逆元的证明
  • Python练习:简单停车场(栈)
  • ruby include和exclude区别
  • Javaweb Servlet出现Class xxx is not a servlet错误原因
  • ubuntu 解压
  • Atitit.面向接口的web 原理与设计重写 路由启动绑定配置url router rewriting urlpage  mvc mvp的 java c#.net php js...
  • 【B2B】2015 年B2B的春天
  • php反射方法信息
  • RedHat5.7+ice3.4.2+php5.2.17+nginx1.8.1环境配置
  • ActiveSync 在 Win7(32位) 与 WinCE7 之间使用出现的问题
  • 分别利用(代码,Xib,SB)创建空的App工程
  • oracle 常用存储过程
  • 移动web开发前准备知识了解(html5、jquery)笔记
  • tornado的入门教程
  • #Java异常处理
  • [译]如何构建服务器端web组件,为何要构建?
  • 《剑指offer》分解让复杂问题更简单
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 0基础学习移动端适配
  • Android交互
  • DOM的那些事
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java多线程(4):使用线程池执行定时任务
  • js 实现textarea输入字数提示
  • JS变量作用域
  • Linux gpio口使用方法
  • October CMS - 快速入门 9 Images And Galleries
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 关于字符编码你应该知道的事情
  • 记录一下第一次使用npm
  • 日剧·日综资源集合(建议收藏)
  • 首页查询功能的一次实现过程
  • 推荐一个React的管理后台框架
  • 我的业余项目总结
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (4.10~4.16)
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .Family_物联网
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .net2005怎么读string形的xml,不是xml文件。
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .net中调用windows performance记录性能信息
  • .NET中使用Protobuffer 实现序列化和反序列化
  • ?php echo ?,?php echo Hello world!;?
  • @Autowired注解的实现原理