Khoa công nghệ thông tin bài giảng LẬp trình cơ BẢn biên soạn


Bài 6 - MẢNG, CON TRỎ VÀ XÂU KÝ TỰ



tải về 1.56 Mb.
trang11/29
Chuyển đổi dữ liệu30.08.2016
Kích1.56 Mb.
#28834
1   ...   7   8   9   10   11   12   13   14   ...   29

Bài 6 - MẢNG, CON TRỎ VÀ XÂU KÝ TỰ


Nội dung bài học

I. Mảng

1. Mảng trong C

2. Mảng một chiều

3. Mảng nhiều chiều

II. Con trỏ

1. Khai báo và sử dụng biến con trỏ

2. Con trỏ và mảng

3. Con trỏ và tham số hình thức của hàm

III. Xâu ký tự

1. Khai báo

2. Các thao tác trên chuỗi ký tự

IV. Tóm tắt nội dung bài học

I. Mảng

1. Mảng trong C


Mảng là một tập hợp các phần tử cố định có cùng một kiểu, gọi là kiểu phần tử. Kiểu phần tử có thể là: ký tự, số, chuỗi ký tự;

Ta có thể chia mảng làm 2 loại: mảng 1 chiều và mảng nhiều chiều.


2. Mảng một chiều


Mảng 1 chiều là một dãy các phần tử có cùng tên gọi, có 1 chỉ số để chỉ thứ tự của phần tử đó trong dãy. Mảng một chiều còn có thể hiểu như một Vector.

Khai báo mảng với số phần tử xác định (khai báo tường minh)

Cú pháp:

[n]

Trong đó:



  • Tên mảng: đây là một cái tên đặt đúng theo quy tắc đặt tên của danh biểu;

  • n: là một hằng số nguyên, cho biết số lượng phần tử tối đa trong mảng là bao nhiêu (hay nói khác đi kích thước của mảng là gì);

  • Kiểu: mỗi phần tử của mảng có dữ liệu thuộc kiểu gì;

  • Ở đây, ta khai báo một biến mảng gồm có n phần tử, phần tử thứ nhất là tên mảng [0], phần tử cuối cùng là tên mảng[n -1];

Ví dụ:

int a[10];

/* Khai báo biến mảng tên a, phần tử thứ nhất là a[0], phần tử cuối cùng là a[9].*/

Ta có thể coi mảng a là một dãy liên tiếp các phần tử trong bộ nhớ như sau:



Vị trí

0

1

2

3

4

5

6

7

8

9

Tên phần tử

a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]

a[7]

a[8]

a[9]

Hình 1: Hình ảnh mảng a trong bộ nhớ

Khai báo mảng với số phần tử không xác định (khai báo không tường minh)

Cú pháp:

<[]>

Khi khai báo, không cho biết rõ số phần tử của mảng, kiểu khai báo này thường được áp dụng trong các trường hợp: vừa khai báo vừa gán giá trị, khai báo mảng là tham số hình thức của hàm.



Vừa khai báo vừa gán giá trị

Cú pháp:

[]= {Các giá trị cách nhau bởi dấu phẩy}

Nếu vừa khai báo vừa gán giá trị thì mặc nhiên C sẽ hiểu số phần tử của mảng là số giá trị mà chúng ta gán cho mảng trong cặp dấu {}. Chúng ta có thể sử dụng hàm sizeof() để lấy số phần tử của mảng như sau:

Số phần tử=sizeof(tên mảng)/ sizeof(kiểu)

Truy xuất từng phần tử của mảng

Mỗi phần tử của mảng được truy xuất thông qua Tên biến mảng theo sau là chỉ số nằm trong cặp dấu ngoặc vuông [ ]. Chẳng hạn a[0] là phần tử đầu tiên của mảng a được khai báo ở trên. Chỉ số của phần tử mảng là một biểu thức mà giá trị là kiểu số nguyên.



Ví dụ 1:

int a[10];

Trong khai báo này, việc truy xuất các phần tử được chỉ ra trong hình 1. Chẳng hạn phần tử thứ 2 (có vị trí 1) là a[1]…

Ví dụ 2: Vừa khai báo vừa gán trị cho 1 mảng 1 chiều các số nguyên. In mảng số nguyên này lên màn hình.

#include

#include

int main()

{

int n,i,j,tam;



int dayso[]={66,65,69,68,67,70};

n=sizeof(dayso)/sizeof(int); /*Lay so phan tu*/

printf("\n Noi dung cua mang ");

for (i=0;i

printf("%d ",dayso[i]);

getch();


return 0;

}

Ví dụ 3: Đổi một số nguyên dương thập phân thành số nhị phân. Việc chuyển đổi này được thực hiện bằng cách lấy số đó chia liên tiếp cho 2 cho tới khi bằng 0 và lấy các số dư theo chiều ngược lại để tạo thành số nhị phân. Ta sẽ dùng mảng một chiều để lưu lại các số dư đó.

#include

#include

int main()

{

unsigned int N;



unsigned int Du;

unsigned int NhiPhan[20],K=0;

int i;

printf("Nhap vao so nguyen N= ");scanf("%d",&N);

do

{

Du=N % 2;



NhiPhan[K]=Du;

K++;


N = N/2;

} while(N>0);

printf("Dang nhi phan la: ");

for(i=K-1;i>=0;i--)

printf("%d",NhiPhan[i]);

getch();

return 0;

}

Ví dụ 4: Nhập vào một dãy n số và sắp xếp các số theo thứ tự tăng. Có rất nhiều giải thuật sắp xếp. Một trong số đó được mô tả như sau: Đầu tiên đưa phần tử thứ nhất so sánh với các phần tử còn lại, nếu nó lớn hơn một phần tử đang so sánh thì đổi chỗ hai phần tử cho nhau rồi tiếp tục so sánh. Sau đó tiếp tục so sánh phần tử thứ hai với các phần tử từ thứ ba trở đi ... cứ tiếp tục như vậy cho đến phần tử thứ n-1.



#include

#include

int main()

{

int b[20], N, i,j,t;

/* 1. Nhap so phan tu cua mang*/

printf("So phan tu thuc te cua mang N= ");

scanf("%d",&N);

/* 2. Nhap gia tri cac pha tu cua mang*/

for(i=0; i< N; i++)

{

printf("Phan tu thu %d: ",i);scanf("%d",&b[i]);

}
/* 3. Sap xep giam dan*/

for(i=0;i

{

for(int j=i+1;j

{

if (b[i]>b[j])

{

t=b[i];

b[i]=b[j];

b[j]=t;

}

}

}

/* 4. In ket qua sau khi sap xep*/

printf("Mang SAU khi sap xep: ");

for (i=0; i

printf("%d ",b[i]);
getch();

return 0;

}

Phiên bản khác của chương trình sử dụng hàm (sẽ học ở bài sau) : viết các hàm Nhap (Nhập các số), SapXep (Sắp xếp) và InMang (In các số); các tham số hình thức của các hàm này là 1 mảng không chỉ định rõ số phần tử tối đa, nhưng ta cần có thêm số phần tử thực tế được sử dụng của mảng là bao nhiêu, đây là một giá trị nguyên.

#include

#include

void Nhap(int a[],int N)

{

int i;



for(i=0; i< N; i++)

{


printf("Phan tu thu %d: ",i);scanf("%d",&a[i]);

}


}

void InMang(int a[], int N)

{

int i;


for (i=0; i

printf("%d ",a[i]);

printf("\n");

}

void SapXep(int a[], int N)



{

int t,i;

for(i=0;i

for(int j=i+1;j

if (a[i]>a[j])

{

t=a[i];



a[i]=a[j];

a[j]=t;


}

}

int main()



{

int b[20], N;

printf("So phan tu thuc te cua mang N= ");

scanf("%d",&N);

Nhap(b,N);

printf("Mang vua nhap: ");

InMang(b,N);

SapXep(b,N); /* G?i hàm s?p x?p*/

printf("Mang sau khi sap xep: ");

InMang(b,N);

getch();

return 0;

}

3. Mảng nhiều chiều


Mảng nhiều chiều là mảng có từ 2 chiều trở lên. Người ta thường sử dụng mảng nhiều chiều để lưu các ma trận, các tọa độ 2 chiều, 3 chiều…

Khai báo mảng 2 chiều tường minh

Cú pháp:

<[Số phần tử chiều 1]><[Số phần tử chiều 2]>

Ví dụ: Người ta cần lưu trữ thông tin của một ma trận gồm các số thực. Lúc này ta có thể khai báo một mảng 2 chiều như sau:

float m[8][9]; /* Khai báo mảng 2 chiều có 8*9 phần tử là số thực*/



Trong trường hợp này, ta đã khai báo cho một ma trận có tối đa là 8 dòng, mỗi dòng có tối đa là 9 cột. Hình ảnh của ma trận này được cho trong hình 2:

Dòng\Cột

0

1

2

3

4

5

6

7

8

0

m[0][0]

m[0][1]

m[0][2]

m[0][3]

m[0][4]

M[0][5]

m[0][6]

m[0][7]

m[0][8]

1

m[1][0]

m[1][1]

m[1][2]

m[1][3]

m[1][4]

M[1][5]

m[1][6]

m[1][7]

m[1][8]

2

m[2][0]

m[2][1]

m[2][2]

m[2][3]

m[2][4]

M[2][5]

m[2][6]

m[2][7]

m[2][8]

3

m[3][0]

m[3][1]

m[3][2]

m[3][3]

m[3][4]

m[3][5]

m[3][6]

m[3][7]

m[3][8]

4

m[4][0]

m[4][1]

m[4][2]

m[4][3]

m[4][4]

m[4][5]

m[4][6]

m[4][7]

m[4][8]

5

m[5][0]

m[5][1]

m[5][2]

m[5][3]

m[5][4]

m[5][5]

m[5][6]

m[5][7]

m[5][8]

6

m[6][0]

m[6][1]

m[6][2]

m[6][3]

m[6][4]

m[6][5]

m[6][6]

m[6][7]

m[6][8]

7

m[7][0]

m[7][1]

m[7][2]

m[7][3]

m[7][4]

m[7][5]

m[7][6]

m[7][7]

m[7][8]

Hình 2: Ma trận được mô tả là 1 mảng 2 chiều

Khai báo mảng 2 chiều không tường minh

Để khai báo mảng 2 chiều không tường minh, ta vẫn phải chỉ ra số phần tử của chiều thứ hai (chiều cuối cùng).



Cú pháp:

<[]><[Số phần tử chiều 2]>

Cách khai báo này cũng được áp dụng trong trường hợp vừa khai báo, vừa gán trị hay đặt mảng 2 chiều là tham số hình thức của hàm.



Truy xuất từng phần tử của mảng 2 chiều

Ta có thể truy xuất một phần tử của mảng hai chiều bằng cách viết ra tên mảng theo sau là hai chỉ số đặt trong hai cặp dấu ngoặc vuông. Chẳng hạn ta viết m[2][3].

Với cách truy xuất theo cách này, Tên mảng[Chỉ số 1][Chỉ số 2] có thể coi là 1 biến có kiểu được chỉ ra trong khai báo biến mảng.

Ví dụ 1: Viết chương trình cho phép nhập 2 ma trận a, b có m dòng n cột, thực hiện phép toán cộng hai ma trận a,b và in ma trận kết quả lên màn hình. Trong ví dụ này, ta sẽ sử dụng hàm để làm ngắn gọn hơn chương trình của ta. Ta sẽ viết các hàm: nhập 1 ma trận từ bàn phím, hiển thị ma trận lên màn hình, cộng 2 ma trận.

#include

#include

void Nhap(int a[][10],int M,int N)

{

int i,j;



for(i=0;i

for(j=0; j

{

printf("Phan tu o dong %d cot %d: ",i,j);



scanf("%d",&a[i][j]);

}

}



void InMaTran(int a[][10], int M, int N)

{

int i,j;



for(i=0;i

{


for(j=0; j< N; j++)

printf("%d ",a[i][j]);

printf("\n");

}

}



/* Cong 2 ma tran A & B ket qua la ma tran C*/

void CongMaTran(int a[][10],int b[][10],int M,int N,int c[][10])

{

int i,j;



for(i=0;i

for(j=0; j

c[i][j]=a[i][j]+b[i][j];

}

int main()



{

int a[10][10], b[10][10], M, N;

int c[10][10];/* Ma tran tong*/

printf("So dong M= "); scanf("%d",&M);

printf("So cot M= "); scanf("%d",&N);

printf("Nhap ma tran A\n");

Nhap(a,M,N);

printf("Nhap ma tran B\n");

Nhap(b,M,N);

printf("Ma tran A: \n");

InMaTran(a,M,N);

printf("Ma tran B: \n");

InMaTran(b,M,N);

CongMaTran(a,b,M,N,c);

printf("Ma tran tong C:\n");

InMaTran(c,M,N);

getch();

return 0;

}

Ví dụ 2: Nhập vào một ma trận 2 chiều gồm các số thực, in ra tổng của các phần tử trên đường chéo chính của ma trận này. Ta nhận thấy rằng giả sử ma trận a có M dòng, N cột thì các phần tử của đường chéo chính là các phần tử có dạng: a[i][i] với i  [0…min(M,N)-1].

#include

#include

int main()

{

float a[10][10], T=0;



int M, N, i,j, Min;

printf("Ma tran co bao nhieu dong? ");scanf("%d",&M);

printf("Ma tran co bao nhieu cot? ");scanf("%d",&N);

for(i=0;i

for(j=0; j

{

printf("Phan tu o dong %d cot %d: ",i,j);



scanf("%f",&a[i][j]);

}

printf("Ma tran vua nhap: \n");



for(i=0;i

{

for(j=0; j< N; j++)



printf("%.2f ",a[i][j]);

printf("\n");

}

Min =(M>N) ? N: M; /* Tìm giá tr? nh? nh?t c?a M & N*/



for(i=0;i

T=T+a[i][i];

printf("Tong cac phan tu o duong cheo chinh la: %f",T);

getch();

return 0;

}


Каталог: files -> FileMonHoc
FileMonHoc -> NGÂn hàng câu hỏi lập trình cơ BẢn nhóm câu hỏI 2 ĐIỂM
FileMonHoc -> CHƯƠng 2 giới thiệu về LÝ thuyết số
FileMonHoc -> CÁc hệ MẬt khoá CÔng khai kháC
FileMonHoc -> BỘ MÔn duyệt chủ nhiệm Bộ môn
FileMonHoc -> Khoa công nghệ thông tin cộng hòa xã HỘi chủ nghĩa việt nam
FileMonHoc -> Chủ nhiệm Bộ môn Ngô Thành Long ĐỀ CƯƠng chi tiết bài giảNG
FileMonHoc -> Chủ nhiệm Bộ môn Phan Nguyên Hải ĐỀ CƯƠng chi tiết bài giảNG
FileMonHoc -> Khoa: CÔng nghệ thông tin cộng hòa xã HỘi chủ nghĩa việt nam
FileMonHoc -> MẬt mã khóA ĐỐi xứng lý thuyết cơ bản của Shannon
FileMonHoc -> Khoa cntt cộng hòa xã HỘi chủ nghĩa việt nam

tải về 1.56 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   7   8   9   10   11   12   13   14   ...   29




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương