前言

这几天刚学了多源代码文件的编译,因为想尝试使用一下这种方法,所以想用此编写这次作业的程序。正好可以learning by doing,在做当中学习新知识。(编译器为Dev-C++)

github地址

git提交

[pdf的地址](http://files.cnblogs.com/files/vancasola/作业1的pdf.pdf)

大致题意

输入两个整数,将他们之和输出,每三位数以逗号隔开。


思路一

将输入的东西全部转化为数组,再逐个输出。

思路二

直接得到一个数字,通过数学运算来输出。此方法思路比较自然,主要是按输出时逗号的个数来讨论,可以将情况分为三种:

  • 出现一个逗号
  • 出现两个逗号
  • 不出现逗号

然后在不同的情况下采用不同的输出格式。

首先,建立一个工程

将代码的大体框架打出来

包括变量的定义以及三种情况

int main()
{
int a,b,d,d0;
scanf("%d %d",&a,&b);
d=a+b;
d0=abs(d); if(d0>999999) if(1000<=d0<=999999) if(d0<1000) return 0;
}

写一个头文件c.h声明函数

包括三种情况下使用的函数

int c_max(int c);
int c_min(int c);
int c_mid(int c);

添加头文件后

main函数的完整代码

#include<stdio.h>
#include<math.h>
#include"c.h"
int main()
{
int a,b,d,d0;
scanf("%d %d",&a,&b);
d=a+b;
d0=abs(d); if(d0>999999)
c_max(d);
if(1000<=d0<=999999)
c_mid(d);
if(d0<1000)
c_min(d);
return 0;
}

其中三种情况对应为三个自定义函数,自定义函数的命名是按照输入两数之和的大小,6位数以上的为c_max,3位数及以下的为c_min,最后一个为c_mid。

c_max
//c的绝对值大于1000000
#include<stdio.h>
#include<math.h>
int c_max(int c)
{
if(c>0)
{
printf("%d,%03d,%03d",
c/1000000,
(c%1000000-c%1000)/1000,
((((c%1000000)%100000)%10000)%1000));
}
else
printf("%d,%03d,%03d",
c/1000000,
(-1)*(c%1000000-c%1000)/1000,
(-1)*((((c%1000000)%100000)%10000)%1000));
return 0;
}

函数又按照和的正负来分采用不同的输出方式,将输入的数字分为三段,每段为一个数字,如1234567,它可以被看作3个数字1、234、567,然后通过取余1234567来得到这三个数字。

刚开始我的格式输出符为%d,%d,%d,当测试数据1,023,000,时,输出就成了1,23,0,显然不符合题目的要求,所以我将输出符改成了%d,%03d,%03d,3将输出的字段大小定为3,如果字段大小小于3,那么0就会在数字前面被补上,直到字段大小等于3,这样就完美地解决了这个问题。

至于和为负数时,因为取余后三个数字一定都是负数,所以只要在将后两个数字乘上-1而第一个不变,这样输出时第一个数字前就有一个负号,而后两个数字均为正数。

c_mid

#include<stdio.h>
#include<math.h>
int c_mid(int c)
{
if(c>0)
{
printf("%d,%03d",
c/1000,
((((c%100000)%10000)%1000)));
}
else
printf("%d,%03d",
c/1000,
(-1)*((((c%100000)%10000)%1000)));
return 0;
}

c_min

#include<stdio.h>
#include<math.h>
int c_min(int c)
{
if(c>=0)
printf("%d",c);
else
printf("%d",c);
return 0;
}

后两段代码的原理其实和c_max是一样的, 而且更加简单。


编写完这5个程序后就可以编译运行了,可是当输入1 1 时竟然会有这样的输出!

再测试中间段数据

中间段的输出却是正确的,于是我猜想是不是条件语句出了问题,但是乍一看却没有发现,所以我分别在三个条件后面加入一个输出,当进入该条件时会在屏幕上显示一些东西,比如插入一条printf("MIM");那么进入if(d0<=999)时屏幕上就会显示MIN。

分别插入输出语句后,发现输入1 1 时,进入了后两个if,发现问题的确出现在条件语句。仔细查看后发现第二个条件语句竟然犯了如此低级的错误:if(1000<=d0<=999999)。

将代码修正后if(d0>=1000&&d0<=999999),重新编译文件后,输出就正常了。

接下来又设计了一系列测试数据来测试代码中各个部分以及临界点的输出(以下直接写出两数之和)

  • 1
  • 1000
  • 1000000
  • 2021020

    发现结果全部正确,于是将代码整合在一个文件中,在网站上提交:



    答案正确。

    附上完整版代码
#include<stdio.h>
#include<math.h>
int c_max(int c);
int c_min(int c);
int c_mid(int c);
int main()
{
int a,b,d,d0;
scanf("%d %d",&a,&b);
d=a+b;
d0=abs(d); if(d0>999999)
c_max(d);
if(d0>=1000&&d0<=999999)
c_mid(d);
if(d0<1000)
c_min(d);
return 0;
} int c_max(int c)
{
if(c>0)printf("%d,%03d,%03d",
c/1000000,
(c%1000000-c%1000)/1000,
((((c%1000000)%100000)%10000)%1000));
else printf("%d,%03d,%03d",
c/1000000,
(-1)*(c%1000000-c%1000)/1000,
(-1)*((((c%1000000)%100000)%10000)%1000));
return 0;
}
int c_mid(int c)
{
if(c>0)printf("%d,%03d",
c/1000,
((((c%100000)%10000)%1000)));
}
else printf("%d,%03d",
c/1000,
(-1)*((((c%100000)%10000)%1000)));
return 0;
}
int c_min(int c)
{
if(c>=0)printf("%d",c);
else printf("%d",c);
return 0;
}

