當前位置:首頁 » 編程語言 » c語言怎麼輸入double類型
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言怎麼輸入double類型

發布時間: 2022-02-25 14:12:53

『壹』 c語言怎麼輸入不確定個數的double型數據

用mallco函數,如下
int N = 0;
double *pnum;
scanf("%f",&N);
pnum=(double *)malloc(10*sizeof(double));
printf("enter %d :\n",N);
for(i=0;i<N;i++)
scanf("%f",&pnum[i]);
printf(":\n");

『貳』 C語言的double類型問題

C 語言包含的數據類型如下圖所示:

一、數據類型與「模子」
short、int、long、char、float、double 這六個關鍵字代表C 語言里的六種基本數據類型。

怎麼去理解它們呢? 舉個例子:見過藕煤球的那個東西吧?(沒見過?煤球總見過吧)。那個東西叫藕煤器,拿著它在和好的煤堆里這么一咔,一個煤球出來了。半徑12cm,12 個孔。不同型號的藕煤器咔出來的煤球大小不一樣,孔數也不一樣。這個藕煤器其實就是個模子。

現在我們聯想一下,short、int、long、char、float、double 這六個東東是不是很像不同類型的藕煤器啊?拿著它們在內存上咔咔咔,不同大小的內存就分配好了,當然別忘了給它們取個好聽的名字。

在32 位的系統上short 咔出來的內存大小是2 個byte;
int 咔出來的內存大小是4 個byte;
long 咔出來的內存大小是4 個byte;
float 咔出來的內存大小是4 個byte;
double 咔出來的內存大小是8 個byte;
char 咔出來的內存大小是1 個byte。
(注意這里指一般情況,可能不同的平台還會有所不同,具體平台可以用sizeof 關鍵字測試一下)

很簡單吧?咔咔咔很爽吧?是很簡單,也確實很爽,但問題就是你咔出來這么多內存塊,你總不能給他取名字叫做x1,x2,x3,x4,x5…或者長江1 號,長江2 號…吧。它們長得這么像(不是你家的老大,老二,老三…),過一陣子你就會忘了到底哪個名字和哪個內存塊匹配了(到底誰嫁給誰了啊?^_^)。所以呢,給他們取一個好的名字絕對重要。下面我們就來研究研究取什麼樣的名字好。

二、變數的命名規則
1、命名應當直觀且可以拼讀,可望文知意,便於記憶和閱讀。
標識符最好採用英文單詞或其組合,不允許使用拼音。程序中的英文單詞一般不要太復雜,用詞應當准確。

2、命名的長度應當符合「min-length && max-information」原則。
C 是一種簡潔的語言, 命名也應該是簡潔的。例如變數名MaxVal 就比MaxValueUntilOverflow 好用。標識符的長度一般不要過長,較長的單詞可通過去掉「母音」形成縮寫。

另外,英文詞盡量不縮寫,特別是非常用專業名詞,如果有縮寫,在同一系統中對同一單詞必須使用相同的表示法,並且註明其意思。

3、當標識符由多個片語成時,每個詞的第一個字母大寫,其餘全部小寫。比如:
int CurrentVal;
這樣的名字看起來比較清晰,遠比一長串字元好得多。

4、盡量避免名字中出現數字編號,如Value1,Value2 等,除非邏輯上的確需要編號。比如驅動開發時為管腳命名,非編號名字反而不好。
初學者總是喜歡用帶編號的變數名或函數名,這樣子看上去很簡單方便,但其實是一顆顆定時炸彈。這個習慣初學者一定要改過來。

5、對在多個文件之間共同使用的全局變數或函數要加范圍限定符(建議使用模塊名(縮寫)作為范圍限定符)。
(GUI_ ,etc)標識符的命名規則:

6、標識符名分為兩部分:規范標識符前綴(後綴) + 含義標識。非全局變數可以不用使用范圍限定符前綴。

7、作用域前綴命名規則。

8、數據類型前綴命名規則。

9、含義標識命名規則,變數命名使用名詞性片語,函數命名使用動詞性片語。例如:

變數含義標識符構成:目標詞+ 動詞(的過去分詞)+ [狀語] + [目的地];

函數含義標識符構成:動詞(一般現時)+目標詞+[狀語]+[目的地];

