ทบทวน อาร์เรย์ (Array)
วัตถุประสงค์ สามารถใช้งานตัวแปรประเภทอาร์เรย์ 1 มิติ และ 2 มิติได้ เข้าใจการส่งผ่านอาร์เรย์ไปยังฟังก์ชัน สามารถใช้งานข้อมูลชนิดโครงสร้าง (structure) ได้
Outline นิยามอาร์เรย์ การประกาศตัวแปรอาร์เรย์ การเข้าถึงตัวแปรอาร์เรย์ การส่งผ่านอาร์เรย์ไปยังฟังก์ชัน ข้อมูลชนิดโครงสร้าง
นิยามของอาร์เรย์ อาร์เรย์ เป็นรูปแบบข้อมูลแบบหนึ่งที่จัดเก็บข้อมูลชนิดเดียวกันอย่างต่อเนื่องกัน โดยจัดอยู่ในบล็อกของหน่วยความจำเดียวกัน และใช้ชื่อตัวแปรร่วมกันในการอ้างถึง v[0] v[1] v[2] v[3] v[4] v[5] 70 65 84 50 46 23
การประกาศตัวแปรแบบอาร์เรย์ อาร์เรย์ 1 มิติ มีโครงสร้างเทียบเท่าเมตริกซ์ขนาด n x 1 การประกาศตัวแปรอาร์เรย์ จะใช้เครื่องหมาย [] ล้อมค่าตัวเลขจำนวนเต็ม เพื่อบอกจำนวนสมาชิกที่ต้องการ รูปแบบการประกาศตัวแปรอาร์เรย์ 1 มิติ: ชนิดของตัวแปร ชื่อตัวแปร[จำนวนสมาชิกที่ต้องการ] เช่น int v[6] float data[10] 70 65 84 50 46 23
การประกาศตัวแปรแบบอาร์เรย์ อาร์เรย์ 2 มิติ มีโครงสร้างคล้ายกับเมตริกซ์สองมิติ มีการอ้างถึงข้อมูลโดยใช้ค่าเลขดัชนี 2 ค่า ซึ่งประกอบค่าดัชนีที่ใช้ในการอ้างอิงในแนวแถว (rows) และค่าดัชนีที่ใช้อ้างอิงในแนวคอลัมน์ (columns) รูปแบบการประกาศตัวแปรอาร์เรย์ 2 มิติ: ชนิดข้อมูล ชื่อตัวแปร[จำนวนแถว][จำนวนคอลัมน์] เช่น int val[2][3] float[5][10] 5 2 7 6
การเข้าถึงตัวแปรอาร์เรย์ รูปแบบการเข้าถึงตัวแปรอาร์เรย์ 1 มิติ ชื่อตัวแปร[ตัวชี้] รูปแบบการเข้าถึงตัวแปรอาร์เรย์ 2 มิติ ชื่อตัวแปร[ตัวชี้แนวแถว][ตัวชี้แนวคอลัมน์] ตัวชี้อาจป้อนอยู่ในรูปของตัวแปร นิพจน์ หรือฟังก์ชันที่ให้ค่าเป็นค่าจำนวนเต็มได้
ตัวอย่างการเข้าถึงตัวแปรอาร์เรย์ read mark[0] write mark[i] tol tol + v[i] v[0] 78 v[i] v[i-1] + 5 x[i][j] i*j
การใช้คำสั่ง for ในการเข้าถึงอาร์เรย์ 1 มิติ ตัวอย่าง ถ้าต้องการหาผลรวมของตัวแปร score 5 อิลิเมนต์ ทำได้ดังนี้ sum score[0] + score[1] + score[2] + score[3] + score[4] เปลี่ยนเป็นใช้ for loop ได้ดังนี้ sum 0 for i0 to 4 sum sum + score[i]
ตัวอย่างการรับค่าและแสดงผลลัพธ์ของอาร์เรย์ #include<stdio.h> main() { int sal[4] for(i=0;i<4;i++) {printf(“Enter sal[%d]: ”,i); scanf(“%d”, sal[i]); //การรับค่า } for(i=1;i<4;i++) {sal[i] = sal[i]*sal[i-1]; printf(“sal[%d] = %d\n” , i, sal[i]); //การแสดงผลลัพธ์ Enter[0]: 1 Enter[1]: 1 Enter[2]: 2 Enter[3]: 5 …………………………………………………………………………… ……………………………………………………………………………. ……………………………………………………………………………..
การใช้คำสั่ง for ในการเข้าถึงอาร์เรย์ 2 มิติ ตัวอย่างเช่น ตัวการหาผลรวมของคะแนนเก็บ คะแนนสอบกลางภาค คะแนนสอบปลายภาคของนักศึกษาแต่ละคน จำนวน 5 คน 1. for i0 to 4 1.1 stu[i]0 1.2 for j 0 to 2 1.2.1 stu[i] stu[i] + score[i][j]
ตัวอย่างการรับค่าและแสดงผลลัพธ์ของอาร์เรย์ 2 มิติ #include<stdio.h> main() { float score[5][3], stu[5]; for(i=0;i<5;i++) stu[i]=0; for(j=0;j<3;j++) scanf(“%f”, &score[i][j]); //การรับค่า stu[i] = stu[i] + score[i][j]; } printf(“%.2f\t”, score[i][j]); //การแสดงผลลัพธ์ printf(“\t%.2f\n”, stu[i]);
การส่งผ่านอาร์เรย์ไปยังฟังก์ชัน ตัวอย่างการส่งค่าแต่ละอิลิเมนต์ในอาร์เรย์ให้กับฟังก์ชัน #include<stdio.h> void chk_v(int num) { if(num%2==0) printf(“%d is an even number\n”, num); else printf(“%d is an odd number\n”,num); } main() { int i; int val[5] = {2,7,4,1,9}; for(i=0;i<5;i++) chk_v(val[i]); //ส่งไปที่ค่า (call by value) Output???
การส่งผ่านอาร์เรย์ไปยังฟังก์ชัน ตัวอย่างการส่งค่าทุกอิลิเมนต์ในอาร์เรย์ให้กับฟังก์ชัน #include<stdio.h> void chk_v(int num[5]) { int i; for(i=0;i<5;i++) { if(num[i]%2==0) printf(“%d is an even number\n”, num); else printf(“%d is an odd number\n”,num); } main() int val[5] = {2,7,4,1,9}; chk_v(val); //ส่งไปทุกค่าในอาร์เรย์ (call by reference) Output???
แบบฝึกหัด เขียนขั้นตอนวิธีด้วยรหัสจำลองเพื่อรับ 2 เมตริกซ์ ขนาด 4 x 3 แล้วเรียกใช้ 2 ฟังก์ชัน ทำการบวกกัน ทำ transpose
ข้อมูลชนิดโครงสร้าง การประกาศข้อมูลชนิดโครงสร้าง struct ชื่อแบบข้อมูลชนิดโครงสร้าง { ชนิดข้อมูล ชื่อตัวแปรสมาชิก ; ชนิดข้อมูล ชื่อตัวแปรสมาชิก ; .... }ชื่อตัวแปรโครงสร้าง;
ข้อมูลชนิดโครงสร้าง ตัวอย่าง การประกาศข้อมูลชนิดโครงสร้าง struct student_history { char id[10] ; char name[30]; int age; char faculty[20]; }student[50];
ข้อมูลชนิดโครงสร้าง การเรียกใช้ การเข้าถึง และการกำหนดค่า การรับค่า และการกำหนดค่าเริ่มต้น สามารถทำได้เช่นเดียวกับตัวแปรทั่วไป เพียงแต่การอ้างถึงแต่กต่างกันเท่านั้น ซึ่งการอ้างถึงตัวแปรที่เป็นสมาชิกในตัวแปรโครงสร้างนั้น สามารถทำได้โดยการระบุชื่อตัวแปรโครงสร้าง ตามด้วยจุด (.) และตามด้วยชื่อตัวแปรสมาชิกที่ต้องการอ้างถึง เช่น student[0].id student[0].name student[0].age student[0].faculty
การส่งผ่านข้อมูลแบบ struct เป็น argument #include<stdio.h> void print(struct history); struct history { int id; char name[20]; char faculty[25]; } student; int main () { printf ("Enter id :"); scanf ("%d",&student.id); printf ("Enter name :"); scanf ("%s",student.name); printf ("Enter faculty :"); scanf ("%s",student.faculty); printf ("\nstudent detail"); print(student); return 0; } void print(struct history std) { printf ("\n\t ID :%d \n\t Name : %s \n\t Faculty: %s",std.id,std.name,std.faculty); } created by Dararat Saeleee , 344-211 Algorithmic Process & Programming Struct1_2.c
การส่งผ่านข้อมูลแบบ struct เป็น argument typedef struct { int roomno ; char name [15]; int age ; char sex ; } Detail; #define size 4 Detail customer [size] ; void range(Detail c[ ]); void main() { ….. range(customer); …} void range (Detail c[ ]) { int i, minage=999, maxage=0; for(i=0;i<size;i++) if (c[i].age < minage) minage = c[i].age; if (c[i].age > maxage) maxage = c[i].age; } printf("age range = %d -%d\n",minage,maxage); created by Dararat Saeleee , 344-211 Algorithmic Process & Programming Demo struct2_2.c
Class Exercise เขียนโปรแกรมภาษาซีเพื่อพิมพ์รายงานผลการเรียน ดังนี้ 344-201 C programming 3 B+ 322-212 Basic Math 4 C 890-200 English 1 3 A GPA = 3.05 Status = Pass created by Dararat Saeleee , 344-211 Algorithmic Process & Programming