計算機程式設計_step5

Download Report

Transcript 計算機程式設計_step5

計算機程式設計
-- 5. 基本輸入,scanf()
李增奎
大綱 --基本輸入,scanf()
基本輸出與輸入
整數 scanf("…%d…", &a)
浮點數 scanf("…%f…", &a)
字元 scanf("…%c…", &a)
使用 scanf 的注意事項
多個參數的情況
字串 scanf("…%s…", a)
綜合範例








2
基本輸出與輸入
基本輸出與輸入




stdio.h – 存放檔案
使用 基本輸出與輸入時,記得 include
#include <stdio.h>
輸出




printf
print 表輸出
"f" 代表 格式化 的意思,也就是 顯示時,按照特定的格式。
輸入




3
scanf
scan 表示輸入,基本上是透過 鍵盤輸入,scan 的意思是掃描輸
入端是否有訊號進來。
f 一樣也是表示格式化的意思,也就是,使用者輸入時需按特定
的格式輸入,程式才會得到正確輸入資料。(否則會發生問題)
整數 scanf("…%d…", &a)
scanf("…%d…", &a)


"…%d…" :



代表 格式化輸入的 格式 字串,
%d, specifier, 基本上和 printf 的是一樣的,
&a :



和 printf 一樣,在 "…%d…" 有幾個 %d 就要在後面附加幾個 變數,
基本上,變數的型別 和 格式化字串 中的 specifier 要互相配合到,
不同的是,

4
scanf 這邊要記得在每個變數前加上 & (取址符號)。
scanf("…%d…", &a)
%d:整數,
例:


int i;
printf("請輸入一個整數:");
scanf("%d", &i);
printf("您輸入的是%d。\n", i);
5
//通常先利用 printf 提示使用者要幹嘛!
// scanf 會讓程式 等在這裡,
// 記得輸入完要按 enter,
// 這邊 做個簡單的輸出,看看有沒有正確
浮點數 scanf("…%f…", &a)
%f:單精度浮點數 – float
%lf:倍精度浮點數 – double
例:



float a;
double b;
printf("請輸入一個浮點數:");
scanf("%f", &a);
printf("請再輸入一個浮點數:");
scanf("%lf", &b);
// 注意,b 是 double,所以用 %lf
printf("您輸入的是%f 和 %f。\n", a, b);
6
字元 scanf("…%c…", &a)
%c:字元,
例:


char c;
printf("請輸入一個字元:");
scanf("%c", &c);
printf("您輸入的是%c。\n", c);
7
使用 scanf 的注意事項
注意事項


"…%f…" :




double 要用 "%lf" – long float 的意思,表倍精度浮點數,
float 用 "%f" ,表單精度浮點數,
由於,單精度和倍精度 在 記憶體內儲存的格式不同,所以,寫程式時一
定要記得。
&a :

scanf 這邊要記得在每個變數前加上 & (取址符號),


理由,



8
其實也未必,如果是 指標變數的話,基本上不用加& ,
scanf 這邊是要把 輸入的資料 存到記憶體內,所以,要告訴它,資料要儲去哪,
而 printf 是把資料印出來,
事實上,scanf 後面的參數 只要給整數值(即位址)就可以了,而在資料取得後,
就會存放到那個整數值對應的記憶體位置,可是通常我們沒辦法得知我們變數的
位址是多少,所以必須用 取址運算 & 才行。
請特別注意,如果給了一個整數給 scanf,它可能不會發生錯誤哦!只是
資料會存到錯誤的位置。(既然 編譯器不會告訴我們錯了,我們就必須自
己嚴加注意!有些編譯器會提示警告—太多人會犯錯了)
使用 scanf 的注意事項
如果沒有 & 的情況,例:

int i;
printf("請輸入一個整數:");
scanf("%d", i);
printf("您輸入的是%d。\n", i);
9
// & 拿掉 試看看!
使用 scanf 的注意事項

double vs. float

正確:

錯誤: float a;
float a;
double b;
printf("請輸入一個浮點數:");
scanf("%f", &a);
printf("請再輸入一個浮點數:");
scanf("%lf", &b);
// 注意,b 是 double,所以用 %lf
printf("您輸入的是%f 和 %f。\n", a, b);
double b;
printf("請輸入一個浮點數:");
scanf("%f", &a);
printf("請再輸入一個浮點數:");
scanf("%f", &b);
// 注意,b 是 double,所以用 %f 會發生問題
printf("您輸入的是%f 和 %f。\n", a, b);
10
多個參數的情況



和 printf 一樣,
scanf("…%d…%d….", &a, &b)
例:
int a,b;
printf("請輸入書籍的單價及購買量(例,5, 200):");
scanf("%d, %d", &a, &b);
printf("總價是%d。\n", a*b);

11
本例順便展示:printf 的參數可以是計算的結果(或者是值),不一
定只能填 變數。
字串 scanf("…%s…", a)

scanf("…%s…", a)


%s,表 輸入字串,
字串變數


事實上是 字元陣列,(先不用管是什麼,先用著)
宣告:





12
char *s = "李增奎";
//使用字串池….. 不可修改內容
printf("姓名是 %s", s);
或者
char s[100] = "李增奎"; //使用一般記憶體區塊…..可修改內容
printf("姓名是 %s", s);
字串

scanf("…%s…", a)

例子:

正確, [打中文時要注意,在web介面上輸入有點怪]
char name[100];
printf("請輸入姓名:");
scanf("%s", name);
printf("%s,您好!\n", name);

//注意哦,這裡沒有 & 。
錯誤,
char *name;
//事實上,name會指向 位址0,此位址無法寫入資料
printf("請輸入姓名:");
scanf("%s,", name);
printf("%s,您好!\n", name);
13
綜合範例

例:
char name[20];
char sid[11];
int grade;
double height;
printf("請輸入以下資料,\n學號:");
scanf("%s", sid);
//注意哦,這裡沒有 & 。
printf("姓名:");
scanf("%s", name);
//注意哦,這裡沒有 & 。
printf("年級:");
scanf("%d", &grade);
//注意哦,這裡有 & 。
printf("身高(單位公分):");
scanf("%lf", &height);
//注意哦,這裡有 & 。
printf("\n您好,您輸入的資料如下:\n學號:%s\n姓名:%s\n年級:
%d\n身高:%f公分\n", sid, name, grade, height);
14