Saturday, February 21, 2015

ตอนที่ 3: การรับข้อมูลจาก keyboard ด้วย scanf() แบบเบื้องต้น


ในตอนนี้จะพูดถึงการรับข้อมูลอินพุตจากแป้นพิมพ์ (keyboard) โดยใช้ฟังก์ชัน scanf() แบบเบื้องต้น

การทำงานของ scanf()

ฟังก์ชัน scanf() จะทำการอ่านค่าข้อความที่มีรูปแบบ (format string) จากการพิมพ์ keyboard แล้วนำมาเก็บไว้ในที่อยู่ (ตัวแปร) ที่กำหนด ทั้งนี้สามารถอ่านค่าเข้ามาเก็บในตัวแปรหลาย ๆ ตัวในคำสั่งเดียวได้ ซึ่ง scanf() จะให้ผลลัพธ์ในการทำงานเป็นเลขจำนวนเต็มแสดงถึงจำนวนข้อมูลที่นำใส่ตัวแปร กรณีที่อ่านข้อมูลใส่ตัวแปรไม่สำเร็จจะให้ผลลัพธ์เป็นศูนย์

รูปแบบการเขียนคำสั่ง scanf()

กรณีอ่านข้อมูลค่าเดียว
scanf("format string",&var);
กรณีอ่านข้อมูลหลายค่า
scanf("format string", &var1, &var2, ..., &varN);
โดย format string จะเป็นการระบุชนิดข้อมูลที่จะอ่าน (Conversion หรือ Specifier) ซึ่งมีลักษณะ (เบื้องต้น) ดังนี้

  • %c จะอ่านข้อมูล 1  อักขระ
  • %d จะอ่านข้อมูลจำนวนเต็ม (int)
  • %f จะอ่านข้อมูลจำนวนจริง (float หรือ double)
  • %s จะอ่านข้อมูลสตริงหรืออักขระที่เรียงต่อกัน ซึ่งอาจจะมีอักขระหลายตัว

ตัวอย่างการทำงานของ scanf() เป็นดังรูปด้านล่าง


แต่ถ้าหากใส่ข้อมูลไม่ถูกรูปแบบที่ระบุไว้ใน format string จะทำให้ผลการอ่านค่าผิดพลาด ดังรูปด้านล่าง เมื่อ scanf() ครั้งที่ 2 ต้องการอ่านค่าจำนวนเต็ม แต่ใส่เลขจำนวนจริงมีทศนิยม พบว่า scanf() ครั้งที่ 3 จะถูกโดดข้าม และได้ 0.34 มาเป็นข้อมูลแทน

เมื่อ scanf() ครั้งที่ 2  ต้องการอ่านค่าจำนวนเต็ม แต่ใส่ตัวอักขระ พบว่า  scanf() ตัวที่ 3 จะถูกข้าม และได้ข้อมูลเป็น 0.000 มาแทน

สำหรับการอ่านข้อมูลพร้อมกันหลาย ๆ ค่า เราจะเขียนได้โดยระบุชนิดข้อมูลที่จะอ่านหลายค่า แล้วใส่ตัวแปรเป็นรายการตามลำดับ สำหรับการใส่ข้อมูล ผู้ใช้โปรแกรมจะแยกข้อมูลแต่ละตัวออกจากกันโดยใช้ white space คือ การกด เว้นวรรค (spacebar) หรือ แท็บ (tab) หรือ ขึ้นบรรทัดใหม่ (enter/return) ดังตัวอย่างในรูปด้านล่าง ซึ่งเป็นการใส่ข้อมูลทีละค่าแล้วกด enter ก่อนใส่ข้อมูลตัวต่อไป
รูปด้านล่างเป็นตัวอย่างการใส่ข้อมูลแต่ละค่าโดยคั่นด้วยการเว้นวรรค





