39
1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี ในปี ค.ศ. 1972 Dennis Ritchie เป็นผู้คิดค้นเขียนภาษาซีขึ้นมาเป็น ครั้งแรก โดยพัฒนามาจากภาษา B และภาษา BCPL แต่ในขณะนั้นยังไม่มีการ ใช้งานภาษาซีอย่างกว้างขวางนัก จนกระทั้งต่อมาในปี ค.ศ. 1978 Brian Ker- nighan ได้ร่วมกับ Dennis Ritchie พัฒนามาตรฐานของภาษาซีขึ้น เรียกว่า K&R (Kernighan & Ritchie) และเขียนหนังสือชื่อ “The C Programming Language” ออกมาเป็นเล่มแรก ทาให้เริ่มมีผู้สนใจภาษาซีมากขึ้น และด้วย ความยืดหยุ่นของภาษาซีที่สามารถปรับใช้งานกับคอมพิวเตอร์ชนิดต่าง ๆ ได้ ทาให้ภาษาซีได้รับความนิยมเพิ่มมากขึ้นเรื่อยๆจนแพร่หลายไปทั่วโลก จนมีบริษัทต่างๆสร้างและผลิต ภาษาซีออกมาเป็นจานวนมาก เกิดเป็นภาษาซีในหลากหลายรูปแบบ เนื่องจากในขณะนั้นยังไม่มีการ กาหนดมาตรฐานสาหรับการสร้างภาษาซี ดังนั้นในปี ค.ศ. 1988 Richie และ Kernighan จึงได้ร่วมกับ ANSI ( American National Standards Institute) สร้างมาตรฐานของภาษาซีขึ้น เรียกว่า ANSI C เพื่อ ใช้เป็นตัวกาหนดมาตรฐานในการสร้างภาษาซีรุ่นต่อ ๆ ไป ในปัจจุบันภาษาซียังคงได้รับความนิยมและใช้งานอย่างกว้างขวาง เนื่องจากเป็นภาษาระดับกลาง (middle-level language) ที่เหมาะกับการเขียนโปรแกรมแบบโครงสร้าง (structured progamming) และเป็นภาษาที่มีความยืดหยุ่นมาก คือ ใช้งานกับเครื่องต่าง ๆ และที่สาคัญในปัจจุบันภาษาโปรแกรมรุ่น ใหม่เช่น C++, Perl, Java, C# ฯลฯ ยังใช้หลักการของภาษาซีเป็นพื้นฐานด้วย กล่าวคือหากมีพื้นฐานของ ภาษาซีมาก่อน ก็จะสามารถศึกษาภาษารุ่นใหม่เหล่านี้ได้ง่ายขึ้น 2. ขั้นตอนการพัฒนาโปรแกรมภาษาซี ขั้นตอนที่ 1 เขียนโปรแกรม (source code) ใช้ editor เขียนโปรแกรมภาษาซี และทาการบันทึกไฟล์ให้มีนามสกุลเป็น . c เช่น test.c เป็นต้น

บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

1

บทท 3

พนฐานภาษาซ

1. ประวตความเปนมาของภาษาซ

ในป ค.ศ. 1972 Dennis Ritchie เปนผคดคนเขยนภาษาซขนมาเปน

ครงแรก โดยพฒนามาจากภาษา B และภาษา BCPL แตในขณะนนยงไมมการ

ใชงานภาษาซอยางกวางขวางนก จนกระทงตอมาในป ค.ศ. 1978 Brian Ker-

nighan ไดรวมกบ Dennis Ritchie พฒนามาตรฐานของภาษาซขน เรยกวา

K&R (Kernighan & Ritchie) และเขยนหนงสอชอ “The C Programming

Language” ออกมาเปนเลมแรก ท าใหเรมมผสนใจภาษาซมากขน และดวย

ความยดหยนของภาษาซทสามารถปรบใชงานกบคอมพวเตอรชนดตาง ๆ ได

ท าใหภาษาซไดรบความนยมเพมมากขนเรอยๆจนแพรหลายไปทวโลก จนมบรษทตางๆสรางและผลต

ภาษาซออกมาเปนจ านวนมาก เกดเปนภาษาซในหลากหลายรปแบบ เนองจากในขณะนนยงไมมการ

ก าหนดมาตรฐานส าหรบการสรางภาษาซ ดงนนในป ค.ศ. 1988 Richie และ Kernighan จงไดรวมกบ

ANSI (American National Standards Institute) สรางมาตรฐานของภาษาซขน เรยกวา ANSI C เพอ

ใชเปนตวก าหนดมาตรฐานในการสรางภาษาซรนตอ ๆ ไป

ในปจจบนภาษาซยงคงไดรบความนยมและใชงานอยางกวางขวาง เนองจากเปนภาษาระดบกลาง

(middle-level language) ทเหมาะกบการเขยนโปรแกรมแบบโครงสราง (structured progamming)

และเปนภาษาทมความยดหยนมาก คอ ใชงานกบเครองตาง ๆ และทส าคญในปจจบนภาษาโปรแกรมรน

ใหมเชน C++, Perl, Java, C# ฯลฯ ยงใชหลกการของภาษาซเปนพนฐานดวย กลาวคอหากมพนฐานของ

ภาษาซมากอน กจะสามารถศกษาภาษารนใหมเหลานไดงายขน

2. ขนตอนการพฒนาโปรแกรมภาษาซ

ขนตอนท 1 เขยนโปรแกรม (source code)

ใช editor เขยนโปรแกรมภาษาซ และท าการบนทกไฟลใหมนามสกลเปน .c เชน test.c เปนตน

Page 2: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

2

editor คอ โปรแกรมทใชส าหรบการเขยนโปรแกรม โดยตวอยางของ editor ทนยมน ามาใช

เขยนโปรแกรมไดแก Notepad, Code Blocks เปนตน ผเขยนโปรแกรมสามารถเลอกใชโปรแกรมใดใน

การเขยนโปรแกรมกได แลวแตความถนดของแตละบคคล

ขนตอนท 2 คอมไพลโปรแกรม (Compile)

น า source code จากขนตอนท 1 มาท าการคอมไพลเพอแปลจากภาษาซเปนภาษามนษยเขาใจ

ไปเปนภาษาเครองทคอมพวเตอรเขาใจได ในขนตอนนคอมไพเลอรจะท าการตรวจสอบ source code วา

เกดขอผดพลาดหรอไม

หากเกดขอผดพลาด จะแจงใหผเขยนโปรแกรมทราบ ผเขยนโปรแกรมจะตองกบไปแกไขโปรแกรม

และท าการคอมไพลโปรแกรมใหมอกครง

หากไมพบขอผดพลาด คอมไพเลอรจะแปลไฟล source code จากภาษาซไปเปนภาษาเครอง(ไฟล

นามสกล .obj) เชน ถาไฟล source code ชอ test.c กจะถกแปลไปเปนไฟลชอ test.obj ซงเกบ

ภาษาเครองไว เปนตน

คอมไพเลอร (compiler) เปนตวแปลภาษารปแบบหนง มหนาทหลกคอการแปลภาษา

โปรแกรมทมนษยเขยนขนไปเปนภาษาเครอง โดยคอมไพลของภาษาซ คอ C compile ซงหลกการท

คอมไพเลอรใช เรยกวา คอมไพล (compile) โดยจะท าการอานโปรแกรมภาษาซทงหมดตงแตตนจนจบ

แลวท าการแปลผลทเดยว

นอกจากคอมไพเลอรแลว ยงมตวแปลภาษาอกรปแบบหน งเรยกวา อนเตอรพรเตอร

(interpreter) ซงหลกการท างานจะแตกตางกบคอมไพเลอร คอ อนเตอรพรเตอรจะท าการอานและแปล

โปรแกรมทละบรรทด เมอแปลผลบรรทดหนงเสรจกจะท างานตามค าสงในบรรทดนน แลวจงท าการแปล

ผลและท าตามค าสงในบรรทดไป หลกการทอนเตอรพรเตอรใช เรยกวา อนเตอรเพรต (interpret)

ตารางท 1 ขอดและขอเสยของตวแปลภาษาทงสองรปแบบมดงน

วธการ ขอด ขอเสย คอมไพเลอร - ท างานไดเรว เนองจากท าการแปลผลทเดยว

แลวจงท างานตามค าสงของโปรแกรมในภายหลง - เมอท าการแปลผลแลว ในครงตอไปไมจ าเปนตองท าการแปลผลใหมอกเนองจากภาษาเครองทแปลไดจะถกเกบไวทหนวยความจ า สามารถเรยกใชงานไดทนท

- เมอเกดขอผดพลาดขนกบโปรแกรมจะตรวจสอบหาขอผดพลาดไดยาก เพราะท าการแปลผลทเดยวทงโปรแกรม

Page 3: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

3

วธการ ขอด ขอเสย อนเตอรพรเตอร - หาขอผดพลาดของโปรแกรมไดงายเนองจาก

ท าการแปลผลทละบรรทด - เนองจากท างานทละบรรทดดงนนจงสงใหโปรแกรมท างานเฉพาะจดทตองการได - ไมเสยเวลารอการแปลโปรแกรมเปนเวลานาน

- ชา เนองจากท างานทละบรรทด

จากหลกการของตวแปลภาษาทงสองแบบน ภาษาซจดเปนภาษาคอมพวเตอรทใชตวแปลภาษา

แบบคอมไพเลอร

ขนตอนท 3 เชอมโยงโปรแกรม (link)

การเขยนโปรแกรมภาษาซนนผเขยนโปรแกรมไมจ าเปนตองเขยนค าสงตางๆขนใชงานเอง

เนองจากภาษาซมฟงกชนมาตรฐานใหผเขยนโปรแกรมสามารถใชงานได เชน การเขยนโปรแกรมแสดง

ขอความ “Hello” ออกทางหนาจอ ผเขยนโปรแกรมสามารถเรยกใชฟงกชน print() ซงเปนมาตรฐานของ

ภาษาซมาใชงานได โดยสวนการประกาศ (declaration) ฟงกชนมาตรฐานตางๆจะถกจดเกบอยในแฮด

เดอรไฟลแตละตว แตกตางกไปตามลกษณะการใชงาน ซงรายละเอยดเกยวกบเฮดเดอรไฟลจะไดกลาวถง

ในภายหลง

ดวยเหตน ภาษาเครองทไดจากขนตอนท 2 จงสามารถน าไปใชงานได แตตองน ามาเชอมโยง

