ทบทวนการเขียนโปรแกรมด้วยภาษาซี ณัฐวุฒิ ปอโนนสูง กลุ่มสาระฯการงานอาชีพและเทคโนโลยี  โรงเรียนศรีสะเกษวิทยาลัย
เนื้อหา Dev-C++:  ซอฟต์แวร์ช่วยพัฒนาโปรแกรม โครงสร้างโปรแกรมภาษาซี ชนิดของข้อมูล ตัวแปร และสัญพจน์ คำสั่งควบคุมการไหลของโปรแกรม ฟังก์ชัน ข้อผิดพลาดที่พบบ่อย
เริ่มต้นใช้งาน  Dev-C++ สร้างไฟล์ใหม่จากเมนู  File > New > Source File ทดลองกรอกโปรแกรม ตามตัวอย่างด้านขวา เซฟไฟล์โดยใช้นามสกุล  .c เช่น  first.c
เริ่มต้นใช้งาน  Dev-C++ ทดลองคอมไพล์และรันโปรแกรม โดยคลิ้กปุ่ม หรือกด  F9 หากดูผลลัพธ์ไม่ทัน : เพิ่มคำสั่ง  getchar()   หรือ  system("PAUSE")   ด้านท้ายของโปรแกรม หรือ เรียกโปรแกรมจาก  Command Prompt
ดีบักโปรแกรมด้วย  Dev-C++ ระบุบรรทัดที่ต้องการหยุดโปรแกรม  (Breakpoint)  โดยคลิ้กที่ต้นบรรทัด คลิ้กปุ่ม  Debug  (  ) ใช้ชุดคำสั่งด้านล่างของโปรแกรมเพื่อควบคุมการทำงาน
ตัวอย่างโปรแกรมภาษาซี #include  <stdio.h> int  main() { int  a, b, sum; printf(&quot;Enter A: &quot;); scanf(&quot;%d&quot;, &a); printf(&quot;Enter B: &quot;); scanf(&quot;%d&quot;, &b); sum = a+b; printf(&quot;Sum = %d\n&quot;, sum); return  0; } คืนค่า  0  เพื่อระบุว่าโปรแกรมจบการทำงานโดยไม่มีข้อผิดพลาด อ่านไฟล์  stdio.h  เพื่อเอาฟังก์ชันมาตรฐานมาใช้ ฟังก์ชัน  main  ระบุจุดเริ่มต้นของโปรแกรม คืนค่ากลับเป็น  int ประกาศตัวแปรแบบ  int  สามตัวคือ  a, b  และ  sum ฟังก์ชันมาตรฐาน  printf()  ใช้พิมพ์ข้อความออกทางหน้าจอ ฟังก์ชันมาตรฐาน  scanf()  ใช้รับอินพุทจากแป้นพิมพ์
โครงสร้างหน่วยความจำ 1  ช่อง  = 1   ไบต์  ( 8  บิต ) ตำแหน่งที่อยู่ (address) ข้อมูลที่เก็บ (data) 0000 32 0001 67 0002 255 0003 0 0004 121 : :
ใช้แทนการอ้างถึงหน่วยความจำ ณ ตำแหน่งหนึ่ง ๆ เพื่อใช้ในการเก็บข้อมูล   ( ที่เปลี่ยนค่าได้ )   ในขณะประมวลผล ตัวแปร   (Variable) short  a, b, sum; a = 10; b = 5; sum = a+b; b   มีค่า  5  ( อ้างถึง ค่า ) &b   มีค่า  1002  ( อ้างถึง ตำแหน่ง ) ตำแหน่ง ค่า : : 1000 2 1001 30 1002 211 1003 5 1005 23 : : 1004 8 10 0 5 0 0 15 a b sum
ชนิดข้อมูลพื้นฐาน 255 0 1 unsigned char 18,446,744,073,709,551,615 0 8 unsigned long long +9,223,372,036,854,775,807 − 9,223,372,036,854,775,808 8 long long +2,147,483,647 -2,147,483,648 4 long +32,767  หรือ  +2,147,483,647 -32,768  หรือ  -2,147,483,648 2  หรือ  4 int 0 0 0 -32,768 -128 ค่าต่ำสุด 4,294,967,295 65,535  หรือ  4,294,967,295 65,535 +32,767 +127 ค่าสูงสุด 1 char 4 unsigned long 2  หรือ  4 unsigned int 2 unsigned short 2 short ขนาด ( ไบต์ ) การประกาศ
ชนิดข้อมูลอื่น ๆ เลขทศนิยม  (floating point) float  (4  ไบต์ )  เก็บเลขทศนิยมแบบ  single precision double  (8  ไบต์ )  เก็บเลขทศนิยมแบบ  double precision ตัวชี้  ( pointer) อาร์เรย์  ( array)
เป็นตัวแปรที่เก็บตำแหน่งของหน่วยความจำ เพื่อใช้อ้างอิงข้อมูลในหน่วยความจำตำแหน่งอื่น ๆ ตัวแปรแบบตัวชี้   (Pointer) short  a = 57; short  *p; p = &a; *p = 78; p   มีค่า  20  ( ค่าของ  p ) &p   มีค่า  22  ( ตำแหน่งของ  p ) *p   มีค่า  78  ( ค่าในตำแหน่งที่  p   ชี้อยู่ ) ตำแหน่ง ค่า : : 0020 2 0021 30 0022 211 0023 5 0025 23 : : 0024 8 57 0 20 0 p 78 0 a
อาร์เรย์และสตริง ข้อมูลแบบอาร์เรย์เป็นการรวมกลุ่มข้อมูลชนิดเดียวกันไว้เป็นแถวลำดับ จัดเป็นตัวแปรแบบตัวชี้ประเภทหนึ่ง short  arr[3]; arr[0] = 50; arr[2] = 89; arr   มีค่า  20 arr[0]   มีค่า  50 &arr   มีค่า  20 *arr   มีค่า  50 23 8 ตำแหน่ง ค่า : : 0020 2 0021 30 0022 211 0023 5 0027 12 : : 0026 33 0025 0024 50 0 89 0 arr
ข้อมูลประเภทสายอักขระ  ( สตริง ) “ สตริง ”   คืออาร์เรย์ของอักขระโดด  (array of char) char  s[] = &quot;Hello&quot;; printf(&quot;%c %c %c\n&quot;, s[0], s[1], s[2]); H e l ผลลัพธ์ :
สัญพจน์  (Literal) เป็นเสมือน  “ ค่าคงที่ ”  ที่ปรากฏอยู่ภายในโปรแกรม จำนวนเต็ม   ( ชนิดข้อมูล  char ,  short ,  long ,...) เช่น   10 ,  -30 จำนวนเต็มแบบยาว  ( ชนิดข้อมูล  long long ) เช่น  123456789012LL เลข  Floating point  ( ชนิดข้อมูล  float ,  double ) เช่น  3.14 ,  500.0 อักขระโดด   ( ชนิดข้อมูล  char ) เช่น   'a' สตริง   ( ชนิดข้อมูล  char* ) เช่น   &quot;Hello&quot;
การรับ / แสดงผล ฟังก์ชันมาตรฐาน  ( เพื่อการรับ / แสดงผลข้อมูล )  ถูกเตรียมไว้ในเฮดเดอร์ไฟล์   “ stdio.h ” ฟังก์ชันรับข้อมูล scanf   สำหรับตัวแปรทุกชนิด  ( ระบุด้วย  %format) getchar ,  getch   สำหรับตัวแปรชนิดอักขระโดด   gets   สำหรับตัวแปรชนิดสตริง ฟังก์ชันแสดงผลข้อมูล  (Output Function) printf   สำหรับตัวแปรทุกชนิด  ( ระบุด้วย  %format)
การแสดงผลข้อมูล ทุกอย่างในหน่วยความจำล้วนเป็นตัวเลข การแสดงผลลัพธ์ด้วยฟังก์ชัน  printf   จึงต้องระบุรูปแบบตามที่เราต้องการจะเห็น char  c = 65; printf(&quot;c (as a number) = %d\n&quot;, c); printf(&quot;c (as a character) = %c\n&quot;, c); หน่วยความจำ : 2 30 65 5 23 : 8 c c (as a number) = 65 c (as a character) = A ผลลัพธ์ :
%format  ใน  scanf  และ  printf %s char array[] สตริง %c char อักขระโดด %lf double %f float จำนวนมีทศนิยม %llu unsigned long long %lu unsigned long %u unsigned int %lld long long %ld long %d int จำนวนเต็ม %format ชนิดตัวแปร ชนิดข้อมูล
ตัวอย่างการใช้  scanf char  name[20]; int  age; printf(&quot;Enter your name and age: &quot;); scanf(&quot;%s %d&quot;, name, &age); printf(&quot;Hello %s.  You are %d years old.\n&quot;, name, age); Enter your name and age:  Tony 38 Hello Tony.  You are 38 years old. ผลลัพธ์ :
การไหลของโปรแกรม โปรแกรมแบบง่าย ทำงานรวดเดียวจากบนลงล่าง START END Statement โปรแกรมที่มีคำสั่งเดียว โปรแกรมที่มีหลายคำสั่ง Statement 1 Statement 2 Statement n END START Statement 3
การควบคุมการไหลของโปรแกรม คำสั่งกำหนดเงื่อนไข โครงสร้าง  if โครงสร้าง  if … else คำสั่งวนซ้ำ โครงสร้าง  while  loop โครงสร้าง  do … while  loop โครงสร้าง  for  loop โปรแกรมย่อย  ( ฟังก์ชัน )
โครงสร้าง  if ส่วนของ  condition   ตีความเป็นข้อมูลแบบ  int ทำคำสั่งใน  {}   หาก  condition   เป็นจริง  ( ไม่เป็นศูนย์ ) หากมีคำสั่งเดียวไม่จำเป็นต้องใช้วงเล็บปีกกา if ( condition )  { statement1; : statementN; } C Syntax START END Statement condition true false Statement Flowchart
โครงสร้าง  if…else if ( condition ) {  statement t1 ; statement t2 ; } else { statement f1 ; statement f2 ;  } C Syntax Flowchart START END Statement f1 condition true false Statement t1 Statement f2 Statement t2
โครงสร้าง   if   แบบหลายเงื่อนไข if  (x==1)   Action1; else if  (x==2) Action2; else if  (x==3) Action3; else if  (x==4)   Action4; else Default_Action; false Action1; x==1 Action2; x==2 Action3; x==3 Action4; x==4 true true true true false false false Default_Action;
โครงสร้าง   switch-case switch  (x)   { case  1 :  Action1; break; case  2 :  Action2; break; case  3 :  Action3; break; case  4 :  Action4; break; default:  Default_Action;   break; } false Action1; x==1 Action2; x==2 Action3; x==3 Action4; x==4 true true true true false false false Default_Action;
โครงสร้าง  while   ลูป วนทำคำสั่ง   stmt1   ถึง  stmtN ตราบเท่าที่   condition   เป็นจริง condition while ( condition )  { stmt1 ; stmt2 ; : stmtN ; } END START true Statement Statement false
โครงสร้าง  do…while   ลูป ทำคำสั่ง  stmt1...stmtN   และวนทำซ้ำอีกตราบเท่าที่  condition   ยังคงเป็นจริง นั่นคือ  stmt1...stmtN   จะถูกกระทำ อย่างน้อยหนึ่งครั้ง END condition do   { stmt1 ; stmt2 ; : stmtN ; }  while  ( condition ); false START Statement 1 Statement N true
ลูปวนนับ  ( Counting Loop) หากพิจารณาโครงสร้างของลูปที่ใช้ในโปรแกรมส่วนใหญ่ มักจะเป็นลูปแบบวนนับ ลูปวนนับจะมีส่วนประกอบดังตัวอย่างต่อไปนี้เสมอ int  i, sum = 0; i = 1; while  (i <= 10) { sum = sum + i; i = i + 1; } printf(&quot;Sum = %d\n&quot;, sum); ตัวแปรที่ใช้นับ ส่วนกำหนดค่าเริ่มต้น การปรับค่าตัวนับ เงื่อนไขของตัวนับ คำสั่งที่ถูกทำซ้ำ
โครงสร้าง  for  ลูป เป็นโครงสร้างที่ให้ความสะดวกในการเขียนลูปวนนับ การทำงาน 1.  ทำคำสั่ง  init_stmt   หนึ่งครั้ง 2.  ถ้า  condition   เป็นจริง ทำคำสั่ง  statement1...statementN 3.  ทำคำสั่ง   update_stmt   จากนั้นกลับไปทำข้อ  2 for ( init_stmt ;  condition ;  update_stmt ) { statement1 ; statement2 ; : statementN ; }
การทำงานของ  for  ลูป false update_stmt for ( init_stmt ;  condition ;  update_stmt ) { statement1 ; statement2 ; : statementN ; } START END condition true Statement1 StatementN init_stmt
โปรแกรมย่อย  (Subroutine) ในภาษาซีเรียกว่า  &quot; ฟังก์ชัน &quot;   (Function) เป็นส่วนของโปรแกรมที่มีหน้าที่การทำงานชัดเจนในตัวเอง ซึ่งถูกเรียกใช้ในโปรแกรมหลักอีกทีหนึ่ง การเขียนโปรแกรมโดยแยกเป็นฟังก์ชันมีข้อดีหลายประการ ช่วยแบ่งงานที่ซับซ้อนเป็นงานย่อยหลายงาน ลดการเขียนโค้ดที่ซ้ำซ้อน ซ่อนรายละเอียดไว้ในส่วนอื่น ทำให้โปรแกรมเข้าใจได้ง่ายขึ้น ฟังก์ชันที่เขียนขึ้นมาสามารถนำไปใช้ในโปรแกรมอื่นได้
ชนิดของฟังก์ชัน ฟังก์ชันมาตรฐาน  (Standard Functions) เป็นฟังก์ชันที่อยู่ในชุดไลบรารีของภาษาซี เรียกใช้ได้ทันที เช่น  printf(), scanf(),   ... ฟังก์ชันที่ผู้ใช้กำหนด  (User Defined Functions)   เป็นฟังก์ชันที่ผู้ใช้สร้างขึ้นเอง  เรียกใช้ใน  main()  หรือจากฟังก์ชันอื่นๆ ได้เหมือนฟังก์ชันมาตรฐาน
ตัวอย่างฟังก์ชันมาตรฐาน rand ,  atoi ,  atof stdlib.h อื่น ๆ strlen ,  strcpy ,  strcmp string.h จัดการกับสตริง isalpha ,  isdigit ,  islower ,  isupper ctype.h แยกประเภทข้อมูลอักขระ sin ,  cos ,  exp ,  pow math.h คณิตศาสตร์ scanf ,  printf ,  gets ,  puts stdio.h จัดการอินพุท / เอาท์พุท ตัวอย่างฟังก์ชัน เฮดเดอร์ไฟล์ กลุ่มฟังก์ชัน
ฟังก์ชันที่ผู้ใช้กำหนดเอง แบบไม่ส่งค่ากลับ ระบุชนิดข้อมูล  void ไม่ต้องมีคำสั่ง  return แบบส่งค่ากลับ ระบุชนิดข้อมูลที่ต้องการ ใช้คำสั่ง  return   ส่งค่าคืนตามชนิดที่ระบุ void  say_hi(char *name) { printf(&quot;Hi, %s\n&quot;, name); } int  max(int a, int b) { if (a > b) return a; else return b; }
การไหลของโปรแกรมเมื่อใช้ฟังก์ชัน int  incr(int i) { int  j; j = i + 1; return  j; } int  main()  { int  k, m = 4; k = incr(m); printf (&quot;k = %d, m = %d\n&quot;, k, m); return  0; }
ขั้นตอนวิธีกับการโปรแกรม การออกแบบขั้นตอนวิธีเป็นส่วนสำคัญในการพัฒนาโปรแกรม การ  &quot; เขียนโปรแกรม &quot;   เป็นเพียงการแปลงขั้นตอนวิธีให้อยู่ในรูปที่ยอมรับได้โดยตัวภาษา
ตัวอย่าง เขียนโปรแกรมเพื่อรับตัวเลขระบุขนาด และพิมพ์รูปสามเหลี่ยมที่มีขนาดตามที่กำหนด Enter N:  3 * ** *** Enter N:  5 * ** *** **** *****
ตัวอย่าง เขียนฟังก์ชัน  sort(int a[], int n)   เพื่อเรียงลำดับข้อมูลในอาร์เรย์จากน้อยไปมาก แนวคิด :   ดึงข้อมูลที่น้อยที่สุดมาวางไว้ด้านหน้าทีละตัว หาตัวน้อยที่สุด สลับที่มาไว้ด้านหน้า ทำซ้ำ   เฉพาะกับส่วนที่เหลือ 1 2 3 4 5 2 3 4 5 1 1 2 3 4 5 2 1 2 3 4 5 1 4 2
ข้อผิดพลาดที่พบบ่อย #include  <stdio.h> int  main () { int  i; scanf(&quot;%d&quot;, i); if  (i = 0) puts(&quot;false&quot;); else puts(&quot;true&quot;); return  0; } ส่งค่า  i  ให้   scanf  แทนที่จะส่งตำแหน่ง ใช้คำสั่งกำหนดค่า  (=)  แทนการเปรียบเทียบ  (==)
ข้อผิดพลาดที่พบบ่อย #include  <stdio.h> int  main () { char  s[10]; printf(&quot;Enter password: &quot;); scanf(&quot;%s&quot;, s); if  (s == &quot;pass&quot;) puts(&quot;Correct password&quot;); else puts(&quot;Incorrect password&quot;); return  0; } ใช้  ==  เปรียบเทียบสตริงไม่ได้ ใช้ฟังก์ชัน  strcmp()  แทน
เอกสารอ้างอิง สไลด์บรรยาย   การโปรแกรมภาษา  C   โดย รศ . ธีรวัฒน์ ประกอบผล สไลด์บรรยาย  Crash Course in C   โดย   J . R. Cooperstock