Source code listing

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*----------------------------------------------------
Program: ScanfDemo
Objectives: Using scanf() for read input from keyboard
Created by Panupong Sornkhom
email: panupongs@nu.ac.th
-----------------------------------------------------*/
#include <stdio.h>
int main()
{
    int iMyVar1,iMyVar2,iAnswer;
    printf("Enter data 1 (integer):");
    /* Read input from keyboard and store in iMyVar */
    scanf("%d",&iMyVar1); 
    
    printf("Enter data 2 (integer):");
    scanf("%d",&iMyVar2);
    
    iAnswer = 3*iMyVar1 + 5*iMyVar2 - 10;
    
    printf("You enter %d and %d\n",iMyVar1,iMyVar2);
    printf("Answer = %d\n",iAnswer);
    
    return 0;
}


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*----------------------------------------------------
Program: ScanfDemo2
Objectives: Using scanf() for read input from keyboard
Created by Panupong Sornkhom
email: panupongs@nu.ac.th
-----------------------------------------------------*/
#include <stdio.h>
int main()
{
    char c;
    int i;
    float f;
    printf("Enter a single character: ");
    scanf("%c",&c); // read a character
    printf("Enter an integer number: ");
    scanf("%d",&i); // read an integer
    printf("Enter a real number: ");
    scanf("%f",&f); // read a real number
    
    /* Show data read from keyboard */
    printf("Here are your entered data\n");
    printf("%c %d %f\n",c,i,f);
    return 0;
}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*----------------------------------------------------
Program: ScanfDemo3
Objectives: Using scanf() for read multiple data
input from keyboard
Created by Panupong Sornkhom
email: panupongs@nu.ac.th
-----------------------------------------------------*/
#include <stdio.h>
int main()
{
    char c;
    int i;
    float f;
    printf("Enter data character integer");
    printf(" and real number respectively: ");
    scanf("%c%d%f",&c,&i,&f); // read a set of data
    
    /* Show data read from keyboard */
    printf("Here are your entered data\n");
    printf("%c %d %f\n",c,i,f);
    
    return 0;
}

คลิป vdo อธิบาย




Friday, February 20, 2015

ตอนที่ 2: ตัวแปร การประกาศตัวแปร และการแสดงค่าตัวแปรโดยใช้ printf()




ในตอนนี้จะพูดถึง ตัวแปร การประกาศตัวแปร และการแสดงค่าตัวแปรออกทางจอภาพโดยใช้คำสั่ง printf()

ตัวแปร

ในการเขียนโปรแกรม มักจะต้องมีการเก็บข้อมูล หรือ เก็บผลลัพธ์ในการคำนวณ ซึ่งคอมพิวเตอร์จะเก็บค่าเหล่านี้ไว้ในหน่วยความจำ โดยโปรแกรมเมอร์จะอ้างถึงหน่วยความจำผ่านตัวแปร เปรียบเสมือนตัวแปรเหมือนกล่องใส่ข้อมูล โปรแกรมสามารถดูได้ว่าในกล่องแต่ละกล่องมีข้อมูลอะไรอยู่ หรือจะเอาข้อมูลใหม่ไปใส่แทนข้อมูลเก่า ก็ทำได้

การประกาศตัวแปร (Variable declaration)

ในภาษา C ก่อนจะเริ่มใช้งานตัวแปร จะต้องมีการประกาศตัวแปรก่อน
รูปแบบคำสั่งการประกาศตัวแปรมีดังนี้

แบบที่ 1: ประกาศตัวแปรตัวเดียว โดยไม่ระบุค่าเริ่มต้น
datatype identifierName;
แบบที่ 2: ประกาศตัวแปรตัวเดียว โดยระบุค่าเริ่มต้น
datatype identifierName = initialValue;
แบบที่ 3: ประกาศตัวแปรหลายตัวที่เป็นชนิดขัอมูลแบบเดียวกัน โดยอาจจะกำหนดค่าเริ่มต้นให้กับตัวแปรบางตัว หรือไม่กำหนด หรือกำหนดทั้งหมดก็ได้
 datatype identifierName1, identifierName2 = initialValue2, identifierName3;

