อาร์เรย์ (Array)

Download Report

Transcript อาร์เรย์ (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]
5
2
7
float[5][10]
6
7
2
การเข้ าถึงตัวแปรอาร์ เรย์
 รูปแบบการเข้าถึงตัวแปรอาร์เรย์ 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 i0 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 มิติ
 ใช้ลปู for 2 ชัน้ โดยลูปชัน้ นอกวนรอบตามจานวนแถว และลูปชัน้ ใน
วนรอบตามจานวนคอลัมน์
 ตัวอย่างเช่น ตัวการหาผลรวมของคะแนนเก็บ คะแนนสอบกลางภาค
คะแนนสอบปลายภาคของนักศึกษาแต่ละคน จานวน 5 คน
1. for i0 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];
}
}
for(i=0;i<5;i++)
{
for(j=0;j<3;j++)
printf(“%.2f\t”, score[i][j]);
printf(“\t%.2f\n”, stu[i]);
}
}
//การรับค่า
//การแสดงผลลัพธ์
การส่งผ่านอาร์ เรย์ไปยังฟั งก์ชนั
 ตัวอย่างการส่งค่าแต่ละอิลเิ มนต์ในอาร์เรย์ให้กบั ฟงั ก์ชนั
#include<stdio.h>
Output???
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)
}
การส่งผ่านอาร์ เรย์ไปยังฟั งก์ชนั
 ตัวอย่างการส่งค่าทุกอิลเิ มนต์ในอาร์เรย์ให้กบั ฟงั ก์ชนั
#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 ฟงั ก์ชนั
1. ทาการบวกกัน
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;
void print(struct history std)
{
printf ("\n\t ID :%d \n\t Name : %s \n\t
Faculty: %s",std.id,std.name,std.faculty);
}
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;
}
Struct1_2.c
created by Dararat Saeleee , 344-211 Algorithmic Process & Programming
19
การส่ งผ่ านข้ อมูลแบบ 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); …}
Demo struct2_2.c
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
20
Class Exercise
 เขียนโปรแกรมภาษาซีเพือ่ พิมพ์รายงานผลการเรียน ดังนี้
344-201 C programming
322-212 Basic Math
890-200 English 1
GPA = 3.05
3 B+
4 C
3 A
Status = Pass
created by Dararat Saeleee , 344-211 Algorithmic Process & Programming