10、程序中不得出現僅靠大小寫區分的相似的標識符。例如:
int x, X; 變數x 與X 容易混淆
void foo(int x); 函數foo 與FOO 容易混淆
void FOO(float x);
這里還有一個要特別注意的就是1(數字1)和l(小寫字母l)之間,0(數字0)和o(小寫字母o)之間的區別。這兩對真是很難區分的,我曾經的一個同事就被這個問題折騰了一次。

11、一個函數名禁止被用於其它之處。例如:
#include "c_standards.h"
void foo(int p_1)
{
int x = p_1;
}
void static_p(void)
{
int foo = 1u;
}

12、所有宏定義、枚舉常數、只讀變數全用大寫字母命名,用下劃線分割單詞。例如:
const int MAX_LENGTH = 100; //這不是常量,而是一個只讀變數,具體請往後看
#define FILE_PATH 「/usr/tmp」

13、考慮到習慣性問題,局部變數中可採用通用的命名方式,僅限於n、i、j 等作為循環變數使用。
一定不要寫出如下這樣的代碼:
int p;
char i;
int c;
char * a;
一般來說習慣上用n,m,i,j,k 等表示int 類型的變數;c,ch 等表示字元類型變數;a 等表示數組;p 等表示指針。當然這僅僅是一般習慣,除了i,j,k 等可以用來表示循環變數外,別的字元變數名盡量不要使用。

14、定義變數的同時千萬千萬別忘了初始化。定義變數時編譯器並不一定清空了這塊內存,它的值可能是無效的數據。這個問題在內存管理那章有非常詳細的討論,請參看。

15、不同類型數據之間的運算要注意精度擴展問題,一般低精度數據將向高精度數據擴展。

『叄』 C語言中關於double型數據的輸入

這是一個初學者經常犯的一個錯誤,應該用%lf,因為double和float在內存分配上存在差異,所以用scanf函數進行輸入的時候要加以區別。

『肆』 c語言中,輸入一串數字字元,如何轉化為double類型的

#include<stdio.h>

intmain()
{
inti;
doublem=0;
charnum[30];

scanf("%s",num);

//一般轉換成數字都是這樣,這個是處理沒有小數點的
for(i=0;num[i]!='';i++)
m=m*10+(num[i]-'0');//num[i]-0,把字元轉換成數字

printf("%lf",m);

return0;
}

『伍』 C語言如何輸出雙精度浮點型數據

1.雙精度浮點型數據用%lf輸出。因為double是8個位元組的,float是4個位元組的,%f 的格式就是4個位元組的,而 %lf 就是8個位元組的。 例如:printf("%lf ",x);

2.short 佔用內存空間2個位元組,短整型數據用%d輸出 例如:printf("%d ",a);

例:

#include <stdio.h>

int main()

{double x;

short int a;

printf("%lf",x); // 輸入double型

printf("%d",a); //輸入短整型

return 0;

}

(5)c語言怎麼輸入double類型擴展閱讀:

C語言特有特點

1.C語言是一個有結構化程序設計、具有變數作用域(variable scope)以及遞歸功能的過程式語言。

2.C語言傳遞參數均是以值傳遞(pass by value),另外也可以傳遞指針(a pointer passed by value)。

3.不同的變數類型可以用結構體(struct)組合在一起。

4.只有32個保留字(reserved keywords),使變數、函數命名有更多彈性。

5.部份的變數類型可以轉換,例如整型和字元型變數。

6.通過指針(pointer),C語言可以容易的對存儲器進行低級控制。

7.預編譯處理(preprocessor)讓C語言的編譯更具有彈性。

『陸』 C語言中double類型怎麼使用

使用printf時,它們具有相同的格式說明符,但使用scanf時,它們沒有相同的格式說明符。

為什麼是這樣?因為printf的參數被提升,而scanf的參數(作為指針)卻不被提升。

這種論點提升到底是什麼?當較小尺寸的參數(特別是char,short和float)傳遞給可變參數函數(如printf之類的函數,其參數數量不固定)時,它們將轉換為較大尺寸。Char和short轉換為int,float轉換為double。

