ครั้งที่ 9 Function(ต่อ)
Pointer พอยเตอร์ คือ ตัวชี้ หน้าที่หลักคือ การชี้ ดังนั้น ค่าที่พอยเตอร์เก็บอยู่ ไม่ใช่ค่าข้อมูลที่แท้จริง หากแต่เป็นค่า แอดเดรส ของตัวแปรอื่น ค่าที่ตัวแปรพอยเตอร์เก็บอยู่ คือ ค่าแอดเดรสของตัวแปรอื่น ค่าที่ตัวแปรพอยเตอร์ได้มาจากการชี้ไปยังแอดเดรสใด ๆ คือ ค่าข้อมูลที่แท้จริงของตัวแปรพอยเตอร์
การประกาศตัวแปร pointer เช่น int *p; คือ ประกาศตัวแปร p เป็นตัวแปร pointer มีชนิดข้อมูลเป็นแบบจำนวนเต็ม char *p; คือ ประกาศตัวแปร p เป็นตัวแปร pointer มีชนิดข้อมูลเป็นแบบตัวอักษร
การกำหนดค่าเริ่มต้นให้กับตัวแปรพอยเตอร์ สามารถทำได้ 2 วิธี 1. ทำพร้อมกับการประกาศตัวแปรพอยเตอร์ เช่น int a; int *p=&a; 2. ทำหลังจากการประกาศตัวแปรพอยเตอร์ เช่น int a; int *p; p=&a;
สัญลักษณ์ในการทำงานพอยเตอร์ สัญลักษณ์ & หมายถึง การกำหนดค่าเริ่มต้นให้กับตัวแปรพอยเตอร์ ว่าต้องการให้พอยเตอร์ชี้ไปที่ตำแหน่งใด สัญลักษณ์ * หมายถึง ค่าข้อมูลที่แท้จริงที่ได้มาจากการที่ตัวแปรพอยเตอร์ทำการชี้ไปยังแอดเดรสของตัวแปรใดๆ
Ex1 int a; int *p = &a, *q = &a; ประกาศ a เป็นแบบจำนวนเต็ม และประกาศค่าเริ่มต้นให้กับ p และ q โดยเริ่มต้นให้ชี้ไปที่ แอดเดรสของตัวแปร a
Ex2 int a; int *p = &a, *q = &a; a = 2; ประกาศ a เป็นแบบจำนวนเต็ม มีค่าเป็น 2 ดังนั้นขณะนี้ *p = 2 และ *q = 2 ด้วย คือ a = *p = *q = 2 เนื่องจากทั้ง p และ q ชี้อ้างอิงตัวแปร a อยู่ ดังนั้น a มีค่าเป็นอะไร ค่าของ *p และ *q ก็ต้องเป็นเช่นนั้นด้วย
Ex3 int a; int *p = &a, *q = &a; a = 2; a = a+3; การทำ a = a+3; มีความหมายเหมือนกับการทำ *p=*p+3; และ *q = *q +3 ด้วย ดังนั้น a=*p=*q=5 นั่นเอง
Ex4 โปรแกรมแสดงการทำงานของตัวแปร พอยเตอร์ 1 ตัว #include <stdio.h> #include <conio.h> void main() { int a=2, b=3; int *p=&a; printf(“Pointer variable p points to variable a at address %p\n”,p); printf(“Value of a is &d, so that value of p is %d too\n”, a, *p); getch(); }
ผลรันของโปรแกรม Pointer variable p points to variable a at address FFF4 Value of a is 2, so that value of p is 2 too
Ex5 #include <stdio.h> void set_to_zero (int *x, int *y) { } void main() { int a,b; a=2; b=3; printf(“%d %d \n”,a,b); set_to_zero(&a,&b); Output
Ex6 จงเขียนฟังก์ชัน swap สลับค่าตัวเลข 2 ค่า #include <stdio.h> #include <conio.h> void swap (int *a, int *b); void main() { int x,y; printf(“Enter 2 number “); scanf(“%d %d”,......................); ..................................... //เรียกใช้ฟังก์ชัน printf("After swap\n"); printf("x=%d,y=%d\n",x,y); } ...............swap (.........................................) int temp; .................................................... Output Enter 2 number 30 5 After swap x = 5, y = 30
ตะลุยโจทย์ฟังก์ชัน(ต่อ)
Ex7 จงเขียนโปรแกรมเพื่อรับค่าเงินบาท แล้วคิดคำนวณเงินสกุลต่าง ๆ โดยเลือกเมนูในโปรแกรมหลัก(main) และเรียกฟังก์ชัน Rate ใช้งานโดยส่งค่าเงินบาทและเมนูไปแล้วส่งค่ากลับมาแสดงผลลัพธ์ในโปรแกรมหลัก กำหนดให้เลือกเมนูเพื่อคิดอัตราแลกเปลี่ยนของเงินแต่ละสกุลเป็นดังนี้ 34.57 บาท/1 ดอลล่าร์ 46.82 บาท/1 ยูโร 0.29 บาท/1 เยน
Input How much money do you have ? (Baht) : 5400 Select Menu (1 for Dollar, 2 for Euro, 3 for Yen) : 1 Output 5400 Baht = 156.20 Dollar How much money do you have ? (Baht) : 5400 Select Menu (1 for Dollar, 2 for Euro, 3 for Yen) : 2 5400 Baht = 115.34 Euro Select Menu (1 for Dollar, 2 for Euro, 3 for Yen) : 3 5400 Baht = 18620.69 Yen
Ex8 จงเขียนโปรแกรมเพื่อคำนวณหาเงินได้สุทธิของพนักงาน 10 คน โดยในโปรแกรมหลักจะต้องมีโปรแกรมย่อย ดังนี้ - โปรแกรมย่อยสำหรับรับชื่อพนักงานและเงินเดือน (INPUTDATA) - โปรแกรมย่อยสำหรับคำนวณเงินโบนัสพนักงาน(CALCULATE) โดยมีเงื่อนไขดังนี้ พนักงานที่มีเงินเดือน 0-10,000 บาท ได้โบนัส 5% พนักงานที่มีเงินเดือน 10,001-50,000 บาท ได้โบนัส 10% พนักงานที่มีเงินเดือน มากกกว่า 50,000 บาท ได้โบนัส 15% - โปรแกรมย่อยสำหรับการแสดงผล (DISPLAY) โดยแสดงเงินได้สุทธิที่เกิดจากเงินเดือน+โบนัส
Input Output Name : Raweewan Salary : 35000 You get 38500 baht Name : Bootsara Salary : 10000 You get 10500 baht
Ex9 จงเขียนโปรแกรมเพื่อวนรับคะแนนสอบกลางภาค (score) ของนักศึกษาจำนวนจำนวน 40 คน แล้วคำคำนวณคะแนนเฉลี่ย (avg) คะแนนสูงสุด (max) และคะแนนต่ำสุด (min) กำหนดให้ main เรียกใช้ฟังก์ชันต่าง ๆ ดังนี้ - Get_Data() - Average() - Maximum() - Minimun()
Input Student 1 : 18.21 Student 2 : 24.50 ……………….. ………………. ……………… Student 40 : 25.12 *************************************************** Output Average Score = 19.54 Max Score = 38.25 Min Score = 16.20
Ex10 จงเขียนโปรแกรมเพื่ออ่านข้อมูลลำดับที่นักศึกษา (No) และจำนวนหน่วยกิต (Credit) จากไฟล์ชื่อ in.txt แล้วคำนวณค่าลงทะเบียนเรียนของนักศึกษาแต่ละคน กำหนดให้มีเงื่อนไขของการคำนวณค่าลงทะเบียนดังนี้ ลงทะเบียนไม่ถึง 9 หน่วยกิต คิดหน่วยกิตละ 1500 บาท ลงทะเบียน 9-15 หน่วยกิต คิดหน่วยกิตละ 1400 บาท ลงทะเบียนมากกว่า 15 หน่วยกิต คิดหน่วยกิตละ 1200 บาท กำหนดให้โปรแกรมดังกล่าวมีโปรแกรมย่อยต่าง ๆ ดังนี้ Calculate() เป็นโปรแกรมย่อยคำนวณค่าลงทะเบียน Output() เป็นโปรแกรมย่อยแสดงผลลัพธ์
ตัวอย่างข้อมูลในไฟล์ ตัวอย่างหน้าจอ No : 1 Credit : 15 Fee : 21000 =========================== No : 2 Credit : 6 Fee : 9000 =========================== …………………………………… …………………………………… ตัวอย่างข้อมูลในไฟล์ 15 6 18 20 12