COMPUTER PROGRAMMING
3/51
NAME:
NICKNAME:
PART I: ‐ CHAPTER 0: PROGRAMMING BASIC ‐ CHAPTER 1: C INTRODUCTIONS ‐ CHAPTER 2: OPERATOR ‐ CHAPTER 3: CONTROLS ‐ CHAPTER 4: FUNCTION ‐ CHAPTER 5: ARRAY ‐ REVIEW MID‐TERM
KAPONG CPE#11
EDITOR & TUTOR
PHONGPHAN PHIENPHANICH
THANK YOU
WEERAPAT @TUTOR MORE ACADEMIC
шѥіѥкзҕѥ $6&,, 'HF +H[ 2FW &KDU
'HF +H[ 2FW &KDU
'HF +H[ 2FW &KDU 'HF +H[ 2FW &KDU
18/ QXOO
6SDFH #
C
62+ VWDUW RI KHDGLQJ
$
D
´
%
E
&
F
67; VWDUW RI WH[W
(7; HQG RI WH[W
'
G
(14 HQTXLU\
(
H
$&. DFNQRZOHGJH
)
I
%(/ EHOO
µ
*
J
%6 EDFNVSDFH
+
K
7$% KRUL]RQWDO WDE
,
,
$ /) 1/ OLQH IHHG QHZ OLQH $
$ -
$ M
% 97 YHUWLFDO WDE
%
% .
% N
& )) 13 IRUP IHHG QHZ SDJH &
& /
& O
PY
(27 HQG RI WUDQVPLVVLRQ
'
' 0
' P
( 62 VKLIW RXW
(
( 1
( Q
) 6, VKLIW LQ
)
) 2
) R
'/( GDWD OLQN HVFDSH
3
S
'& GHYLFH FRQWURO
4
T
'& GHYLFH FRQWURO
5
U
'& GHYLFH FRQWURO
6
V
'& GHYLFH FRQWURO
7
W
1$. QHJDWLYH DFNQRZOHGJH
8
X
6<1 V\QFKURQRXV LGOH
9
Y
(7% HQG RI WUDQV EORFN
:
Z
&$1 FDQFHO
;
[
(0 HQG RI PHGLXP
<
\
$ 68% VXEVWLWXWH
$
$ =
$ ]
% (6& HVFDSH
%
% >
% ^
& )6 ILOH VHSDUDWRU
&
& ?
& _
' *6 JURXS VHSDUDWRU
'
' @
' `
( 56 UHFRUG VHSDUDWRU
( !
( A
( a
) 86 XQLW VHSDUDWRU
) "
) B
) '(/
C
O
' &5 FDUULDJH UHWXUQ
´ª°´ ¬¦ ´ªÂ¦ ¨³ ´ª» oµ¥Á } ´ª°´ ¬¦ ¸ÉÄ oÄ µ¦ ª »¤ Ťnµ¤µ¦ ¡·¤¡r°° ¸®É oµ °Å o * จาก หนั งสือปฏิบัตกิ ารสําหรับนั กศึกษาวิชา 423101 Computer Programming
Chapter 0: Programming Basic
วิธีการเอาชนะปญหา (กระบวนการแกปญหา) การแกปญหาเปนความสามารถหนึ่งของมนุษย (จริงๆๆนะ) ลองมองมนุษยเรา เรามีการแกไขปญหาอยูทุกวัน ตั้งแตตื่นยันนอนหลับ (ในฝนดวย ...ตื่นมาอาจจะปวดหัว) แตการแกไขปญหาที่บอกขางตนนั้น เปนการแกไขปญหาแบบ ที่คงจะเรียกอยางนี้วาเปนแบบอัตโนมัติ และไมเปนระเบียบ เชน ตอนตื่นไปอาบน้ํา (บางคนอาจจะไมนะ) เราก็จะตองหา วิธีในการทําใหตัวเองลุกออกจากเตียงไปอาบน้ําดวยวิธีตางๆ อาจจะเปน นับหนึ่งถึงสาม แลวลุกอยางเร็ว อะไรประมาณนี้ นั่นก็คือการแกปญหา การกินขาว ถาถามวาคนเรากินขาวยังไง ก็จะเจอคําตอบวา “ก็ยัดใสปาก เคี้ยวๆๆๆๆ กลืน จบ” เฮอๆๆ แตการแกปญหาที่เราจะศึกษาเพื่อเขียนใสในคอมพิวเตอร ผมเคยไดยินจากอาจารยทานหนึ่งบอกวา ใหมองวา คอมพิวเตอรเนี้ย มันโงมากๆๆ คือ มันไมสามารถคิดเองได ตองคอยปอนคําสั่งใหมันทํา คําสั่งนั้นตองมีความชัดเจน พอที่จะทําใหคนโงทํางานได และคําสั่งตองมีการทํางานเปนกระบวนการที่ชัดเจน ยกตัวอยางเชน
จงหาวิธีการกินขาวของมนุษย (อันนี้ยกตัวอยางเฉยๆๆนะ ไมตองซีเรียส) 1. จับชอน 2. ตักขาวดวยชอนที่จับ 3. ยกชอนขึ้น 4. ถายังไมตรงกับปากให กลับไปทําขอ 3 อีก (บางคนบอกวาถาเลยหละ ... เฮอๆๆตัวอยางเฉยๆๆ) 5. เอาขาวในชอนใสในปาก 6. เคี้ยวขาว 7. ถาขาวยังไมละเอียดใหกลับไปทําในขอ 6 อีกครั้ง 8. กลืนขาว 9. ถาขาวยังไมหมดใหกลับไปเริ่มทําขอ 1 อีกครั้ง
จะเห็นไดวาอันนี้คือวิธีการกินขาวแบบเปนกระบวนการ ที่มีคําสั่งชัดเจนและมีกระบวนการที่ชัดเจน การเขียน ขางตนแบบนี้เรียกวา การเขียน Algorithm คือการเขียนเปนกระบวนการที่มีขั้นตอนชัดเจน และแตละขั้นตอนมีคําสั่งที่ ชัดเจนดวย Algorithm ขางตนนี้ อาจจะยังไมดีนัก คือ อาจจะเกิด Bug เกิดขึ้นได คิดงายๆเลย ที่ขอ 5 อาจจะมีคนแยงวา จะเอาขาวใสปากไดไง ทั้งๆที่ยังไมไดอาปาก (เฮอๆๆ ชางคิด) บางคนอาจจะบอกวา ถากินตะเกียบจะทํายังไง (อันนี้เริ่ม กวนอวัยวะสวนลาง ต่ํากวาตะตุมลงไป) ถาติดคอจะทํายังไงอะ (ยังๆ...ยังไมจบ) Algorithm จะตองกําหนดสิ่งที่เรียกวา ขอบเขต หรือ กรณีตางๆ ของเหตุการณใหครบ เพื่อที่การแกไขปญหาจะไดมีความชัดเจน และงายตอการเขียน Algorithm (เมื่อรูจักขอใชแทนคําวา กระบวนการแกไขปญหาเลยแลวกัน ... ไมไดแอบนะ) การเขียน Algorithm ดีไม ดี ปจจัยแรกคือ สามารถแกไขปญหาในขอบเขต หรือกรณีตางๆ ไดดีมากนอยแคไหน ดีในที่นี้อาจจะหมายถึงความเร็วใน การทํางานของ Algorithm หรืออาจจะเปนความกวางของขอบเขต หรือกรณีตางๆ
Computer Programming Programming Basic
4
Flow Chart
Flow Chart หรือผังงาน คือการเขียน Algorithm ในรูปแบบสัญลักษณ เพื่อที่จะใหมองเห็นภาพการทํางาน
ของโปรแกรมไดงายขึ้น โดยที่มีสัญลักษณมาตรฐานดังนี้
สัญลักษณ
ความหมาย จุดเริ่มตน/ สิ้นสุดของโปรแกรม ลูกศรแสดงทิศทางการทํางานของโปรแกรม ใชแสดงคําลั่งในการประมวลผล หรือการกําหนดคาขอมูลใหกับตัวแปร ใชแสดงการตรวจสอบเงื่อนไขเพื่อตัดสินใจ เมื่อเงื่อนไขเปนจริงหรือเท็จ ใชรับขอมูล/ แสดงผลขอมูลจากการประมวลผลออกมา ใชรับขอมูลทางคียบอรด ใชแสดงผลออกทางเครื่องพิมพ ใชเรียกใชฟงกชันที่เขียนขึ้นมาเอง
ใชแสดงผลออกทางจอภาพ จุดเชื่อมตอของ Flow chart ที่มาจากหลายทิศทางเพื่อจะไปสูการทํางานที่ เหมือนกัน การขึ้นหนาใหม ในกรณีที่ Flow chart มีความยาวเกินกวาจะแสดงในหนึ่ง หนา
Computer Programming Programming Basic
5
แบบฝกหัด: การเขียน Flow Chart 1. เขียน Flow chart แทนการทํางานของโปรแกรมตูเอทีเอ็ม โดยจําลองการถอนเงินของลูกคา ซึ่งเมื่อลูกคาทํา
การถอนเงินโปรแกรมจะทําการตรวจสอบจํานวนเงินที่ตองการถอนกับเงินที่อยูในบัญชี ถาจํานวนเงินในบัญชีมี มากกวาโปรแกรมจะยอมใหลูกคาถอนเงิน แตถาจํานวนเงินในบัญชีไมพอโปรแกรมจะไมยอมใหลูกคาถอนเงิน 2. เขียน Flow chart แทนการทํางานของโปรแกรมคํานวณเกรดเฉลี่ย โดยเริ่มโปรแกรมจะรับจํานวนรายวิชาแลว
ทําการวนรับคาเกรดและหนวยกิจตามจํานวนรายวิชาที่ผูใชปอนเขามาทางคียบอรด ถาผูใชปอนคาไมถูกตอง โปรแกรมจะวนรับคาใหม(เกรด ) เมื่อรับคาทั้งหมดครบใหโปรแกรมแสดงผลคาเกรดเฉลี่ยออกทางจอภาพ 3. จงเขียนกระบวนการหาผลรวมเลข ตั้งแต 1 ถึง N เมื่อ N เปนจํานวนที่รับเขามา 4. อานขอความตอไปนี้ แลวเขียนเปน Flow Chart "นักเรียนประถมศึกษา เมื่อครูประจําวิชาเดินเขามาในหอง นักเรียนทุกคนลุกขึ้น นักเรียนทุกคนลุกขึ้นทํา
ความเคารพ ครูบอกนักเรียนนั่งลง หลังจากนั้น ครูพูดวา นักเรียนทุกคนเงียบไดแลว เราจะเรียนวิชาภาษาไทย กัน ครูสํารวจโดยถาม นักเรียนวานักเรียนมีหนังสือภาษาไทยหรือไม ถาใครไมมีใหยายไปนั่งกับเพื่อนที่มีหนังสือ เมื่อทุกคน เรียบรอยแลว ใหนักเรียนเปดหนังสือหนา 35 แลวอานหนา 35‐36 ออกเสียงพรอมกัน หลังจากนั้นใหทํา แบบฝกหัดที่ 5 ถาใครทําแบบฝกหัดไมได ใหกลับไปอานหนังสือหนา 35 ‐ 36 ใหม ถาทําไดทําแบบฝกหัด ตอจนเสร็จ แลวนําแบบฝกหัดนั้นมาสงครู " 5. จงเขียนกระบวนการของการแยกแยะตัวเลข โดยการรับตัวเลข N มาจากผูใช ถา N สามารถแสดงไดในหลัก
เดียวใหแสดงคําวา One‐Digit ทํานองเดียวกัน ถาสองหลัก และสามหลักใหแสดงเปน Two‐Digit ,Three‐ Digit มิฉะนั้นแลวใหแสดงวา Over‐Three‐Digit 6. จงเขียนกระบวนการของการแยกแยะตัวเลข โดยการรับตัวเลข N มาจากผูใช ถา N เปนเลขคู ใหแสดงคําวา “It is an even number” ถาเปนเลขคี่ใหพิมพวา “It is an odd number”
Chapter 1: C Introductions
การเขียนภาษาคอมพิวเตอรนั่นจําเปนตองอาศัยปจจัยอยู 2 อยาง อยางแรกนั่นคือ Syntax คําๆนี้หมายถึง วิธีการเขียนโปรแกรม กฎกติกามารยาทตางๆ อีกสวนคือ Algorithm (หรือ Logic) นั่นคือ กระบวนการคิด หรือ กระบวนการทํางานของโปรแกรม ทั้งสองสวนนี้จะตองมีอยูในหัวเวลาที่จะเขียนโปรแกรมอะไรซักอยางหนึ่ง ถาไมมีแลว ... ยอมไมสามารถเขียนโปรแกรมได คงจะเหมือนการเตะบอล Syntax เหมือนกติกาการเตะบอล บอกวาทําอะไรได ทํา อะไรไมได นักเตะตองทําการกติกา สวน Algorithm ก็จะเหมือนการเลน เทคนิคการเลน วาจะเลนเกมสอยางไรใหชนะ วาจะวางแผนยังไง แตจริงๆแลวยังมีอีกสวนนะ นั่นคือ Trick อันนี้ขึ้นอยูกับวามีมากนอยเพียงใด ถายิ่งมีมาก ก็สามารถแกปญหา โดยการนํามาปรับใชกับโจทยของเราไดมาก (เปนธรรมดา)
รูปแบบ และสวนประกอบของ Code สําหรับ Anjuta #include<stdio.h> int main(){ return 0; }
ชนิดขอมูล ชนิดขอมูล
การกําหนดชนิดขอมูล
Integer
int variable_name;
Character char variable_name; String
char variable_name[n];
Float
float variable_name;
Double
double variable_name;
คําอธิบาย คือ ขอมูลตัวเลขจํานวนเต็ม คือ ขอมูลตัวอักษร 1 ตัวอักษร (ใชหลักการ ASCII Code) คือ ขอมูลประเภทขอความ เมื่อ n คือความยาวของขอความ คือ ขอมูลตัวเลขทศนิยม เชน 10.5 20.8 คือ ขอมูลชนิดทศนิยมละเอียดของทศนิยมมากขึ้น
Computer Programming C Introductions
หลักการตั้งชื่อตัวแปร 1. ควรตั้งชื่อใหสื่อความหมาย (อันนี้แนะนําอยางแรงเลย) 2. อักษรขึ้นตน ตองเปน a ถึง z หรือ A ถึง Z หรือเครื่องหมายขีดเสนใต ( _ ) ( <<< เนน ) 3. อักษรตอไป จะเปนตัวอักษร หรือตัวเลข หรือเครื่องหมายขีดเสนใต ก็ได แตหามมีชองวางภายในชื่อ 4. ตัวอักษรที่ใชเปน Case‐sensitive คือ ตัว a จะตางกับ A 5. *** ควรหลีกเลี่ยงที่จะใช _ ขึ้นตน 6. หามตั้งชื่อตรงกับ คําสงวน (Reserved Keywords) ซึ่งมีดังตอไปนี้
คําสงวนในภาษาซี asm auto break case cdecl char const continue default do
double else enum extern far float for goto huge if
int interrupt long near pascal register return short signed sizeof
static struct switch typedef union unsigned volatile void while
_cs _ds _es _ss _AH _AL _AX _BH _BL _BX
_BP _CH _CL _CX _DH _DL _DX _DI _SI _SP
ตัวอยางการตัง้ ชื่อตัวแปร int a,b,sum=0; float gpa; float 2g; char name[50];
int sizeof; char grade=’A’; char this grade=’A’; char str[]= “Computer Programming”;
เพิ่มเติมการตัง้ ตัวแปร
มาทดสอบการตั้งตัวแปรกัน ชื่อนักเรียน อายุ เกรดเฉลี่ย สวนสูง รหัสนักศึกษา เพศ รหัสวิชาเรียน
ผลรวมเลขจํานวนเต็ม จํานวนของตัวเลขทศนิยม ความกวางของสี่เหลี่ยม ความสูงของสี่เหลี่ยม พื้นที่สี่เหลี่ยม พื้นที่วงกลม คา PI
7
Computer Programming C Introductions
8
แสดงผลออกทางหนาจอกับ printf();
printf เปนคําสั่งที่ใชในการแสดงผลออกทางหนาจอ โดยมีขอความควบคุมเพื่อใหผลลัพธออกมาตามที่เรา
ตั้งใจไว (บางทีอาจจะไมไดตั้งใจก็เปนได) มาดูรูปแบบกันดีกวา printf(“ขอความควบคุม”[,ตัวแปรหรือคาตางๆ]); [,ตัวแปรหรือคาตางๆ] หมายถึงจะใสหรือไมใสก็ได หรือจะใสกี่ครั้งก็ได ตัวอยาง printf(“Testing text”); ออกทางจอภาพ : Testing text printf(“word1\nword2”); ออกทางจอภาพ : word1
word2
ในการควบคุมการแสดงผลทางจอภาพนั้น มีอักขระพิเศษที่ใชควบคุมอยูดวยเชน อักขระพิเศษ ความหมาย อักขระพิเศษ ความหมาย \n \t ขึ้นบรรทัดใหม Tab (เวนวรรค 8 ครั้ง) \\ \’ %s %c %o
\ ‘
%% \” %d
แสดงสตริง แสดงตัวอักษร แสดงเลขฐาน 8
%f %x
% “
แสดงจํานวนเต็ม แสดงทศนิยม แสดงเลขฐาน 16
ตัวอยาง จอภาพ
Code
#include<stdio.h> My Name is _________ int main(){ Age : ___ GPAX : _____ char name[]= “_________” , grade = ‘_’; I want “__” int age=___; float gpax=_____; printf(“My Name is %s\n”,name); printf(“Age : %d\t GPAX : %f\n”,age,gpax); printf(“I want \”%c\””,grade); return 0; }
printf แบบพิเศษ Code #include<stdio.h> int main(){ printf(“|%10s|\n”,“abc”); printf(“|%‐10s|\n”,“abc”); printf(“|%4s|\n”,“abcdefg”); printf(“|%05d|\n”,8); printf(“|%5.2f|\n”,3.5); printf(“|%.2f|\n”,3.141592); return 0; }
จอภาพ | abc| |abc | |abcdefg| |00008| | 3.50| |3.14|
Computer Programming C Introductions
puts(); และ putchar(); จะคลายกับ printf คือการแสดงผลทางหนาจอ แตจะสามารถแสดงผลไดทีละตัวแปร โดยที่ puts(); จะใช แสดงผลตัวแปร String สวน putchar(); จะใชแสดงผลตัวแปร Char (ตัวแปรชนิดอื่น ... อด) puts(ตัวแปร String); putchar(ตัวแปร Char); ตัวอยาง จอภาพ Code My Name is KAPONG #include<stdio.h> int main(){ I want A char name[]= “KAPONG”; char grade= ‘A’; puts(“My Name is ”); puts(name); puts(“\nI want ”); putchar(grade); return 0; }
การรับคาจากผูใช scanf(); และ gets(); scanf คือคําสั่งที่ใชในการรับขอมูลจากคียบอรด โดยคาที่รับเขามาจะขึ้นอยูกับขอความควบคุม gets คือคําสั่งที่ใชรับขอความจากคียบอรด (ขอความอยางเดียว) โดยจะเก็บในตัวแปรที่ระบุไว scanf(“ขอความควบคุม”[,ตัวแปรที่จะรับ]); gets(ตัวแปร char[] ที่จะรับ);
ขอความควบคุม จะใช %s,%f,%d เปนหลัก (อันนี้จําเปนมาก อันอื่นคอนขางไมออกสอบเลย) ตัวแปรที่จะมารับ ถาเปนประเภทเดียวกับ String ไมตองมี & ขางหนา ถาไมใชแลวใหใส & นําหนาดวย
ตัวอยาง Code
จอภาพ
#include <stdio.h> int main(){ char name[20],school[30]; int age; printf(“Please Enter Your Name : ”); scanf(“%s”,name); printf(“Please Enter Your School : ”); gets(school); printf(“Please Enter Your Age : ”); scanf(“%d”,&age); printf(“Name : %s\n”,name); printf(“School : %s\n”,school); printf(“Age : %d”,age); return 0; }
Please Enter Your Name : Pong Please Enter Your School : SUT University Please Enter Your Age : 20 Name : Pong School : SUT University Age : 20
9
Computer Programming C Introductions
10
อักขระพิเศษเพิ่มเติม
%[^\n] %[a‐z] , %[A‐Z] %[^a‐z] , %[^a‐z] %[0‐9] , %[^0‐9]
ความตางระหวาง scanf และ gets
แบบฝกหัด: C Introduction 1.
จงเขียนโปรแกรมใหแสดงผลลัพธทางจอภาพดังนี ้ =================================================== ID Name Age GPAX =================================================== B5000001 Somsak 18 2.50 B5000002 Somsri 18 3.25 B5000003 Somprasong 18 3.75 B5000004 Sommai 18 2.75 ===================================================
2.
จงเขียนโปรแกรมรับคา id, name, age จากผูใช แลวทําการแสดงผลออกทางจอภาพ
Chapter 2: Operators
เมื่อเราไดตัวแปรมาแลว เราจะรับมาแลวแสดงผลเลย มันก็จะกะไรอยูนะ มันคงจะตองมีตัวดําเนินการกันบาง โดยตัวดําเนินการ ผมอยากจะแบงเปน 5 แบบ คือ ตัวดําเนินการเกี่ยวกับการกําหนดคาและเพิ่มคา ตัวดําเนินการทาง คณิตศาสตร ตัวดําเนินการทางตรรกะ ตัวดําเนินการเชิงบิต ตัวดําเนินการกําหนดคาแบบมีเงื่อนไข
ตัวดําเนินการทางคณิตศาสตร การใชงาน Operator + ทําการบวก
ตัวอยาง a=a+b; c=3+5; a=a‐b; c=3‐5; a=2*3;
‐
ทําการลบ
*
ทําการคูณ ทําการหาร a=a/2; ทําการหารเอาเศษ a=3%2;
/ %
a= +3; (+3 คาที่ไดก็คือ 3) b=a+5; a= ‐3; b=a‐5; c=a*b; b=5/3; (ผลลัพธจะเปน 1) b=a%4;
เพิ่มเติม
ตัวดําเนินการในการกําหนดคาและเพิ่มคา ความหมาย Operator ตัวอยาง = n=8; นําคา 8 ไปใสในตัวแปร n += n+=8 n = n+8; ‐= n‐=8 n = n‐8; *= n*=8 n = n*8; /= n/=8 n = n/8; %= n%=8 n = n%8; ++ ++n n=n+1; n++ ‐‐ ‐‐n n=n‐1; n‐‐ ขอเพิ่มเติมที่เครื่องหมาย ++ กับ ‐‐ นะ อันนี้คอนขางที่จะสําคัญเลยทีเดียว คือ ลองดูคําสั่งสองแบบนี้ แลวอาจจะ เขาใจมากยิ่งขึ้น คําสั่ง คาที่ได
num1=8; num2=++num1 ‐3; num1=__ , num2=__
num1=8; num2=num1++ ‐ 3; num1=__,num2=__
Computer Programming Operators
12
ความหมายของ ++, ‐‐ ถาจะเอาใหงาย หมายถึงวา ถา ++num หมายถึง เพิ่มคา num ขึ้นอีก 1 แลวคอยนําคา num มาใช แตถา num++ หมายถึง นําคา num มาใชกอนแลวคอยเพิ่มคา num ขึ้นอีกหนึ่ง ลองทดสอบดูในโคด ขางบนนะครับ (‐‐ เหมือนกันนะ ไมอยากเขียนซ้ํา) จํางายๆ ++ มากอน เพิ่มคากอน ++ มาหลัง เพิ่มคาหลัง
ตรงนี้อาจจะยังไมสามารถอธิบายการทํางานของเครื่องหมายไดทั้งหมด ลองดูวาคาตอไปนี้ แตละตัวแปรเมื่อผาน คําสั่งตอไปนี้จะมีคาเปนเทาไหรบาง สมมุติวา x=3,y=4,z=7,a=1,b=2 โจทย คา โจทย คา x=++y ‐3%2
x=y++ ‐ 3%2
a+=b%2‐5*3
a+=b%(2‐5)*3
x+= 3%2 + y++
x+= 3%2 + ++y
x= y++ + ++z
x= ++y + z++
x=x++
x=++x
x=(a=b++)+2*b
x=(a=++b)+2*b
ตัวดําเนินการเชิงตรรกะ ชื่อก็บอกวา ตรรกะ ดังนั้นคงตองใช ตรรกศาสตร ในการคํานวณแนๆๆ กอนอื่นตองบอกอยางนี้วา ในภาษาซี จะ มองวา 0 แทนคาเท็จ และคาใดๆก็ตามที่ ไมใช 0 แทนคาจริง (แตในความนิยมจะให 1 แทนจริง และผลที่ไดจาก เครื่องหมายนี้ก็จะได 1 เมื่อจริงเชนกัน) โอเค มาดูกันเครื่องหมายกันเลย
Operator == > < >= <= != && || !
ตัวอยาง
ความหมาย เทากับ a==b มากกวา a>b นอยกวา a<b มากกวาหรือเทากับ a>=b นอยกวาหรือเทากับ a<=b ไมเทากับ a!=b (a>b)&&(a<c) และ (a>b)||(a<c) หรือ นิเสธ (not) !(a<b)
ตัวอยางเชน ถากําหนดให a=5,b=7,c=10 คําสั่ง คาที่ได a>b a<(c‐b) (a+b)>c (a*+7)%2==c%2 c!=4 (a>b)&&(c<b)
0 0 1 1 1 0
Computer Programming Operators
13
ตัวอยาง Code
จอภาพ
#include<stdio.h> #include<string.h> int main(){ int a,b,c=5; char ch = 'A'; char str[10] = "Computer"; char str2[] = "Computer"; a=b=c=10; printf("a=%d,b=%d,c=%d\n",a,b,c); printf("a=%d,b=%d,c=%d\n",++a,b++,c‐‐); printf("a=%d,b=%d,c=%d\n",a,b,c); a=ch++; printf(“a=%d,%c\n”,a,a); printf(“ch=%c,%d\n”,ch,ch); printf(“sizeof(str)=%d\n”,sizeof(str)); printf(“strlen(str)=%d\n”,strlen(str)); printf(“sizeof(str2)=%d\n”,sizeof(str2)); printf(“strlen(str2)=%d\n”,strlen(str2)); return 0; }
หลังจากนี้ขอขามตัวดําเนินการเชิงบิต กับตัวดําเนินการแบบเงื่อนไขไปกอน เพราะอาจจะทําใหงงกันได มาดู เรื่องที่สําคัญสําหรับเครื่องหมายเลยดีกวา
ลําดับความสําคัญของเครื่องหมาย
เครื่องหมาย
ความสําคัญ ทําจาก สูงสุด ซายไปขวา ( ) ขวาไปซาย ! ++ ‐‐ (type cast) | ซายไปขวา * / % | ซายไปขวา + ‐ | ซายไปขวา < <= > >= | ซายไปขวา == !== | ซายไปขวา && | ซายไปขวา || V ตําสุด ขวาไปซาย = += ‐= *= /= %=
Computer Programming Operators
14
แบบฝกหัด: Operator 1. จงเขียนโปรแกรมรับคาจํานวนเต็ม 3 จํานวนจากผูใช แลวทําการหาคาเฉลี่ย 2. จงเขียนโปรแกรมแปลงคาจากหนวยเซนติเมตร เปน ฟุตและนิ้ว กําหนดให (2.54 cm = 1” ,12” = 1
ฟุต) 3. จงเขียนโปรแกรมแปลงคาจากองศาฟาเรนไฮต เปน องศาเซลเซียส 4. จงเขียนโปรแกรมรับคาจํานวนวินาทีจากผูใช แลวทําการแปลงใหเปนชั่วโมง นาที และวินาที ตามลําดับ
เชน 7450 วินาที ก็เปน 2 ชั่วโมง 4 นาที กับอีก 10 วินาที 5. *จงคํานวณหาพื้นที่ของวงกลมที่ใหญที่สุดในสี่เหลี่ยมผืนผา เมื่อรับคาดานกวาง และดานยาวมาจากผูใช 6. *จงคํานวณหาพื้นที่ที่นอยที่สุดเมื่อทําการตัดวงกลมออกจากสี่เหลี่ยมผืนผา เมื่อรับคาดานกวางและดานยาว
จากผูใช 7. *จงหาพื้นที่ของสี่เหลี่ยมผืนผาที่ใหญที่สุดที่บรรจุอยูใน ครึ่งวงกลม 8. *จงรับคาเขามา 10 คาแลวทําการหาจํานวนของเลขคู และจํานวนของเลขคี่ 9. จงรับจํานวน num มาจากผูใช (ขอบเขตของ num ตั้งแต 0 ถึง 9999) แลวทําการหาคาของผลบวก
ตัวเลขแตละหลักของ num เชน 2345 ก็จะเปน 2+3+4+5 = 14 เปนตน
Chapter 3: Controls
หัวขอนี้จะเริ่มมีการเขียนโปรแกรมมากยิ่งขึ้นอีก(อีกละ) และตอง focus หนักกวาเดิม(นั่น) เพราะหัวขอนี้ถือวา เปนหัวขอที่เปนหัวใจของการเขียนโปรแกรมเลยทีเดียว (สวนอื่นเหมือนตับไต ขาดไมไดเหมือนกัน) สวนนี้จะมี Syntax คอนขางนอย แตจะไปเนนหนักเรื่อง Algorithm มากกวาเยอะ ไมเสียเวลาเริ่มกันเลยดีกวา
If…else…
If…else… เปนคําสั่งที่ใชในการตัดสินใจ เมื่อตองตัดสินใจ (เฮอๆๆ) ยกตัวอยางเชน ถา(if) จะมาติว (เงื่อนไข)
ตองกินขาวมากอน(คําสั่งเมื่อจริง) หากไม(else) ก็กินตามปกติ(คําสั่งเมื่อเท็จ) (แอบแซวนิดหนึง) จะเห็นไดวา เมื่อมี ขอความๆ หนึ่งซึ่ง มีโอกาสเปน จริง หรือเปนเท็จ ไดเมื่อรันโปรแกรม (เงื่อนไข) แลวมีทางออกใหเลือกมากกวา 1 ทาง เหมือนตัวอยาง เราจะใช if else มาจัดการ รูปแบบคําสั่ง มีดวยกัน 3 แบบ คือ if (เงื่อนไข){ }
คําสั่งs;
คําสั่ง; else
if (เงื่อนไข) {
คําสั่ง; … } else {
คําสั่ง; }
if (เงื่อนไข)
…
คําสั่ง; if (เงื่อนไข) { คําสั่ง; … } else if (เงื่อนไข 2) { } … เงื่อนไขถัดไป ถามี } else { คําสั่ง; … }
แบบที่ 1 (มุมบนซาย) คือ มีทางเลือก 2 ทางคือถาจริงก็ทําคําสั่ง และถาเท็จก็ไมทําอะไร แบบที่ 2 (มุมลางซาย) คือ มีทางเลือก 2 ทาง คือถาจริงทําชุดคําสั่งบน ถาเท็จทําคําสั่งลาง แบบที่ 3 (มุมลางขวา) คือ ถามีมากกวา 2 ทางขึ้นไป ก็ else if ไปเรื่อยๆ จนครบ สวน else สุดทายคือไมเขากรณีใดๆ เลย เงื่อนไขในที่นี้ สวนใหญจะเปน นิพจน ที่ประกอบไปดวยเครื่องหมายแบบตรรกะ แลวใหผลลัพธ เปน จริง หรือ เท็จเทานั้น สังเกต หากเปนคําสั่งเดียว จะไมจําเปนตองใส { } (ยกใหเห็นใน แบบมุมบนขวา) แตถามีคําสั่งมากกวา 2 คําสั่งจะตองใส { } ครอบ ขอแนะนํา หากเขียนโปรแกรมควรมีการเวนเขาไปใหบอกวาใครอยูในวงไหน สังเกตจากตัวอยางวา คําสั่งจะมี การเวนเขาไปขางในอีก
Computer Programming Control
16
มาดูตัวอยางกันโปรแกรมกัน เชน #include <stdio.h> int main(){ int x; printf(“Please enter even number :”); scanf(“%d”,&x); if (x%2 == 0) printf(“It\’s even number\n”); else { printf(“%d is ”,x); printf(“Odd Number\n”); } }
ผลการรัน Please enter even number : 20 It’s even number
ผลการรัน Please enter even number : 11 11 is Odd Number
Switch…case switch…case เปนคําสั่งที่มีลักษณะคลายกับ if…else หลายเงื่อนไข เหมาะกับการทํา if…else ที่มีการ
เปลี่ยนเงื่อนไขเฉพาะคาเทานั้น อาจจะงงเล็กๆ ลองมาดูรูปแบบ switch(ตัวแปรที่เปนเงื่อนไข){ ตัวอยางเชน case คาที่ 1 : คําสั่งs; switch(x){ }
break; case คาที่2 : คําสั่งs; break; …. case คาที่ n : คําสั่งs; break; default : คําสั่งs;
}
case 1 : printf(“X is One”); break; case 2 : printf(“X is Two”); break; case 3 : printf(“X is Three”); break; default : printf(“X is other”);
การทํางานของตัวอยางที่ใหก็เชนวา ถา x =1 ก็จะพิมพคําวา “X is One” ถา x=2 ก็พิมพคําวา “X is Two” ถา x=3 ก็พิมพคําวา “X is Three” แตถาไมใชก็พิมพคําวา “X is other”
default สําหรับกรณีที่ไมใชคาที่ระบุไวใน case กอนหนานี้ แลวจะทําคําสั่งภายใน default เหมือนกับ
if…else หลายๆทางเลือกอะ default ก็จะเหมือนกับ else ตัวสุดถา คือถาไมเขากรณีไหนเลยก็ทําคําสั่งนี้ อะไร
ประมาณนี้ จุดที่จะเนน เปนพิเศษ (ไมไดบอกอะไรนะ) นั้นก็คือ สังเกตวาจะมีการใส break; ทุกๆ case ที่พิมพเลย ให ลองเดาดูกอนถาเราไมใส break; จะเกิดอะไรขึ้น.... ผลลัพธคือ เบรกแตกไง เหมือนรถไมมี เบรกแหละ มันก็จะหยุด ไมได อันนี้ก็เหมือนกัน เชน
Computer Programming Control
17
ตัวอยางเชน switch(x){ case 1 : printf(“X is One”); case 2 : printf(“X is Two”); case 3 : printf(“X is Three”); default : printf(“X is other”); } ถา x=1 ก็จะพิมพ “X is OneX is TwoX is ThreeX is other” ถา x=2 ก็จะพิมพ “X is TwoX is ThreeX is other” เฮอๆๆ เห็นถึงการ break แตกหรือยัง คือมันจะทํางานลงมาเรื่อยๆจนจบ switch เลย ดังนั้น ทุก case จะตองมี break; เปนคําสั่งหลังสุดทุกครั้ง แบบฝกหัด: If‐else & switch‐case 1. จงเขียนโปรแกรมรับคาจํานวนเต็ม n จากผูใช หากผูใชกรอกตัวเลขที่มากกวา 30 และเปนเลขคู ใหพิมพ
วา “You’re right” หากไมใชใหพิมพคําวา “You’re wrong” 2. จงเขียนโปรแกรมรับคาจํานวนเต็ม score จากผูใช แลวทําการหาเกรด โดยมีเกณฑดังนี้ 80 ขึ้นไป 70‐79 60‐69 50‐59
A B C D F
นอกนั้น
3. จงเขียนโปรแกรมถามแปลงคาองศาจากฟาเรนไฮตเปน เซลเซียส หรือจาก เซลเซียสเปนฟาเรนไฮต โดยการ
รับอักษร 1 ตัวมาจากผูใช หากเปน C ใหรับคาขององศาเซลเซียส แปลงเปน ฟาเรนไฮต หากเปน F ใหรับ คาขององศาฟาเรนไฮต แปลงเปน เซลเซียส หากไมใช ใหพิมพคําวา “You’re wrong” 4. จงเขียนโปรแกรมรับจํานวนเต็มมา 10 จํานวน แลวทําการหาคาสูงสุด พรอมทั้งคาเฉลี่ย ของเลขคู
for loop คําวา loop คือ จะมีการวนซ้ํา ดังนั้น for loop จึงเปนการวนซ้ําแบบ for การวนซ้ําแบบนี้สวนใหญใชกับการ วนซ้ําที่มีการวนรอบที่แนนอน (นับได) และการวนซ้ําแบบนี้มักจะมีตัว index ที่ใชในการบอกวาไปถึงรอบที่เทาใดแลว index ที่อยูในความนิยมมักจะใช i , j , k , l (อันนี้คือความนิยม) ลองมาดูรูปแบบของ for loop กันเลยดีกวา for (คําสั่งเริ่มตน;เงื่อนไข;คําสั่งจบรอบ) for (คําสั่งเริ่มตน;เงื่อนไข;คําสั่งจบรอบ){
คําสั่ง;
}
คําสั่งs;
Computer Programming Control
18
อยากจะบอกวา { } ใชหลักการเดียวกับ if‐else คือ ถามีคําสั่งภายใต for เพียงคําสั่งเดียว ไมจําเปนที่จะตองใส แตถามีมากกวา 1 คําสั่ง จะตองใสดวย
มาดูตัวอยางกันเลยดีกวา #include <stdio.h> int main(){ int num,i; printf(“Please enter a number :”); scanf(“%d”,&num); for (i=0;i<num;i++) printf(“%d ”,i); } #include <stdio.h> int main(){ int num,i; printf(“Please enter a number :”); scanf(“%d”,&num); for (i=1;i<=num;i++) printf(“%d ”,i); }
ผลการรัน Please enter a number : 10 0 1 2 3 4 5 6 7 8 9
ผลการรัน Please enter a number : 10 1 2 3 4 5 6 7 8 9 10
แบบฝกหัด: for‐loop 1. จงเขียนโปรแกรมรับคาตัวเลขจํานวนเต็มบวกจากผูใช แลวทําการพิมพ คาจากตัวเลขนั้น จนถึง 1 (นับลง) 2. จงเขียนโปรแกรมรับคาตัวเลขจํานวนเต็มบวกจากผูใช หากผูใช ใสคาเลขคี่ ใหพิมพตั้งแต 1 ถึง ตัวเลขนั้น
โดยพิมพเฉพาะเลขคี่ หากรับเลขคู ใหพิมพตั้งแต 0 ถึงตัวเลขนั้น โดยพิมพเฉพาะเลขคู 3. จงเขียนโปรแกรมคลายกับขอที่ 2 แตใหนับลงแทน 4. แสดงเลขที่หาร 5 ลงตัว ที่มีคาระหวาง 50‐100 พรอมทั้งนับจํานวน 5. แสดงเลขที่หาร 9 ลงตัว ที่มีคาระหวาง 1‐199 พรอมทั้งนับจํานวน 6. จงเขียนโปรแกรมรับคาตัวเลขจํานวนเต็มบวก แลวทําการพิมพแมสูตรคูณของเลขจํานวนนั้น 7. จงเขียนโปรแกรมหาผลรวมเลข ตั้งแต 1 ถึง N เมื่อ N เปนจํานวนที่รับเขามา 8. จงเขียนโปรแกรมรับจํานวนเต็มมา 10 จํานวน แลวทําการหาคาสูงสุด พรอมทั้งคาเฉลี่ย 9. จงเขียนโปรแกรมพิมพคาจาก A ถึง Z 10. จงเขียนโปรแกรมพิมพคาจาก Z ถึง A 11. จงเขียนโปรแกรมรับคาตัวอักษร 1 ตัวจากผูใชแลวทําการพิมพจาก A ถึงตัวอักษรนั้น แลวพิมพกลับไปยัง A อีกครั้ง Please enter a character : L A B C D E F G H I J K L K J I H G F E D C B A 12. จงเขียนโปรแกรมรับคาของตัวเลขจํานวนเต็ม แลวทําการพิมพสี่เหลี่ยมที่มีความกวางเทากับจํานวนเต็มนั้น Please enter a number : 4 * * * * * * * * * * * * * * * *
Computer Programming Control
13. จงสรางรูปตอไปนี้ดวย for loop
14. จงเขียนโปรแกรมคลายๆกับ ขอ 12 แตเปนรูปเหลี่ยมกลวง Please enter a number : 4 * * * * * * * * * * * * 15. จงเขียนโปรแกรมคลายกับขอ 14 แตเปนสี่เหลี่ยมกลวงของตัวอักษร Please enter a number : 4 A B C D E F G H I J K L 16. จงใชความรูที่ไดจากขอ 12,14,15 แลวจงสรางรูป Character Diamon Please enter a number : 4 A B C D E F G H I J K L 17. จงใหความรูจากขอที่ 16 แลวสรางรูปสามเหลี่ยมกลวง Please enter a number : 4 A B C D E F G H I 18. จงเขียนโปรแกรมสรางสามเหลี่ยมกลับหัว
19
Computer Programming Control
20
while loop & do‐while loop while loop จะนิยมใชกันมากกับ loop ที่โปรแกรมเมอร (คนที่เขียน) คิดวาลูปนั้นหนะมีจํานวนรอบไม แนนอน (คือเรื่อยๆ ประมาณนั้น) ตัวรูปแบบจะมีลักษณะที่งายกวา for loop เล็กนอย (คิดวางั้น) while loop มีคูหูอยู ตัวหนึ่งคือ do‐while loop ซึง่ มีลักษณะที่เหมือนกับ while loop แตตางกันตรงนิดเดียว เดี๋ยวลองดู รูปแบบและการ ทํางานกอน while (เงื่อนไข){ }
คําสั่งs;
การทํางานของ while 1. ตรวจสอบเงื่อนไขวาเปนจริงหรือไม หาก พบวาเท็จ ก็จบ loop while หากจริงให ดําเนินการตอไป 2. ทําคําสั่งภายใน while loop 3. กลับไปทําขอ 1
do{
คําสั่งs; }while (เงื่อนไข); การทํางานของ do‐while 1. ทําคําสั่งภายใน do‐while loop 2. ตรวจสอบเงื่อนไขวาเปนจริงหรือไม หาก พบวาเท็จ ก็จบ loop หากจริงใหกลับไปทํา ขอ 1
ขอสังเกต while กับ do‐while จะตางกันตรงที่วา หากเงื่อนไขเปนเท็จตั้งแตแรก while จะไมทําคําสั่ง ภายในลูปเลย แต do‐while จะไดรับการทําคําสั่ง 1 ครั้ง เอาแบบทางการคือวา do‐while จะไดรับการทําคําสั่งภายใน loop อยางนอย 1 ครั้งเสมอ แต while จะทําคําสั่งก็ตอเมื่อ เงื่อนไขยังคงเปนจริงอยู
มาดูตัวอยางกันเลย #include <stdio.h> int main(){ int num,i; printf(“Please enter a number :”); scanf(“%d”,&num); while(num>0){ printf(“%d ”,num); num‐‐; } } #include <stdio.h> int main(){ int num,i; printf(“Please enter a number :”); scanf(“%d”,&num); do { printf(“%d ”,num); num‐‐; } while(num>0); }
ผลการรัน Please enter a number : 10 10 9 8 7 6 5 4 3 2 1 Please enter a number : 0
ผลการรัน Please enter a number : 10 10 9 8 7 6 5 4 3 2 1 Please enter a number : 0 0
Computer Programming Control
21
แบบฝกหัด: while & do‐while 1. จงเลือกหนึ่งโปรแกรมจากแบบฝกหัด for loop แตใหเปลี่ยนไปใช while loop แทน 2. จงเขียนโปรแกรมรับคาตั้งแต 5 – 20 จากผูใช หากผูใชกรอกผิดใหขึ้นคําวา “Wrong number” แลวทําการ
รับคาใหมจนกวาผูใชจะรับคาถูกตอง 3. จงเขียนโปรแกรมรับคา 10 คาจากผูใช โดยคาที่เก็บนั้นตองอยูระหวาง 0 – 10 แลวทําการหาคาสูงสุด 4. เขียนโปรแกรมเพื่อรับขอมูลของคนๆหนึ่ง ประกอบดวย เพศ (‘F’,’M’) อายุ (int 20‐50) และน้ําหนัก
(weight) ถาเปนผูชายอายุ 30‐50 น้ําหนัก 50 – 60 หรือผูหญิงอายุ 20‐30 น้ําหนัก 45 – 55 แลวพิมพคํา วา “GREAT” ถาไมใหพิมพคําวา “HOHOHO” 5. รับคาตัวเลข 2 จํานวนจากผูใช a ,b โดยที่ 0<a<10 และ 20<b<40 ถาไมอยูในชวงดังกลาวใหพิมพวา “ERROR” และวนรับใหม เมื่อได a,b แลวใหทําการพิมพคาเลขคูตั้งแต a ถึง b 6. จงเขียนโปรแกรมถามผูใชใหปอนคาเลขจํานวนเต็ม 1 จํานวน ซึ่งมีคา 1‐12 ถาไมอยูในพิสัย โปรแกรมจะแสดง
ขอความวา “Invalid Input!” แลวทําการวนลูปรับขอมูลใหม จนกวาจะไดขอมูลที่ตองการ หลังจากนั้นให แสดงผลลัพธตารางสูตรคูณ 7. จงเขียนโปรแกรมรับคาจํานวนเต็ม 1 จํานวน ซึ่งมีคาระหวาง 1‐100 ถาไมถูกตองใหโปรแกรมวนรับคาจนกวา
จะไดคาที่ถูกตองพรอมแสดงขอความเตือน จากนั้นคํานวณผลบวกจํานวนคี่ n จํานวน โดยเริ่มจาก 1 เชน n = 4 ผลลัพธ คือ 1+3+5+7 = 16 8. จงเขียนโปรแกรมใหรับคาจากผูใชเปนอักขระ 1 ตัวเฉพาะสระภาษาอังกฤษ(a,e,i,o,u) และเลขจํานวนเต็ม 1
จํานวนมีคาระหวาง 5‐20 ถาขอมูลที่ใสเขามาไมถูกตองใหแสดงขอความ “Invalid data!” และวนรับคาใหม หลังจากนั้นทําการแสดงคาสลับระหวางตัวเล็กแลวตัวใหญตามจํานวนเลขจํานวนเต็มที่ปอนเขามา
แถม...Break, Continue คําสั่ง break; และคําสั่ง continue; เปนคําสั่งที่ใชในการควบคุม loop โดยที่ break; จะไวสําหรับการออก จากลูป หรือ switch (...กําลังจะเขียน) โดยที่จะออกในทันที แต continue; จะเปนคําสั่งที่จะใชไดเฉพาะลูป เมื่อเจอ คําสั่งนี้ในลูป โปรแกรมจะไมทําคําสั่งใดๆตอ แตจะกลับไปตรวจสอบเงื่อนไขใหม แปลงายๆวาคลายกับ break; แตจะ ไปเริ่มใหม แต break;จะออกไปเลย (หมายเหตุ ถาเปน for loop จะกลับไปทําคําสั่งจบรอบ กอนแลวจึงไปตรวจสอบ เงื่อนไข)
Chapter 4: Function
คําถามที่ตองตอบ ฟงกชันคืออะไร ... มันคือการนํากระบวนการบางสวนมาเขียนแยกออกจากโปรแกรมนั่นเอง เปนการกระทํากระบวนการยอย (Module) ... (ยังงงอยูใชปะ) โดยกระบวนการยอยนี้อาจจะมองกับไปถึงหัวขอแรกของ เรา เชน การตมมามา กระบวนการที่อยูที่ main ก็จะสนใจแควา ตมน้ําใหเดือด ,เอาเสนลงหมอ ,รอจนสุก และตักใสถวย แต function จะมองถึงวา กระบวนการตมน้ําใหเดือดทํายังไง แคนั้น แลวคอยเอา function ที่ได มาให main ใช ก็จะ เปนคําสั่งตมน้ําภายใน main main เปนฟงกชันหนึ่งใน ภาษาซี ซึ่งจะถือวาเปนฟงกชันแรกที่ตัว Compiler จะทํางานดวยเลย แลวแตวา main จะไปเรียกฟงกชันไหนมาทํางานตอก็สุดแลวแต (อันนี้ตองรูนะ) เอาหละ เราวามาไกลพอสมควรแลวมาดูวิธีการมองฟงกชันกันเลยดีกวา Parameter
Function
ตัวแปรที่สงใหฟงกชัน
Return Value
คาที่สงกลับมายังคนที่เรียก ฟงกชัน
ฟงกชันเราจะสนในตัว Parameter ที่สงเขาไปใหกับ Function ที่จะเขียน กระบวนการภายใน Function และคาที่สงกลับมาใหกับคนที่เรียกมัน (Return Value) เอาหละเรามาดูรูปแบบการประกาศและการเรียกใชกันกอน ดีกวา การประกาศ ชนิดของคาที่จะสงกลับ ชื่อฟงกชัน(ตัวแปรที่จะสงใหฟงกชัน){ คําสั่งs; return คาที่สงกลับ; //ในกรณีที่มีการสงคากลับ }
การประกาศฟงกชันตนแบบ (Prototype) ชนิดของคาที่จะสงกลับ ชื่อฟงกชัน(ตัวแปรที่จะสงใหฟงกชัน); การเรียกใชกรณีมีการสงคากลับ ตัวแปรที่ใชรับ = ชื่อฟงกชัน(คาที่สงใหฟงกชันตามที่ไดประกาศ); การเรียกใชกรณีที่ไมมีการสงคากลับ ชื่อฟงกชัน(คาที่สงใหฟงกชันตามที่ไดประกาศ);
ชนิดของคาที่จะสงกลับ จะเหมือนกับชนิดของตัวแปรเลย แตเพิ่มมาหนึ่งชนิดนั่นคือ void นั่นคือการบอกวาจะ ไมสงคากลับ (ถาเปน void ไมตองมีคําสั่งบรรทัด return) ตัวแปรที่จะสงให จะประกาศเหมือนกับประการตัวแปรเลย แตวาแตละตัวแปรจะขั้นดวยเครื่องหมาย , (comma) โดยเมื่อประกาศเสร็จจะไมมี ; ปดทาย ชื่อฟงกชัน ใชหลักการ เดียวกับชื่อตัวแปรเลย แตระวังในการใชชื่อฟงกชันที่ซ้ํากับฟงกชันที่มีอยูแลว คําสั่งภายใน คิดเหมือนตอนอยูใน main จะเห็นวามีการประกาศฟงกชันตนแบบ อันนี้ใชในกรณีที่อยากจะระบุรายละเอียดของฟงกชันไวหลัง main แต หากทําอยางนั้น main จะไมรูจักแลวจะทําให error ได ดังนั้นจะตองมีการประกาศฟงกชันตนแบบไวสวนหนา main หรือ ไวภายใน main ก็ได (ในกรณีที่ไวภายใน main, main เทานั้นที่จะสามารถใชฟงกชันนี้ได) การประกาศตนแบบ นี้เรียกวา Prototype ซึ่งจะเหมือนกับบรรทัดแรกของการประกาศฟงกชันแตเปลี่ยนจาก { เปน ; ปดทายเลย
Computer Programming Function
23
ฟงกชันที่มีการเรียกใชฟงกชันอื่น จะตองเขียนไวหลังฟงกชันที่ตัวเองเรียกใชเสมอ ไมงั้น error (ดูกรณี main เปนตัวอยาง) เอาหละ มาดูตัวอยางการเขียนโปรแกรมกันเลยดีกวา ไมใชฟงกชัน (Before) ใชฟงกชัน (After) #include<stdio.h> #include<stdio.h> int main(){ int getnumber(char strwel[],char strerr[]){ int a,b; int a; do{ do{ printf(“Please enter a :”); printf(strwel); scanf(“%d”,&a); scanf(“%d”,&a); if(a>=0&&a<=50) if(a>=0&&a<=50) break; break; else else printf(“Error Na”); printf(strerr); }while(1); }while(1); do{ return a; printf(“Please enter b :”); } scanf(“%d”,&b); if(b>=0&&b<=50) int main(){ break; int a,b; else a=getnumber(“Please enter a:”, “Error printf(“Error Na”); Naja”); b=getnumber(“Please enter b:”, “Error }while(1); Na Ja”); printf(“%d+%d=%d”,a,b,a+b); printf(“%d+%d=%d”,a,b,a+b); } } จากตัวอยางขางตนนี้เห็นวาหลังจากการใชฟงกชัน จะทําให main สั้นลงเยอะมาก และเราไมตองเขียน do { … } while หลายๆรอบดวย เพียงเขียนรอบเดียวก็สมบูรณได อีกอยาง จะทําให main อานงายขึ้นดวยวาเปนโปรแกรมทํา
อะไร
ฟงกชันสําเร็จรูป
strlen() ;
strcat(); strcmp();
strcpy();
isalpha() islower() isupper() isdigit() isspace() tolower()
หาความยาว String การนํา String หนึ่งมาตอกับอีก String หนึ่ง การเปรียบเทียบ String 2 ตัว การคัดลอง String toupper() ceil() floor() pow() sqrt()
Computer Programming Function
24
แบบฝกหัด 1.
จงเขียน Prototype ของฟงกชันตอไปนี้ a.
ฟงกชัน calculate ทําหนาที่คํานวณ รับอารกิวเมนทจํานวนเต็ม 2 จํานวน และสงคากลับเปน จํานวนเต็ม ________________________________________________
b.
ฟงกชัน display ทําหนาหนาแสดงผล รับอารกิวเมนทจํานวนเต็ม 1 คา ________________________________________________
c.
ฟงกชัน display2 ไมรับอารกิวเมนท และไมสงคากลับ ________________________________________________
d.
ฟงกชัน grade_cal ทําหนาที่คํานวณเกรด โดยรับอารกิวเมนทเปนคาคะแนน(จํานวนเต็ม) แลว สงคากลับเปนเกรด A,B,C,D หรือ F ________________________________________________
e.
ฟงกชัน getArea รับอารกิวเมนทเปนคารัศมีวงกลม(ทศนิยม) และสงคากลับเปนคาพื้นที่ วงกลม(ทศนิยม)
________________________________________________
2. จงเขียนโปรแกรมรับคาอักขระ 1 ตัว โดยตองเปน a‐z ถาปอนเขามาไมถูกตองใหวนรับคาใหม จากนั้นสง
คาใหฟงกชัน loop() แสดงผล ผลรวม และจํานวนตามตัวอยางการรัน ตัวอยางการรันโปรแกรม 3. จงเขียนโปรแกรมแสดงขอความเปนจํานวนครั้งที่ผูใชตองการโดยโปรแกรมจะรับอักขระและจํานวนครั้ง
จากผูใช ในสวนของการแสดงขอความใหเขียนเปนฟงกชัน โดยสงอารกิวเมนตเปนตัวอักขระและจํานวน ครั้ง 4. จงเขียนโปรแกรมรับขอมูลใหกับ a,b,c ซึ่งเปนความยาวดานทั้งสามของสามเหลี่ยมแลวสงใหกับฟงกชัน area() ซึ่งเปนฟงกชันที่จะทําการคํานวณคาพื้นที่สามเหลี่ยม แลวสงคืนกลับให main แสดงคาพื้นที่นั้น
(ในกรณีที่รับขอมูลหา a,b,c เปนลบใหวนรับคาใหม) 5. ทําการเขียนโปรแกรมรับขอมูลแบบสตริงชื่อ name สงไปยังฟงกชัน backward() ฟงกชันนี้จะทําการ
กลับ String แลวสงคาคืนใหกับ main เพื่อไปพิมพคา 6. จงเขียนโปรแกรมรับขอมูลตัวเลขจํานวนเต็ม 3 คาดวยฟงกชัน findMax() แลวสงคามากที่สุดกลับมาให main แสดงผล 7. จงเขียนฟงกชันคํานวณหาคา factorial 8. จงเขียนฟงกชัน isTriangle() โดยรับขอมูลตัวเลข 3 จํานวน แลวสงคา กลับมาเปน 0 หรือ 1 หากวาเลข
ทั้งสามสามารถนํามาสราง 3 เหลี่ยมไดใหสง 1 กลับมา แตถาไมใหสง 0 กลับมา
Computer Programming Function
25
9. จงเขียนโปรแกรมรับคาจํานวนเต็ม 1 จํานวนจากผูใช ซึ่งมีคาระหวาง 1‐10 ถาคาที่ปอนเขามาไมถูกตองให
โปรแกรมวนรับจนกวาจะไดคาที่ถูกตอง จากนั้นสงคาใหฟงกชัน find5() ทําการวนลูปเริ่มจากคาปอนเขา มาไปถึง 100 แลวแสดงคาที่ลงทายดวยเลข 5 แลวสงจํานวนที่พบกลับมาแสดงผลที่ฟงกชัน main() 10. จงเขียนโปรแกรมถามผูใชใหปอนคาเลขจํานวนเต็ม 1 จํานวน ซึ่งมีคา 100‐999 ถาคาไมถูกตอง
โปรแกรมจะแสดงขอความวา “ERROR!” แลวทําการวนลูปรับขอมูลใหม จนกวาจะไดขอมูลที่ตองการ หลังจากนั้นใหสงคาใหกับฟงกชัน fineMax() แยกเลขแลวหาคา maximum จากคาเลขที่ปอนเขามา แลวสงหลับมาแสดงผลที่ฟงกชัน main() 11. จงเขียนโปรแกรมรับคาจํานวนเต็ม 2 จํานวนจากผูใช จากนั้นหาคา หรม (Greatest Common Divisor: gcd) 12. จงเขียนโปรแกรมรับคาจํานวนเต็ม 2 จํานวนจากผูใช จากนั้นหาคา ครน (Least Common Multiple: lcm)
Chapter 5: Array
จะขอบอก Keyword สําหรับอาเรยซักนิดกอนเลยนะครับ “Array คือ ชุดขอมูลชนิดเดียวกัน ขนาดตามที่เรา กําหนดตั้งแตแรก และตัวแปรแตละตัวมี index (เหมือนเลขที่) เฉพาะแตละตัว” ... เมื่อบอกแบบนี้จะตองลงลึกใน รายละเอียดกันซักนิด ชุดขอมูลชนิดเดียวกัน คือ ตัวแปรที่ไมไดมาเพียงตัวเดียวแตมาทีหลายๆตัว ทุกตัวมีชื่อเหมือนกัน และมีชนิดเดียวกัน แตจะตางกันที่เลขที่ หรือ Index หรือ Subscript ที่ตางกันเทานั้น เจา Index นี้ก็คิดเหมือนสมัย เรียนมัธยม มันก็เหมือนเลขที่ของแตละคนตองแตกตางกัน แตทุกคนก็ใชชื่อหองเดียวกัน อาจจะเชนหอง ป.9/20 เลขที่ 2 อะไรประมาณนี้ คือจะเรียกหองนี้ (ชุดขอมูลนี้) ก็จะตองเรียกวา ป.9/20 แตถาจะเรียกทีละคนก็จะตองเรียกวา หอง ป. 9/20 เลขที่ 2
เอาละคงพอจะเขาใจกัน Concept กันพอสมควรแลว ตอไปคงจะตองมาดูวา Array นี้หนาตาเปนอยางไร ... แตจะบอกวากวาจะมาถึงหัวขอนี้ ทุกคนคงไดใช Array ไปแลวอยางไมรูตัว (หรือเปลา) งงละซิ จํา char[] ไดหรือเปลา หรือที่เราเรียกวา String นั้นเอง String ถือวาเปน Array of Char หรือ อาเรยของ char นั่นเอง แลวตัวไหนหละที่ บอกวาเปนอาเรย ก็ [] ไงถาเห็น [] คงจะตองบอกใหคิดถึง Array ไวกอน มาดูวิธีสรางอาเรยกันดีกวา ชนิดตัวแปร ชื่อตัวแปร[ขนาดอาเรย] (={คาของอาเรย});
(={คาของอาเรย}) คือคาเริ่มตนที่กําหนดใหกับ อาเรยตั้งแตทีแรกเลย สามารถกําหนดเทากับขนาดของอาเรย ถา
ไมเทาจะทําใหเกิด error วิธีแกมี 2 ทางคือ ลบตัวคาขนาดของอาเรย หรือไมก็ไมตองกําหนดคาให การกําหนดคานั้นแต ละคาตองคั้นดวยเครื่องหมาย , (comma) สังเกตวาจะมีลักษณะคลายกับการประกาศตัวแปรธรรมดา แคมี [] เพิ่มขึ้นมาเทานั้น มาดูตัวอยางการประกาศตัว แปรอาเรย เอาแบบทั้งถูกและผิดกันเลยดีกวา วิธีที่ถูกตอง วิธีที่ผิด int x[]; //ไมใสขนาด int x[10]; int x[5]={1,2,3,4,5,6}; //กําหนดคาไมตรงกับขนาด int x[5]={1,2,3,4,5}; int x[] = {1,2,3,4,5}; char name[] = {‘H’,‘e’,‘l’,‘l’,‘o’}; char name[]= “Hello”; //พิเศษสําหรับ char[] เทานั้น
ขนาดของ name[] ในทั้งสองในตัวอยางจะมีขนาดไมเทากัน ลองดูใน sizeof เพราะวาการประกาศอยางหลัง จะไดขนาดเพิ่มขึ้นอีก 1 จากจํานวนตัวอักษร เพราะจะมีการสราง ‘\0’ ขึ้นอีกตัวหนึ่งเพื่อเปนการบอกวาเปนจุดสิ้นสุดของ String ตัวนั้น แตการประกาศแบบแรกจะไมสราง ‘\0’ ขึ้น การประกาศแบบแรกจะไมสามารถ printf ดวย %s ได sizeof เปนคําสั่งในการหาขนาดของตัวแปรครับ มาถึงวิธีเรียกอาเรยแตละตัวกันบาง ... อันนี้งายๆครับ วิธีคือ ชื่อตัวแปร[index] ใหมองวาเปนเหมือนตัวแปรตัวหนึ่งไปเลยครับ ลองมาดูตัวอยางกันนะ
Computer Programming Array
27
ตัวอยาง #include<stdio.h> #include<conio.h> int main(){ int x[3]; x[0]=4; x[1]=2; x[2]=1; printf(“%d+%d+%d=%d”,x[0],x[1],x[2],x[0]+x[1]+x[2]); getch(); return 0; } ผลการรัน 4+2+1=7
ขอสังเกตจะพบวา อาเรยจะเริ่ม index ที่ 0 จนไปถึง ขนาดอาเรย ‐1 หากเรียกเกินจะเกิดอะไรขึ้น??? คําตอบคือ จะแสดงคาอะไรก็ไมรูแทนที่ เฮอๆๆ ไม error นะ เจาตัว index นี้สามารถใชตัวแปรเก็บคาแลวเรียก Array โดยใชตัว แปรแทน index ได (สวนใหญนิยมใชตัวแปร i,j,k) มาดูตัวอยางกัน #include<stdio.h> #include<conio.h> int main(){ int x[7],i,sum=0; for(i=0;i<7;i++) x[i]=i+1; for(i=0;i<7;i++) printf(“%d ”,x[i]); getch(); return 0; } ผลการรัน 1 2 3 4 5 6 7
หลักการของอาเรยยังมีตออีกนิด กรณีที่เปนหลายมิติ ... อาจจะมองเปน Matrix ก็ได หรือมองแบบเปนตาราง หรือยังไงก็ไดอันนี้คงไมวากัน ... แตอยากใหมองแบบนี้ ลองมองวาเปน Array ของ Array ดูบาง เชน int x[2][3] ก็คือ มีอาเรย แบบ 3 ตัวอยู 2 ตัว (อาจจะงงกวาเดิม) คือ x[0] เปนอาเรยขนาด 3 ตัว x[1] เปนอาเรยขนาด 3 ตัวเชนกัน คือ เปนอาเรยที่ซอนอยูในอาเรยนั่นเอง ลองดูตัวอยาง แลวลองเปรียบเทียบกันตัวอยางกอนหนา แลวจะเขาใจที่บอก
Computer Programming Array
28
ตัวอยาง #include<stdio.h> #include<conio.h> int main(){ int x[2][3],i,sum=0; for(i=0;i<3;i++) x[0][i]=i+1; for(i=0;i<3;i++) x[1][i]=2*i+1; for(i=0;i<3;i++) printf(“%d ”,x[0][i]); printf(“\n”); for(i=0;i<3;i++) printf(“%d ”,x[1][i]); getch(); return 0; } ผลการรัน 1 2 3 1 3 5
แบบฝกหัด: Array 1. จงเขียนโปรแกรมรับตัวเลขจํานวน 15 ตัวจากผูใช แลวทําการหาแสดงคาทั้งหมดที่รับมา แลวหาคาสูงสุด
คาต่ําสุด และผลรวมของเลขทั้งหมดนั้น 2. จงเขียนโปรแกรมรับคา n จากผูใช โดยที่ 5<n<15 แลวทําการรับตัวเลขจํานวน n ตัวจากผูใช แลวให
แสดงผลลัพธแบบขอที่ 1 3. ทําโปรแกรมคลายกับขอ 2 แตวาใหรับตัวเลขไดเฉพาะตัวเลขที่ไมเกิน 20 แลวทําการแสดงผล 4. จงเขียนโปรแกรมรับคา String 1 ตัวจากผูใชแลวทําการหานับจํานวนตัวพิมพใหญ ตัวพิมพเล็ก และ
ชองวาง แลวพิมพออกทางหนาจอ 5. จงเขียนโปรแกรมรับคา String จากผูใชจํานวน 5 ตัวแลวทําการหาวาตัวไหนมีความยาวมากที่สุด 6. จงเขียนโปรแกรมรับคาตัวเลขจํานวนเต็มจากผูใช แลวทําการพิมพ เลขคู และเลขคี่ โดยการพิมพทีละชนิด 7. ทําการเขียนโปรแกรมคนหาอักษรภายใน String โดยการรับ String และตัวอักษรที่ตองการคนหาจาก
ผูใช แลวทําการพิมพขอความออกมาวาภายใน String มีตัวอักษรนั้นกี่ตัว และตําแหนงใดบาง String : The river is no return Character : r Found character r = 4 in the position : 5 9 17 21
Computer Programming Array
29
8. จงเขียนโปรแกรมรับ String จากผูใชโดยมีความยาวตั้งแต 4‐15 หากไมใชใหแสดงขอความ ERROR!
แลววนกลับไปรับใหม เมื่อได String แลวทําการหาวา เปนตัวพิมพใหญ ตัวพิมพเล็ก และอักขระอื่นๆ อยางละกี่ตัว 9. จงเขียนโปรแกรมเพื่อรับคะแนนของนักศึกษา 4 คนๆ ละ 3 วิชา (คะแนนเต็มแตละวิชา = 10) เก็บไวในตัว
แปร score แลวคํานวณคะแนนเฉลี่ยในแตละวิชา และคะแนนเฉลี่ยของนักศึกษาแตละคนโดยกําหนดให คะแนนเฉลี่ยของนักศึกษาถาต่ํากวา 7.5 ถือวาสอบไมผาน โปรแกรมตองตรวจสอบดวยวามีนักศึกษาสอบ ไมผานกี่คน Enter score of student No.1 Subject 1: 8 Subject 2: 6 Subject 3: 7 Enter score of student No.2 Subject 1: 9 Subject 2: 8 Subject 3: 10 Enter score of student No.3 Subject 1: 7 Subject 2: 8 Subject 3: 6 Enter score of student No.4 Subject 1: 6 Subject 2: 5 Subject 3: 8 Sum and Average score of subject 1 = 30, 7.50 Sum and Average score of subject 2 = 27, 6.75 Sum and Average score of subject 3 = 31, 7.75 Sum and Average score of student No 1: 21, 7.00 Sum and Average score of student No 2: 27, 9.00 Sum and Average score of student No 3: 21, 7.00 Sum and Average score of student No 4: 19, 6.33 Total of student not pass the exam: 3
Review Mid‐Term
ขอสอบกลางภาค 1/2550
ขอที่ 1 (1/2550) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
#include<stdio.h> #include<string.h> ‐‐‐‐‐‐‐‐‐‐‐‐‐ เขียนคําตอบ --------------; void main(){ int i,n[10],x; ‐‐‐‐‐‐‐‐‐‐‐‐‐ เขียนคําตอบ --------------; for(i=0;i<x;i++){ n[i] = 'A'+i; if(n[i]%2==0) printf("n[%d] = %c\n",i,n[i]); else printf("n[%d] = %d\n",i,n[i]); } } int test(){ int k; char str[11]; do{ printf("Enter a string (5‐10 characters) : "); gets(str); k=strlen(str); }while(‐‐‐‐‐‐‐‐‐‐‐‐‐ เขียนคําตอบ --------------); return k; }
บรรทัดที่ 3 ฟงกชัน prototype ของฟงกชัน test() คือ int test() บรรทัดที่ 6 คําสั่งที่ใชในการเรียกฟงกชัน test() คือ x=test() บรรทัดที่ 22 คําสั่งที่ใชในการเปรียบเทียบโดยใช || เปนตัวเชื่อมคือ
k<5 || k>10
บรรทัดที่ 22 คําสั่งที่ใชในการเปรียบเทียบโดยใช && เปนตัวเชื่อมคือ
k>=5 && k<=10 ถาผูใชปอนสตริง “AAAAAA” เขามา สิ่งที่
แสดงออกที่จอภาพ คือ n[0] = n[1] = n[2] = n[3] = n[4] = n[5] =
65 B 67 D 69 F
Computer Programming Review Mid‐Term
ขอที่ 2 (1/2550) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
จากการรันโปรแกรม สิ่งที่แสดงออกทางจอภาพ คือ
#include<stdio.h> #include<string.h> void main(){ char str1[30]="Trimester 1/2550" ,str2[30]="Com Pro"; int n1,n2,n3; n1=sizeof(str1); n2=strlen(str1); strcpy(str2,"SUT"); strcat(str1,str2); n3=strlen(str2); printf("n1=%d\n",n1); printf("n2=%d\n",n2); printf("n3=%d\n",n3); printf("str1=%s\n",str1); printf("str2=%s\n",str2); }
n1 = 30 n2 = 16 n3 = 3 str1 = Trimester 1/2550SUT str2 = SUT
ขอที่ 3 (1/2550) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
#include<stdio.h> void main(){ int test[3][5]={15,14,13,12 ,11,10,9,8,7,6,5,4,3,2,1}; int i,j,a=0,b=0,c=0; for(i=0;i<3;i++){ b++; for(j=0;j<5;j++){ if(j%2==1) continue; c=c+test[i][j]; a++; i++; } } printf("i=%d\n",i); printf("j=%d\n",j); printf("a=%d\n",a); printf("b=%d\n",b); printf("c=%d\n",c); }
จากการรันโปรแกรมสิ่งที่แสดงผลออกทางหนาจอคือ
i = j = a = b = c =
4 5 3 1 24
31
Computer Programming Review Mid‐Term
32
ขอที่ 4 (1/2550) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
#include<stdio.h> void main(){ char ch='C'; int i=1, total=0; printf("Output: "); while(i){ if(ch>'E') i=0; else if (ch%2==0) ch=ch+2; else if (ch<'E') ch‐‐; printf("%c ",ch); total++; } printf("\nTotal = %d",total); }
จากการรันโปรแกรม ผลลัพธทางจอภาพ คือ
Output: B D F F Total = 4
สําหรับขอสอบชุดอื่นๆ
สามารถหาไดจาก โปรแกรม HKSOnline
สามารถ ปลดล็อกการพิมพจากโปรแกรม Portable PDF Password Remover 3.0
สามารถหาและ Download ไดที่ http://student.sut.ac.th/b4909446/