NO.6【嫿骨】の無情讀數器

嫿骨有心麼發表於2020-12-31

前言

今天用了新軟體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()後面定義函式
(這種寫法好像規範一些 以後就用這種叭)
(ФωФ)

相關文章