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

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

题目:

<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;

}

评测结果:

小结:

第一次审题总是漏洞百出,大概是受之前的题目影响,把前面一大段非常有用的题目提示忽略掉了,这次我找出了题目中非常关键的一点:"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;
}

评测结果:

小结:

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

代入我的几个测试数据,我发现出现了如下情况:

很明显,在代码行:

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;
}

评测结果:

小结:

我输入样例:



发现样例是错误的。问题在哪里呢?

再一次输入另一个例子:



恍然大悟: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;
}

评测结果:

小结:

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

测试样例1:



测试样例2:



测试样例3:

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

测试样例4:

**输入: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*/

评测结果:

小结:

令人欣喜的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的绝对值,分成0999,1000999999,>=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*/

评测结果:

小结:

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

总结:

1.审题需要仔细认真,不能马虎。

2.样例输出是对的,但是结果不一定是正确的,需要大量的样例来测试证明。

3.有时候不同的思路写出来的代码往往具有更好的简洁度和可读性。


以上即是笔者解题的过程和大体思路,不足之处还望大家多多指正。时值猴年新春,祝各位新年快乐!

                                                                              2016.1.26.

程序设计第二次作业<1>的更多相关文章

  1. C语言程序设计第二次作业--顺序结构

    C语言程序设计第二次作业--顺序结构 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 #include <stido ...

  2. hdoj上的一题和程序设计第二次作业的拓展-人见人爱a+b

    hdoj上一道有意思的题目,题目: 人见人爱a+b 敲的也蛮快的,大概十分钟左右就AC了.代码如下: 人见人爱a+b #include<stdio.h> int main() { int ...

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

    Github链接:https://github.com/zora02/object-oriented/tree/master/1001.A%2BB%20Format%20(20) 一.解题 题目 解题 ...

  4. C语言程序设计第二次作业

    一.学习内容 掌握关系运算符.逻辑运算符.条件运算符 掌握常用数学函数的用法 if语句(单分支,双分支和多分支) 用switch语句实现多分支 理解多个if语句,if...else if... 和if ...

  5. C语言程序设计第二次作业——顺序结构

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. 错误信息1: 错误原因:i和d位置错误 改正方法:i和d位置互换 错误信息2: 错误原因:\n后缺了一个" 改正方法:\n后加一个 ...

  6. C语言程序设计第二次作业——

    1,编译过程过程中的错误缺引号和分号并且拼写错误. 正确结果: 2,编译过程 改正错误: 正确结果: 3,利用SIZEOF运算符求出的数据类型所占字节大小: 4,在头文件LIMITS.H中相关的编译 ...

  7. C语言程序设计第二次作业—————顺序结构改

    1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 #include <stido.h> int mian() { ...

  8. C语言程序设计第二次作业1

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...

  9. C语言程序设计第二次作业0

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...

随机推荐

  1. 谈JavaScript代码封装

    前言 也算老生常谈的问题了,再深入搞一搞怎么玩儿封装,如果看到这篇文章的你,正好你也是追求完美的代码洁癖狂者,那么这篇文章相信非常适合你. 举一个例子,编写一个Person类,具有name和birth ...

  2. Android Studio安装与配置

    谷歌已经停止支持eclipse开发android了,转向android studio是大势所趋,笔者由于电脑配置的原因, 以前迟迟不愿意向android studio,现如今因为开始学习materia ...

  3. $GLOBALS['HTTP_RAW_POST_DATA'] 和$_POST的区别

    $_POST:通过 HTTP POST 方法传递的变量组成的数组.是自动全局变量. $GLOBALS['HTTP_RAW_POST_DATA'] :总是产生 $HTTP_RAW_POST_DATA 变 ...

  4. 实例讲解虚拟机3种网络模式(桥接、nat、Host-only)

    转自:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html 前言 很多人安装虚拟机的时候,经常遇到不能上网的问题,而vmwa ...

  5. javaWeb项目中web.xml的xsd( XML Schemas Definition)文件

    <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns="http://w ...

  6. 【HTML5】SVG内联

    什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用于定义用于网络的基于矢量的图形 SVG 使用 XML 格式定义图形 SVG 图像在放大或改变尺 ...

  7. 解析Cloudera Manager内部结构、功能包括配置文件、目录位置等

    转载自 http://www.aboutyun.com/thread-9189-1-1.html 问题导读1.CM的安装目录在什么位置? 2.hadoop配置文件在什么位置? 3.Cloudera m ...

  8. SU suchart命令学习

  9. mvc-4控制器和状态(2)

    访问视图 常见地视图模式时一个视图对应一个控制器,视图包含一个id,通过id传入控制器:在视图之中的元素则使用class 这里会使用jquery的选择器,为了减少使用,可以设置一个专门用于存放选择器到 ...

  10. Windows自带Android模拟器启动失败

    Windows自带Android模拟器启动失败 错误信息:[Critical] XDE Exit Code: InvalidArguments (3)XDE执行的第三个参数为设置内存值,形式为/mem ...