โดย dataType คือชนิดข้อมูล ส่วน identiferName คือ  ชื่อตัวแปร และ initialValue คือ ค่าเริ่มต้นของตัวแปร ซึ่งถ้าเราประกาศตัวแปรโดยไม่กำหนดค่าเริ่มต้น เราจะไม่ทราบว่าตัวแปรที่ประกาศขึ้นมานี้เก็บค่าอะไรอยู่ อาจจะเป็นค่าที่ค้างอยู่เดิมในหน่วยความจำ ซึ่งอาจทำให้การคำนวณในโปรแกรมของเราผิดพลาดได้

สำหรับชนิดข้อมูลในภาษา C มีดังนี้
ชนิดข้อมูล หลัก มี 3 ประเภท ได้แก่
  1. ข้อมูลจำนวนเต็ม (Integer) แบ่งเป็น 3 ประเภทย่อยตามขนาดของหน่วยความจำที่ใช้ คือ
    1. short int หรือ short เป็นข้อมูลจำนวนเต็มขนาดสั้น
    2. int เป็นข้อมูลจำนวนเต็มขนาดปกติ
    3. long int หรือ long เป็นข้อมูลจำนวนเต็มขนาดยาว
  2. ข้อมูลจำนวนจริงมีทศนิยม (Floating-point) แบ่งเป็น 3 ประเภทย่อยตามขนาดของหน่วยความจำที่ใช้ คือ
    1. float เป็นข้อมูลจำนวนจริงขนาดปกติ
    2. double เป็นข้อมูลจำนวนจริงขนาดยาว หรือ ความละเอียด 2 เท่า (double precision) 
    3. long double เป็นข้อมูลจำนวนจริงขนาดยาวกว่า double 
  3. ข้อมูลอักขระ (Character) เป็นข้อมูลชนิดอักขระ ซึ่งในภาษาซีจะเก็บข้อมูลโดยเข้ารหัสตัวอักขระเป็นเลขจำนวนเต็มเพื่อเก็บข้อมูล ส่วนการนำไปแสดงเป็นตัวอักขระก็จะถอดรหัสเลขจำนวนเต็มเป็นตัวอักขระ  ซึ่งรหัสที่ใช้ในภาษา C และเป็นรหัสที่นิยมใช้มากที่สุดในระบบคอมพิวเตอร์ คือรหัส ASCII ย่อมาจาก (American Standard Code for Information Interchange) ดูตารางแสดงรหัส ASCII ได้ที่เว็บ http://www.asciitable.com/
ขนาดของหน่วยความจำที่ใช้ในแต่ละระบบคอมพิวเตอร์ (แต่ละ Compiler) อาจจะไม่เท่ากัน แต่ความสัมพันธ์ระหว่างขนาดจะเป็นเช่นนี้เสมอ คือ
ขนาดของ long  >= ขนาดของ int >= ขนาดของ short
ขนาดของ long double >= ขนาดของ double >= ขนาดของ float 
 รูปด้านล่างนี้แสดงตัวอย่างขนาดของหน่วยความจำที่ใช้สำหรับแต่ละชนิดข้อมูล ในระบบ c9.io
หมายเหตุ นอกจากการแบ่งชนิดข้อมูลตามขนาดของหน่วยความจำที่ใช้แล้ว เรายังสามารถแบ่งย่อยข้อมูลจำนวนเต็มตามลักษณะการคิดเครื่องหมายได้อีกด้วย คือ
  1. แบบคิดเครื่องหมาย (signed) เป็นข้อมูลที่มีค่าเป็นบวกหรือลบได้ 
  2. แบบไม่คิดเครื่องหมาย (unsigned) เป็นข้อมูลที่เป็นบวกเพียงอย่างเดียว
โดยปกติชนิดข้อมูลทั้งหมดที่กล่าวมาก่อนหน้านี้จะเป็นแบบคิดเครื่องหมาย แต่เราสามารถประกาศตัวแปรให้เป็นแบบไม่คิดเครื่องหมายได้โดยเติมคำว่า unsigned ไปข้างหน้า เช่น unsigned int aa; คือ การประกาศตัวแปรชื่อ aa เป็นข้อมูลจำนวนเต็มแบบไม่คิดเครื่องหมาย ทั้งนี้ int และ unsigned int จะใช้พื้นที่ในการเก็บข้อมูลเท่ากัน แต่ int จะเก็บค่าได้ตั้งแต่ -2,147,483,648 ถึง 2,147,483,647 ในขณะที่ unsigned int จะเก็บค่าได้ตั้งแต่ 0 ถึง 4,294,967,295