(link) เขากบlibrary กอน ซงผลจากการเชอมโยงจะท าใหได executable program (ไฟลนามสกล .exe

เชน test.exe) ทสามารถน ามาใชงานได

คอมเมนตแบบรรทดเดยว ใชเครองหมาย //

คอมเมนตแบบหลายบรรทด ใชเครองหมาย /* และ*/

ตวอยางท 3.1 คอมเมนตในภาษาซ

1: //comment only one line

2: #include <stdio.h>

3: main () สวนทเปนคอมเมนตจะไมไดรบการแปลผล

4: {

5: /*comment

6: many

7: line*/

8: }

Page 4: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

4

กฎการตงชอ

ภาษาซมเกณฑในการตงชอใหกบ Identtifier ซงไดแก ตวแปร, ฟงกชน และเลเบล ดงน

ชอทตงจะตองไมซ ากบค าสงวน (ressrved word) ในภาษาซ

ชอตางๆทตงจะเปนแบบ case-sensitive หมายความวาตวอกษรใหญกบตวอกษรเลก ถอวา เปนคน

ละตวกน เชน TEST, Test, test, tEsT ถอวาเปนคนละชอกน

ชอจะตองขนตนดวยตวอกษรหรอเครองหมาย underscore (_) เทานน จะขนดวยตวเลขไมได แต

ภายในชอสามารถประกอบดวยตวอกษร เครองหมาย underscore หรอตวเลขกได เชน TEST_VALUE,

HELLO123, h1_T2_UserName เปนตน

การตงชอจะเวนวรรค (มชองวางหรอแทบภายในชอ) ไมได

การตงชอจะประกอบดวยอกขระพเศษเชน $, @, #, & ไมได

ตวอยางท 3.2 การตงชอทถกตองและไมถก

ชอทถกตอง a b1 app_passwd _testValue TRUE

ชอทไมถกตอง

$hello เพราะชอมอกขระพเศษคอ $

User name เพราะชอมชองวาง

3people เพราะชอขนตนดวยตวเลข

while เพราะชอซ ากบค าสงวนภาษาซ

data%type เพราะมอกขระพเศษคอ %

asm defaulf for pascal switch _ds

auto do goto register typedef _es

break double huge retum union _ss

case else if shortu nsigned

cdecl enum int signed void

char extem nterrupt sizeof volatile

cons far ong static while

continue float near struct _cs

Page 5: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

5

3. โครงสรางภาษาซเบองตน

การเขยนโปรแกรมคอมพวเตอรนนผเขยนโปรแกรมจะตองทราบหลกการและรปแบบของ

โปรแกรมภาษานนๆ ภาษาซกเชนเดยวกนรปแบบของภาษานประกอบดวยสวนตางๆ 5 สวน ไดแก สวน

ทเปนพรโพรซอรไดเรกทฟ สวนทก าหนดคา สวนทเปนฟงกชนหลก (main) การสรางฟงกชน และอธบาย

โปรแกรม โดยผพฒนาโปรแกรม จะตองทราบวาแตละสวนนนมรปแบบการเขยนอยางไร

3.1 โครงสรางโปรแกรม

การเขยนโปรแกรมแตละภาษานนโครงสรางของโปรแกรมจะตางกน ในบทนจะกลาวถง

โครงสรางของการเขยนโปรแกรมดวยภาษาซ (c/c++) รวมทงการเขยนโปรแกรมอยางงาย ลกษณะ

โครงสรางของภาษาซแบงออกไดเปน 5 สวนดงดงน

1.พรโพรเซสเซอรไดเรกทฟ (Preprocessor directieves)

2.สวนทก าหนดคา(Glodal declaration)

3.สวนฟงกชนหลก(The main() function)

4.การสรางฟงกชนและการใชฟงกชน(Program comments)

preproessor directives

globl declaration

void main ()

{

local declarations

statements

} //main

function

ดงตวอยางเชน

#include<stdio.h>

void main ()

{

printf (“Hello World! \n”);

}

Page 6: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

6

โครงสรางของโปรแกรมประกอบดวยหลายสวน แตในการเขยนโปรแกรมนนเราไมจ าเปนตอง

เขยนหมดทกสวน สวนใดทไมใชกสามารถตดทงได แตทกโปรแกรมตองมสวนพรโพรเซสเซอรไดเรกทฟ

และสวนฟงกชนหลก รายละเอยดสวนตางๆ เปนดงน

3.1.1 พรโพรเซสเซฮรไดเรกทฟ (Preprocessor dilectives)

สวนนทกโปรแกรมตองม จะใชส าหรบเรยกไฟลทโปรแกรมตองการในการท างาน และก าหนดคาต าง โดย

คอมไพเลอรจะกระท างานตามค าสงกอนทจะคอมไพลโปรแกรม ซงจะตองเรมตนดวยเครองหมาย ไดเรก

ทฟ (directive)#และตามดวยชอโปรแกรมหรอชอตวแปรทตองการก าหนดคา สวนนอาจเรยกอชอหนงวา

สวนหวโปรแกรม(Header Part)ส าหรบไดเรกทฟท ใชกนบอยๆไดแก #include เปนการแจงให

คอมไพเลอรอานไฟลอนเขามาคอมไพลรวมดวย รปแบบการใชจะท าโดยเขยน # include แลวตามดวย

ชอไฟลดงน

รปแบบ

#include ชอไฟล

#include “stdio.h’’ ความหมายวา อานไฟล stdio.h เขามาดวย

#include”Pro1.c’’ ความหมายวา อานไฟล Pro1.c เขามาดวยกน

การก าหนดชอไฟลตามหลง #include นน อาจใชเครองหมาย< > ครอมชอไฟลกไดซงจะเปน

การอานไฟลจากไกเรกทอรทก าหนดไวกอน แตถาใช “ “ เปนการอานไฟลจากไดเรกทอรปจจบนทก าลง

อย และไฟลทจะ include เขามานจะตองไมมฟงกชน main() โดยมากแลวจะประกอบดวยโปรแกรมยอย

คาคงทก าหนดตางๆ

#define เปนการก าหนดคานพจนตางๆ ใหกบชอของตวแปร โดยมรปแบบดงน

รปแบบ

#define ANME VALUE

#define END 20; ก าหนด END มคาเทากบ 20

#define A 5*6+3 ก าหนดA มคาเปน 5*6+3

3.1.2 สวนทประกาศ ( Global declarations)

สวนทจะใชในการประกาศตวแปรหรอฟงกชทตองใชในโปรแกรม โดยทกๆ สวนของโปรแกรม

สามารถจะเรยกใชขอมลทประกาศไวในสวนนได สวนนบางโปรแกรมอาจไมมกได ส าหรบรายละเอยด

ตางๆ จะกลาวตอไปน

Page 7: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

7

3.1.3 สวนฟงกชนหลก (main()function)

สวนนทกโปรแกรมจะตองม ซงจะประกอบไปดวยประโยคค าสงตางๆทจะใหโปรแกรมท างาน

โดยค าสงตางๆ มาตอเรยงกน และแตละประโยคค าสงจะจบดวยเคร องหมายเซมโคลอน(Semi colon ;)

โดยโปรแกรมหลกนจะเรมตนดวย main() ตามดวยเครองหมายปกกาเปด { และจบดวยเครองหมายปกกา

ปด}

3.1.4 สวนก าหนดฟงกชนขนใชเอง (Program comments)

สวนทใชเขยนคอมเมนตโปรแกรม เพออธบายงานตางๆ ท าใหผศกษาโปรแกรมในภายหลงท า

ความเขาใจโปรแกรมไดงายขน เมอคอมไพลโปรแกรมสวนนจะถกขามไป

4. ตวแปรกบชนดของขอมล

ในการเขยนโปรแกรมดวยภาษาซนน หากมการประกาศตวแปรขนมาใชงานแลว ผเขยน

โปรแกรมจะตองก าหนดชนดของขอมลใหกบตวแปรนนดวย ตลอดจนความสมพนระหวางตวแปรและ

ชนดของขอมลวามความเกยวของกนอยางไร

ตวแปร (Variables )

ตวแปร คอ ชอทก าหนดขนเพอใชในการเกบขอมล ซงการประกาศตวแปรขนมาใชงานจะ

เปนไปตามกฎการตงชอทไดกลาวไวแลวใบบทท 1

ชนดของขอมล (Data Type)

ชนดของขอมล คอ สงทก าหนดลกษณะและขอบเขตของขอมลนนๆโดยขอมลทมชนดของ

ขอมลแตกตางกน กจะเกบขอมลไดในลกษณะทตางกน และขอบเขตของขอมลทเกบไดกจะไมเทากนซง

ในภาษาซแบงชนดของขอมลออกเปน 4 แบบ คอ

ชนดขอมลแบบ void

ชนดขอมลแบบตวอกษร

ชนดขอมลแบบเลขจ านวนเตม

ชนดขอมลแบบเลขทศนยม

ชนดขอมลแบบ void (0 ไบต) ชนดขอมลแบบนจะไมมคา ซงเราจะไมใชชนดขอมลแบบ void นก าหนดใหกบตวแปร แตจะ

น าชนดขอมลประเภทนก าหนดไวทฟงกชนในกรณทไมตองการใหฟงกชนมการรบคาใด ๆ เขาหรอสงคา

ใด ๆ กลบไป

Page 8: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

8

ชนดขอมลแบบตวอกษร (character) (1 ไบต)

คอชนดขอมลประเภท char ซงชนดของขอมลในรปแบบนจะเกบขอมลได 1 ตวอกษรเทานน

ผเขยนโปรแกรมอาจจะคดวาคอมพวเตอรท าการเกบขอมลชนดตวอกษรนในรปแบบของตวอกษร เชน

เมอก าหนด char A = a : แลวคอมพวเตอรจะเกบคา a ไวในตวแปร A แตในความเปนจรงไมเปน

เชนนน คอมพวเตอรจะเกบขอมลในลกษณะของรหสแอสก (ASCII : American Standard Code for

Information Interchange) เชน ในทนคอมพวเตอรจะเกบคาของตวแปร A เปน 0110 0001 ใน

ระบบเลขฐานสอง (มคาเทากบ 97 ในระบบเลขฐานสบ) ซงเปนรหสแอสกของตวอกษร a นนเอง

ซงจากการทคอมพวเตอรเกบขอมลชนดตวอกษรในรปแบบของรหสแอสก 1 ไบต (8 บต) นนท า

