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


    前言

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


    文末附上作业的一、二题

  • 相关阅读:
    Java多线程学习
    JAVA类的加载机制
    这四款也许是电脑录屏软件中免费、无广告且最实用的,程序员必备
    手机端没有好的录屏软件?地表最强移动端录屏软件了解一下?
    手把手教你 在Pytorch框架上部署和测试 关键点人脸检测项目DBFace,成功实现人脸检测效果
    520是秀恩爱吃狗粮,521才是真正的告白日,- Python告白神器用起来 !
    截图还在使用QQ的Ctrl + Alt + A 截图?还不会网页长截图?
    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测
    小白也能弄懂的卷积神经网络(Convolutional Neural Networks )
    官网安装Python包太慢?教你三种下载安装方式-PiP、conda、轮子,教你三种Pytorch的下载安装方式,保证你再也不用出现Error
  • 原文地址:https://www.cnblogs.com/vancasola/p/6353758.html
Copyright © 2020-2023  润新知