Tải bản đầy đủ (.pdf) (22 trang)

kỹ thuật lập trình C chuyên nghiệp phần 3

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (627.24 KB, 22 trang )

Mảng – Tìm
Tì vịị trí
t í X trong
t
dãy

„
„

Bài tốn:
tốn: Tìm vị trí X trên mảng a đang có N thành phần
phần.
ầ .
Giải pháp:
pháp: Tìm tuần tự

//input: dãy (a, N), X
//output: Vị trí của X, -1 nếu khơng có
int
Search(int a[], int N, int X)
{
for (int i = 0; i < N; i ++)
if (a[i] == X)
return i;
return -1;
}


Mảng – Thêm
Thê một
ột thành


thà h phần
hầ dữ liệu
liệ
„
„

Bài toán:
toán: cần
ầ thêm thành phần
ầ dữ liệu X vào mảng a
đang có N thành phần.
phần.
Hai
H i trường
t ờ hợp
h cần
ầ xem xét:
xét
ét:
… Dãy chưa có thứ tự
Ỉ Thêm
Thê X vào
à cuối
ối a.
… Dãy đã có thứ tự
Ỉ Tìm vị trí thích hợp, chèn X vào


Mảng – Thêm
Thê X vào

à cuối
ối dãy

Thêm 15 vào (a, 7)
0

1

2

3

4

5

6

12

2

8

5

1

6


4

N=8
7

a[N] = X;
15
NX ++;

7


Mảng – Chèn
Chè X vào
à dãy
dã tăng
tă dần
dầ
Chèn 6 vào (a, 7)
0

1

2

3

4

5


6

1

2

4

5

8

12

15

N=8
7
X

6
Vị trí thích hợp: 4

pos
7


Mảng – Chèn
Chè X vào

