NO.6【婳骨】の无情读数器

本文档展示了使用C语言设计的程序,该程序能输入并处理最多9位(包括小数)的数字,输出各数位并以中文读法显示。程序涵盖了输入判断、数字拆分及中文转换等多个功能,同时讨论了C语言中保留小数精度、scanf_s函数与scanf的区别、强制类型转换等知识点。此外,还分享了在VS2019与CodeBlocks间遇到的差异及解决方法。
摘要由CSDN通过智能技术生成

前言

今天用了新软件vs2019,好些地方跟CodeBlocks不同,整了整!。!
中间也遇到了些小问题
中间为了不输出多个“零”,感觉有点乱了呢
下次试一试画个图,更清晰些
心里乱糟糟,不知道干什么好的时候,果然还是敲代码最棒了()噗

题目

原题

设计一个程序, 输入三位数, 分别输出百位, 十位和个位数;样例输入: 251样例输出: 2 5 1

开题

输入9位数(包括9)以内的数字(包括正数、负数、0、小数)(进行判断,只能是数字)
输出各个位上的数、包括小数位
转换写法(壹)
继续/退出

代码

用到了两个自定义函数

void NumberShow(double);	//显示
void NumberWay(int);	//转换方式

int main()
{
	double n0;	//定义所输入的数字
	int ex;	//定义退出选项
	system("title 【婳骨】の无情读数器");
	while(1)
	{
		printf("你说个数,我给你瞅瞅(小数点前最多九位(多个减号算一个哦,且不能在录入时进行运算)):\n");
		for (scanf_s("%lf", &n0); n0 <= -1000000000 || n0 >= 1000000000; scanf_s("%lf", &n0))	//判断输入数字是否符合要求
		{
			fflush(stdin);
			printf("输入错误!请按要求输入!\n你再说个数,我给你瞅瞅(小数点前最多九位、不能在录入时进行运算、多个减号算一个哦)):\n");
		}
		printf("您输入的数字为:%.2lf(保留两位小数)\n", n0);
		NumberShow(n0);		//数据显示
		printf("要继续么?(输入1并回车则继续,输入其他回车以退出)\n");
		scanf_s("%d", &ex);
		fflush(stdin);
		if (ex != 1)
		{
			printf("谢谢使用!\n");
			exit(0);
		}
		printf("重新开始!");
		Sleep(2000);
		system("cls");
	}
}

void NumberShow(double n0)		//数据显示
{
	int a = 0;	//控制零的输出
	int b;	//读取小数位所用
	int c = -1;	//控制多余的零
	int d = 0;	//判断正负,默认为正
	int n;	//存放小数点前的数字
	int u;	//不变的输入数字
	int n1, n2, n3, n4, n5, n6, n7, n8, n9, n11, n12;	//定义各个位数上的数
	double n10;	//定义小数位上的数
	if (n0 < 0)
	{
		n0 = -n0;	//将负数化为正数,便于读取
		printf("对了 这个数为负数哈~\n");
		d = 1;	//为负数
	}
	n = (int)n0;		//取小数点前的数字
	u = (int)n0;		//取小数点前的数字
	n1 = n / 100000000;	//亿位 取商
	printf("该数的亿位为:\t%d\n", n1);
	n = n % 100000000;	//取余数
	n2 = n / 10000000;	//千万位
	printf("该数的千万位为:%d\n", n2);
	n = n % 10000000;	//取余数
	n3 = n / 1000000;		//百万位
	printf("该数的百万位为:%d\n", n3);
	n = n % 1000000;	//取余数
	n4 = n / 100000;		//十万位
	printf("该数的十万位为:%d\n", n4);
	n = n % 100000;	//取余数
	n5 = n / 10000;		//万位
	printf("该数的万位为:\t%d\n", n5);
	n = n % 10000;	//取余数
	n6 = n / 1000;		//千位
	printf("该数的千位为:\t%d\n", n6);
	n = n % 1000;	//取余数
	n7 = n / 100;		//百位
	printf("该数的百位为:\t%d\n", n7);
	n = n % 100;	//取余数
	n8 = n / 10;			//十位
	printf("该数的十位为:\t%d\n", n8);
	n = n % 10;	//取余数
	n9 = n / 1;			//个位
	printf("该数的个位为:\t%d\n", n9);
	n10 = n0 - u;	//0.xx	小数位
	b = (int)(n10 * 100);
	n11 = b / 10;	//十分位
	n12 = b - n11 * 10;	//百分位
	printf("该数中的小数为:\t%.2lf\n", n10);
	printf("该数的十分位为:%d\n", n11);
	printf("该数的百分位为:%d\n", n12);
	printf("读作:\t\t");		//读法
	if (d == 1)	//负数
	{
		printf("负");
	}
	if (n1 != 0)	//亿位不为0
	{
		NumberWay(n1);
		printf("亿");
	}
	if (n2 != 0 || n3 != 0 || n4 != 0 || n5 != 0)	//千万位、百万位、十万位、万位中的一个不等于零
	{
		if (n2 != 0)
		{
			NumberWay(n2);
			a = 1;	//表示后面数已经不是首个数了
			printf("仟");
		}
		if (n3 == 0 && a == 1 && (n4 != 0 || n5 != 0))
		{
			printf("零");
			c = 0;	//使得下一个万里的零不打印
		}
		if (n3 != 0)
		{
			NumberWay(n3);
			a = 1;
			printf("佰");
		}
		if (n4 == 0 && a == 1 && b == 1)
		{
			printf("零");
		}
		if (n4 != 0)
		{
			NumberWay(n4);
			a = 1;
			printf("拾");
		}
		if (n5 != 0)
		{
			NumberWay(n5);
			a = 1;
		}
		printf("万");
	}
	if (n6 != 0)
	{
		NumberWay(n6);
		a = 1;
		printf("仟");
	}
	if (n7 == 0 && a == 1 && (n8 != 0 || n9 != 0))
	{
		printf("零");
		c = 2;
	}
	if (n7 != 0)
	{
		NumberWay(n7);
		a = 1;
		printf("佰");
	}
	if (n8 == 0 && a == 1 && c != 2 && n9 != 0)
	{
		printf("零");
	}
	if (n8 != 0)
	{
		NumberWay(n8);
		a = 1;
		printf("拾");
	}

	if (n9 != 0)
	{
		NumberWay(n9);
		a = 1;
	}
	if (n10 == 0)	//为整数
	{
		printf("整");
	}
	if (n1 == 0 && n2 == 0 && n3 == 0 && n4 == 0 && n5 == 0 && n6 == 0 && n7 == 0 && n8 == 0 && n9 == 0)
	{
		printf("零");
	}
	if (n11 != 0 || n12 != 0)
	{
		printf("点");		//带小数
		NumberWay(n11);
		NumberWay(n12);
	}
	printf("\n");
}
void NumberWay(int temp)		//数据读法
{
	if (temp == 0)
	{
		printf("零");
	}
	if (temp == 1)
	{
		printf("壹");
	}
	if (temp == 2)
	{
		printf("贰");
	}
	if (temp == 3)
	{
		printf("叁");
	}
	if (temp == 4)
	{
		printf("肆");
	}
	if (temp == 5)
	{
		printf("伍");
	}
	if (temp == 6)
	{
		printf("陆");
	}
	if (temp == 7)
	{
		printf("柒");
	}
	if (temp == 8)
	{
		printf("捌");
	}
	if (temp == 9)
	{
		printf("玖");
	}
}