การแสดงค่าตัวแปรออกทางจอภาพโดยใช้คำสั่ง printf()

printf() สามารถใช้แสดงค่าตัวแปรออกทางจอภาพได้ โดยใช้รูปแบบดังต่อไปนี้

printf("Message with %specifier", variable);
โดย variable คือตัวแปรที่ต้องการแสดงค่า ส่วน specifier คือ สิ่งที่ใช้ระบุชนิดหรือรูปแบบข้อมูลที่จะแสดง ซึ่ง specifier ที่ควรรู้เบื้องต้นมีดังนี้

  • %c จะแสดงตัวอักขระ 1 ตัว
  • %d หรือ %i จะแสดงค่าจำนวนเต็มเลขฐานสิบแบบคิดเครื่องหมาย
  • %e หรือ %E จะแสดงเลขจำนวนจริง float หรือ doubleในรูปแบบเลขยกกำลัง เช่น \[2.56\times10^5\] จะแสดงเป็น 2.56e5 (ถ้าใช้ %E จะเป็น E ตัวใหญ่แทน e)
  • %f จะแสดงเลขจำนวนจริง float หรือ double ในรูปแบบเลขทศนิยม
  • %u จะแสดงเลขจำนวนเต็มแบบไม่คิดเครื่องหมาย
นอกจากนี้เราสามารถใช้ตัว l สำหรับการระบุข้อมูลชนิด long ร่วมกับ specifier ตัวอื่นได้ เช่น
  • %ld จะแสดงเลขจำนวนเต็มแบบยาวและคิดเครื่องหมาย (long int)
  • %lu จะแสดงเลขจำนวนเต็มแบบยาวไม่คิดเครื่องหมาย (unsigned long int)

ในกรณีที่ต้องการแสดงค่าตัวแปรมากกว่า 1 ตัวในข้อความเดียวกันก็ทำได้ ตัวอย่างเช่น
printf("Var1  = %d  Var2 = %d  Var3 = %d", a, b, c); 
โปรแกรมจะแสดงข้อความโดยนำค่าจากตัวแปร a, b, และ c ไปใส่แทน %d ในข้อความตามลำดับ

Source code listing


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*----------------------------------------------------
Program: VariableDemo
Objectives: 
    (1) Variables and declaration
    (2) Displaying variables by using printf()
Created by Panupong Sornkhom
email: panupongs@nu.ac.th
-----------------------------------------------------*/
#include <stdio.h>
int main()
{
    /*----------------------------------------------
    เมื่อคอมพิวเตอร์ต้องเก็บข้อมูล เช่น รับข้อมูลจากผู้ใช้ 
    หรือเก็บผลลัพธ์จากการคำนวณ คอมพิวเตอร์จะเก็บข้อมูลไว้ใน
    หน่วยความจำ ซึ่งการเข้าถึงหน่วยความจำนั้น
    ในการเขียนโปรแกรมจะทำผ่านตัวแปร โดยจะต้องทำการ
    ประกาศตัวแปร ซึ่งรูปแบบของคำสั่งในการประกาศตัวแปร คือ
        dataType variableName;
    หรือ
        dataType variableName = initialValue;
    เมื่อ dataType คือ ชนิดข้อมูล
        variableName คือ ชื่อตัวแปร
    กรณีมีตัวแปรหลายตัว ระบุโดยคั่นด้วยเครื่องหมาย ,
    -------------------------------------------------*/
    
    /* ประกาศตัวแปรจำนวนเต็ม ชื่อ iVariable1*/
    int iVariable1 = 5; 
    /* ประกาศตัวแปรจำนวนจริง ชื่อ fVariable2 */
    float fVariable2 = 3.14;  
    /* ประกาศตัวแปรอักขระ ชื่อ cVariable3 */
    char cVariable3 = 'A';
    
    /*----------------------------------------------
    การแสดงค่าตัวแปรโดยใช้ printf() ทำได้โดย
    ระบุ Format Specifiers โดยใช้เครื่องหมาย % 
    ภายในเครื่องหมายคำพูดที่จะแสดงข้อความ
    แล้วระบุตัวแปรที่ต้องการแสดงค่า ตัวอย่างเช่น
    printf("A = %d",var); 
    คือ แสดงข้อความ A = ค่่าของตัวแปรvar
    หากมีตัวแปรที่ต้องการแสดงค่าหลายตัว ให้ระบุโดยคั่นด้วย ,
    ----------------------------------------------*/
    printf("Answer = %d\n",iVariable1);
    printf("Answer2 = %f\n",fVariable2);
    printf("Answer3 = %c\n",cVariable3);
    printf("FinalAnswer = %f\n",
        iVariable1+fVariable2);
    printf("%d * %f = %f\n",iVariable1,fVariable2,
        iVariable1*fVariable2);
    return 0;
}




 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*----------------------------------------