ใหขอมลชนดตวอกษรเทยบไดกบขอมลชนดเลขจ านวนเตมทมคาตงแต 0 ถง 255 (ส าหรบขอมลชนด

ตวอกษรแบบไมคดเครองหมาย หรอ unsigned char ) และมคาตงแต - 128 ถง 127 (ส าหรบขอมล

ชนดตวอกษรแบบคดเครองหมาย หรอ singned char)

ตารางท 2 แสดงคาในระบบเลขฐานสอง และฐานสบส าหรบขอมลชนดตวอกษร

คาในระบบเลขฐานสอง คาในระบบเลขฐานสบ เมอมองเปนขอมลชนด

unsigned char

คาในระบบเลขฐานสบ เมอมองเปนขอมลชนด

singned char 0000 0000 0 0 0000 0001 1 1 0000 0010 2 2 0000 0011 3 3

… … … 0111 1100 124 124 0111 1101 125 125 0111 1110 126 126 0111 1111 127 127 1000 0000 128 -128 1000 0001 129 -127 1000 0010 130 -126 1000 0011 131 -125

… … … 1111 1100 252 -4 1111 1101 253 -3 1111 1110 254 -2 1111 1111 255 -1

Page 9: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

9

และเมอเปรยบเทยบขอมลชนดตวอกษรวาเปนขอมลตวเลขแลว กไมนาแปลกทจะน าขอมลชนด

ตวอกษรมากระท าการทางคณตศาสตรตางๆได ตวอยางเชน

ชนดขอมลแบบเลขจ านวนเตม (Integer)

เปนขอมลแบบเลขจ านวนเตม เชน 1 ,3 ,50 ,...... เรยกไดอกอยางวา Integral

Number ซงภาษาซแบงชนขอมลแบบเลขจ านวนเตมออกเปน 3 ประเภท คอ

short int เปนเลขจ านวนเตมแบบสน เรยกงายๆวา shot

imt เปนเลขจ านวนเตมแบบปกต

long ing เปนเลขจ านวนเตมแบบยาว เรยกงายๆวา long

ตารางท 3 แสดงขนาดของชนดขอมลแบบเลขจ านวนเตมในแตละประเภท

ประเภท การคด

เครองหมาย จ านวนไบต คาต าสด คาสงสด

short int signed 2 (16 บต) -32,768 32,767 unsigned 2 (16 บต) 0 65,535

int (16 บต) signed 2 (16 บต) -32,768 32,767 unsigned 2 (16 บต) 0 65,535

int (32 บต) signed 4 (32 บต) -2,147,483,648 2,147,483,647 unsigned 4 (32 บต) 0 4,294,967,295

long int signed 4 (32 บต) -2,147,483,648 2,147,483,647 unsigned 4 (32 บต) 0 4,294,967,295

จะเหนวาชนดขอมลแบบเลขจ านวนเตมมอยหลายประเภท การจะเลอกใชชนดขอมล

ประเภทใดขนอยกบความเหมาะสม เชน หากขอมลทตองการเกบมขนาดใหญมากนก อาจเลอกชนด

ขอมลประเภท short int มาใชในการเกบขอมล แตหากขอมลทตองการเกบมขนาดใหญเกนกวาทจะ

เกบลงในตวแปรทเปนชนดขอมลประเภท short int ได กอาจเลอกเกบลงในตวแปรทเปนชนดขอมล

ประเภท int หรอ long int แทน ทงนใหพจารณาตามความเหมาะสม

จากตาราง จะเหนไดวาชนดขอมลแตละประเภท ยงแบงไดเปน 2 ลกษณะ คอ

signed หมายถง การเกบขอมลเลขจ านวนเตมแบบคดเครองหมาย คอ จะเกบทง

เลขจ านวนเตมบวกและลบ โดยจะมบต 1 บต เรยกวา sign bit ท าหนาท เกบคา

เครองหมาย ซง sign bit น จะเปนบตทอยดานซายสด ซงหากคา sign bit

Page 10: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

10

เทากบ 0 จะหมายถง เลขจ านวนเตมนนเปนคาบวก แตถา sign bit เทากบ 1

จะหมายถง เลขจ านวนเตมนนเปนคาลบ

unsigned หมายถง การเกบขอมลเลขจ านวนเตมแบบไมคดเครองหมาย คอ จะ

เกบเฉพาะเลขจ านวนเตมบวกและศนยเทานน

ชนดขอมลแบบเลขทศนยม (floating-point)

เปนชนดขอมลแบบเลขทศนยมหรอบางทกเรยกวาเลขจ านวนจรง (real number)

เชน 10.0, 15.33, 20.0000,...ซงภาษาซแบงชนดขอมลแบบเลขทศนยมออกเปน 3 ประเภท คอ

float

double

long double

ตารางท 4 แสดงขนาดของชนดขอมลแบบเลขทศนยมในแตละประเภท

ประเภท จ านวนไบต คาต าสด คาสงสด float 4 (32 บต) 3.4×10 3.4×10

double 8 (64 บต) 1.7 × 10 1.7 × 10 long double 10 (80 บต) 3.4 ×10 1.1 ×10

ขอแตกตางระหวางชนดขอมลแบบเลขจ านวนเตมและชนดขอมลแบบเลขทศนยม คอ ชนด

ขอมลแบบเลขทศนยมจะเปนแบบคดเครองหมาย (signed) เสมอ จะไมมแบบไมคดเครองหมาย

(unsigned) ซงทง float , double และ long double ตางกเกบขอมลในลกษณะของเลขทศนยมแบบ

คดเครองหมายเหมอนกนหมด เพยงแต long double สามารถเกบขอมลทมชวงคาไดมากกวา double

และ double เกบขอมลทมชวงคาไดมากกวา

ความสมพนธระหวางตวแปรและชนดของขอมล

ความสมพนธระหวางตวแปรและชนดของขอมลจะแสดงออกมาในรปของ การประกาศ

ตวแปร กลาวคอ ในการประกาศตวแปรขนใชงาน จ าเปนอยางยงทจะตองก าหนดชนดของขอมลใหกบ

ตวแปรนนดวย การจะก าหนดชนดขอมลใหกบตวแปรใดๆนน ตองพจารณาใหดวาตองการเกบขอมลใน

ลกษณะใดแลวเลอกชนดขอมลใหเหมาะสม เพราะหากเลอกชนดขอมลทมขนาดเลกเกนกวาจะเกบขอมล

ไดกจะเกดขอผดพลาด และหากเลอกชนดขอมลใหญเกนกวาขนาดของขอมลทตองการเกบจรงมากๆกจะ

ท าใหสนเปลองหนวยความจ าโดยเปลาประโยชน ซงจะเหนวาการเลอกก าหนดชนดขอมลใหกบตวแปร

นนมความส าคญมาก ควรพจารณาอยางรอบคอบ

Page 11: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

11

รปแบบการประกาศตวแปร คอ

เชน

char A ; เปนการประกาศตวแปร A ใหเปนชนดขอมลแบบตวอกษร

int B ; เปนการประกาศตวแปร B ใหเปนชนดขอมลแบบเลขจ านวนเตมประเภท int

float C ,D; เปนการประกาศตวแปร C และ D ใหเปนชนดขอมลแบบเลขทศนยมประเภท float

การก าหนดคาเรมตนใหกบตวแปร

นอกจากจะประกาศตวแปรขนใชงานแลว เรายงสามารถก าหนดคาเรมตนใหกบตวแปรแตละตว

ได ดงน

ประเภทของตวแปร

ตวแปรทประกาศขนเพอใชงานแบงออกเปน 2 ประเภท คอ

ตวแปรแบบโกลบอล (Global Variable)

คอ ตวแปรทประกาศไวภายนอกฟงกชนทกฟงกชน ซงเมอตวแปรอยนอกทกฟงกชน นน

หมายถง ตวแปรนนเปนของสาธารณะ ไมไดมฟงกชนใดเปนเจาของตวแปรนน ดงนนฟงกชนทกฟงกชน

จงสามารถเรยกใชงานตวแปรนได

ชนดของขอมล ตวแปร ; รปแบบ

char data = 'A'; int value = 10; long int tak = 3.5 L double pi = 3.1415926536; float average = 3.1416f; unsigned long int number=30678LU; char data; int value ; data='A'; value = 10 ; int value1, value2=0;

ประกาศตวแปรพรอมกบก าหนดคาเรมตน

ใหกบตวแปรดวย

ประกาศตวแปรกอน จากนนจง

ก าหนดคาใหกบตวแปรในภายหลง

ท าการประกาศตวแปร value1 และ value2ขนมาใชงานโดย

ก าหนดคาเรมตนใหกบตวแปร value2เปน 0 แตไมมการ

ก าหนดคาเรมตนใหกบตวแปร value1

Page 12: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

12

ตวแปรแบบโลคอล (Local Variable)

คอตวแปรทประกาศไวภายในฟงกชนหนงๆ ซงหากอยในฟงกชนใดจะถอวาฟงกชนนนเปน

เจาของตวแปรนน ฟงกชนอนจะไมสามารถเรยกใชงานตวแปรนได

ตวอยางท 3.3 การท างานของตวแปรแบบโกลบอลและโลคอล

อธบายโปรแกรม

โปรแกรมนคอมไพลไมผาน ทราบหรอไมวามสาเหตมาจากอะไร ลองมาพจารณารวมกน

บรรทดท 3; ประกาศตวแปร I เปน global variable ซงทกฟงกชนสามารถใชงานตวแปร i ได

บรรทดท 6; ประกาศตวแปร n เปน local variable ซงเจาของตวแปร n คอ ฟงกชน

testVar() ดงนนจะมเพยงฟงกชน test Var() เทานนทสามารถใชงานตวแปร n ได

บรรทดท 11; ประกาศตวแปร m เปน local variable โดยจะมเฉพาะฟงกชน main() เปน

เจาของตวแปรน

บรรทดท 13; เปนการเรยกใชงานฟงกชน test Var() โดยสงพารามเตอรเปนเลขจ านวนเตมเขา

ไปยงฟงกชน test Var()ดวย โดยพารามเตอรทสงไปเปนคาของตวแปร i ซง

ประกาศไวเปนโกลบอล ดงนน ไมมปญหา สามารถเรยกใชตวแปร i ได

บรรทดท 5; ฟงกชน test Var() รบคาเลขจ านวนเตม i ซงมคาเทากบ 1 เขามาในฟงกชนจากนน