部分运行结果

在这里插入图片描述

小结

	1、在c语言中个数保留2位小数可以通过精度限定符来完成,精度限定符有一个点号后跟一个整数组成。例子:
		#include <stdio.h>
		int main()
		{
			dobule a = 1.23456;
			printf("%.2f\n", a);
			return 0;
		}
	2、scanf_s()函数与scanf()函数的区别
		scanf() 函数 :
		scanf() 函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。其调用格式为:scanf("<格式化字符串>",<地址表>)。
		scanf_s()函数:
		scanf_s() 是针对“ scanf()在读取字符串时不检查边界,可能会造成内存泄露”这个问题设计的。scanf_s()用于读取字符串时,必须提供一个数字以表明最多读取多少位字符,以防止溢出。
		如果我们在vs2019环境下直接使用scanf()函数,程序运行报错。故使用scanf_s()函数来代替scanf()函数
	3、强制类型转换
		强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
		自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。
		例如: (double) a 把a转换为双精度浮点型,(int)(x+y) 把x+y的结果转换为整型。
	4、在定义函数前需要先在main()函数前进行声明,然后再去定义
		这个的问题(发生了报错:函数错误)就是 函数的声明与定义存在问题
		main()函数是开始 进行编译后在里面碰到了其他的函数 然后去前面找,找到了NumberShow()函数,然后编译 又碰到了 NumberWay()函数 继续往前面找
		发现找不到(因为它不会找后面啊喂)于是报错
		解决方法呢就是:先在main()函数前面把其他的函数全声明一遍 然后再去main()后面定义函数
		(这种写法好像规范一些 以后就用这种叭)
	5、更改控制台窗口标题
		#include <stdlib.h>
		int main()
		{
			system("title 你的标题");
			return 0;
		}
	6、Visual Studio与Code Block还是有很大差别的

感谢

啊,刚【L】(群里的)把我教会了
先感谢一波

这个的问题就是 函数的声明与定义存在问题(起初是main()函数前没有如文中那种写法,而是直接开始定义的,并且NumberShow()函数在前,接下来是NumberWay()函数,出了问题)
main()函数是开始 进行编译后在里面碰到了其他的函数 然后去前面找,找到了NumberShow()函数,然后编译 又碰到了 NumberWay()函数 继续往前面找
发现找不到(因为它不会找后面啊喂)于是报错
解决方法呢就是:先在main()函数前面把其他的函数全声明一遍 然后再去main()后面定义函数
(这种写法好像规范一些 以后就用这种叭)
(ФωФ)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值