แถวลำดับ (Array) 1 มิติ

Download Report

Transcript แถวลำดับ (Array) 1 มิติ

แถวลำดับ (Array) 1 มิติ
แถวลำดับ (Array)
•
•
•
•
เป็ นกลุ่มตัวแปรที่อยูใ่ นหน่วยควำมจำมีลำดับต่อเนื่องกัน
มีชื่อเดียวกัน
เก็บข้อมูลชนิดเดียวกัน
มีเลขดัชนีแยกตัวแปรแต่ละตัว
กำรประกำศ
• รู ปแบบ
type array_name[n];
เช่น
int arr_num[5];
arr_num เป็ นตัวแปรแถวลำดับชนิด int
มีสมำชิก 5 ตัว
float gpa[10];
arr_num เป็ นตัวแปรแถวลำดับชนิด
float มีสมำชิก 10 ตัว
char arr_char[12]; arr_num เป็ นตัวแปรแถวลำดับชนิด
char มีสมำชิก 12 ตัว
กลไกกำรทำงำน
• เมื่อมีกำรประกำศตัวแปรแถวลำดับ เช่น
int arr_num[n];
หน่วยควำมจำจะถูกจองไว้จำนวน n บล็อก แต่ละบล็อก มีชื่อ
arr_num เหมือนกัน มีเลขดัชนีเรี ยงกันตั้งแต่ 0 – (n-1)
กลไกกำรทำงำน
พื้นที่หน่วยควำมจำที่จองไว้
int arr_num[5];
arr_num
ชื่อตัวแปรแถวลำดับเป็ น
pointer ชี้ไปยัง
หน่วยควำมจำที่ใช้เก็บข้อมูล
arr_num[0]
arr_num[1]
arr_num[2]
arr_num[3]
arr_num[4]
แถวลำดับแต่ละตัวมี
เลขดัชนีต่ำงกัน ตัวแรก
เป็ น 0 ตัวสุ ดท้ำย n
–1
กลไกกำรทำงำน
float gpa[10];
gpa
แต่ละช่อง เก็บข้อมูล
ชนิด float
gpa[0]
gpa[1]
gpa[2]
gpa[3]
gpa[4]
gpa[5]
gpa[6]
gpa[7]
gpa[8]
gpa[9]
กลไกกำรทำงำน
แต่ละช่องเก็บข้อมูล
ชนิด char
arr_chr[0]
char arr_chr[12];
arr_chr[1]
arr_chr[2]
arr_chr
arr_chr[3]
arr_chr[4]
arr_chr[5]
arr_chr[6]
arr_chr[7]
arr_chr[8]
arr_chr[9]
arr_chr[10]
arr_chr[11]
กำรกำหนดค่ำทีละตัว
int
int arr_num[5];
arr_num[0] = 2;
arr_num[1] = 4;
arr_num[2] = 6;
arr_num[3] = 8;
arr_num[4] = 10;
ให้ระบุดชั นี ขณะกำหนดค่ำ
2 arr_num[0]
4 arr_num[1]
6 arr_num[2]
8 arr_num[3]
10 arr_num[4]
กำรกำหนดค่ำทีละตัว
ให้ระบุดชั นี ขณะกำหนดค่ำ
float gpa[10];
gpa[0] = 3.00;
gpa[1] = 4.00;
gpa[2] = 2.50;
gpa[3] = 1.80;
gpa[4] = 2.24;
gpa[5] = 3.00;
gpa[6] = 4.00;
gpa[7] = 2.50;
gpa[8] = 1.80;
gpa[9] = 2.24;
float
3.00 gpa[0]
4.00 gpa[1]
2.50 gpa[2]
1.80 gpa[3]
2.24 gpa[4]
3.00 gpa[5]
4.00 gpa[6]
2.50 gpa[7]
1.80 gpa[8]
2.24 gpa[9]
กำรกำหนดค่ำทีละตัว
char ch_arr[8];
ch_arr[0] = ‘A’;
ch_arr[1] = ‘B’;
ch_arr[2] = ‘p’;
ch_arr[3] = ‘z’;
ch_arr[4] = ‘5’;
ch_arr[5] = ‘@’;
ch_arr[6] = ‘#’;
ch_arr[7] = ‘?’;
ให้ระบุดชั นี ขณะกำหนดค่ำ
A
char
ch_arr[0]
ch_arr[1]
p ch_arr[2]
z ch_arr[3]
5 ch_arr[4]
@ ch_arr[5]
# ch_arr[6]
? ch_arr[7]
B
กำรประกำศพร้อมกำรกำหนดค่ำ
int a[] = {2,4,6,7,8};
2
4
6
7
8
a[0] a[1] a[2] a[4] a[4]
หน่วยควำมจำ
กำรประกำศพร้อมกำรกำหนดค่ำ
double d[] = {2.5,4.3,6.1,7.23,8.11,2.44};
2.5 4.3 6.1 7.23 8.11 2.44
หน่วยควำมจำ
d[0] d[1] d[2] d[3] d[4] d[5]
กำรประกำศพร้อมกำรกำหนดค่ำ
char ch_arr[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’};
H
e
l
l
o
ch_arr[0] ch_arr[1] ch_arr[2] ch_arr[3] ch_arr[4]
หน่วยควำมจำ
กำรเข้ำถึงข้อมูล
• กำรเข้ำถึงข้อมูลในแถวลำดับ ต้องระบุเลขดัชนี เช่น
int a[] = {1, 3, 5, 7, 9};
ผลลัพธ์
int b = a[0];
int c = a[1];
printf(“%d\n”, a[3]);
printf(“%d\n”, a[4]);
b = 1;
c = 3;
พิมพ์ 7
พิมพ์ 9
กำรเข้ำถึงข้อมูล
• กำรเข้ำถึงข้อมูลในแถวลำดับ ต้องระบุเลขดัชนี เช่น
char a[] = {‘a’, ‘b’, ‘c’, ‘d’};
char b = a[0];
char c = a[1];
printf(“%c\n”, a[3]);
printf(“%d\n”, a[1]);
ผลลัพธ์
b = ‘a’;
c = ‘b’;
พิมพ์ d
พิมพ์ 97
กำรเข้ำถึงข้อมูล
• กำรเข้ำถึงข้อมูลในแถวลำดับ ต้องระบุเลขดัชนี เช่น
double a[] = {2.4, 3.1, 5.8, 7.6, 9.5};
int b = a[0];
double c = a[1];
printf(“%lf\n”, a[2]);
printf(“%lf\n”, a[4]);
error !!!
c = 3.1;
พิมพ์ 5.8
พิมพ์ 9.5
ผลลัพธ์คืออะไร
p = 10
int a[] = {1, 3, 5, 7, 9, 11};
int p = a[1]+a[3];
int q = a[2]+a[4];
int r = p+q;
printf(“p = %d\n”, p);
printf(“q = %d\n”, q);
printf(“r = %d\n”, r);
q = 14
r = 24
ผลลัพธ์คืออะไร
3
int a[] = {1, 3, 5, 7, 9, 11};
a[0] = a[1];
a[1] = a[2] + a[4];
a[2] = a[1]*2;
printf(“%d\n”, a[0]);
printf(“%d\n”, a[1]);
printf(“%d\n”, a[2]);
14
28
ผลลัพธ์คืออะไร
รหัส ASCII ของ A = 65, B = 66
C = 67, D = 68, E = 69, F = 70
char a[] = {‘A’, ‘B’, ‘C’};
int p = a[1];
char q = a[0]+2;
a[2] = a[0]+3;
printf(“%c %d\n”, p, p);
printf(“%d\n”, q);
printf(“%c\n”, a[0]+5);
B 66
67
F
ผลลัพธ์คืออะไร
1.5
float a[] = {1.5, 3.2, 5.3, 7.4};
float p = a[1];
a[1] = a[2];
a[2] = p;
printf(“%d\n”, a[1]);
printf(“%d\n”, a[2]);
a[0]
3.2
5.3 a[1]
p
3.2
5.3
3.2
a[2]
7.4
a[3]
5.3
3.2
กำร swap ข้อมูลของ
แถวลำดับ
String
• แถวลำดับชนิด char ที่มี null character ปิ ดท้ำย
• กำรประกำศและกำหนดค่ำ
char str1[] = “Hello”;
char str2[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’};
str1
//แบบที่ 1
//แบบที่ 2
str1[0]
str1[1]
str1[2]
str1[3]
str1[4]
str1[5]
H
e
l
l
o
\0
เหมือนกัน
str2
str2[0]
str2[1]
str2[2]
str2[3]
str2[4]
str2[5]
H
e
l
l
o
\0
String
• ถ้ำประกำศแถวลำดับให้มีจำนวนสมำชิกมำกกว่ำข้อมูลที่จดั เก็บ
char str[10] = “Korat”;
str[0] str[1] str[2] str[3] str[4] str[5] str[6] str[7] str[8] str[9]
K
o
r
a
t
\0
?
?
?
?
printf(“%s\n”, str);
ภำษำซี จะมองไม่เห็นข้อมูล
Korat
ที่อยูถ่ ดั จำก null character
String
• ถ้ำประกำศแถวลำดับให้มีจำนวนสมำชิกน้อยกว่ำข้อมูลที่จดั เก็บ
char str[4] = “Korat City”;
str[0] str[1] str[2] str[3]
K
o
r
a
t
C
i
t
y
printf(“%s\n”, str);
ข้อมูลที่เกิน จะล้ ำออกไปเก็บในหน่วย
Korat%4@#$%^&
ควำมจำนอกตัวแปร เมื่อพิมพ์ขอ้ มูล
อำจเป็ นข้อมูลขยะที่คำดเดำไม่ได้
String
• กำรประกำศแถวลำดับโดยไม่ระบุจำนวนสมำชิก แถวลำดับจะถูกสร้ำงให้มีขนำด
พอดี เก็บข้อมูลได้ครบทุกตัว รวมทั้ง null character ที่ปิดท้ำย
char str[] = “Sawasdee”;
str[0] str[1] str[2] str[3] str[4] str[5] str[6] str[7] str[8]
S
a
w
a
str มีขนำดกี่ไบต์ ?
s
d
9
e
e
\0
String
• กำรประกำศแบบ pointer
char * str = “Sawasdee”;
ผลลัพธ์จะเหมือนกำรประกำศด้วยคำสั่ง
char str[] = “Sawasdee”;
str[0] str[1] str[2] str[3] str[4] str[5] str[6] str[7] str[8]
str
S
a
w
a
s
d
e
e
\0
ฟังก์ชนั นับจำนวนสมำชิกแถวลำดับ
• ฟังก์ชนั sizeof(ตัวแปรแถวลำดับ)
• ส่ งค่ำกลับเป็ นจำนวนสมำชิกของแถวลำดับ
#include <stdio.h>
void main() {
elements of a = 6
elements of ch = 4
int a[] = {2,3,4,5,6,7};
char ch[] = {‘2’, ‘A’, ‘$’, ‘#’};
printf(“elements of a = %d\n”, sizeof(a));
printf(“elements of ch = %d\n”, sizeof(ch));
}
ตัวอย่ำงกำรพิมพ์ขอ้ มูลในแถวลำดับ
#include <stdio.h>
1
3
5
7
9
void main() {
int num[] = {1, 3, 5, 7, 9};
int i;
5
for (i = 0; i < sizeof(num); i++)
printf(“%d ”, num[i]);
printf(“\n”);
}
ตัวอย่ำงกำรพิมพ์ขอ้ มูลในแถวลำดับ
#include <stdio.h>
9
7
5
3
1
void main() {
int num[] = {1, 3, 5, 7, 9};
int i;
4
for (i = sizeof(num)-1; i >= 0; i--)
printf(“%d ”, num[i]);
printf(“\n”);
}
ตัวอย่ำงกำรพิมพ์ขอ้ มูลในแถวลำดับ
#include <stdio.h>
a
void main() {
char str[] = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’};
int i;
5
for (i = 0; i < sizeof(str); i++)
printf(“%c ”, str[i]);
printf(“\n”);
}
e i o u
ตัวอย่ำงกำรพิมพ์ขอ้ มูลในแถวลำดับ
#include <stdio.h>
u
o
void main() {
char str[] = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’};
int i;
4
for (i = sizeof(str)-1; i >= 0; i--)
printf(“%c ”, str[i]);
printf(“\n”);
}
i e a
ฟังก์ชนั นับจำนวนตัวอักษรของ String
• ฟังก์ชนั strlen(ตัวแปร String)
• ส่ งค่ำกลับเป็ นจำนวนตัวอักษร ไม่รวม null character ปิ ดท้ำย
• ต้อง include string.h
ตัวอย่ำง
#include <stdio.h>
The length of str1 = 26
The length of str2 = 10
#include <string.h>
void main() {
char str1[] = “abcdefghijklmnopqrstuvwxyz”;
char *str2 = “Korat City”;
printf(“The length of str1 = %d\n”, strlen(str1));
printf(“The length of str2 = %d\n”, strlen(str2));
}
นับเว้นวรรคด้วย
เรำสำมำรถพิมพ์ขอ้ มูลของ string ทีละตัวในแบบ
เดียวกับแถวลำดับ
#include <stdio.h>
#include <string.h>
void main() {
int i;
char str1[] = “HELLO”;
5
for (i = 0; i < strlen(str1); i++)
printf(“%c”, str1[i]);
}
HELLO
ตัวอย่ำงกำรเปลี่ยนเป็ นตัวพิมพ์เล็ก
#include <stdio.h>
#include <string.h>
void main() {
int i;
char str1[] = “HELLO”;
5
for (i = 0; i < strlen(str1); i++)
printf(“%c”, str1[i] + 32);
}
hello
วิธีน้ ีใช้ได้เฉพำะข้อมูลเดิมเป็ นตัวพิมพ์ใหญ่เท่ำนั้น
ตัวอย่ำงกำรเปลี่ยนเป็ นตัวพิมพ์ใหญ่
#include <stdio.h>
#include <string.h>
void main() {
int i;
char str1[] = “hello”;
for (i = 0; i < strlen(str1); i++)
printf(“%c”, str1[i] -32);
}
HELLO
วิธีน้ ีใช้ได้เฉพำะข้อมูลเดิมเป็ นตัวพิมพ์เล็กเท่ำนั้น
พิมพ์จำกหน้ำไปหลัง และพิมพ์จำกหลังไปหน้ำ
#include <stdio.h>
Hello
#include <string.h>
olleH
void main() {
int i;
char str1[] = “Hello”;
for (i = 0; i < strlen(str1); i++)
printf(“%c”, str1[i]);
printf(“\n”);
for (i = strlen(str1)-1; i >= 0; i--)
printf(“%c”, str1[i]);
}
ตัวอย่ำงกำรหำผลบวกและค่ำเฉลี่ยของแถวลำดับ
#include <stdio.h>
float num[10], total;
int i;
void main() {
for (i = 0; i < 10; i++) {
input ข้อมูลเก็บในตัวแปร
printf(“Enter number : ”);
แถวลำดับ num
scanf(“%f”, &num[i]);
}
บวกข้อมูลจำกแถวลำดับ num
for (i = 0; i < 10; i++)
total += num[i];
เก็บค่ำใน total
printf(“\nAverage = %f”, total/10);
}
ตัวอย่ำงกำรทำงำน
#include <stdio.h>
float num[10], total;
int i;
void main() {
for (i = 0; i < 10; i++) {
printf(“Enter number : ”);
scanf(“%f”, &num[i]);
}
for (i = 0; i < 10; i++)
total += num[i];
printf(“\nTotal = %f”, total);
printf(“\nAverage = %f”, total/10.0);
}
Enter number :
2
Enter number :
4
Enter number :
6
Enter number :
8
Enter number : 10
Enter number : 12
Enter number : 14
Enter number : 16
Enter number : 18
Enter number :
Total = 110
Average = 11.0
20
กำรหำค่ำมำกสุ ด
• เก็บข้อมูลแถวลำดับตัวที่ 0 ในตัวแปร max
• ทำซ้ ำจนกว่ำจะหมดข้อมูลดังนี้
– ถ้ำข้อมูลใน max น้อยกว่ำข้อมูลในแถวลำดับตัวที่ 1 ถึง n-1
• ให้นำข้อมูลในแถวลำดับมำเก็บใน max
num[0] num[1] num[2] num[3] num[4] num[5] num[6]
10
3
15
7
10
15
max
4
2
11
กำรหำค่ำมำกสุ ด
#include <stdio.h>
void main() {
int num[] = {10, 3, 15, 7, 4, 2, 11};
int i, max;
7
max = num[0];
for (i = 1; i < sizeof(num); i++) {
if (max < num[i])
max = num[i];
}
printf(“maximum = %d\n”, max);
}
num[0] num[1] num[2] num[3] num[4] num[5] num[6]
10
3
15
7
10
15
4
max
2
11