à dãy
dã tăng
tă dầ
dần
//input: dãy (a, N) tăng dần, X
//output: dãy (a, N) đã có X ở đúng vị trí
void
Insert(int a[], int &N, int X)
{
int pos;
for (pos = N; (pos>0)&&(a[pos
(pos>0)&&(a[pos-1]>X); pos ---)
)
a[pos] = a[pos – 1];
a[pos] = X;
N ++;
}


Mảng – L
Loạii bỏ một
ột thành
thà h phần
hầ dữ liệ
liệu
„
„

Bài toán:
toán: loại bỏ thành phần dữ liệu X ra khỏi

mảng a đang có N thành phần.
phần.
Hướng giải quyết:
quyết: xác định vị trí của X, nếu tìm
thấy thì dồn các phần tử ở phía sau lên để lấp vào
chỗ
hỗ trống
trống.
ố . 2 trường
ờ hợp
h :
hợp:
… Dãy khơng có thứ tự
tự:: lấp phần tử cuối lên
… Dãy đã thứ tự
tự:: dời tất
ấ cả các phần
ầ tử ở sau ví
trí của X lên trước 1 vị trí
trí..


Mảng – L
Loạii bỏ X ra khỏi dãy
dã tăng

Loại 5 khỏi (a,
(a 8)
pos
0


1

2

3

4

5

6

7

1

2

4

5

7

8

8

9


STOP

N=7
8
X
Tìm vị trí của 5

5

Ok, found

Dồn các vị trí 4, 5, 6, 7 lên


Mảng – Loại
L i bỏ X ra khỏi dãy
dã tăng

//input: dãy (a, N), X
//output: dãy (a, N) đã loại bỏ 1 thành phần X
int
Remove(int a[], int &N, int X)
{
int pos = Search(a, N, X);
if (pos == -1) //khơng có X trong dãy
return 0;
N ---;
;
for (; (pos < N); pos ++)

a[pos] = a[pos + 1];
return 1;
}


Mảng – Sắp
Sắ xếp
ế
„
„

Bài toán:
toán: Sắp
ắ xếp
ế các thành phần
ầ của (a, N) đểể thu
được dãy tăng dần
Giải pháp
pháp:
há : Tìm
Tì cách
á h triệt
t iệt tiêu
tiê tất cảả các
á nghịch
hị h thế
của dãy
Ỉ Thuật tốn sắp xếp Đổi chổ trực tiếp



Mảng – Sắp xếp đổi chổ
1

j
2

3

4

5

6

7

8

12
1

2

8

5

1

6


4

15

i


Mảng – Sắp xếp đổi chổ
1

2

j
3

1

2
12

8

i

4

5

6


7

8

5

2

6

4

15


Mảng – Sắp xếp đổi chổ
1

2

3

j
4

1

2


12
4

8

i

5

6

7

8

5

6

4

15


Mảng – Sắp xếp đổi chổ
1

2

3


4

j
5

1

2

4

12
5

8

i

6

7

8

6

5

15



Mảng – Sắp xếp đổi chổ
1

2

3

4

5

6

7

8

1

2

4

5

6

8


12

15


Mảng – Sắp xếp đổi chổ
void Swap(int &x
&x, int &y)
{
int t = x; x = y; y = t;
}
void
id I
InterchangeSort(int
t
h
S t(i t a[],
[] int
i t N)
{
int i, j;
for (i = 0 ; ifor (j =i+1; j < N ; j++)
if(a[j]< a[i])
Swap(a[i],a[j]);
}


Mả

Mảng nhiều
hiề chiều
hiề
„

C không
khô hỗ trợ
t mảng
ả nhiều
hiề chiều.
chiều
hiề . Tuy
T nhiên
hiê cóó thể tiếp
tiế
cận theo hướng:
hướng: Mảng 2 chiều là mảng một chiều mà mỗi
thành phần của nó là một mảng một chiều
chiều..

float

short

rainfall[12][365];

exam marks[500][10];
exam_marks[500][10];

“rainfall” là mảng gồm 12

thành phần, mỗi thành phần là
mảng gồm
ồ 365 số
ố float
“exam_marks” là mảng gồm
500 thà
thành
h phần,
hầ mỗi
ỗi thành
thà h
phần là mảng 10 số short

const
t int
i t brighton
b i ht
= 7
7;
int day_of_year = 238;
rainfall[brighton][day_of_year] = 0.0F;


Mả
Mảng nhiều
hiề chiều
hiề
„

Khai báo mảng 2 chiều:

chiều:
type name[row_size
name[row_size][
][column_size
column_size];
];

SumSquares

0
„
„
„
„
„
„

0
1
1

4

1
2
1

4
5
2


int SumSquares
SumSquares[[2][
][33] = { {0,1,4}, {1,2,5} };
int SumSquares
SumSquares[[2][
][33] = { 0,1,4,1,2,5 };
int SumSquares
SumSquares[[2][
][33] = { {0,1,4} };
int SumSquares
SumSquares[[ ][
][33] = { {0,1,4}, {1,2,5} };
int SumSquares
SumSquares[[ ][
][3
3] = { {0,1, }, {1} };
int SumSquares
SumSquares[[ ][
][33];

5


Nhậ Mảng
Nhập
Mả 2 chiều
hiề
2.


#define MAX_STUDENT
MAX STUDENT 5
#define MAX_SUBJECT 6

3.

int StudentScore
StudentScore[MAX_STUDENT][MAX_SUBJECT];
[MAX_STUDENT][MAX_SUBJECT];

4.

void
id read_Score
read_Score(
d S
(int
i Score[MAX_STUDENT][MAX_SUBJECT],
S
[MAX STUDENT][MAX SUBJECT]
int nStudents
nStudents,, int nSubjects
nSubjects))
{
int i,j
i,j;;
for(ii=0; ifor(
nStudents; i++)
for(j=0; j<

jnSubjects;; j++)
scanf(“%d”,
scanf
(“%d”, &Score[
&Score[ii][j]);
}

1
1.

5.
6.
7.
8.
9.
10
10.



Hàm truy
t
cập,
ậ iin Mảng
Mả 2 chiều
hiề
1
1.
2.

3.
4.
5.
6.
7
7.
8.
9.
10.

void print_Score(
print Score(
print_Score
Score(int Score[MAX_STUDENT][MAX_SUBJECT],
Score[MAX STUDENT][MAX SUBJECT]
int nStudents
nStudents,, int nSubjects
nSubjects))
{
int i,j
i,j;;
for(ii=0; ifor(
nStudents; i++)
{
for(j=0; j<
jnSubjects;; j++)
printf(“%2d
printf(

printf
(“%2d\
( %2d\
%2d\tt”, &Score[i
&Score[i][j]);
printf(“
printf
(“\\n”);
}
}


Ch
Chương
ttrình
ì h
1
1.
2.
3.
4.
5.
6.
7
7.
8.
9.

main(void)
{

int nStudents
nStudents,, nScores
nScores;;
scanf(“%d
scanf
(“%d %d”, &
&nStudents
nStudents,, &
&nScores
nScores);
);
if(nStudents
if(
nStudents <= MAX_STUDENT &&
nScores
S
<= MAX_SCORES)
MAX SCORES)
read_Score((StudentScore
read_Score
StudentScore,, nStudents,
nStudents, nScores);
nScores);
print_Score
print Score (StudentScore
StudentScore,, nStudents
nStudents,, nScores
nScores);
);
return 0;

}


Biểu diễn mảng 2 chiều
StudentScores

0

1

Student1

0

1

4

?

?

?

Student2

1

2


5

?

?

?

Student3

?

?

?

?

?

?

Student4

?

?

?


?

?

?

Student5

?

?

?

?

?

?

4

?

Student1

?

?


1

2

5

?

Student2

?

?


Con tr
trỏỏ - Pointer

Phạm Thế Bảo
Trường Đại học Khoa học Tự nhiên Tp.HCM
Tp HCM



×