(还是分为多个源文件的代码看起来简洁一点)

总结

多源代码文件方面

  • 建立一个工程。(之前文件一直没能成功编译就是少了它)
  • 在头文件中声明函数。
  • 将主函数与自定义函数分开写。
  • 注意函数和变量不要重复定义。
  • include"c.h" 中 ""表示被包含文件位于当前工作目录下。

解题方面

  • 按照讨论的不同情况先写出程序框架
  • 格式输出时使用%03d来控制前导零
  • 使用一些输出来检查bug


文末附上作业的一、二题



1001. A+B Format (20)的解题思路以及多源代码文件的尝试编写的更多相关文章

  1. 关于‘1001.A+B Format (20)’的解题报告

    1001.A+B Format(20) 首先要感谢一下指导我github上传问题的小伙伴们,捣腾了一整天我终于摸到了一点门路,真的谢谢你们. 小豪的github 问题描述: Calculate a + ...

  2. PAT 甲级1001 A+B Format (20)(C++ -思路)

    1001 A+B Format (20)(20 分) Calculate a + b and output the sum in standard format -- that is, the dig ...

  3. 1001.A+B Format (20)的解题

    关于A+B的正确打开方式! 解题思路 gitub 也是研究了很久才学会了本地上传,中间还遇到一些问题,多亏学长的教程跟搜索引擎的帮忙解决啦! 我想还是了解题目的意思是解题的最关键,通过了查词软件跟自身 ...

  4. "1001. A+B Format (20)" 解题报告

    Github : git@github.com:Circlecos/object-oriented.git PDF Of Markdown : "1001. A+B Format (20)& ...

  5. 1001.A+B Format (20)(思路,bug发现及其修改,提交记录)

    https://github.com/031502316a/object-oriented/tree/master/1001 ---恢复内容开始--- 1.解题思路 一开始见到题目时,感觉难的就是输出 ...

  6. 1001. A+B Format (20) (%0nd)

    1001. A+B Format (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Calculate ...

  7. PAT-PAT (Advanced Level) Practise 1001. A+B Format (20) 【二星级】

    题目链接:http://www.patest.cn/contests/pat-a-practise/1001 题面: 1001. A+B Format (20) Calculate a + b and ...

  8. 1001.A+B Format (20)代码自查(补足版)

    1001.A+B Format (20)代码自查(补足版) 谢谢畅畅酱的提醒,发现了代码中的不足,把变量名更改成更合理的名字,并且把注释也换成英文啦! 栋哥提供的代码自查的方式也帮助了我发现很多代码中 ...

  9. PAT 甲级 1001 A+B Format (20)(20 分)

    1001 A+B Format (20)(20 分) Calculate a + b and output the sum in standard format -- that is, the dig ...

随机推荐

  1. 用NI的数据采集卡实现简单电子测试之2——绘制三极管输出特性曲线(面)图

    本文从本人的163博客搬迁至此. 想设计几个实验,既能展示NI的LabVIEW和数据采集卡的功能特点,又能够让普通电类专业本科学生可以理解,自然首先想到了<电子技术基础>课程的内容.第一个 ...

  2. Android JS interaction

    WebView web; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst ...

  3. # 2017-2018-1 20155224 《信息安全系系统设计基础》第四周MyOD

    2017-2018-1 20155224 <信息安全系系统设计基础>第四周MyOD 在这里跟老师先道歉,当时我的git没有安装好,后面也一直没有装上,所以程序没有git. 要求 参考教材第 ...

  4. 【转】C++ 枚举类型的思考

    转自: http://blog.csdn.net/classfactory/article/details/87749 C++ 中的枚举类型继承于 C 语言.就像其他从 C 语言继承过来的很多特性一样 ...

  5. 使用JDBC connect获取数据库表结构信息

    1.这是生成代码的关键 引入maven依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysq ...

  6. Linux常用文件权限控制命令

    一,查看文件属主属组ls -l [root@localhost app]# ls -l total 302832 drwxr-xr-x. 4 lhc lhc 4096 Nov 18 16:05 apa ...

  7. Openstack入门篇(十一)之neutron服务(控制节点)的部署与测试

    1.Neutron的介绍 Neutron 为整个 OpenStack 环境提供网络支持,包括二层交换,三层路由,负载均衡,防火墙和 *** 等.Neutron 提供了一个灵活的框架,通过配置,无论是开 ...

  8. Minor GC&Full GC&Major GC区别及触发条件

    Minor GC:从年轻代回收内存 触发条件 1.Eden区域满 ​ 2.新创建的对象大小 > Eden所剩空间 Full GC:清理整个堆空间,包括年轻代和老年代 触发条件 ​ 1.每次晋升到 ...

  9. 学习python,第三篇:.pyc是个什么鬼?

    .pyc是个什么鬼? 1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存 ...

  10. IP地址相关知识

    IP地址基本概念                                                                                            ...