Program: Datatypes in C program
Objectives:
    (1) Show various datatypes 
        and size of memory required
    (2) Show format identifiers
        related to datatypes
    (3) Show the limitation value of
        each datatype
Created by Panupong Sornkhom
email: panupongs@nu.ac.th
----------------------------------------*/
#include <stdio.h>
#include <limits.h> // ใช้กับค่าคงที่ เช่น INT_MAX 
#include <float.h>  // ใช้กับค่าคงที่ที่เกี่ยวกับกับ floating-point number
int main()
{
    // declare character variable c
    char c = 'x'; 
    // declare short variable s
    short s = 12345;
    // declare integer variable i
    int i = 1234567890; 
    // declare long variable l
    long l = 1234567890123;
    // declare floating-point vairable f
    float f = 12.9876543210;
    // declare double precision variable d
    double d = 12.9876543210; 
    // declare long double variable ld
    long double ld = 12.9876543210L; 
    
    /*
    * ใช้ sizeof เพื่อดูขนาดของหน่วยความจำ
    * เป็นจำนวน byte ที่ใช้ในแต่ละตัวแปร
    */
    printf("Size of char = %lu byte\n",sizeof c);
    printf("Size of short = %lu bytes\n",sizeof s);
    printf("Size of int = %lu bytes\n",sizeof i);
    printf("Size of long = %lu bytes\n",sizeof l);
    printf("Size of float = %lu bytes\n",sizeof f);
    printf("Size of double = %lu bytes\n",sizeof d);
    printf("Size of long double = %lu bytes\n",sizeof ld);
    
    /* 
    * แสดงความแตกต่างระหว่าง signed กับ unsigned 
    * โดยแสดงค่าคงที่ที่ประกาศไว้ในไฟล์ limits.h
    */
    printf("Minimum value of type (signed) int = %d\n",INT_MIN);
    printf("Maximum value of type (signed) int = %d\n",INT_MAX);
    printf("Minimum value of type unsigned int = %d\n",0);
    printf("Maximum value of type unsigned int = %u\n",UINT_MAX);
    
    /*
    * แสดงค่าของตัวแปรชนิดต่าง ๆ ด้วย printf 
    */
    printf("c = %c\n",c);
    printf("s = %d\n",s);
    printf("i = %d\n",i);
    printf("l = %ld\n",l);
    printf("f = %e\n",f);
    printf("f = %f\n",f);
    printf("f = %.6f\n",f);
    printf("d = %e\n",d);
    printf("d = %f\n",d);
    printf("d = %.15f\n",f);
    printf("ld = %Le\n",ld);
    printf("ld = %Lf\n",ld);
    printf("ld = %.18Lf\n",ld);
    printf("Number of digits in float = %d\n",FLT_DIG);
    printf("Number of digits in double = %d\n",DBL_DIG);
    printf("Number of digits in long double = %d\n",LDBL_DIG);
    return 0;
}

คลิป VDO อธิบาย