前言

这几天刚学了多源代码文件的编译,因为想尝试使用一下这种方法,所以想用此编写这次作业的程序。正好可以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. C++ 函数的二义性

    函数二义性是一种编译时发生的错误,造成二义性调用的原因 是在函数匹配时两个或多个函数提供的匹配一样好,编译时找 不到唯一的最佳匹配. 列: #include <iostream> usin ...

  2. win7-x64上MySql的初次安装

    1.官网:https://dev.mysql.com/downloads/mysql/下载对应的zip包 2.将包解压缩到本地,如:F:\mysql\mysql-8.0.15-winx64 3.配置环 ...

  3. office2010安装需MSXML版本6.10.1129.0详解解

    https://blog.csdn.net/qq_40824474/article/details/82390606 office2010安装提示报错 由于下列原因,安装程序无法继续,需要计算机安装M ...

  4. Fiddler设置代理后,iphone手机无法访问网络的全面解决办法

    好久不抓手机包,都有些忘记了,电脑上软件都在,原本是Fiddler4,现在已自动升级到V5. 入主题吧,首先Fiddler设置好代理,然后手机安装证书好了,设置手机代理,结果iphone无法访问网络, ...

  5. Word里面怎么取消全文每个标题前面都有的这个点

    Word里标题前面的那个点,如图1所示看起来觉得很不舒服,该怎么把它取消呢?(本测试环境是Win 10 64位系统,Microsoft Office家庭和学生版 2016) 图1 选中所有标题,如图2 ...

  6. 关于SignalR连接数量问题的记录

    在使用SignalR的项目测试时遇到了一个问题,开发环境用的是Win10的操作系统,在VS2017调试环境中运行项目,连接多个SignalR客户端是没有问题的,例如,三个用户在一个聊天室同时聊天.但是 ...

  7. [glog]_[C/C++]_[使用glog来记录日志]

    glog 快速使用教程 场景 1.大部分程序由函数组成, 每个函数执行一段设计好的逻辑, 但是大部分的时候有可能出现意料之外的值, 这时候就很想知道这种意料以外的值是如何产生的, 这就需要一个函数调用 ...

  8. 5 admin的使用

    1.admin组件的使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTA ...

  9. hive streaming 使用的时候的一些心得

    hive streaming 报错的解决方案: 1.把使用到hive streaming 的sql 分解,例如:select transform a,b,c,d using 'python cc.py ...

  10. 实现对象属性的lazy-loading(延迟加载)

    一.延迟加载器LazyLoader作用:       说到延迟加载,应该经常接触到,尤其是使用Hibernate的时候,本篇将通过一个实例分析延迟加载的实现方式.LazyLoader接口继承了Call ...