Tr n Ph c Tu n
tranphuoctuan.khoatoan.dhsp@gmail.com http://baigiang.tranphuoctuan.com
M t s t nh ch t Khai báo m ng trong C Truy xu t các thành ph n Truy n tham s ki u m ng cho hàm
M t s thao tác c s
M ng nhi u chi u
Trang 2NH P MÔN L P TRÌNH 12/23/2009 3
M ng – M t s tính ch t
M ng là m t ki u d li u có c u trúc do ng i l p trình nh ngh a
Dùng bi u di n các i t ng d li u d ng m t dãy các thành ph n có cùng ki u v i nhau – ki u c s
NNLT C luôn ch nh m t kh i nh liên t c cho
m t bi n ki u m ng Kích th c c a m ng c xác nh ngay khi khai báo và không bao gi thay i
M ng – Khai báo trong C
typedef ki uc s Tênki u[S thànhph n];
ki u c a m i thành ph n h ng s , s thành ph n
t i a c a m ng
do l p trình viên t tên
typedef int AINT[100];
//AINT là ki u m ng bi u di n dãy g m 100 thành ph n int
AINT a; //a: bi n ki u AINT
Trang 3NH P MÔN L P TRÌNH 12/23/2009 5
M ng – Ví d
#define SIZE 10
int a[5]; // a dãy g m 5 s nguyên long int big[100]; // big: chi m 400 bytes! double d[100]; // d: chi m 800 bytes!
long double v[SIZE];// v:10 long doubles
long int big[100]; // big: chi m 400 bytes!
M ng – Ví d
int a[5] = { 10, 20, 30, 40, 50};
double d[100] = { 1.5, 2.7};
short primes[] = { 1, 2, 3, 5, 7, 11, 13};
long b[50] = { 0 };
const int c = 5;
int a[i];
double d[c];
short primes[];
kh i tr cho 5 thành ph n
2 thành ph n
u tiên c
kh i tr , ph n còn l i: 0
compiler xác nh kích th c g m 7 thành ph n cách nhanh nh t
kh i tr t c các thành ph n b ng 0
Trang 4NH P MÔN L P TRÌNH 12/23/2009 7
Các thành ph n c a m ng c truy xu t thông qua ch s
c a chúng 0 size-1 Thao tác truy xu t không ki m tra gi i h n c a ch s
int main() {
a[0] = 59;
a[5] = -10;
a[i/2] = 2;
a[6] = 0;
a[-1] = 5;
return 0;
}
int main() {
int a[6];
int i = 7;
a[0] = 59;
a[5] = -10;
a[i/2] = 2;
a[6] = 0;
a[-1] = 5;
return 0;
}
0 a
1 2 3 4 5
M ng – Truy xu t các ph n t
Truy n tham s M ng cho hàm
Tham s ki u m ng c truy n cho hàm chính là a ch
c a ph n t u tiên trên m ng
S thành ph n trong tham s m ng có th tr ng.
S thành ph n th c s c s d ng ph i truy n qua m t tham s khác (vd: size)
int add_elements(int a[], int size) {
int add_elements(int a[], int size) {
int add_elements(int *p, int size)
int add_elements(int *p, int size)
Trang 5NH P MÔN L P TRÌNH 12/23/2009 9
Ví d
#include <stdio.h>
void sum(long [], int);
3, 5, 7, 11 };
sum(primes, 6);
printf("%li\n", primes[0]);
return 0;
}
void sum(long a[], int sz) {
for(i = 0; i < sz; i++)
total += a[i];
a[0] = total;
}
#include <stdio.h>
void sum(long [], int);
int main(void) {
long primes[6] = { 1, 2,
3, 5, 7, 11 };
sum(primes, 6);
printf("%li\n", primes[0]);
return 0;
}
void sum(long a[], int sz) {
int i;
long total = 0;
for(i = 0; i < sz; i++)
total += a[i];
a[0] = total;
}
1 2 3 5 7 11 primes
a
sz 6
ng c l u vào
ph n t u tiên
dùng ki m tra
gi i h n ch
M t s thao tác c s
Nh p
Xu t Thêm m t th ành ph n d li u
Lo i b m t thành ph n d li u Tìm ki m
S p x p
Trang 6NH P MÔN L P TRÌNH 12/23/2009 11
M ng – Nh p d li u
void ReadData(int a[], int size)
{
int i;
for(i = 0; i < size; i++) {
printf(“Nhap thanh phan %d: ”, i); scanf(“%d”, &a[i]);
} }
void ReadData(int a[], int size)
{
int i;
for(i = 0; i < size; i++) {
printf(“Nhap thanh phan %d: ”, i); scanf(“%d”, &a[i]);
} }
duy t qua t t c các
ph n t
nh p d li u cho a[i]
M ng – Xu t d li u ra màn hình
void WriteData(int a[], int size) {
int i;
for(i = 0; i < size; i++)
printf(“%d ”, a[i]);
printf(“\n”);
}
{
int i;
for(i = 0; i < size; i++)
printf(“%d ”, a[i]);
printf(“\n”);
}
Trang 7NH P MÔN L P TRÌNH 12/23/2009 13
M ng – Nh p xu t d li u
#include <stdio.h>
{
int a[100], n;
clrscr();
printf(“Nhap so thanh phan cua day: “); scanf(“%d”, &n);
printf(“Nhap cac thanh phan cua day: “); ReadData(a, n);
printf(“Day vua nhap: \n“);
WriteData(a, n);
}
#include <stdio.h>
{
int a[100], n;
clrscr();
printf(“Nhap so thanh phan cua day: “); scanf(“%d”, &n);
printf(“Nhap cac thanh phan cua day: “); ReadData(a, n);
printf(“Day vua nhap: \n“);
WriteData(a, n);
}
M ng – Tìm v trí X trong dãy
//input: dãy (a, N), X
{
for (int i = 0; i < N; i ++)
if (a[i] == X)
return i;
return -1;
}
//input: dãy (a, N), X
{
for (int i = 0; i < N; i ++)
if (a[i] == X)
return i;
}
Bài toán: Tìm v trí X trên m ng a ang có N thành ph n.
Gi i pháp: Tìm tu n t
Trang 8NH P MÔN L P TRÌNH 12/23/2009 15
M ng – Thêm m t thành ph n d li u
Bài 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.
Hai tr ng h p c n xem xét:
Dãy ch a có th t Thêm X vào cu i a.
Dãy ã có th t Tìm v trí thích h p, chèn X vào
M ng – Thêm X vào cu i dãy
15
12
0
Thêm 15 vào (a, 7)
N = 7
a[N] = X;
N ++;
a[N] = X;
N ++; X
Trang 9NH P MÔN L P TRÌNH 12/23/2009 17
M ng – Chèn X vào dãy t ng d n
6
1
0
Chèn 6 vào (a, 7)
N = 7
X
trí thích h p: 4
pos
M ng – Chèn X vào dãy t ng d n
{
int pos;
for (pos = N; (pos>0)&&(a[pos-1]>X); pos )
a[pos] = a[pos – 1];
a[pos] = X;
N ++;
}
{
int pos;
a[pos] = X;
N ++;
}
Trang 10NH P MÔN L P TRÌNH 12/23/2009 19
M ng – Lo i b m t thành ph n d li u
Bài 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.
ng gi i 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 tr ng 2 tr ng h p:
Dãy không có th t : l p ph n t cu i lên Dãy ã th t : d i t t c các ph n t sau ví trí c a X lên tr c 1 v trí.
N = 8
M ng – Lo i b X ra kh i dãy t ng
12
0
Lo i 5 kh i (a, 8)
N = 7
pos
Tìm v trí c a 5
5 X
STOP
Ok, found
n các v trí 4, 5, 6, 7 lên
Trang 11NH P MÔN L P TRÌNH 12/23/2009 21
M ng – Lo i b X ra kh i dãy t ng i dãy t ng
//input: dãy (a, N), 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;
}
//input: dãy (a, N), X
{
int pos = Search(a, N, X);
return 0;
for (; (pos < N); pos ++)
a[pos] = a[pos + 1];
return 1;
}
M ng – S p x p
Bài 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: Tìm cách tri t tiêu t t c các ngh ch th
c a dãy Thu t toán s p x p i ch tr c ti p
Trang 12NH P MÔN L P TRÌNH 12/23/2009 23
M ng – S p x p i ch
12
1
i
j
1
1
1
i
j
2
M ng – S p x p i ch
Trang 13NH P MÔN L P TRÌNH 12/23/2009 25
1
1
i
j
4
M ng – S p x p i ch
1
1
i
j
5
M ng – S p x p i ch
Trang 14NH P MÔN L P TRÌNH 12/23/2009 27
1
1
M ng – S p x p i ch
M ng – S p x p i ch
void Swap(int &x, int &y) {
int t = x; x = y; y = t;
}
void InterchangeSort(int a[], int N) {
int i, j;
for (i = 0 ; i<N-1 ; i++)
for (j =i+1; j < N ; j++) if(a[j]< a[i])
void Swap(int &x, int &y) {
int t = x; x = y; y = t;
}
void InterchangeSort(int a[], int N) {
int i, j;
for (i = 0 ; i<N-1 ; i++)
for (j =i+1; j < N ; j++) if(a[j]< a[i])
Swap(a[i],a[j]);
Trang 15NH P MÔN L P TRÌNH 12/23/2009 29
M ng nhi u chi u
C không h tr m ng nhi u chi u Tuy nhiên có th ti p
c n theo 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.
float rainfall[12][365];
“rainfall” là m ng g m 12 thành ph n, m i thành ph n là
ng g m 365 s float
short exam_marks[500][10]; “exam_marks” là m ng g m
500 thành ph n, m i thành
ph n là m ng 10 s short
const int brighton = 7;
int day_of_year = 238;
rainfall[brighton][day_of_year] = 0.0F;
const int brighton = 7;
int day_of_year = 238;
rainfall[brighton][day_of_year] = 0.0F;
Khai báo m ng trong C Truy xu t các ph n t Truy n tham s ki u m ng cho hàm Các thao tác: nh p, xu t, thêm/h y 1 thành ph n,
t m ki m, s p x p
M ng nhi u chi u