น ามาคณกบตวแปร n ทเปนตวแปรแบบโลคอล ไดผลลพธเทากบ 3 (มาจาก n *

j = 3 *1 ) และท าการสงคา 3 นกลบออกไปจากฟงกชน เพอสงคนใหกบตวท

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:

#include <stdio.h> int i = 1; int testVar(int j ){ int n = 3; return n * j ; } main () { int m ; printf(''Globla1 variable i is %d\n'' ,i); m = testVar (i); m = m *n; printf(''Local variable m is %d\n'' ,m); }

Page 13: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

13

เรยกใชงานฟงกชน กลาวคอ จะท าการคนคาไปยงบรรทดท 13 ท าใหตวแปร m ม

คาเทากบ 3

บรรทดท 14; บรรทดนเองมเปนาเหตใหโปรแกรมคอมไพลไมผาน โดยจะแสดง error วา

ผอานคดวาทโปรแกรมเกด error แบบนมสาเหตมาจากอะไร ? อะไรคอขอผดพลาดของบรรทด

ท 14 ? เราลองมาพจารณากน ดงทกลาวแลววาตวแปร n เปนตวแปรแบบโลคอล เจาของมนคอ

ฟงกชน test Var() ดงนน ฟงกชน main() จะไมสามารถเรยกใชงานตวแปร n ของฟงกชน test Var()

ได จงเกด error วาไมไดท าการประกาศตวแปร n ขน ( คอ ฟงกชน main ) ไมรจกตวแปร n เพราะไมม

การประกาศตวแปรชอนไวในฟงกชน main() นนเอง) วงหากตดบรรทดนออกไป โปรรแกรมกจะ

สามารถคอมไพลผานและไดผลลพธดงน

5. โอเปอเรเตอร และการด าเนนการตางๆ

การเขยนโปรแกรมจ าเปนจะตองมการด าเนนการระหวางคาหรอขอมลตางๆอยตลอดเวลา ซงใน

บทนเราจะไดมาศกษากนวาการด าเนนการในภาษาซมอะไรบาง และแตละอยางมการท างานอยางไร

โอเปอเรเตอร

โอเปอเรเตอร ( Operator) คอ ตวด าเนนการ ซงอาจเปนการด าเนนการทางคณตศาสตร

การด าเนนการทางตรรกศาสตร หรออนๆ โอเปอเรเตอรมกจะเปนเครองหมายหรอสญลกษณพเศษตางๆ

เชน + , - , * , / , && , | | , > , < เปนตน

โอเปอเรเตอร ( Operand) คอ ตวถกกระท า อาจเปนคาคงท ตวแปร นพจน หรอฟงกชนกได

นพจน ( Expression) คอ การน าเอาโอเปอเรเตอร และโอเปอเรเตอรหลายๆตวมารวมเขา

ดวยกนเปนประโยคเดยว

การค านวณการทางคณตศาสตร

หมายถงการน าคา (โอเปอแรนด) 2 คามากระท ากนโดยใชโอเปอเรเตอรหรอตวด าเนนการทาง

คณตศาสตร เชน บวก ลบ คณ หาร หรอบางครงกเปนการน าโอเปอเรเตอรไปกระท ากบโอเปอแรนด

error ; undefined symbol 'n ' in function main

global variable I is l local variable m is 3

Page 14: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

14

ตวเดยว โอเปอเรเตอรทางคณตศาสตร (Arithmetic Operator) ในภาษาซ แบงออกเปน 7 ประเภทดง

ตารางท 5 แสดงโอเปอเรเตอรทางคณตศาสตร (Arithmetic Operator) ในภาษาซ

โอเปอเรเตอร ความหมาย ตวอยาง ผลลพธ + บวก 9 + 4 13 - ลบ 9 - 4 5 * คณ 9 * 4 36 / หาร 9 / 4 2 ( กรณน ทงตวตงและ

ตวหารเปนเลขจ านวนเตม จงไดผลลพธเปนเลขจ านวนเตม โดยเศษจะถกปดทง)

% หารเอาเศษ (Modulo) 9 % 4 1 ++ เพมคาขน 1

โดย a ++ จะน าคาของ a ไปใชกอน แลวจงเพมคาของ a ขน 1

b = a++; จะมความหมายเทยบเทากบ 2 บรรทดตอไปน b = a; a = a+1 ;

สมมต a มคาเปน 9 หลงจากท าค าสง b=a++; แลวจะไดวา a=10 , b=9

++a จะเพมคาของ a ขน 1กอน แลวจงน าคา

ของ a ไปใช

b = a++; จะมความหมายเทยบเทากบ 2 บรรทดตอไปน a = a+1 ; b = a;

สมมต a มคาเปน 10หลงจากท าค าสง b=++a; แลวจะไดวา a=11 , b=11

-- ลดคาลง 1 โดย a-- จะน าคาของ a ไปใชกอน แลวจงลดคาของ a ลง 1

b = a--; จะมความหมายเทยบเทากบ 2 บรรทดตอไปน b = a; a = a-1 ;

สมมต a มคาเปน 11หลงจากท าค าสง b=a--; แลวจะไดวา a=10 , b=11

--a จะลดคา a ลง 1 กอน แลวจงน าคาของ a ไปใช

b = --a; จะมความหมายเทยบเทากบ 2 บรรทดตอไปน a = a-1 ; b = a;

สมมต a มคาเปน 10หลงจากท าค าสง b=--a; แลวจะไดวา a=9 , b=9

Page 15: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

15

เพอเปนการเพมความเขาใจเกยวกบการท างานของโอเปอเรเตอร ผเขยนตองการใหผอาน

ทดลองตงคาตวเลขขนมา 2 คา แลวน าคาตวเลขทงสองตวมากระท ากนดวยโอเปอเรเตอรชนดตาง ๆ

ดงตอไปน

จงหา

1 x + y = ?

2 x - y = ?

3 x * y = ?

4 x / y = ?

5 x % y = ?

6 ถา z = x ++; จงหาวา x = ? , z = ?

7 ถา z = ++x; จงหาวา x = ? , z = ?

8 ถา z = y--; จงหาวา y = ? , z = ?

9 ถา z = --y; จงหาวา y = ? , z = ?

จากนนไดผลลพธอยางไรใหน ามาตรวจสอบกบโปรแกรมตอไปน (ทดลองหลายๆครงเพอเพม

ความเขาใจเกยวกบการท างานของโอเปอเรเตอร)

ล าดบการท างานของโอเปอเรเตอร

เนองจากโอเปอเรเตอรมอยหลายชนด ดงนน ภาษาซจงไดก าหนดล าดบการท างานของ

โอเปอเรเตอรนนขน ดงน

ตารางท 6 แสดงล าดบการท างานของโอเปอเรเตอร

ล าดบความส าคญจากสงไปต า โอเปอเรเตอร ()

++,-- -(เครองหมายลบหนาตวเลข)

* , / , % + , -

ในการท างานใหเรมจากโอเปอเรเตอรทมล าดบความส าคญสงสดกอน กลาวคอ จะท า

โอเปอเรเตอรทมล าดบความส าคญสงสดไลไปยงโอเปอเรเตอรทมล าดบความส าคญต าสด แตหากพบ

โอเปอเรเตอรทมล าดบความส าคญเทากน จะท าใหโอเปอเรเตอรเหลานนจากซายไปขวา

Page 16: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

16

ตวอยางการท างานของโอเปอเรเตอร

ตวอยาง จงหาคาของนพจน 8 + 7 * 6

วธท า 1. ใหสงเกตตวโอเปอเรเตอรกอนเสมอวามโอเปอเรเตอรอะไรบางในทนมโอเปอเรเตอร + และ *

2. ท าการไลล าดบความส าคญของโอเปอเรเตอรทงหมดเปรยบเทยบกน จากตวทมล าดบ

ความส าคญสงสดไปยงตวทมล าดบความส าคญต าสด

3. จากขอ 2 จะไดวาล าดบการท างานเปนดงน

ขนท 1 7 * 6 = 42

ขนท 2 8 + คาทไดจากขนท 1

= 8 + 42

= 50

ดงนน 8 + 7 * 6 = 50

ตวอยาง ก าหนด a = 9 , b = 3 , c = 2 จงหาคาของนพจน - ( a + b+c )+ a * c++ และคาของ a , b และ c วธท า

1. โจทยขอนแตกตางจากขออน คอ เปนการน าตวแปรมากระท าตอกน ไมใชคาคงทอยางขอทผานมา วธทงายคอ ใหน าคาของตวแปรแตละตวแทนทลงในตวแปรนนๆกอน ดงน

- (9 + 3 + 2 ) + 9 * 2 ++ 2. ไลล าดบความส าคญของโอเปอเรเตอรไดดงน

3. เรมตนท าการค านวณ

ล าดบความส าคญจากสงไปต า โอเปอเรเตอร *

+

8 + 7 * 6

ล าดบความส าคญ โอเปอเรเตอร ()

++ -(เครองหมายลบหนาตวเลข)

* +

Page 17: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

17

ขนท 1 ท าภายในวงเลบกอน คอ ( 9 + 3 + 2 ) ไดผลลพธเปน 14 ขณะนจะไดนพจนเปน – (14) + 9 * 2++ ขนท 2 ท าโอเปอเรเตอรทมความส าคญในล าดบถดมา นนคอ ท า ++ โดย 2++ มาจาก c++ ซงในขณะนยงไมมผลใดๆแตเมอท าการประมวลผลนพจนเสรจสนแลวคาของตวแปร c จะเพมขนอก 1 กลาวคอ คาของ c จะถกน ามาค านวณในนพจนกอนทจะเพมคาขน อก 1 ดงนน ในขณะนนพจนจะเปน - (14)+ 9 * 2 ขนท 3 ตอมาจะท าโอเปอเรเตอร – ซงเปนเครองหมายลบหนาตวเลข 14ดงนนจะไดนพจนเปน - 14 + 9 * 2 ขนท 4 ท าโอเปอเรเตอร * คอ 9 * 2 ไดผลลพธเปน 18 ดงนน ในขณะนนพจนจะเปน - 14 + 18 ขนท 5 ท าโอเปอเรเตอรตวสดทายคอโอเปอเรเตอร + จะไดวา - 14 + 18 ไดผลลพธเปน 4 ดงนนคาของนพจน – (a + b + c) + a *c++ คอ 4 และมคาของตวแปร a , b และ c หลงจากท านพจนดงกลาวแลว คอ 9 (คาเดม), 3 (คาเดม)และ 3 (ถกเพมคาขน 1 เนองจากการท า c++ ในขนท 2) ตามล าดบ