C lang

  • 1.
    ทบทวนการเขียนโปรแกรมด้วยภาษาซี ณัฐวุฒิ ปอโนนสูงกลุ่มสาระฯการงานอาชีพและเทคโนโลยี โรงเรียนศรีสะเกษวิทยาลัย
  • 2.
    เนื้อหา Dev-C++: ซอฟต์แวร์ช่วยพัฒนาโปรแกรม โครงสร้างโปรแกรมภาษาซี ชนิดของข้อมูล ตัวแปร และสัญพจน์ คำสั่งควบคุมการไหลของโปรแกรม ฟังก์ชัน ข้อผิดพลาดที่พบบ่อย
  • 3.
    เริ่มต้นใช้งาน Dev-C++สร้างไฟล์ใหม่จากเมนู File > New > Source File ทดลองกรอกโปรแกรม ตามตัวอย่างด้านขวา เซฟไฟล์โดยใช้นามสกุล .c เช่น first.c
  • 4.
    เริ่มต้นใช้งาน Dev-C++ทดลองคอมไพล์และรันโปรแกรม โดยคลิ้กปุ่ม หรือกด F9 หากดูผลลัพธ์ไม่ทัน : เพิ่มคำสั่ง getchar() หรือ system(&quot;PAUSE&quot;) ด้านท้ายของโปรแกรม หรือ เรียกโปรแกรมจาก Command Prompt
  • 5.
    ดีบักโปรแกรมด้วย Dev-C++ระบุบรรทัดที่ต้องการหยุดโปรแกรม (Breakpoint) โดยคลิ้กที่ต้นบรรทัด คลิ้กปุ่ม Debug ( ) ใช้ชุดคำสั่งด้านล่างของโปรแกรมเพื่อควบคุมการทำงาน
  • 6.
    ตัวอย่างโปรแกรมภาษาซี #include <stdio.h> int main() { int a, b, sum; printf(&quot;Enter A: &quot;); scanf(&quot;%d&quot;, &a); printf(&quot;Enter B: &quot;); scanf(&quot;%d&quot;, &b); sum = a+b; printf(&quot;Sum = %d\n&quot;, sum); return 0; } คืนค่า 0 เพื่อระบุว่าโปรแกรมจบการทำงานโดยไม่มีข้อผิดพลาด อ่านไฟล์ stdio.h เพื่อเอาฟังก์ชันมาตรฐานมาใช้ ฟังก์ชัน main ระบุจุดเริ่มต้นของโปรแกรม คืนค่ากลับเป็น int ประกาศตัวแปรแบบ int สามตัวคือ a, b และ sum ฟังก์ชันมาตรฐาน printf() ใช้พิมพ์ข้อความออกทางหน้าจอ ฟังก์ชันมาตรฐาน scanf() ใช้รับอินพุทจากแป้นพิมพ์
  • 7.
    โครงสร้างหน่วยความจำ 1 ช่อง = 1 ไบต์ ( 8 บิต ) ตำแหน่งที่อยู่ (address) ข้อมูลที่เก็บ (data) 0000 32 0001 67 0002 255 0003 0 0004 121 : :
  • 8.
    ใช้แทนการอ้างถึงหน่วยความจำ ณ ตำแหน่งหนึ่งๆ เพื่อใช้ในการเก็บข้อมูล ( ที่เปลี่ยนค่าได้ ) ในขณะประมวลผล ตัวแปร (Variable) short a, b, sum; a = 10; b = 5; sum = a+b; b มีค่า 5 ( อ้างถึง ค่า ) &b มีค่า 1002 ( อ้างถึง ตำแหน่ง ) ตำแหน่ง ค่า : : 1000 2 1001 30 1002 211 1003 5 1005 23 : : 1004 8 10 0 5 0 0 15 a b sum
  • 9.
    ชนิดข้อมูลพื้นฐาน 255 01 unsigned char 18,446,744,073,709,551,615 0 8 unsigned long long +9,223,372,036,854,775,807 − 9,223,372,036,854,775,808 8 long long +2,147,483,647 -2,147,483,648 4 long +32,767 หรือ +2,147,483,647 -32,768 หรือ -2,147,483,648 2 หรือ 4 int 0 0 0 -32,768 -128 ค่าต่ำสุด 4,294,967,295 65,535 หรือ 4,294,967,295 65,535 +32,767 +127 ค่าสูงสุด 1 char 4 unsigned long 2 หรือ 4 unsigned int 2 unsigned short 2 short ขนาด ( ไบต์ ) การประกาศ
  • 10.
    ชนิดข้อมูลอื่น ๆ เลขทศนิยม (floating point) float (4 ไบต์ ) เก็บเลขทศนิยมแบบ single precision double (8 ไบต์ ) เก็บเลขทศนิยมแบบ double precision ตัวชี้ ( pointer) อาร์เรย์ ( array)
  • 11.
    เป็นตัวแปรที่เก็บตำแหน่งของหน่วยความจำ เพื่อใช้อ้างอิงข้อมูลในหน่วยความจำตำแหน่งอื่น ๆตัวแปรแบบตัวชี้ (Pointer) short a = 57; short *p; p = &a; *p = 78; p มีค่า 20 ( ค่าของ p ) &p มีค่า 22 ( ตำแหน่งของ p ) *p มีค่า 78 ( ค่าในตำแหน่งที่ p ชี้อยู่ ) ตำแหน่ง ค่า : : 0020 2 0021 30 0022 211 0023 5 0025 23 : : 0024 8 57 0 20 0 p 78 0 a
  • 12.
    อาร์เรย์และสตริง ข้อมูลแบบอาร์เรย์เป็นการรวมกลุ่มข้อมูลชนิดเดียวกันไว้เป็นแถวลำดับ จัดเป็นตัวแปรแบบตัวชี้ประเภทหนึ่งshort arr[3]; arr[0] = 50; arr[2] = 89; arr มีค่า 20 arr[0] มีค่า 50 &arr มีค่า 20 *arr มีค่า 50 23 8 ตำแหน่ง ค่า : : 0020 2 0021 30 0022 211 0023 5 0027 12 : : 0026 33 0025 0024 50 0 89 0 arr
  • 13.
    ข้อมูลประเภทสายอักขระ (สตริง ) “ สตริง ” คืออาร์เรย์ของอักขระโดด (array of char) char s[] = &quot;Hello&quot;; printf(&quot;%c %c %c\n&quot;, s[0], s[1], s[2]); H e l ผลลัพธ์ :
  • 14.
    สัญพจน์ (Literal)เป็นเสมือน “ ค่าคงที่ ” ที่ปรากฏอยู่ภายในโปรแกรม จำนวนเต็ม ( ชนิดข้อมูล char , short , long ,...) เช่น 10 , -30 จำนวนเต็มแบบยาว ( ชนิดข้อมูล long long ) เช่น 123456789012LL เลข Floating point ( ชนิดข้อมูล float , double ) เช่น 3.14 , 500.0 อักขระโดด ( ชนิดข้อมูล char ) เช่น 'a' สตริง ( ชนิดข้อมูล char* ) เช่น &quot;Hello&quot;
  • 15.
    การรับ / แสดงผลฟังก์ชันมาตรฐาน ( เพื่อการรับ / แสดงผลข้อมูล ) ถูกเตรียมไว้ในเฮดเดอร์ไฟล์ “ stdio.h ” ฟังก์ชันรับข้อมูล scanf สำหรับตัวแปรทุกชนิด ( ระบุด้วย %format) getchar , getch สำหรับตัวแปรชนิดอักขระโดด gets สำหรับตัวแปรชนิดสตริง ฟังก์ชันแสดงผลข้อมูล (Output Function) printf สำหรับตัวแปรทุกชนิด ( ระบุด้วย %format)
  • 16.
    การแสดงผลข้อมูล ทุกอย่างในหน่วยความจำล้วนเป็นตัวเลข การแสดงผลลัพธ์ด้วยฟังก์ชัน printf จึงต้องระบุรูปแบบตามที่เราต้องการจะเห็น char c = 65; printf(&quot;c (as a number) = %d\n&quot;, c); printf(&quot;c (as a character) = %c\n&quot;, c); หน่วยความจำ : 2 30 65 5 23 : 8 c c (as a number) = 65 c (as a character) = A ผลลัพธ์ :
  • 17.
    %format ใน scanf และ printf %s char array[] สตริง %c char อักขระโดด %lf double %f float จำนวนมีทศนิยม %llu unsigned long long %lu unsigned long %u unsigned int %lld long long %ld long %d int จำนวนเต็ม %format ชนิดตัวแปร ชนิดข้อมูล
  • 18.
    ตัวอย่างการใช้ scanfchar name[20]; int age; printf(&quot;Enter your name and age: &quot;); scanf(&quot;%s %d&quot;, name, &age); printf(&quot;Hello %s. You are %d years old.\n&quot;, name, age); Enter your name and age: Tony 38 Hello Tony. You are 38 years old. ผลลัพธ์ :
  • 19.
    การไหลของโปรแกรม โปรแกรมแบบง่าย ทำงานรวดเดียวจากบนลงล่างSTART END Statement โปรแกรมที่มีคำสั่งเดียว โปรแกรมที่มีหลายคำสั่ง Statement 1 Statement 2 Statement n END START Statement 3
  • 20.
    การควบคุมการไหลของโปรแกรม คำสั่งกำหนดเงื่อนไข โครงสร้าง if โครงสร้าง if … else คำสั่งวนซ้ำ โครงสร้าง while loop โครงสร้าง do … while loop โครงสร้าง for loop โปรแกรมย่อย ( ฟังก์ชัน )
  • 21.
    โครงสร้าง ifส่วนของ condition ตีความเป็นข้อมูลแบบ int ทำคำสั่งใน {} หาก condition เป็นจริง ( ไม่เป็นศูนย์ ) หากมีคำสั่งเดียวไม่จำเป็นต้องใช้วงเล็บปีกกา if ( condition ) { statement1; : statementN; } C Syntax START END Statement condition true false Statement Flowchart
  • 22.
    โครงสร้าง if…elseif ( condition ) { statement t1 ; statement t2 ; } else { statement f1 ; statement f2 ; } C Syntax Flowchart START END Statement f1 condition true false Statement t1 Statement f2 Statement t2
  • 23.
    โครงสร้าง if แบบหลายเงื่อนไข if (x==1) Action1; else if (x==2) Action2; else if (x==3) Action3; else if (x==4) Action4; else Default_Action; false Action1; x==1 Action2; x==2 Action3; x==3 Action4; x==4 true true true true false false false Default_Action;
  • 24.
    โครงสร้าง switch-case switch (x) { case 1 : Action1; break; case 2 : Action2; break; case 3 : Action3; break; case 4 : Action4; break; default: Default_Action; break; } false Action1; x==1 Action2; x==2 Action3; x==3 Action4; x==4 true true true true false false false Default_Action;
  • 25.
    โครงสร้าง while ลูป วนทำคำสั่ง stmt1 ถึง stmtN ตราบเท่าที่ condition เป็นจริง condition while ( condition ) { stmt1 ; stmt2 ; : stmtN ; } END START true Statement Statement false
  • 26.
    โครงสร้าง do…while ลูป ทำคำสั่ง stmt1...stmtN และวนทำซ้ำอีกตราบเท่าที่ condition ยังคงเป็นจริง นั่นคือ stmt1...stmtN จะถูกกระทำ อย่างน้อยหนึ่งครั้ง END condition do { stmt1 ; stmt2 ; : stmtN ; } while ( condition ); false START Statement 1 Statement N true
  • 27.
    ลูปวนนับ (Counting Loop) หากพิจารณาโครงสร้างของลูปที่ใช้ในโปรแกรมส่วนใหญ่ มักจะเป็นลูปแบบวนนับ ลูปวนนับจะมีส่วนประกอบดังตัวอย่างต่อไปนี้เสมอ int i, sum = 0; i = 1; while (i <= 10) { sum = sum + i; i = i + 1; } printf(&quot;Sum = %d\n&quot;, sum); ตัวแปรที่ใช้นับ ส่วนกำหนดค่าเริ่มต้น การปรับค่าตัวนับ เงื่อนไขของตัวนับ คำสั่งที่ถูกทำซ้ำ
  • 28.
    โครงสร้าง for ลูป เป็นโครงสร้างที่ให้ความสะดวกในการเขียนลูปวนนับ การทำงาน 1. ทำคำสั่ง init_stmt หนึ่งครั้ง 2. ถ้า condition เป็นจริง ทำคำสั่ง statement1...statementN 3. ทำคำสั่ง update_stmt จากนั้นกลับไปทำข้อ 2 for ( init_stmt ; condition ; update_stmt ) { statement1 ; statement2 ; : statementN ; }
  • 29.
    การทำงานของ for ลูป false update_stmt for ( init_stmt ; condition ; update_stmt ) { statement1 ; statement2 ; : statementN ; } START END condition true Statement1 StatementN init_stmt
  • 30.
    โปรแกรมย่อย (Subroutine)ในภาษาซีเรียกว่า &quot; ฟังก์ชัน &quot; (Function) เป็นส่วนของโปรแกรมที่มีหน้าที่การทำงานชัดเจนในตัวเอง ซึ่งถูกเรียกใช้ในโปรแกรมหลักอีกทีหนึ่ง การเขียนโปรแกรมโดยแยกเป็นฟังก์ชันมีข้อดีหลายประการ ช่วยแบ่งงานที่ซับซ้อนเป็นงานย่อยหลายงาน ลดการเขียนโค้ดที่ซ้ำซ้อน ซ่อนรายละเอียดไว้ในส่วนอื่น ทำให้โปรแกรมเข้าใจได้ง่ายขึ้น ฟังก์ชันที่เขียนขึ้นมาสามารถนำไปใช้ในโปรแกรมอื่นได้
  • 31.
    ชนิดของฟังก์ชัน ฟังก์ชันมาตรฐาน (Standard Functions) เป็นฟังก์ชันที่อยู่ในชุดไลบรารีของภาษาซี เรียกใช้ได้ทันที เช่น printf(), scanf(), ... ฟังก์ชันที่ผู้ใช้กำหนด (User Defined Functions) เป็นฟังก์ชันที่ผู้ใช้สร้างขึ้นเอง เรียกใช้ใน main() หรือจากฟังก์ชันอื่นๆ ได้เหมือนฟังก์ชันมาตรฐาน
  • 32.
    ตัวอย่างฟังก์ชันมาตรฐาน rand , atoi , atof stdlib.h อื่น ๆ strlen , strcpy , strcmp string.h จัดการกับสตริง isalpha , isdigit , islower , isupper ctype.h แยกประเภทข้อมูลอักขระ sin , cos , exp , pow math.h คณิตศาสตร์ scanf , printf , gets , puts stdio.h จัดการอินพุท / เอาท์พุท ตัวอย่างฟังก์ชัน เฮดเดอร์ไฟล์ กลุ่มฟังก์ชัน
  • 33.
    ฟังก์ชันที่ผู้ใช้กำหนดเอง แบบไม่ส่งค่ากลับ ระบุชนิดข้อมูล void ไม่ต้องมีคำสั่ง return แบบส่งค่ากลับ ระบุชนิดข้อมูลที่ต้องการ ใช้คำสั่ง return ส่งค่าคืนตามชนิดที่ระบุ void say_hi(char *name) { printf(&quot;Hi, %s\n&quot;, name); } int max(int a, int b) { if (a > b) return a; else return b; }
  • 34.
    การไหลของโปรแกรมเมื่อใช้ฟังก์ชัน int incr(int i) { int j; j = i + 1; return j; } int main() { int k, m = 4; k = incr(m); printf (&quot;k = %d, m = %d\n&quot;, k, m); return 0; }
  • 35.
    ขั้นตอนวิธีกับการโปรแกรม การออกแบบขั้นตอนวิธีเป็นส่วนสำคัญในการพัฒนาโปรแกรม การ &quot; เขียนโปรแกรม &quot; เป็นเพียงการแปลงขั้นตอนวิธีให้อยู่ในรูปที่ยอมรับได้โดยตัวภาษา
  • 36.
  • 37.
    ตัวอย่าง เขียนฟังก์ชัน sort(int a[], int n) เพื่อเรียงลำดับข้อมูลในอาร์เรย์จากน้อยไปมาก แนวคิด : ดึงข้อมูลที่น้อยที่สุดมาวางไว้ด้านหน้าทีละตัว หาตัวน้อยที่สุด สลับที่มาไว้ด้านหน้า ทำซ้ำ เฉพาะกับส่วนที่เหลือ 1 2 3 4 5 2 3 4 5 1 1 2 3 4 5 2 1 2 3 4 5 1 4 2
  • 38.
    ข้อผิดพลาดที่พบบ่อย #include <stdio.h> int main () { int i; scanf(&quot;%d&quot;, i); if (i = 0) puts(&quot;false&quot;); else puts(&quot;true&quot;); return 0; } ส่งค่า i ให้ scanf แทนที่จะส่งตำแหน่ง ใช้คำสั่งกำหนดค่า (=) แทนการเปรียบเทียบ (==)
  • 39.
    ข้อผิดพลาดที่พบบ่อย #include <stdio.h> int main () { char s[10]; printf(&quot;Enter password: &quot;); scanf(&quot;%s&quot;, s); if (s == &quot;pass&quot;) puts(&quot;Correct password&quot;); else puts(&quot;Incorrect password&quot;); return 0; } ใช้ == เปรียบเทียบสตริงไม่ได้ ใช้ฟังก์ชัน strcmp() แทน
  • 40.
    เอกสารอ้างอิง สไลด์บรรยาย การโปรแกรมภาษา C โดย รศ . ธีรวัฒน์ ประกอบผล สไลด์บรรยาย Crash Course in C โดย J . R. Cooperstock