Transcript void
418115: Structured Programming การบรรยายครัง้ ที่ 3 & 4 ประมุข ขันเงิน [email protected] โปรแกรม #1 void main() { } โปรแกรม #1 โปรแกรมนี้ทำอะไร? ไม่ได้ ทำอะไร ข้ ำงในไม่มีคำสั่งอะไรเลย เข้ ำมำแล้ วก็ออกไป โปรแกรม #1 main() คืออะไร? ฟังก์ชัน ฟังก์ชันคืออะไร? โปรแกรมย่อย ทำหน้ ำที่เฉพำะตัวอย่ำงหนึ่ง ให้ โปรแกรมใหญ่เรียกใช้ แล้ วโปรแกรมใหญ่ล่ะ? ระบบปฏิบัติกำร (OS) โปรแกรม #2 #include <stdio.h> void main() { printf(“Hello, world!\n”); } โปรแกรม #2 โปรแกรมนี้ทำอะไร? พิมพ์ Hello, world! โปรแกรม #2 #include <stdio.h> คืออะไร? ใช้ บอกว่ำเรำจะไปเอำฟังก์ชันจำกไฟล์ช่ ือ stdio.h มำใช้ stdio.h เป็ นไฟล์ท่เี รำเรียกว่ำ header file มันบรรจุช่ ือและข้ อมูลอื่นๆ ของฟังก์ชันที่ฟังก์ชัน main ของเรำจะไปเรียกใช้ ได้ โปรแกรม #2 #include <stdio.h> คืออะไร? ใช้ บอกว่ำเรำจะไปเอำฟังก์ชันจำกไฟล์ช่ ือ stdio.h มำใช้ stdio.h เป็ นไฟล์ท่เี รำเรียกว่ำ header file มันบรรจุช่ ือและข้ อมูลอื่นๆ ของฟังก์ชันที่ฟังก์ชัน main ของเรำจะไปเรียกใช้ ได้ เรำใช้ ฟังก์ชันอะไรจำก stdio.h? printf โปรแกรม #2 printf มีไว้ ทำอะไร? พิมพ์ข้อควำมออกทำง standard output standard output คืออะไร? ช่องทำงแสดงผลลัพธ์ท่รี ะบบปฏิบัติกำรสร้ ำงให้ โปรแกรมตำมปกติ ส่วนมำกคือหน้ ำจอ แต่เรำสำมำรถบอกให้ ระบบปฏิบัตกิ ำรต่อ standard output เข้ ำไฟล์หรือกำร์ดเน็ต เวิร์กก็ได้ โปรแกรม #2 “Hello, world!\n” คืออะไร? ข้ อมูลประเภทข้ อควำม ภำษำ C เรียกข้ อมูลประเภทนี้ว่ำ สตริง (string) ในภำษำ C เรำเขียนข้ อควำมประเภท string ได้ ด้วยกำรใช้ เครื่องหมำยฟันหนู (“) ล้ อมรอบข้ อควำมที่ต้องกำร ตัวอย่ำงเช่น “one”, “Franscesca Lucchini”, “3.1415” โปรแกรม #2 อ้ ำว! ทำไมพิมพ์ออกมำแล้ วไม่เห็นมี \n? ข้ อควำม \n เป็ นข้ อควำมพิเศษ เรียกว่ำ escape sequence ตัว \n แทน การเว้นบรรทัด โปรแกรม #3 ผลลัพธ์ของโปรแกรมนี้ควรจะเป็ นอย่ำงไร? #include <stdio.h> void main() { printf(“one\ntwo\nthree\n”); printf(“four\nfive\nsix\n”); } โปรแกรม #3 one two three four five six Escape Sequence อืน่ ๆ Escape Sequence \t \0 \’ \” \\ ความหมาย อักขระ tab อักขระ NULL (ใช้ ส้ นิ สุดสตริง) อักขระ ‘ (ฝนทอง) อักขระ “ (ฟันหนู) อักขระ \ (backspace) แบบฝึ กหัด #1 เขียนโปรแกรมเพื่อพิมพ์ข้อควำม a\b\\”c” de’f’ แบบฝึ กหัด #1 #include <stdio.h> void main() { printf(“a\\b\\\\\”c\”\n”); printf(“de\’f\’”); } แบบฝึ กหัด #1 #include <stdio.h> void main() { printf(“a\\b\\\\\”c\”\n”); printf(“de’f’”); } เครือ่ งหมายเซมิโคลอน (;) เวลำเรำเรียกฟังก์ชันหนึ่งครึ่ง ถือเป็ นคำสั่งหนึ่งคำสั่ง มีคำสั่งแบบอื่นๆ อีกมำกมำยที่จะได้ เรียน ทุกคาสังต้ ่ องจบด้วยเครือ่ งหมายเซมิโคลอน (;) เสมอ ระวังใส่เครื่องหมำยเซมิโคลอนหลังทุกคำสั่งด้ วย โปรแกรม #4 #include <stdio.h> void main() { printf(“First value is %d.\n”, 5); printf(“Second value is %d.\n”, 7); } โปรแกรม #4 printf(“First value is %d.”, 5); ข้ อมูลที่เรำป้ อนให้ ฟังก์ชันเวลำสั่งให้ มันทำงำน เรียกว่ำ อาร์กิวเมนต์ (argument) เวลำมี argument หลำยๆ ตัว เรำจะคั่นมันด้ วยเครื่องหมำยคอมมำ (,) ตอนนี้ printf มี argument สองตัว 1. สตริง “First value is %d.” 2. ตัวเลขจำนวนเต็ม 5 โปรแกรม #4 อำร์กวิ เมนต์ตวั แรกของ printf จะต้ องเป็ นสตริงเสมอ เพรำะมันคือข้ อควำมที่เรำจะพิมพ์ออกไป แล้ วอำร์กวิ เมนต์ตวั อื่นๆ ที่ตำมมำล่ะ? มันจะถูกนำไปแทนค่ำใส่ใน ชุดอักขระจัดรูปแบบ แล้ วชุดอักขระจัดรูปแบบที่ว่ำนั่นอยู่ไหน? “First value is %d.” %d บอกว่ำมันจะพิมพ์ค่ำที่เอำมำแทนเป็ น เลขฐานสิบ (decimal) โปรแกรม #4 ผลลัพธ์ของโปรแกรม First value is 5. Second value is 7. โปรแกรม #5 #incluce <stdio.h> void main() { printf(“Sum of %d and %d is %d.\n”, 9, 4, 9+4); printf(“Difference of %d and %d is %d.\n”,9, 4, 9-4); printf(“Product of %d and %d is %d.\n”, 9, 4, 9*4); printf(“Quotient of %d by %d is %d\n”, 9, 4, 9/4); printf(“Modulus of %d by %d is %d\n”, 9, 4, 9%4); } โปรแกรม #5 ผลลัพธ์ Sum of 9 and 4 is 13. Difference of 9 and 4 is 5. Product of 9 and 4 is 36. Quotient of 9 and 4 is 2. Modulus of 9 and 4 is 1. โปรแกรม #5 printf(“Sum of %d and %d is %d.\n”, 9, 4, 9+4); แสดงให้ เรำเห็นว่ำ printf จะมี argument กี่ตัวก็ได้ argument ตัวที่ตำมหลังมำจะถูกนำไปแทรกที่อกั ขระจัดรูปแบบ ตำมลำดับที่อกั ขระจัดรูปแบบปรำกฏ โปรแกรม #5 9+4, 9-4, 9*4, 9/4 และ 9%4 เรำเรียกพวกนี้ว่ำ นิพจน์ นิพจน์มีผลลัพธ์ ซึ่งจะเป็ นค่ำหนึ่งค่ำ เครื่องหมำยสำหรับกำรคำนวณเชิงคณิตศำสตร์ เครื่องหมำย + และ - แทนกำรบวกและกำรลบ ตำมลำดับ เครื่องหมำย * แทนกำรคูณ เครื่องหมำย / แทนกำรหำร ถ้ ำเอำจำนวนเต็มมำหำรกันก็จะได้ จำนวนเต็ม เครื่องหมำย % แทนกำรหำรเอำเศษ โปรแกรม #5 เครื่องหมำยพวกนี้มลี ำดับควำมสำคัญเหมือนกับในทำงคณิตศำสตร์ + และ – มีควำมสำคัญเท่ำกัน * และ / และ % มีควำมสำคัญเท่ำกัน * และ / และ % มีควำมสำคัญมำกกว่ำ + และ – เรำสำมำรถใช้ วงเล็บเพื่อจัดลำดับกำรคำนวณได้ แบบฝึ กหัด #2 ผลลัพธ์ของโปรแกรมนี้คืออะไร? #include <stdio.h> void main() { printf(“%d\n”, 7+10%3); printf(“%d\n”, (7+10)%3); printf(“%d\n”, 7+10%3*4-(5*20)); } แบบฝึ กหัด #2 8 2 -89 โปรแกรม #6 #incluce <stdio.h> void main() { printf(“%f printf(“%f printf(“%f printf(“%f } + * / %f %f %f %f = = = = %f\n”, %f\n”, %f\n”, %f\n”, 9.0, 9.0, 9.0, 9.0, 4.0, 4.0, 4.0, 4.0, 9.0+4.0); 9.0-4.0); 9.0*4.0); 9.0/4.0); โปรแกรม #6 ผลลัพธ์ของโปรแกรม 9.000000 9.000000 9.000000 9.000000 + * / 4.000000 4.000000 4.000000 4.000000 = = = = 13.000000 13.000000 36.000000 2.250000 โปรแกรม #6 ภำษำ C สำมำรถจัดกำรเลขทศนิยมได้ เช่นกัน ค่ำของเลขทศนิยม เวลำพิมพ์ต้องมีจุดทศนิยม มิฉะนั้นภำษำ C จะคิดว่ำเป็ น จำนวนเต็ม มีเครื่องหมำยที่เรำใช้ ได้ ส่เี ครื่องหมำยคือ +, -, *, / เวลำเอำเลขทศนิยมไปหำรเลขทศนิยมก็จะได้ เลขทศนิยมกลับมำ เรำสำมำรถพิมพ์ค่ำเลขทศนิยมได้ ด้วยอักขระจัดรูปแบบ %f โปรแกรม #7 #include <stdio.h> void main() { int age; age = 15; printf(“The child age is %d\n”, age); } โปรแกรม #7 ผลลัพธ์ของโปรแกรม The child age is 15. ตัวแปร (Variable) ตำแหน่งในหน่วยควำมจำ เก็บข้ อมูลหนึ่งชิ้น ตัวแปรต้ องมี ชื่อ ตัวแปรช่วยให้ เรำแทน ข้อมู ล ด้ วย ชื่อ ทำให้ ไม่จำเป็ นต้ องรู้ค่ำของมัน ในโปรแกรม #7 มีตวั แปรหนึ่งตัว ชื่อ age เรำพิมพ์ค่ำของ age ออกทำงด้ วย printf ได้ เหมือนกับพิมพ์ค่ำตัวเลข printf(“The child age is %d\n”, age); การประกาศตัวแปร เป็ นกำรบอกว่ำ มีตัวแปรชื่อนี้ ตัวแปรชื่อที่เรำประกำศชนิดอะไร ถ้ ำจะประกำศตัวแปรแค่ตวั เดียว ให้ ส่งั ชนิดข้อมูล ชื่อตัวแปร1; หรือถ้ ำจะประกำศพร้ อมกันทีละหลำยๆ ตัวก็ได้ ชนิดข้อมูล ชื่อตัวแปร 1, ชื่อตัวแปร 2, ชื่อตัวแปร 3, …, ชื่อตัวแปร n; ตัวอย่าง int age; int x, y, z; float area, length; int คือชนิดของตัวแปรที่เก็บจำนวนเต็มแบบหนึ่ง float คือชนิดของตัวแปรที่เก็บจำนวนจริงแบบหนึ่ง การกาหนดค่าให้ตวั แปร (Assignment) ใช้ เครื่องหมำยเท่ำกับ (=) โดยมีรป ู แบบดังนี้ ชื่อตัวแปร = นิพจน์; ยกตัวอย่ำงเช่น x = 5; หรือ y = (10*3)%7; ตัวแปรก็สำมำรถเข้ ำไปอยู่ในนิพจน์ได้ เช่น x = 10*y+y/5; แม้ แต่ตวั แปรตัวเดียวกันก็สำมำรถไปอยู่ท้งั สองฟำกของเครื่องหมำยเท่ำกับได้ x = x+1; z = z*z + 2*z + 1 โปรแกรมจะอ่ำนค่ำที่เก็บในหน่วยควำมจำมำใช้ ในกำรคำนวณทำงด้ ำนซ้ ำย เมื่อ คำนวณเสร็จแล้ วจะเอำผลลัพธ์ไปเขียนทับลงในตัวแปรที่อยู่ในด้ ำนขวำ ถ้ ำ x เท่ำกับ 5 หลังจำกสั่ง x = x+1 จะได้ x เท่ำกับ 6 ถ้ ำ z เท่ำกับ 3 หลังจำกสั่ง z = z*z + 2*z + 1 แล้ ว z จะมีค่ำเท่ำกับ 16 แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; x = x + y * z; z = y – x - z; y = 4 * x / y printf(“%d %d %d\n”, x, y, z); } แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; x =2 x + y * z; z = y – x - z; y = 4 * x / y printf(“%d %d %d\n”, x, y, z); } แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; x =2 x +5 y * z; z = y – x - z; y = 4 * x / y printf(“%d %d %d\n”, x, y, z); } แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; x =2 x +5 y *6 z; z = y – x - z; y = 4 * x / y printf(“%d %d %d\n”, x, y, z); } แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; 32x = 2x + 5y * 6z; z = y – x - z; y = 4 * x / y printf(“%d %d %d\n”, x, y, z); } แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; 32x = 2x + 5y * 6z; z =5 y – x - z; y = 4 * x / y printf(“%d %d %d\n”, x, y, z); } แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; 32x = 2x + 5y * 6z; z =5 y – 32 x - z; y = 4 * x / y printf(“%d %d %d\n”, x, y, z); } แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; 32x = 2x + 5y * 6z; z =5 y – 32 x -6 z; y = 4 * x / y printf(“%d %d %d\n”, x, y, z); } แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; 32x = 2x + 5y * 6z; -33z = 5y – 32 x -6 z; y = 4 * x / y printf(“%d %d %d\n”, x, y, z); } แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; 32x = 2x + 5y * 6z; -33z = 5y – 32 x -6 z; y = 4 * 32 x / y printf(“%d %d %d\n”, x, y, z); } แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; 32x = 2x + 5y * 6z; -33z = 5y – 32 x -6 z; y = 4 * 32 x /5 y printf(“%d %d %d\n”, x, y, z); } แบบฝึ กหัด #3 #include <stdio.h> void main() { int x, y, z; x = 2; y = 5; z = 6; 32x = 2x + 5y * 6z; -33z = 5y – 32 x -6 z; x /5 y 24y = 4 * 32 printf(“%d %d %d\n”, x, y, z); } โปรแกรม #3 ผลลัพธ์ของโปรแกรม 32 24 -33 ชือ่ (Identifier) ชื่อในภำษำ C จะต้ องเป็ นไปตำมกฏดังนี้ ประกอบขึ้นจำกตัวเลข ตัวอักษร หรือเครื่องหมำย underscore (_) name, student, a10, light_saber, _times, _101 one man ไม่ใช่ช่ ือชื่อเดียว แต่เป็ นชื่อสองชื่อ idolm@ster ไม่ใช่ช่ ือที่ถูกต้ อง ตัวอักขระตัวแรกต้ องไม่เป็ นตัวเลข 10a ไม่ใช่ช่ ือที่ถูกต้ อง ตัวพิมพ์ใหญ่และตัวพิมพ์เลขถือเป็ นคนละชื่อกัน salary, Salary, SALARY คนละชื่อกันทั้งสิ้น ชื่อจะต้ องไม่ซำ้ กับคำสงวน (reserved words) คาสงวน (Reserved Words) คำที่เป็ นส่วนประกอบของภำษำ C โดยตรง ห้ ำมใช้ เป็ นชื่อ มี 36 คำ สังเกตง่ำยๆ เวลำพิมพ์โปรแกรมใน IDE เกือบทุกตัวแล้ วสีของมันจะแตกต่ำงกับ ชื่ออื่นๆ ตอนนี้เรำรู้ reserved words สองคำ คือ void int ตัวแปรชนิดต่างๆ มีตวั แปรพื้นฐำนอยู่ 5 แบบ int = เลขจำนวนเต็ม float = เลขทศนิยมควำมละเอียดต่ำ double = เลขทศนิยมควำมละเอียดสูง (กว่ำ float 2 เท่ำ) char = ตัวอักขระ void = ไม่ระบุชนิด ตัวแปรชนิดต่างๆ สำหรับตัวแปรประเภท int เรำสำมำรถใส่คำเพิ่มเพื่อกำหนดเครื่องหมำยและควำมสั้น ยำวได้ unsigned = เก็บเฉพำะค่ำที่ไม่เป็ นลบ short = ให้ ใช้ หน่วยควำมจำน้ อยลงครึ่งหนึ่ง long = ให้ ใช้ หน่วยควำมจำเพิ่มขึ้นสองเท่ำ ดังนั้นมีชนิดตัวแปรแบบ int ที่เป็ นไปได้ อยู่ 6 แบบ int, unsigned int, short int, unsigned short int, long int, unsigned long int short int สำมำรถเขียนย่อเป็ น short ได้ long int สำมำรถเขียนย่อเป็ น long ได้ ตัวแปรชนิดต่างๆ ชนิดตัวแปร จานวนบิต ค่าตา่ สุด ค่าสูงสุด int 32 -2,147,483,648 2,147,483,647 unsigned int 32 0 4,294,967,295 short 16 -32,768 32,767 unsigned short 16 0 65,536 long 32 -2,147,483,648 2,147,483,647 unsigned long 32 0 4,294,967,295 ตัวแปรชนิดต่างๆ สมัยนี้ (ต่ำงกับประมำณ 10 ปี ก่อน) int กับ long มีควำมหมำยเดียวกัน ถ้ ำอยำกใช้ เลข 64 บิตจริง ให้ ใช้ ตวั แปรชนิด long long ค่ำต่ำสุด -9,223,372,036,854,775,808 ค่ำสูงสุด 9,223,372,036,854,775,807 โปรแกรม #8 #include <stdio.h> void main() { int a = 1000000000; short b = 1000000000; long c = 1000000000; long long d = 1000000000; printf(“%d %d %d %d\n”, a, b, c, d); } โปรแกรม #8 ผลลัพธ์ของโปรแกรม 1000000000 -13824 1000000000 100000000 โปรแกรม #8 เรำสำมำรถใช้ %d กับข้ อมูลประเภท int, short, long, และ long long ได้ แต่บำงครั้งค่ำของ long long ที่พิมพ์จะไม่ถูกต้ อง (เรำจะดูเรื่องนี้ในโปรแกรม #9) เรำสำมำรถกำหนดค่ำที่เกินขอบเขตให้ ตวั แปรใดก็ได้ ภำษำ C จะไม่บ่น ไม่ฟ้อง compile error แต่ค่ำที่ตัวแปรนั้นเก็บไว้ จริงๆ จะไม่ต้องกับค่ำที่เรำกำหนดให้ เช่น กำหนดค่ำ 1,000,000,000 ให้ b แต่ควำมจริงมันเก็บ -13,824 ต้องระวังไม่ให้ค่าทีเ่ รากาหนดให้ตวั แปรเกินขอบเขตของมัน โปรแกรม #9 #include <stdio.h> void main() { int a = 1000000000000; short b = 1000000000000; long c = 1000000000000; long long d = 1000000000000; printf(“%d %d %d %d\n”, a, b, c, d); } โปรแกรม #9 เรำกำหนดค่ำ 1,000,000,000,000 ให้ กบ ั ตัวแปรทุกตัว ค่ำนี้เกินขอบเขตของ int และ long (ไม่ต้องพูดถึง short) ดังนั้นน่ำจะได้ ผลลัพธ์คอื เลขตัวสุดท้ ำยที่พิมพ์ออกมำน่ำจะเท่ำกับ 1,000,000,000,000 แค่ตวั เดียว แต่ผลลัพธ์ท่ไี ด้ จริงๆ คือ: -727379968 4096 -727379968 -727379968 โปรแกรม #9 เกิดอะไรขึ้น? เวลำใช้ %d มันจะคิดว่ำค่ำที่ให้ มำเป็ น int ซึ่งมีขนำด 32 บิต หำกต้ องกำรพิมพ์ค่ำ 64 บิตของ long long จะต้ องใช้ %lld แทน โปรแกรม #10 #include <stdio.h> void main() { int a = 1000000000000; short b = 1000000000000; long c = 1000000000000; long long d = 1000000000000; printf(“%lld %lld %lld %lld\n”, a, b, c, d); } โปรแกรม #10 ผลลัพธ์ของโปรแกรม -727379968 4096 -727379968 1000000000000 อธิบำยได้ หรือไม่? ตัวแปร a, b, และ c ถูกกำหนดค่ำที่เกินควำมสำมำรถของมัน ดังนั้นจึงเก็บค่ำที่ผดิ อยู่ แล้ ว ตัวแปร d เป็ นตัวแปรประเภท long long เมื่อพิมพ์ค่ำด้ วย %lld จึงทำให้ ได้ ค่ำที่ ถูกต้ องออกมำ แต่ถ้ำใช้ %d มันจะถูกคิดว่ำเป็ น int อักขระจัดรูปแบบอืน่ ๆ สาหรับตัวแปรประเภทจานวนเต็ม อักขระจัดรูปแบบ ความหมาย %o เลขฐำน 8 (Octal) %x เลขฐำน 16 (heXadecimal) ใช้ ตัวพิมพ์เล็ก %X เลขฐำน 16 ใช้ ตัวพิมพ์ใหญ่ %u ให้ คิดว่ำค่ำที่ให้ มำเป็ นตัวแปรแบบ unsigned ถ้ ำอยำกให้ คด ิ ว่ำค่ำที่ให้ เป็ น long long ให้ เติม ll ไปข้ ำงหน้ ำ %lld, %llo, %llx, %llX, %llu ถ้ ำอยำกให้ คด ิ ว่ำค่ำที่ให้ เป็ น short ให้ เติม h ไปข้ ำงหน้ ำ %hd, %ho, %hx, %hX, %hu ถ้ ำอยำกให้ คด ิ ว่ำค่ำที่ให้ เป็ น long ให้ เติม l ไปข้ ำงหน้ ำ %ld, %lo, %lx, %lX, %lu โปรแกรม #10 #include <stdio.h> void main() { int x = 253; int y = -1*x; printf(“%d %u %o %x %X\n”, x, x, x, x, x); printf(“%d %u %o %x %X\n”, y, y, y, y, y); } โปรแกรม #10 ผลลัพธ์ของโปรแกรม 253 253 375 fd FD -253 4294967043 37777777403 ffffff03 FFFFFF03 โปรแกรม #10 ทำไม -253 พิมพ์ออกมำด้ วย %u แล้ วได้ ค่ำ 4294967043? เพรำะกำรเก็บค่ำของ -253 ในตัวแปรชนิด int ใช้ รป ู แบบของบิตเดียวกันกับ 4294667043 ในตัวแปรชนิด unsigned int เรำจะดูรป ู แบบของบิตได้ ท่ไี หน? ดูท่เี ลขฐำน 16 หรือเลขฐำน 8 1111 1111 1111 1111 1111 1111 0000 0011 F F F F F F 0 3 ถ้ ำอยำกรู้ควำมหมำยของรูปแบบบิตเหล่ำนี้ ให้ ดูกำรเก็บข้ อมูลจำนวนเต็มแบบ Two’s Complement สังเกตว่ำกำรพิมพ์ตัวเลขในรูปเลขฐำน 8 และเลขฐำน 16 จะคิดว่ำเลขไม่ใช่ลบเสมอ เพรำะมันจะพิมพ์ไปตำมรูปแบบของบิต sizeof เรำสำมำรถหำจำนวนไบต์ท่ใี ช้ เก็บข้ อมูลชนิดหนึ่งๆ ได้ โดยใช้ เครื่องหมำย sizeof โดยมีรปู แบบกำรใช้ ดงั นี้ sizeof(ชนิดของข้ อมูล) ยกตัวอย่ำงเช่น sizeof(int) sizeof(unsigned long long) sizeof(short) sizeof(unsigned long) โปรแกรม #11 #include <stdio.h> void main() { printf("The number of bytes in an int is %d.\n", sizeof(int)); printf("The number of bytes in a short int is %d.\n", sizeof(short)); printf("The number of bytes in a long int is %d.\n", sizeof(long)); printf("The number of bytes in a long long is %d.\n", sizeof(long long)); } โปรแกรม #11 ผลลัพธ์ของโปรแกรม The The The The number number number number of of of of bytes bytes bytes bytes in in in in an int is 4. a short int is 2. a long int is 4. a long long is 8. ตัวแปรประเภท char เรำสำมำรถคิดว่ำมันแทนค่ำได้ สองแบบ ตัวอักษร เช่น a, B, c, +, -, ., ! เลข 8 บิต มีค่ำตั้งแต่ -128 ถึง 127 เวลำจะพิมพ์ค่ำของ char ใช้ %d ถ้ ำต้ องกำรพิมพ์ค่ำตัวเลขตั้งแต่ -128 ถึง 127 ใช้ %u ถ้ ำต้ องกำรพิมพ์ค่ำตัวเลขตั้งแต่ 0 ถึง 255 ใช้ %c ถ้ ำต้ องกำรพิมพ์ตัวอักษร โปรแกรม #12 #include <stdio.h> void main() { char x = 65; printf("x as a number is %d.\n", x); printf("x as a character is %c.\n", x); } โปรแกรม #12 ผลลัพธ์ของโปรแกรม x as a number is 65. x as a character is A. รหัส ASCII ทำไมค่ำ 65 ถึงพิมพ์ออกมำแล้ วได้ ตวั A? เพรำะ 65 คือรหัส ASCII ของตัวอักษร A รหัส ASCII คือรหัสที่ยอมรับกันเป็ นมำตรำฐำนให้ ใช้ แทนตัวอักษรที่ปรำกฏอยู่บน คีย์บอร์ดและตัวอักษรที่ใช้ บ่อยหลำยๆ ตัว ตัวแปรประเภท char เรำสำมำรถเขียนค่ำตัวอักษรในภำษำ C ได้ ให้ ใช้ เครื่องหมำยฟันหนู (‘) ล้ อมรอบตัวอักษรนั้น ‘a’ ‘B’ ‘+’ ‘9’ โปรแกรม #13 #include <stdio.h> void main() { char x = '9'; printf("x as a number is %d.\n", x); printf("x as a character is %c.\n", x); } โปรแกรม #13 ผลลัพธ์ของโปรแกรม x as a number is 57. x as a character is 9. ตัวแปรประเภท char เนื่องจำกตัวแปรประเภท char จริงๆ แล้ วคือตัวเลขจำนวนเต็ม ดังนั้นคุณจึง สำมำรถทำอย่ำงนี้ได้ ‘A’ + 5 ‘B’ * ‘x’ 100 / ‘a’ เป็ นประโยชน์มำกสำมำรถใช้ เป็ น ‘A’ + 5 มีค่ำเท่ำกับ 70 ซึ่งคือรหัส ASCII ของตัว ‘F’ ซึ่งเป็ นตัวอักษรที่อยู่หลัง A 5 ตัว ‘x’ – ‘a’ มีค่ำเท่ำกับ 23 ซึ่งหมำยควำมว่ำ ‘x’ อยู่หลัง ‘a’ ไป 23 ตัว ตัวแปรประเภท string เรำสำมำรถประกำศตัวแปรประเภท string ได้ ด้วยคำสั่ง char *ชื่อตัวแปร; เช่น char *name; หลังจำกนั้นก็สำมำรถกำหนดค่ำให้ มน ั ได้ โดยใช้ เครื่องหมำยเท่ำกับ (=) เช่น name = “Dennis Richie” เวลำจะพิมพ์ค่ำ string ด้ วยคำสั่ง printf ให้ ใช้ ตวั อักขระจัดรูปแบบ %s เช่น printf(“%s\n”, name); โปรแกรม #14 #include <stdio.h> void main() { char *name; name = "Dennis Ritchie"; printf("%s is the creator of the C language.\n", name); } โปรแกรม #15 ผลลัพธ์ Dennis Ritchie is one of the creator of the C language. โปรแกรม #15 สำมำรถเขียนให้ ส้น ั ลงเล็กน้ อยได้ ดงั นี้ #include <stdio.h> void main() { char *name = "Dennis Ritchie"; printf("%s is the creators of the C language.\n", name); } ตัวแปรทีเ่ ก็บค่าจานวนจริง มีรวมทั้งหมด 3 ชนิด float ขนำด 32 บิต double ขนำด 64 บิต long double ขนำด 64 บิต long double กับ double จะเหมือนกันในสำยตำของส่วนมำก แต่สำหรับ คอมไพเลอร์บำงตัว long double จะมีขนำด 128 บิต อักขระจัดรูปแบบที่ใช้ แสดงผลตัวแปรรูปแบบต่ำงๆ ได้ แต่ float ใช้ %f double และ long double ใช้ %lf อักขระจัดรูปแบบสาหรับค่าประเภทจานวนจริง %f คือกำรพิมพ์จำนวนจริงธรรมดำ %e คือกำรพิมพ์จำนวนจริงในรูปแบบ scientific notation เช่น 123.45 จะพิมพ์เป็ น 1.234500e+02 หมำยควำมถึง 1.2345 102 %E คือกำรพิมพ์แบบ scientific notation เหมือนกัน แต่ใช้ ตวั E พิมพ์ใหญ่ โปรแกรม #16 #include <stdio.h> void main() { float score; score = 300.545; printf("Score are %f, %e, and %E\n", score, score, score); } โปรแกรม #16 ผลลัพธ์ของโปรแกรม Score are 300.545013, 3.005450e+002, and 3.005450E+002 โปรแกรม #16 ทำไมมันถึงพิมพ์ 300.545013 ทั้งๆ ที่เรำสั่ง 300.545? นี่เป็ นเพรำะว่ำจำนวนจริงมีอยู่นับไม่ถ้วน แต่เรำใช้ พ้ ืนที่เพียง 32 บิต (ตัวแปรประเภท float) เก็บค่ำนั้น ทำให้ เรำเก็บจำนวนจริงได้ แค่บำงตัว 300.545 เป็ นหนึ่งในจำนวนจริงที่เก็บไม่ได้ เลยต้ องใช้ ค่ำที่ใกล้ มันมำกที่สดุ ที่เก็บได้ คือ 300.545013 0.000013 ที่เกินมำเรียกว่ำ round-off error โปรแกรม #16 ทำอย่ำงไร round-off error จะหำยไป? มันหำยไปไม่ได้ นี่เป็ นข้ อจำกัดทำงทฤษฎี! แต่เรำสำมำรถทำให้ มน ั ลดลงได้ ด้วยกำรใช้ ตวั แปรที่ให้ ควำมละเอียดสูงขึ้น ใช้ double แทน float อย่ำงไรก็ดีจะใช้ กต็ ้ องคิดดีๆ ใช้ แล้ วหน่วยควำมจำสำหรับเก็บข้ อมูลจะเพิ่มขึ้นสองเท่ำ! โปรแกรม #17 #include <stdio.h> void main() { double score; score = 300.545; printf("Score are %f, %e, and %E\n", score, score, score); } โปรแกรม #17 ผลลัพธ์ของโปรแกรม Score are 300.545000, 3.005450e+002, and 3.005450E+002 การกาหนดจานวนตัวเลขและจานวนตัวเลขหลังทศนิยม เรำสำมำรถกำหนดจำนวนตัวเลขและจำนวนตัวเลขหลังทศนิยมได้ ด้วยตัวอักขระ จัดรูปแบบ %w.df โดยที่ w และ d เป็ นจำนวนเต็มที่ไม่เป็ นลบ w แทนจำนวนตำแหน่งทั้งหมดในกำรแสดงผล รวมจุดทศนิยมหนึ่งตำแหน่ง d แทนจำนวนตำแหน่งหลังจุดทศนิยม ถ้ ำข้ อมูลมีน้อยกว่ำ w ตำแหน่ง โปรแกรมเติมช่องว่ำงหน้ ำข้ อมูลจนครบ w ตำแหน่ง ยกตัวอย่ำงเช่น ถ้ ำเรำพิมพ์ค่ำ 12.35 ด้ วยอักษรจัดข้ อควำม %7.2f เรำจะได้ ข้ อควำม (ว่ำง) (ว่ำง) 1 2 . 3 5 โปรแกรม #18 #include <stdio.h> void main() { double temp; temp = 12.34; printf("%7.2f, %10.3E, %10.3e\n", temp, temp, temp); temp = 1.2365e-5; printf("%7.2f, %10.3E, %10.3e\n", temp, temp, temp); temp = 584.365E+17; printf("%7.2f, %10.3E, %10.3e\n", temp, temp, temp); } โปรแกรม #18 ผลลัพธ์ของโปรแกรม 12.34, 1.234E+001, 1.234e+001 0.00, 1.237E-005, 1.237e-005 58436500000000000000.00, 5.844E+019, 5.844e+019 โปรแกรม #18 ผลลัพธ์ของโปรแกรม __12.34, 1.234E+001, 1.234e+001 ___0.00, 1.237E-005, 1.237e-005 58436500000000000000.00, 5.844E+019, 5.844e+019 +=, -=, *=, /=, %= สมมติว่ำ เป็ นเครื่องหมำย ถ้ ำสั่ง ตัวแปร = นิพจน์; จะมีควำมหมำยเหมือนกับ ตัวแปร = ตัวแปร (นิพจน์); เช่น x += 1; y -= x*5; มีควำมหมำยเหมือนกับ มีควำมหมำยเหมือนกับ x = x+1; y = y – (x*5); โปรแกรม #19 #include <stdio.h> void main() { int a = 0, b = 5; a += 4; printf("a is %d\n", a *= 3; printf("a is %d\n", a /= 4; printf("a is %d\n", a %= 5; printf("a is %d\n", a = 7; a /= a - b; printf("a is %d\n", b *= b + a; printf("b is %d\n", } a); a); a); a); a); b); โปรแกรม #19 ผลลัพธ์ของโปรแกรม a a a a a b is is is is is is 4 12 3 3 3 40 ++, - คำสั่ง x+=1; สำมำรถย่อเป็ น x++; หรือ ++x; ก็ได้ ฃ คำสั่ง x-=1; สำมำรถย่อเป็ น x--; หรือ --x; ก็ได้ โปรแกรม #20 #include <stdio.h> void main() { int x = 8; printf("x is %d\n", x++; printf("x is %d\n", ++x; printf("x is %d\n", x--; printf("x is %d\n", --x; printf("x is %d\n", } x); x); x); x); x); โปรแกรม #20 ผลลัพธ์ของโปรแกรม x x x x x is is is is is 8 9 10 9 8 คาสัง่ scanf ใช้ รับข้ อมูลจำกทำง standard input ทำหน้ ำที่กลับกันกับ printf อยู่ใน stdio.h เหมือนกับ printf รูปแบบกำรใช้ งำน scanf(ข้ อควำม, &ชื่อตัวแปร 1, &ชื่อตัวแปร 2, …, &ชื่อตัวแปร n); ข้ อควำมที่ให้ เป็ นอำร์กวิ เมนต์ของ scanf ไปจะต้ องมีอกั ขระจัดรูปแบบเท่ำกับ จำนวนตัวแปรที่ให้ เป็ นอำร์กวิ เมนต์ต่อท้ ำย scanf จะอ่ำนข้ อควำมเข้ ำมำหนึ่งข้ อควำม แล้ วพยำยำมเอำข้ อควำมส่วนที่ตรงกับ อักขระจัดรูปแบบไปใส่ในตัวแปรที่ตรงกับอักขระจัดรูปแบบนั้น คาสัง่ scanf ยกตัวอย่ำงเช่น ถ้ ำเรำสั่ง scanf(“%d %d”, &x, &y); แล้ วผู้ใช้ ป้อนข้ อควำม 10 20 จะได้ ว่ำ x จะมีค่ำเท่ำกับ 10 และ y มีค่ำเท่ำกับ 20 โปรแกรม #21 #include <stdio.h> void main() { int val; printf("Enter a decimal integer: "); scanf("%d", &val); printf("The value is %o in octal, and %x in \ hexadecimal.\n", val, val); printf("Enter an octal integer: "); scanf("%o", &val); printf("The value is %d in decimal.\n", val); printf("Enter a hexadecimal integer: "); scanf("%x", &val); printf("The value is %d in decimal.\n", val); } โปรแกรม #21 ผลลัพธ์ของโปรแกรม Enter a decimal integer: 78 The value is 116 in octal, and 4e in hexadecimal. Enter an octal integer: 116 The value is 78 in decimal. Enter a hexadecimal integer: 4e The value is 58446 in decimal. (หมายเหตุ ตัวอักษรตัวพิมพ์หนำคือข้ อควำมที่ผ้ ูใช้ ป้อนเข้ ำทำงคีย์บอร์ด) แบบฝึ กหัด #4 เขียนโปรแกรมรับเลขจำนวนเต็มหนึ่งตัว สมมติว่ำตัวแปรนั้นคือ x เสร็จแล้ วพิมพ์ ค่ำ x, x2, และ x3 แบบฝึ กหัด #4 #include <stdio.h> void main() { int x; scanf("%d\n", &x); printf("%d %d %d\n", x, x*x, x*x*x); } แบบฝึ กหัด #5 จงเขียนโปรแกรมรับรัศมีของวงกลม แล้ วพิมพ์พ้ ืนที่และเส้ นรอบวงของวงกลมนั้น โดยประมำณ ออกทำงหน้ ำจอ แบบฝึ กหัด #5 #include <stdio.h> void main() { float r; float pi = 3.14159265; scanf("%f\n", &r); float area = pi * r * r; float circumference = 2 * pi * r; printf("%f %f\n", area, circumference); }