การแปลชนดของขอมล

เนองจากตวอยางทผานมา นพจนทแสดงใหเหนจะเปนนพจนทมชนดขอมลประเภท

เดยวกนทงหมดแตในความเปนจรงแลวนพจนสามารถประกอบดวยชนดของขอมลทแตกตางกนได

เรยกวา mixed type expression แตหลกการท างานของโอเปอเรเตอรนน โอเปอแรนดทน ามา

ด าเนนการดวยโอเปอเรเตอรหนงๆตองมชนดของขอมลเหมอนกน ดงนนภาษาซจงมกฎทจะใชจดการกบ

นพจนเหลานอย 2 ประเภท คอ implicit type conversion และ explicit type conversion

Implicit Type Conversion

ความหมายของ implicit type conversion คอ คอมไพเลอรจะท าการแปลงชนด

ของขอมลใหอยในรปแบทเหมาะสมโดยอตโนมต ซงกฎการแปลงชนดขอมล คอ

ตารางท 7 แสดงนยส าคญ (significance) ของชนดขอมลส าหรบการท า implicit type

conversion

ชนดของขอมล long double นยส าคญสงสด

double float unsigned long int

Page 18: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

18

ชนดของขอมล long int

นยส าคญนอยสด

unsigned int int short

char

ถาหากในนพจนหนง ๆ ประกอบดวยชนดของขอมลหลากหลายประเภท ภาษาซจะท า

การแปลงชนดของขอมลใหโดยอตโนมต โดยชนดขอมลทมนยส าคญต ากวาจะถกแปลงไปเปนชนดขอมล

ทมนยส าคญสงกวาเสมอ เชนในการบวกตวแปร A ทมชนดขอมลประเภท int เขากบตวแปร B ทม

ชนดขอมลประเภท float นนจะไมสามารถท าไดทนท เพราะตวแปรทงสองมชนดขอมลแตกตางกน แต

ภาษาซจะท า implicit type conversion โดยแปลงชนดขอมลของตวแปร A จาก int ไปเปน

float ใหกอน (เนองจาก floatมนยส าคญสงกวา int ) แลวจงท าการบวกคาตามปกต ซงผลลพธทได

จะมชนดขอมลเปน float

ตารางท 8 แสดงตวอยางการท างานของ implicit type conversion

นพจน การแปลงชนดขอมล char + fioat แปลง char ไปเปน fioat unsigned int - long int แปลง unsigned int ไปเปน long int fioat * double แปลง fioat ไปเปน double int /long double แปลง int ไปเปน long double (short +long) / double แปลง short ไปเปน long (ท าใน

วงเลบกอน) จากนนแปลงคาทไดจากการบวกในวงเลบจากชนด long ไปเปน double

ตวอยางท 3.4 โปรแกรมแสดงการท างานของ implicit type conversion

1: 2: 3: 4: 5: 6: 7:

#inlude < stdio.h> main ( ) { char a = 'A'; Int b = 10; float c = 200.0; double d = 93.2;

Page 19: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

19

ผลลพธของโปรแกรม

before chracter is A numeric character is 65 integer is 10 floating is 200.000000 double is 93.200000 after chracter is A numeric character is 65 integer is 75 floating is 265.000000 double is 158.200000

8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:

printf (''Before\n''); printf (''Character is %c\n'' , a); printf (''Nume character is %d\n'' , a); printf (''Integer is %d\n'' , b); printf (''Floating is %f\n'' , c ); printf (''Double is %f\n'' , d); b = b + a; c = c + a; d = d + a; printf (''\nAfter\n'' );

printf (''Chracter is %c\n'' a ); printf (''Numeric character is %d\n'' a ); printf (''Integer is %d\n'' b ); printf (''Floating is %f\n'' c ); printf (''Double is %f\n'' d ); }

Page 20: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

20

อธบายโปรแกรม

บรรทดท 10; จะเหนวาบรรทดท 3 ไดประกาศตวแปร a เปนชนด char แตบรรทดน

สามารถพมพคาตวแปร a ออกมาเปนตวเลขได ทเปนเชนนเนองจากตวแปร

ชนด char ทกตวจะเกบคาตวเลข (numeric value) ซงกคอรหสแอสกของ

ตวอกษรนนๆไว

บรรทดท 15-17; ท าการบวกตวแปรชนด char เขากบตวแปรชนด int , float , double

ตามล าดบซงทสามารถบวกไดเนองจากชนดขอมล char นนถอวาเปน

numeric value อยางหนงนนเอง โดยในบรรทดท 15 คอมไพเลอรจะ

แปลงคาตวแปร a ไปเปนชนด int กอนท าการบวก บรรทดท 16 จะแปลง

คาตวแปร a ไปเปนชนด float กอนท าการบวก และบรรทดท 17 จะแปลง

คาตวแปร a ไปเปนชนด double กอนท าการบวก

Explicit Type Conversion (Casting)

explicit type conversion คอ การทผเขยนโปรแกรมท าการแปลงชนดขอมลจากชนดหนง

ไปเปนอกชนดหนงดวยตนเอง คอมไพเลอรไมไดท าการแปลงให

การแปลงชนดขอมลในแบบน เรยกอกอยางหนงวา การท า casting หรอเรยกสนๆวา “cast”

ซงท าไดโดยการระบชนดขอมลปลายทางทตองการในวงเลบ แลววางไวหนานพจนทตองการแปลงชนด

ขอมล

รปแบบ (ชนดขอมลปลายทาง) นพจนทตองการแปลงชนดขอมล

ตวอยางการท า explicit type conversion หรอ casting

ก าหนด ตวแปร a มชนดขอมลเปน int

ตวแปร b มชนดขอมลเปน int

ตวแปร c มชนดขอมลเปน float

( float) a

ความหมาย คอ ตองการแปลงชนดขอมลของตวแปร a จาก int ไปเปน float

( float) (a-b)

ความหมาย คอ ท า a - b กอน จากนนจงท าการแปลงคาผลลพธทไดไปเปนชนด float

c = ( float) a / b

Page 21: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

21

ความหมาย คอ ท าการแปลงคาตวแปร a ไปเปนชนด float (ตรงนเปน explicit type

conversion) จากนนภาษาซจะท า implicit type conversion โดยแปลงคาตวแปร b ไปเปนชนด

float เชนเดยวกบ a โดยอตโนมต เพอใหสามารถท า a / b ได จากนนท า a / b ไดผลลพธเทาไร

เกบลงตวแปร c

( float) (a / 10) กบ ( float) a/10

ส าหรบกรณน หากดผวเผนอาจจะคดวาทงสองนพจนเหมอนกน แตในความเปนจรงแลว

แตกตางกน กลาวคอ ส าหรบ ( float) (a / 10) นนหาก a มคาเปน 5 แลวจะได ( float) (a /

10) = ( float) (5 / 10) = ( float) 0 = 0 จะเหนวาผลลพธไมไดเปน 0.5 อยางทผเขยน

โปรแกรมคาดไว ทเปนเชนนเพราะการหารทเกดขนมตวตงและตวหารเปนเลขจ านวนเตมทงค ดงนน

ผลลพธทไดจงเปนขอมลแบบจ านวนเตมโดยเศษจะถกตดทงไปนนเอง

แตส าหรบ ( float) a / 10 นน ถา a มคาเปน 5 ผลลพธทไดจะเปน 0.5 ดงน

( float) a / 10 = ( float) 5 / 10 = 5.0 /10 = 5.0 /100 = 0.5

เนองจากนพจนนจะท าการแปลงคาตวแปร a จากชนด int ไปเปน float กอน (explicit

type conversion ) จากนนภาษาซจะแปลงคตวเลข 10 จากชนด int ไปเปน float คอ เทากบ

10.0 ใหโดยอตโนมต (explicit type conversion ) การหารทเกดขนจงมตวตงและตวหารเปนเลข

ทศนยมแบบ float ทงค และจะไดผลลพธเปนชนด float

ตารางท 9 เปรยบเทยบขอดขอเสยระหวาง implicit type conversion กบ explicit type

conversion

เปรยบเทยบ implicit type conversion explicit type conversion ขอด ผเขยนโปรแกรมไมตองค านงถงการแปลง

ชนดขอมลใหยงยาก เนองจากคอมไพเลอรภาษาซจะท าการแปลงชนดขอมลทถกตองใหโดยอตโนมต

ผเขยนโปรแกรมสามารถแปลงชนดขอมลไดตามตองการ

ขอเสย ชนดขอมลทภาษาซแปลงใหอาจไมใชชนดขอมลทผเขยนโปรแกรมตองการ

การแปลงชนดขอมลดวยวธน หากท าอยางไมรอบคอบจะท าใหผลลพธทไดมคาไมถกตอง กลาวคอ วธนงายตอการเกดขอผดพลาด

การด าเนนการทางตรรกะ ตรรกะ (Logic) คอ แนวคดเชงเหตผลและผลทเกยวของกบคาความจรง 2 คา คอ จรง (True)

หรอ เทจ (False)

Page 22: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

22

โอเปอเรเตอรทางตรรกะ (Logical Operator) คอ โอเปอเรเตอรทใหผลลพธออกมาเปนคา

ตรรกะ “จรง” หรอ “เทจ” อยางใดอยางหนงเทานน

ตารางท 10 โอเปอเรเตอรทางตรรกะ

โอเปอเรเตอร ความหมาย > มากกวา >= มากกวาหรอเทากบ < นอยกวา <= นอยกวาหรอเทากบ == เทากบ != ไมเทากบ && และ(AND) || หรอ (OR) ! นเสธ (NOT)

ผลลพธของโอเปอเรเตอร && , || และ ! เปนดงตารางตอไปน

A B A&&B A || B !A จรง จรง จรง จรง เทจ จรง เทจ เทจ จรง เทจ เทจ จรง เทจ เทจ จรง เทจ เทจ เทจ เทจ จรง

คาตรรกะ “จรง” และ“เทจ” นน หากแปลงเปนเลขจ านวนจะไดคาเทากบ 1 และ 0 ตามล าดบ

ส าหรบการแปลงจากเลขจ านวนเปนคาตรรกะ ภาษาซจะถอวาคา 0 คอคาตรรกะ “เทจ” และคาอนๆท

ไมใช 0 คอคา ตรรกะ “จรง”

ตารางท 11 แสดงตวอยางการท างานของโอเปอเรเตอรทางตรรกะ

