บทที่ 3 พื้นฐานภาษาซี · 1 บทที่ 3...
Post on 01-Jun-2020
10 Views
Preview:
TRANSCRIPT
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 เปนตน
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 ขอดและขอเสยของตวแปลภาษาทงสองรปแบบมดงน
วธการ ขอด ขอเสย คอมไพเลอร - ท างานไดเรว เนองจากท าการแปลผลทเดยว
แลวจงท างานตามค าสงของโปรแกรมในภายหลง - เมอท าการแปลผลแลว ในครงตอไปไมจ าเปนตองท าการแปลผลใหมอกเนองจากภาษาเครองทแปลไดจะถกเกบไวทหนวยความจ า สามารถเรยกใชงานไดทนท
- เมอเกดขอผดพลาดขนกบโปรแกรมจะตรวจสอบหาขอผดพลาดไดยาก เพราะท าการแปลผลทเดยวทงโปรแกรม
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: }
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
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”);
}
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)
สวนทจะใชในการประกาศตวแปรหรอฟงกชทตองใชในโปรแกรม โดยทกๆ สวนของโปรแกรม
สามารถจะเรยกใชขอมลทประกาศไวในสวนนได สวนนบางโปรแกรมอาจไมมกได ส าหรบรายละเอยด
ตางๆ จะกลาวตอไปน
7
3.1.3 สวนฟงกชนหลก (main()function)
สวนนทกโปรแกรมจะตองม ซงจะประกอบไปดวยประโยคค าสงตางๆทจะใหโปรแกรมท างาน
โดยค าสงตางๆ มาตอเรยงกน และแตละประโยคค าสงจะจบดวยเคร องหมายเซมโคลอน(Semi colon ;)
โดยโปรแกรมหลกนจะเรมตนดวย main() ตามดวยเครองหมายปกกาเปด { และจบดวยเครองหมายปกกา
ปด}
3.1.4 สวนก าหนดฟงกชนขนใชเอง (Program comments)
สวนทใชเขยนคอมเมนตโปรแกรม เพออธบายงานตางๆ ท าใหผศกษาโปรแกรมในภายหลงท า
ความเขาใจโปรแกรมไดงายขน เมอคอมไพลโปรแกรมสวนนจะถกขามไป
4. ตวแปรกบชนดของขอมล
ในการเขยนโปรแกรมดวยภาษาซนน หากมการประกาศตวแปรขนมาใชงานแลว ผเขยน
โปรแกรมจะตองก าหนดชนดของขอมลใหกบตวแปรนนดวย ตลอดจนความสมพนระหวางตวแปรและ
ชนดของขอมลวามความเกยวของกนอยางไร
ตวแปร (Variables )
ตวแปร คอ ชอทก าหนดขนเพอใชในการเกบขอมล ซงการประกาศตวแปรขนมาใชงานจะ
เปนไปตามกฎการตงชอทไดกลาวไวแลวใบบทท 1
ชนดของขอมล (Data Type)
ชนดของขอมล คอ สงทก าหนดลกษณะและขอบเขตของขอมลนนๆโดยขอมลทมชนดของ
ขอมลแตกตางกน กจะเกบขอมลไดในลกษณะทตางกน และขอบเขตของขอมลทเกบไดกจะไมเทากนซง
ในภาษาซแบงชนดของขอมลออกเปน 4 แบบ คอ
ชนดขอมลแบบ void
ชนดขอมลแบบตวอกษร
ชนดขอมลแบบเลขจ านวนเตม
ชนดขอมลแบบเลขทศนยม
ชนดขอมลแบบ void (0 ไบต) ชนดขอมลแบบนจะไมมคา ซงเราจะไมใชชนดขอมลแบบ void นก าหนดใหกบตวแปร แตจะ
น าชนดขอมลประเภทนก าหนดไวทฟงกชนในกรณทไมตองการใหฟงกชนมการรบคาใด ๆ เขาหรอสงคา
ใด ๆ กลบไป
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
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
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 เกบขอมลทมชวงคาไดมากกวา
ความสมพนธระหวางตวแปรและชนดของขอมล
ความสมพนธระหวางตวแปรและชนดของขอมลจะแสดงออกมาในรปของ การประกาศ
ตวแปร กลาวคอ ในการประกาศตวแปรขนใชงาน จ าเปนอยางยงทจะตองก าหนดชนดของขอมลใหกบ
ตวแปรนนดวย การจะก าหนดชนดขอมลใหกบตวแปรใดๆนน ตองพจารณาใหดวาตองการเกบขอมลใน
ลกษณะใดแลวเลอกชนดขอมลใหเหมาะสม เพราะหากเลอกชนดขอมลทมขนาดเลกเกนกวาจะเกบขอมล
ไดกจะเกดขอผดพลาด และหากเลอกชนดขอมลใหญเกนกวาขนาดของขอมลทตองการเกบจรงมากๆกจะ
ท าใหสนเปลองหนวยความจ าโดยเปลาประโยชน ซงจะเหนวาการเลอกก าหนดชนดขอมลใหกบตวแปร
นนมความส าคญมาก ควรพจารณาอยางรอบคอบ
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
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); }
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
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
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 แสดงล าดบการท างานของโอเปอเรเตอร
ล าดบความส าคญจากสงไปต า โอเปอเรเตอร ()
++,-- -(เครองหมายลบหนาตวเลข)
* , / , % + , -
ในการท างานใหเรมจากโอเปอเรเตอรทมล าดบความส าคญสงสดกอน กลาวคอ จะท า
โอเปอเรเตอรทมล าดบความส าคญสงสดไลไปยงโอเปอเรเตอรทมล าดบความส าคญต าสด แตหากพบ
โอเปอเรเตอรทมล าดบความส าคญเทากน จะท าใหโอเปอเรเตอรเหลานนจากซายไปขวา
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
ล าดบความส าคญ โอเปอเรเตอร ()
++ -(เครองหมายลบหนาตวเลข)
* +
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
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;
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 ); }
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
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)
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)
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) ); }
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)
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”);
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
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 ''); }
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
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* '' ); }
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 }
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''); } }
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
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 ;” , );
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 ); }
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
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
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
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); }
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
top related