為什麼這樣 據我所知,純粹出於歷史原因。C的設計師認為這是個好主意,因為這些轉換基本上是免費的,因為所有類型的尺寸都足夠小,可以放入單個寄存器或堆棧中的單個「單元」(將內容壓入堆棧必須與某些位元組邊界對齊,例如,堆棧上的每個項目都必須以4的倍數的地址開頭。同樣,顯然,這種轉換減少了傳遞參數時的錯誤。

因此,當您向printf傳遞float類型的參數時,實際上它會在轉換為printf之前就轉換為double類型。我們可以使用調試器證明這一點。我寫了下面的C代碼:

主要功能編譯成:

領取關於C/C++更多學習資料:

我在調用printf之前(在地址0x63b處)放了一個斷點。根據Linux x86_64調用約定,浮點參數在XMM寄存器中傳遞(CPU中特殊的小內存位置,可用於對多條數據並行執行同一條指令,但實際上可用於大多數事情) 。因此,我查看了第一個XMM寄存器xmm0,然後:

xmm0中的值之一,當解釋為雙精度值時,是1,恰好是我們傳遞給printf的值。同時,當將該寄存器中的值解釋為浮點數時,它們是這樣(巧合的是,我們得到1.875)。因此,轉換確實發生了。這就解釋了為什麼對於printf,我們在浮點數和雙精度參數中都使用%f -浮點數無論如何都會轉換為雙精度,因此printf不能分辨出兩者之間的區別。

同時,scanf的參數是指針,因此不受此轉換的限制。其原因是因為所有指針類型僅包含內存地址,並且所有內存地址都具有相同的大小(在我的64位計算機上為64位)。因此,當scanf在其格式字元串中獲得%f時,它將期望一個float *類型的指針,而當它獲得%lf時,將期望得到double *類型的指針。如果格式說明符和指針的類型不匹配,則會產生一些有趣的結果。

由於float的大小為4個位元組,而double的大小為8個位元組(至少在我的機器上),因此當我們寫入float *類型的指針所指向的位置時,我們將覆蓋4個位元組的內存。同時,如果我們寫入由雙*指向的位置,則將覆蓋8個位元組的內存。考慮以下代碼:

printf說明符上的.15標志只是使printf精確度更高。由於我們使用的是雙精度值(並且正如我剛剛說的那樣,%f也適用於printf的雙精度值),因此我們實際上可以訪問具有這種精度的數字(只要它們不是太大而不能填充即可。我實際上不是對浮點表示非常了解)

編譯並運行後,結果如下:

如您所見,如果我們忽略所有類型的fuckery,則數字應該匹配,但它們甚至不相近。這是為什麼?

好吧,我們給scanf%f說明符,所以它期望一個浮點數*。但是我們傳遞了一個雙*。現在,這些指針的實際值都只是地址-scanf不知道它們之間的區別。它進行了下去,讀取我們輸入的值,並將其存儲為float 。但是浮點數僅佔用4個位元組,因此scanf只會在我們可用的double變數的8個位元組中寫入4個位元組。在我的情況下,由於我的機器是低位位元組序的,因此似乎對應於double變數的細粒度(小有效位)數字的第4個位元組將被覆蓋。因此,當我們列印出double double back時,我們得到的數字幾乎與以前相同,但最低有效數字有所變化。

有想學習更多C/C++知識的,可以點擊下方了解更多,領取免費學習資料:

『柒』 c語言double類型輸出問題及字元輸入問題

double要用%lf

你輸入字元串時,肯定按了回車,而回車實際上輸入了2個字元,第1個被用來確認scanf結束,還有一個仍然保留在了緩沖區內,被scanf("%c",&ch);讀到了,這個字元是個控制字元,所以不可見.

在任何讀取字元的語句之前,你最好用fflush(stdin);來清空一下緩沖區.

『捌』 C語言如何輸入雙精度數據

C語言用scanf()函數輸入雙精度數據時,採用的數據格式參數必須是%lf,如:

doubled;
scanf("%lf",&d);

scanf("%f,%f",&a,&b);不能輸入雙精度數據嗎?

當然不能。主要原因在於double和float類型的大小不同:

  1. double類型數據在內存中存儲佔8位元組(64位),按IEEE754標准存儲,格式為:1位符號位+11位指數位+52位小數位

  2. float類型數據在內存中存儲佔4位元組(32位),按IEEE754標准存儲,格式為:1位符號位+8位指數位+23位小數位

  3. 當輸入數據格式串為%f時,scanf()按float類型將輸入的數據存儲到內存地址中,這時,若再按double類型解釋輸出數據時,數據當然不是用戶輸入的內容了。

『玖』 C語言double的用法

double是一種數據類型 具有比float更高的精度 在32位機中以8個位元組儲存。
用法:同int float 一樣,用於聲明變數或定義函數的返回值類型,或可用於類型強制轉換。
例: double a;//變數聲明
double sqrt_(double b);//定義函數返回至類型及形參類型
c=(double)3;//將「3」強制轉換為double類型並賦給變數c