นพจน คาตรรกะ 30 > 20 จรง(1) 200 >= 200 จรง(1) 10 ==10 จรง(1) 10 != 10 เทจ (0)

Page 23: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

23

นพจน คาตรรกะ (( 10*7/5)&&0) 10&&1

เทจ (0) เพราะเมอน าคาใดกตามมาด าเนนการ AND (ดวยโอเปอเรเตอร&&) กบคา 0 (เทยบเทากบคาตรรกะ “เทจ”) จะไดผลลพธเปนเทจเสมอ จรง(1)

((2 != 1) || 0) จะได 1 || 0 ((2 == 1) || 0) จะได 0 || 0

จรง(1) เพราเมอน าคาใดกตามมาด าเนนการ OR (ดวยโอแปอเรเตอร ||) กบคา 1 (เทยบเทากบคาตรรกะ “จรง”) จะไดผลลพธเปนจรงเสมอ เทจ (0)

! 0 ! 1 !!!! 0 !!!! (!1)

จรง(1) เทจ (0) เทจ (0) เทจ (0)

ตวอยางท 3.5 โปรแกรมแสดงการท างานของโอเปอเรเตอรทางตรรกะ

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:

#inlude < stdio.h> main ( ) { printf ('' logical operation\n''); printf ('' result of expression 30 > 20 is %d\n'' , 30 > 20 ); printf ('' result of expression 200 >= 200 is %d\n'' , 200 >= 200 ); printf ('' result of expression 10 == 10 is %d\n'' , 10 == 10 ); printf ('' result of expression 10 != 10 is %d\n'' , 10 != 10 ); printf ('' result of expression (( 10*7/5)&&0 is %d\n'' , (( 10*7/5)&&0)); printf ('' result of expression 10&&1 is %d\n\n'' , 10 &&1 ); printf ('' result of expression (( 2 != 1)||0 is %d\n'' , ((2 i=1) ||0) ); printf ('' result of expression (( 2 == 1)||0 is %d\n\n'' , ((2 ==1) ||0) ); printf ('' result of expression !0 is %d\n'' ,!0 ); printf ('' result of expression !1 is %d\n'' ,!1 ); printf ('' result of expression !!!!0 is %d\n'' ,!!!!0 ); printf ('' result of expression !!!!(!1) is %d\n'' ,!!!!(!1) ); }

Page 24: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

24

ผลลพธของโปรแกรม

6. การรบและแสดงผลขอมล

วธการรบขอมลผานคบอรดเขามาในโปรแกรม ( Input ) เพอน ามาประมวลผลรวมทงวธการ

แสดงผลขอความหรอผลลพธของโปรแกรมออกทางจอภาพ ( Output ) ซงจะขอกลาวถงรายละเอยด

การท างานของเอาทพตกอน เพราะผอานคงคนเคยกบการแสดงผลขอมลออกทางจอภาพแลว และ

อาจจะสงสยวามนมหลกการท างานอยางไร หลงจากนนจะไดทดลองรบขอมลเขามาในโปรแกรมกนดบาง

การแสดงผลขอมล ( Output )

ฟงกชนทใชในการแสดงผลขอมลออกทางจอภาพ คอ printf (print formatted) มหนาทหลก

คอ แปลงขอมลลกษณะของเลขฐานสอง (binary) ทคอมพวเตอรประมวลผลได ใหอยในรปแบบท

มนษยเขาใจ กอนการแสดงผลขอมลออกทางจอภาพ

รปแบบของฟงกชน printf คอ

string _format คอ สตรงทตองการแสดงผล ซงอาจเปนขอความธรรมดาๆ เชน Hello , C

Language หรอเปนสญลกษณแทนชนดขอมลตางๆซงจะถกแทนดวย คาคงท ,ตวแปร หรอนพจนใด ๆ

logical operation result of expression 30 > 20 is 1 result of expression 200 >= 200 is 1 result of expression 10 ==10 is 1 result of expression 10 != 10 is 0 result of expression (( 10 *7 / 5) && 0 ) is 0 result of expression 10 && 1 is 1 result of expression ((2 != 1) || 0 ) is 1 result of expression ((2 != 1) || 0 ) is 1 result of expression !0 is 1 result of expression !1 is 0 result of expression !!!!0 is 0 result of expression !!!!(!1) is 0

รปแบบ printf ( “string _format”, data_list)

Page 25: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

25

ทก าหนดมาเปนพารามเตอร (ในสวนของ data_list ) ตงแตตวท 2 เปนตนไป เชน %d ใชแทนขอมล

ชนดเลขจ านวนเตม , %c ใชแทนขอมลชนดตวอกษร เปนตน

data_list คอ ขอมลทจะแสดงผล ซงอาจเปนคาคงท ,ตวแปร หรอนพจนใดๆ

ตารางท 12 ตวแทนชนดขอมลแตละประเภท

ชนดขอมล ตวแทนชนดขอมล

char %c string %s

short int %hd unsigned short int %hu

Int %d unsigned int %u

long int %ld unsigned long int %lu

float %f double %Lf

long double %Lf

ตวอยางท 3.6 การใชงานฟงกชน printf()

String format : เปนขอความธรรมดา

ผลลพธของโปรแกรม

อธบายโปรแกรม

การใชงานฟงกชน printf() ในลกษณะนเปนการแสดงขอความทก าหนดออกทางจอภาพเทานน

ไมไดตองการแสดงผลขอมลอนเพมเตม ดงนนจงรบคาพารามเตอรเพยงตวเดยวเทานน คอ รบคา string

format ไมจ าเปนตองรบพารามเตอร data list

hello world

printf (“Hello World”);

Page 26: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

26

ตวอยางท 3.7

คาคงท 2 จะถกแทนลงในสญลกษณ %d

ซงเปนตวแทนของชนดขอมล int

data list : เปนคาคงท

string format : เปนขอความธรรมดาปนกบสญลกษณทใชเปนตวแทนชนด

ขอมล int

ผลลพธของโปรแกรม

อธบายโปรแกรม

ฟงกชน printf() ในขอนมการใช string format ในรปแบบของขอความธรรมดาผสมกบ

ตวแทนชนดขอมล ดงนน เปนทแนนอนวาเมอมตวแทนชนดขอมลแลว จะตองมการรบคาพารามเตอร

อกตวหนง ส าหรบเปนขอมลทจะน ามาแทนทลงในตวแทนชนดขอมลนน ซงในทนท าการรบ

คาพารามเตอร data list เปนขอมลคาคงทเขามา

ตวอยางท 3.8 คาของตวแปร x จะถกแทนลงในสญลกษณ %c

ซงเปนตวแทนของชนดขอมล char

data list : เปนตวแปรทเกบขอมลประเภทตวอกษร

string format : เปนขอความธรรมดาปนกบสญลกษณทใชเปน

ตวแทนชนดขอมล char

ผลลพธของโปรแกรม

อธบายโปรแกรม

ขอนคลายกบขอทผานมา แตมสงหนนงทแตกตาง คอ data list ในขอนเปนตวแปร แตขอท

ผานมาเปนคาคงท

จากตวอยางทผานมาและจากทไดศกษามาตงแตเรมตน มกจะมรหส \n อยในสวนของ string

format ของฟงกชน printf() อยบอยครง ทราบหรอไมวาคออะไร

printf (“1 + 1 = %d” , 2) ;

1 + 1 = 2

char X = ' x' ; printf (“heelo %cyz” , x) :

hello xyz

Page 27: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

27

รหสทขนตนดวยเครองหมาย * \* (Backslash) เรยกวา Escape Character ซงแบงออกเปน

หลายประเภท ดงตารางท 7.2 โดยมกใช Escape Character ก าหนดไวในสวนของ string format

ของฟงกชน printf() เพอชวยในการจดการแสดงผลตวอกษรออกทางจอภาพ

ตารางท 13 แสดง Escape character

รหส ความหมาย \0 คาวาง(null character) \a สงเสยง 1ครง (bell) \b ถอยหลง 1 ชองตวอกษร (backspace) \f ขนหนาใหม (form feed) \n ขนบรรทดใหม(new line) \r เลอนเคอรเซอรไปทางซายสด(carriage retum) \t แทบแนวนอน(horizontal tab) \v แทบแนวตง (vertical teb) \' พมพเครองหมาย ' \'' พมพเครองหมาย * \\ พมพเครองหมาย \

ตวอยางท 3.9 โปรแกรมแสดงการหาพนทและเสนรอบวงของวงกลม

1: 2: 3: 4: 5: 6: 7: 8: 9:

10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:

# include < stdio .h> #define PI 3.14159 main() { float radius = 7.5 ,area ,circum; area = PI * radius * radius ; circum = 2 *PI * radius ; printf (“Radius of circle is %f\n” , radius ); printf (“\tArea of circle is %.3f\n” ,area ); printf (“\t\tCircumference of circle is %.5f\n”,circum ); printf (“\nConclusion\n” ); printf (“**************************************\n'' ); printf (“Radius \t\tArea \t\tCircular\n” ); printf (“**************************************\n ); printf (“%7.2f \t%”-7.2f \t7.2f \n'', radius , area , circum ); printf (“**************************************\n ); printf (“**************************************\n ); printf (“1234567890 \t1234567890 \t1234567890\n ''); }

Page 28: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

28

ผลลพธของโปรแกรม

อธบายโปรแกรม

บรรทดท 9: พมพคารศมของวงกลม ซงก าหนดคาไวเปน 7.5 แตเนองจากในการสงพมพ

ไมไดใสสวนขยายใดๆใหกบตวแทนชนดขอมล (คอ ก าหนดเปน%f) ดงนนจง

พมพคารศมของวงกลมออกมาเปนเลขทศนยม 6 ต าแหนง คอ 7.500000

บรรทดท 10: ใช Escape character '\t' ในการแสดงผล ท าใหขอความในบรรทดน

แสดงผลเลอนจากขอบซายไป 1 แทบ และบรรทดนสงพมพคาพนทของ

วงกลมโดยใสสวนขยายใหกบตวแทนชนดขอมลเปน %.3f ดงนนจงพมพคา

พนทของวงกลมเปนเลขทศนยม 3 ต าแหนง คอ 176.714

บรรทดท 11: ใช Escape character '\t' 2 ครงในการแสดงผล ท าใหขอความใน

บรรทดนแสดงผลเลอนจากขอบซายไป 2 แทบ และสงพมพคาเสนรอบวงเปน

%.5f จงแสดงผลเปนทศนยม 5 ต าแหนง คอ 47.12385

บรรทดท 12-15: เปนการจดการแสดงผลหนาจอ โดยใช Escape character รวมดวย

บรรทดท 16: พมพคารศม พนท และเสนรอบวงของวงกลมตามล าดบ ซงทงหมดจะ

แสดงผลเปนเลข 7 หลก ( เปนทศนยม 2 ต าแหนง ) โดยรศมและเสนรอ

บวงก าหนดการแสดงผลเปน %7.2f ดงนนจะแสดงผลชดขวา สวนพนท

วงกลมทก าหนดเปน %-7.2f นนหนาเลข 7 เปนเครองหมายลบ จงแสดงผล

ชดซาย

บรรทดท 19: แสดงตวเลข 0 – 9 เพอใหสงเกตการแสดงผลในบรรทดท 16 ไดงาย

radius of circle is 7.500000 area of circle is 176.714 circumference of circle is 47.12385 conclusion ***************************************************************** radius area circular ***************************************************************** 7.50 176.71 47.12 ***************************************************************** ***************************************************************** 1234567890 1234567890 1234567890

Page 29: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

29

ตวอยางท 3.10 โปรแกรมแสดงการรายงานผลการศกษา

ผลลพธของโปรแกรม

อธบายโปรแกรม

บรรทดท 4 : พมพขอความ“ \4512345645 MISS SOMYING KENGKAR” หางจากขอบ

ซาย 3 แทบ

บรรทดท 5 : ใช Escape character '\t' ซงหมายถงการเลอนเคอรเซอรไปซายสด แต

สงเกตวาขอความในบรรทดท 4 ไมไดใช '\n' เพอสงขนบรรทดใหม ดงนน

ฟงกชน printf() ในบรรทดท 5 จงพมพขอความ “1st SEMESTER 2002”

ไวซายสดในบรรทดเดยวกบผลลพธทไดจากฟงกชน printf() ในบรรทดท 4

บรรทดท 6-8 : มการใช Escape character \' และ \'' เพอพมพเครองหมาย ' และ ''

1 st SEMESTER 2002 \ 4512345645 MISS SOMYING KENGAR ' 100001 ' Introduction to computer 3 “ A” ' 100002 ' Introduction to C Language 3 3 “ A” ' 100001 ' Mathematicsl 3 “ C” -------------------------------------------------------------------------------------------------- Cum : 3.33 --------------------------------------------------------------------------------------------------

1: 2: 3: 4: 5: 6: 7: 8: 9:

10: 11: 12: 13:

# include < stdio .h> main() { printf (“\t\t\t\\4512345645 MISS SOMYING KENGKAR''); printf (“\r 1st SEMESTER 2002\n ); printf (“\n\ '1000001 \' \t Introduction to computer \t 3 \t \ ''A\'' '' ); printf (“\n\ '1000002 \' \t Introduction to computer \t 3 \t \ ''A\'' '' ); printf (“\n\ '1000003 \' \t Mathemtics1 \t \t \t 3 \t \ ''C\'' '' ); printf (“\n\n ---------------------------------------------------------------------------'' ); printf (“\n\t\t\t cum : 3.33 '' ); printf (“\n\n ---------------------------------------------------------------------------'' ); printf (“\n\b\b\b* '' ); }

Page 30: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

30

บรรทดท 12 : ใช Escape character '\b' ซงหมายถง ถอยหลงไป 1 ชอง ตวอกษร แต

จะเหนวาบรรทดท 11 เมอพมพ – ตวสดทายเรยบรอยแลว ไมมการใช '\n'

เพอสงขนบรรทดใหมจงท าใหเคอรเซอรยงคงอยในบรรทดเดม ดงนนเมอ

ฟงกชน printf() ในบรรทดท 12 สง '\b' 3 ครง แลวสงพมพ * ออกมา

จงไดผลลพธดงขางตน

การรบขอมล (Input)

ฟงกชนทใชในการรบขอมลจากคยบอรด คอ scanf (scan formatted)

รปแบบของฟงกชน scanf คอ

string format ตางจาก string format ของฟงกชน printf() ตรงท string

format ของ

ฟงกชน scanf() จะอยในรปแบบของตวแทนชนดขอมลตางๆ เชน

%d , %c , %s , %f,..เทานน

address_list เปนตวระบทอย (address) ในหนวยความจ าทจะใชในการเกบขอมลท

รบเขามานนโดย address list จะตางกบ data list ของฟงกชน

printf() ตรงท data list เปนการระบถงขอมลโดยตรง ท าใหอางถง

ตวแปรทเกบขอมลนนๆไดโดยตรง สวน address list เปนการอางถง

ทอย ดงนนจะเรยกโดยอางองถงตวแปรโดยตรงไมได แตตองอางถง

โดยใช ampersand(&) น าหนาชอตวแปรทตองการรบขอมลเขามา

เกบไว ซงเปนการระบทอยของตวแปรนนในหนวยความจ า

ตวอยางท 3.11 โปรแกรมแสดงความแตกตางระหวาง address list ของฟงกชน scanf() กบ data

list ของฟงกชน printf()

รปแบบ scanf (“string_format” , address_list);

Address list : อางองทอยของตว

แปร x เพอเกบขอมลทรบเขามาจากคยบอรดไวในหนวยความจ าตรงต าแหนงทอยนน

Data list:อางถงตวแปร x โดยตรง

1: 2: 3: 4: 5: 6: 7: 8:

# include < stdio .h> main() { int x=3; printf(Value of x is %d\n'' ,x); scanf (''%d '' ,&x); printf(New value of x is %d\n'' ,x }

Page 31: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

31

การใชฟงกชน scanf() รบขอมลชนดสตรงเขามาทางคยบอรดนน เราจะไมใส %น าหนาตวแปร

ทใชรบคา เนองจากภาษาซก าหนดใหชอตวแปรชนดสตรง (ซงกคออารยของขอมลชนด char ) เปนการ

อางองถงทอยของตวแปรนนๆอยแลว

ตวอยางท 3.12 โปรแกรมแสดงการใชงานฟงกชน scanf()

ตวอยางรปแบบการใชงานฟงกชน scanf()

ตวอยางท 3.13

ผลลพธของโปรแกรม

int x = 3 ; scanf ('' %d'' , x); printf (''%d'' ,x);

333 3

1: 2: 3: 4: 5: 6: 7: 8: 9:

10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:

# include < stdio .h> main() { char name [20] , birthday [11]; int age ; float weight; printf (“name : ''); scanf (''%s , name); printf (“age : ''); scanf (''%d , &age); printf (“birthday : ''); scanf (''%s , birthday); printf (“weight : ''); scanf (''%f , &weight); printf(''########################################\n''); printf(''# name \t\t Age \tBirthday \tSalary #\n''); printf(''########################################\n''); printf(''# %s\t%d\t%s\t%2.f\t #\n ''name , age ,birthday , weight''); printf(''########################################\n''); } }

Page 32: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

32

อธบายโปรแกรม

จะเหนวาผลลพธทไดจากฟงกชน printf() ไมใชคา 333 ทปอนเขามาจากคยบอรด แตกลบได

คา 3 ซงเปนคาของตวแปร x ทไดก าหนดไวแตแรกแลว ทเปนเชนนเนองจากตรงฟงกชน scanf() ใน

สวนของ address list ไมไดใสเครองหมาย & ไวหนาตวแปร x นนเอง ท าใหไมสามารถอางถงทอย

ของตวแปร x ได ดงนนขอมลทปอนเขามาจงไมถกเกบลงในตวแปร x คาของ x จงเปนคาเดมไม

เปลยนแปลง

ตวอยางท 3.14

ผลลพธของโปรแกรม

อธบายโปรแกรม

ใหสงเกตลกษณะการปอนขอมลเขามาทางคยบอรด จะเหนวาการปอนขอมลแตละคาจะใช

ชองวาง (space) เปนตวแยกขอมลแตละตวออกจากกน ตอมาใหสงเกตผลลพธทแสดงออกมา จะเหน

วาตวอกษร c ทปอนเขามา ไมไดรบการแสดงผล ทเปนเชนนเพราะตรงสวน string format ของ

ฟงกชน scanf() ระบเปน %d %d%c โดยเขยนตดกนไมเวนวรรค ซง %d จะตางกบ %c เลกนอย

ตรงทหากเขยน%d ตดกนจะไมเปนปญหา สามารถรบคา input ทปอนเขามาได เพราะชนดขอมล

แบบจ านวนเตมจะแปลผลลชองวางใหโดยอตโนมต ในขณะทชนดขอมลแบบตวอกษรไมสนบสนนการ

แปลผลชองวาง ซงหากระบ %c โดยไมเวนวรรคแลวจะเกดปญหาดงกลาว ดงนน เพอปองกนปญหาน

ใหแกโปรแกรมใหม ดงน

ตวอยางท 3.15

ผลลพธของโปรแกรม

scanf (''%d%d%c'' ,&a ,&b , &c); printf('' %d %d %c '' ,a , b , c);

10 20 c 10 20

scanf (''%d%d%c'' ,&a ,&b , &c); printf('' %d %d %c '' ,a , b , c);

10 20 c 10 20 c

Page 33: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

33

อธบายโปรแกรม

โปรแกรมนตางจากโปรแกรมทแลวเพยงแคเลกนอย คอ โปรแกรมนไดท าการเวน %c หาง

ออกมา 1 ชองวางเพอทเวลาปอนขอมลเลข 10 20 และท าการเวนวรรคเพอปอนตวอกษร c แลว

ฟงกชน scanf() จะไดสามารถรบคานนมาแสดงผลได

ตวอยางท 3.16

ผลลพธของโปรแกรม

อธบายโปรแกรม

สงเกตวาปอนคาตวเลขเขามา 3 ตว คอ 5 10 15 แตฟงกชน scanf() ท าการรบคาเขามา

แค 2 คาเทานน คอ a และ b สวนคา c รบเขามาจรง แตไมมตวแทนชนดขอมลมารองรบ ดงนน

คาของตวแปร c จงไมถกเปลยนแปลง เมอผลลพธแสดงออกมาจงไดคาตวแปร c เปน 30

เหมอนเดม

ตวอยางท 3.17

int a = 10 , b=20 , c = 30 ; scanf (''%d%d%c'' ,&a ,&b , &c); printf('' %d %d %c '' ,a , b , c);

1: 2: 3: 4: 5: 6: 7: 8: 9:

10: 11: 12:

5 10 15 5 10 30

# include < stdio .h> main() { char nam [10]; int a , b , c; float d , e , f ; printf (“Enter your nam ;” , ); scanf ( ''%s , name ); printf (“Enter integer number1 ;” , ); scanf ( ''%d , &a ); printf (“Enter integer number 2 ;” , );

Page 34: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

34

ผลลพธของโปรแกรม

การรบและแสดงผลขอมลแบบตวอกษร

การรบและแสดงผลขอมลแบบตวอกษร นอกจากจะใชฟงกชน scanf() และ printf() แลวยงมฟงกชนเฉพาะทใชในการรบขอมลแบบตวอกษร คอ getchar() และแสดงผลขอมลแบบตวอกษร คอ putchar() ดวย getchar() เปนฟงกชนส าหรบรบขอมล 1 ตวอกษรจากคยบอรด putchar() เปนฟงกชนส าหรบแสดงผลขอมล 1 ตวอกษรออกทางจอภาพ ตวอยางท 3.18 เปรยบเทยบการท างานของฟงกชน getchar() กบ scanf() และ putchar() กบ printf()

#include <stdio.h> main() { char c; c = getchar () ; putchar (c) ; }

enter you nam : Maruko enter integer number1 : 1 enter integer number2 : 2 enter integer number3 : 3 enter integer number4 : 4.5 enter integer number5 : 5.5 hi Maruko average of your number is 3.20

1: 2: 3: 4: 5: 6: 7:

13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:

scanf ( ''%d , &b ); printf (“enter integer number 3 ;” , ); scanf ( ''%d , &c );

printf (“enter integer number ;” , ); scanf ( ''%d , &d ); printf (“enter integer number 5 ;” , ); scanf ( ''%d , &e ); f = (a + b + c + d + e) / 5 ; printf (“\nHi %s \n'' ,name ); printf (“average of your number is % 2.f ,f ); }

Page 35: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

35

ผลลพธของโปรแกรม อธบายโปรแกรม โปรแกรมทงสองใหผลลพธเหมอนกน ดงนนจะเหนไดวาฟงกชน getchar() ใชงานไดเทยบเทากบฟงกชน scanf() ฟงกชน putchar() ใชงานไดเทยบเทากบฟงกชน printf() ในกรณทเปนการรบและการแสดงขอมลแบบตวอกษรเพยงตวเดยว ดงนนจงขนอยกบผเขยนโปรแกรมวาจะเลอกฟงกชนใดมาใชงาน ตวอยางท 3.19 แสดงการท างานของฟงกชน getchar() และ putchar() ผลลพธของโปรแกรม

1: 2: 3: 4: 5: 6: 7: 8: 9:

#include <stdio.h> main() { char c; do { c = getchar () ; putchar (c) ; }while (c ! = ' E'); }

a a

a a b b c c d d e e D D E E

Page 36: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

36

อธบายโปรแกรม โปรแกรมนใชลป do-while (จะไดศกษาโดยละเอยดในบทถดไป) ในการตรวจสอบตวอกษรทปอนเขามาวาเปนตวอกษร E หรอไม (ตว e กบ E ถอวาเปนคนละตวกน เพราะตางกมคาแอสกเฉพาะตวทไมเหมอนกน) ถาใชกจะออกจากการท างานของลป แตถาไมใช ในบรรทดท 6 กจะรอรบขอมลตวอกษรตอไปโดยใชฟงกชน getchar() และพมพตวอกษรทรบเขามาออกทางจอภาพดวยฟงกชน putchar() ในบรรทดท 7 และจะท างานเชนนตอไปเรอยๆจนกวาจะปอนตวอกษร E

ฟงกชน getch() และ getche() นอกจากฟงกชน getchar() แลวยงมอก 2 ฟงกชนทใชในการรบขอมลแบบตวอกษร คอ getch() อาน 1 ตวอกษรจากคยบอรด แตไมแสดงตวอกษรทรบเขามาออกทางหนาจอ getche() อาน 1 ตวอกษรจากคยบอรด แตแสดงตวอกษรทรบเขามาออกทางหนาจอดวย

ตวอยางท 3.20 เปรยบเทยบการท างานของฟงกชน getchar() , getch() และ getche()

ผลลพธของโปรแกรม

1: 2: 3: 4: 5: 6: 7: 8: 9:

#include <stdio.h> main() { char c; do { c = getchar () ; }while (c ! = ' E'); }

#include <stdio.h> #include <stdio.h> main() { char c; do { c = getch () ; }while (c ! = ' E'); }

#include <stdio.h> #include <stdio.h> main() { char c; do { c = getche () ; }while (c ! = ' E'); }

a b c d e D E

abcdeDE

Page 37: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

37

อธบายโปรแกรม โปรแกรมท 1 : ใชฟงกชน getchar() ในการรบตวอกษรจากคยบอรด ซงเมอปอนตวอกษรเขามาแลว

จะตองกด ทกครง กลาวคอฟงกชน getchar() จะยงไมรบตวอกษรไปประมวลผลจนกวาผใชจะกด และเมอกด แลวเคอรเซอรกจะยายไปยงบรรทดถดไป

โปรแกรมท 2 : ใชฟงกชน getch() ในการรบตวอกษรจากคยบอรด จะเหนวาไมปรากฏผลลพธใดๆบนจอภาพ ทเปนเชนนเนองจากฟงกชน getch() จะไมแสดงผลตวอกษรทปอนเขาไปออกทางหนาจอ และเมอปอนตวอกษรแลวตวอกษรนนจะถกน าไปประมวลผลทนท ผใชไมตองท าการกด ใด ๆ ทงสน (ฟงกชน getch()มการประกาศไวในเฮดเดอรไฟล conio.h ดงนนจงรวมเฮดเดอรไฟลนเขาไวในโปรแกรมดวย

โปรแกรมท 3 : ใชฟงกชน getche() ในการรบตวอกษรจากคยบอรด จะเหนวาฟงกชน getche() แสดงผลตวอกษรทปอนเขาไปออกทางหนาจอเหมอนโปรแกรมท 1 ดวย แตฟงกชน getche() ตางจากฟงกชน getchar() เพยงเลกนอย คอ ส าหรบฟงกชน getche() นน ผใชไมตองท าการกด โดยเมอปอนตวอกษรแลว ตวอกษรจะถกน าไปประมวลผลทนท (ฟงกชน getche()มการประกาศไวในเฮดเดอรไฟล conio.h ดงนน จงตองรวมเฮดเดอรไฟลนเขาไวในโปรแกรมดวย)

ตารางท 14 ตารางเปรยบเทยบการท างานของฟงกชน getchar() , getch() และ getche() ฟงกชน การกด แสดงผลทางจอภาพ

getchar() / / getch() × × getche() × /

การรบและแสดงผลขอมลแบบสตรง นอกจากจะใชฟงกชน scanf() และ printf() ในการรบและแสดงผลขอมลแลว ยงม ฟงกชนทท างานกบสตรงโดยเฉพาะดวย คอ gets() ทใชในการรบขอมลสตรง และ puts() ทใชในการ แสดงผลขอมลสตรง ฟงกชน gets() มาจากค าวา get string เปนฟงกชนส าหรบอานขอมลจากคยบอรดมาเกบไวใน หนวยความจ า ณ ต าแหนงทตวแปรชนดอารเรยชอย ซงการอานขอมลของฟงกชน gets น หากขอความทปอนเขามาประกอบดวยชองวาง (space) กไมเปนปญหา ฟงกชน gets() ยงคงอานขอความตอไปได สงทจะท าใหฟงกชน gets() หยดอานขอความมเพยงกรณเดยว คอ เมอกด ซง

Enter

Enter Enter

Enter

Enter

Enter

Page 38: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

38

เมอปอนขอความและกด แสดงการสนสดการปอนขอความแลว ฟงกชน gets() จะใส '\0' (null string) ปดทายใหกบขอความโดยอตโนมตดวย

ฟงกชน puts() มาจากค าวา put string เปนฟงกชนส าหรบเพมสตรงออกทางจอภาพ หลกการใชงานของ ฟงกชนนงาย ๆ คอ ใหสงคาทอย (address) ของสตรงเขามาทฟงกชนนเทานน

ตวอยางท 3.21 เปรยบเทยบการท างานระหวางฟงกชน gets() และ scanf() ผลลพธของโปรแกรม อธบายโปรแกรม อยางทไดกลาวไวแลวขางตนวา ฟงกชน gets() สามารถรบคาได แมกระทงคาทเปน

ชองวาง(space) โดยจะรบคาไปจนกระทงมการกด จงจะหยดการรบคา ดงนน ผลลพธของโปรแกรมทางดานซายมอทใชฟงกชน gets() ในการรบคา จงแสดงชอ Chibi Maruko ออกมาได ตางจากโปรแกรมทางดานขวามอทใชฟงกชน scanf() ในการรบคา ซงแสดงชอไดเพยง Chibi เทานน ทงทปอนเขามาเปน Chibi Maruko สาเหตทเปนเชนนเพราะฟงกชน scanf() นน เมออานพบชองวางจะตดขอความออก คอ ส าหรบกรณนจะแยก Chibi และ Maruko ออกจากกน (ตองระบ %s ในสวนของ string format อกอนหนงและน าตวแปรชนดสตรงมารบคาอกตวแปรหนงจงจะไดขอความ Maruko เขามาในโปรแกรม) นอกจากนน scanf() ยงไมมการเตม '\0' เพอปดสตรงให

what' your name ? chibi maruko hi chibi maruko , nice to meet you

what' your name ? chibi maruko hi chibi , nice to meet you

Enter

Enter

1: 2: 3: 4: 5: 6: 7: 8:

#include <stdio.h> main() { char name [20]; printf( What 's your name?\n''); gets (name); printf( ''Hi %s , nice to meet you''; name); }

#include <stdio.h> main() { char name [20]; printf( What 's your name?\n''); gets (''%s'' , name); printf( ''Hi %s , nice to meet you''; name); }

Page 39: บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3 พื้นฐานภาษาซี 1. ประวัติความเป็นมาของภาษาซี

39

ตวอยางท 3.22 โปรแกรมแสดงการท างานของฟงกชน gets() และ puts() ผลลพธของโปรแกรม

1: 2: 3: 4: 5: 6: 7: 8: 9:

#include <stdio.h> main() {

char name [20],greeting [25] = '' Welcome to C Language '' ; puts( What 's your name?''); gets (name); printf( ''Hi %s\n , name)'; puts(greeting); }

what ' s you name ? maruko hi maruko welcome to c language