Lập trình căn bản - Chương 6: Kiểu mảng

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à có các kiểu bất kỳ: ký tự, số, chuỗi kýtự ; cũng có khi ta sử

dụng kiểu mảng đểlàm kiểu phần tửcho một mảng (trong trường hợp này ta gọi là

mảng của mảng hay mảng nhiều chiều).

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

Mảng là kiểu dữliệu được sửdụng rất thường xuyên. Chẳng hạn người ta cần

quản lýmột danh sách họvà tên của khoảng 100 sinh viên trong một lớp. Nhận thấy

rằng mỗi họvà tên đểlưu trữta cần 1 biến kiểu chuỗi, nhưvậy 100 họvà tên thì cần

khai báo 100 biến kiểu chuỗi. Nếu khai báo nhưthếnày thì đoạn khai báo cũng như

các thao tác trên các họtên sẽrất dài dòng và rắc rối. Vì thế, kiểu dữliệu mảng giúp

ích ta trong trường hợp này; chỉcần khai báo 1 biến, biến này cóthểcoi nhưlà tương

đương với 100 biến chuỗi ký tự; đó là 1 mảng mà các phần tửcủa nó là chuỗi ký tự.

Hay như đểlưu trữcác từkhóa của ngôn ngữlập trình C, ta cũng dùng đến một mảng

đểlưu trữchúng.

pdf8 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 2990 | Lượt tải: 2download
Tóm tắt nội dung Lập trình căn bản - Chương 6: Kiểu mảng, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
/* Lưu số dư vào mảng ở vị trí K*/ 
 K++; /* Tăng K lên để lần kế lưu vào vị trí 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. Đây là một bài 
toán có ứng dụng rộng rãi trong nhiều lĩnh vực. 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. 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. 
Chương trình sẽ được chia thành 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]); 
 } 
} 
Trang 74 
Lập trình căn bản 
void InMang(int a[], int N) 
{ 
 int i; 
 for (i=0; i<N;i++) 
 printf("%d ",a[i]); 
 printf("\n"); 
} 
void SapXep(int a[], int N) 
{ 
 int t,i; 
 for(i=0;i<N-1;i++) 
 for(int j=i+1;j<N;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; 
} 
 Kết quả chạy chương trình có thể là: 
III. MẢNG NHIỀU CHIỀU 
 Mảng nhiều chiều là mảng có từ 2 chiều trở lên. Điều đó có nghĩa là mỗi phần 
tử của mảng là một mảng khác. 
 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… 
 Phần dưới đây là các vấn đề liên quan đến mảng 2 chiều; các mảng 3, 4,… chiều thì 
tương tự (chỉ cần tổng quát hóa lên). 
Trang 75 
Lập trình căn bản 
III.1 Khai báo 
III.1.1. Khai báo mảng 2 chiều tường minh 
Cú pháp: 
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 
III.1.2. 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: 
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. 
III.2 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<M;i++) 
Trang 76 
Lập trình căn bản 
 for(j=0; j<N; 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<M;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<M;i++) 
 for(j=0; j<N; 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; 
 clrscr(); 
Trang 77 
Lập trình căn bản 
 printf("Ma tran co bao nhieu dong? ");scanf("%d",&M); 
 printf("Ma tran co bao nhieu cot? ");scanf("%d",&N); 
 for(i=0;i<M;i++) 
 for(j=0; j<N; 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<M;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<Min;i++) 
 T=T+a[i][i]; 
 printf("Tong cac phan tu o duong cheo chinh la: %f",T); 
 getch(); 
 return 0; 
} 
IV. BÀI TẬP 
IV.1 Mục đích yêu cầu 
Làm quen với kiểu dữ liệu có cấu trúc trong C, kiểu mảng. Thực hiện các bài tập trong 
phần nội dung bằng cách kết hợp kiểu dữ liệu mảng, các kiểu dữ liệu đã học và các phần đã 
học trong các bài tập trước. 
IV.2 Nội dung 
1. Viết chương trình nhập vào một dãy n số thực a[0], a[1],..., a[n-1], sắp xếp dãy số theo thứ 
tự từ lớn đến nhỏ. In dãy số sau khi sắp xếp. 
2. Viết chương trình sắp xếp một mảng theo thứ tự tăng dần sau khi đã loại bỏ các phần tử 
trùng nhau. 
3. Viết chương trình nhập vào một mảng, hãy xuất ra màn hình: 
- Phần tử lớn nhất của mảng. 
- Phần tử nhỏ nhất của mảng. 
- Tính tổng của các phần tử trong mảng . 
4. Viết chương trình nhập vào một dãy các số theo thứ tự tăng, nếu nhập sai quy cách thì yêu 
cầu nhập lại. In dãy số sau khi đã nhập xong. Nhập thêm một số mới và chèn số đó vào dãy đã 
có sao cho dãy vẫn đảm bảo thứ tự tăng. In lại dãy số để kiểm tra. 
5. Viết chương trình nhập vào một ma trận (mảng hai chiều) các số nguyên, gồm m hàng, n 
cột. In ma trận đó lên màn hình. Nhập một số nguyên khác vào và xét xem có phần tử nào của 
ma trận trùng với số này không ? Ở vị trí nào ? Có bao nhiêu phần tử ? 
Trang 78 
Lập trình căn bản 
6. Viết chương trình để chuyển đổi vị trí từ dòng thành cột của một ma trận (ma trận chuyển 
vị) vuông 4 hàng 4 cột. Sau đó viết cho ma trận tổng quát cấp m*n. 
Ví dụ: 
1 2 3 4 1 2 9 1 
2 5 5 8 2 5 4 5 
9 4 2 0 3 5 2 8 
1 5 8 6 4 8 0 6 
7. Viết chương trình nhập vào một mảng số tự nhiên. Hãy xuất ra màn hình: 
- Dòng 1 : gồm các số lẻ, tổng cộng có bao nhiêu số lẻ. 
- Dòng 2 : gồm các số chẵn, tổng cộng có bao nhiêu số chẵn. 
- Dòng 3 : gồm các số nguyên tố. 
- Dòng 4 : gồm các số không phải là số nguyên tố. 
8. Viết chương trình tính tổng bình phương của các số âm trong một mảng các số nguyên. 
9. Viết chương trình thực hiện việc đảo một mảng một chiều. 
Ví dụ : 1 2 3 4 5 7 9 10 đảo thành 10 9 7 5 4 3 2 1 . 
10. Viết chương trình nhập vào hai ma trận A và B có cấp m, n. In hai ma trận lên màn hình. 
Tổng hai ma trận A và B là ma trận C được tính bởi công thức: 
 cij= aij +bij ( i=0,1,2,...m-1; j=0,1,2...n-1) 
Tính ma trận tổng C và in kết quả lên màn hình. 
11. Viết chương trình nhập vào hai ma trận A có cấp m, k và B có cấp k, n. In hai ma trận lên 
màn hình. Tích hai ma trận A và B là ma trận C được tính bởi công thức: 
cij= ai1*b1j + ai2 *b2j + ai3 *b3j + ... + aik *bkj (i=0,1,2,...m-1;j=0,1,2...n-1) 
Tính ma trận tích C và in kết quả lên màn hình. 
12. Xét ma trận A vuông cấp n, các phần tử a[i, i] ( i= 1 ... n ) được gọi là đường chéo chính 
của ma trận vuông A. Ma trận vuông A được gọi là ma trận tam giác nếu tất cả các phần tử 
dưới đường chéo chính đều bằng 0. Định thức của ma trận tam giác bằng tích các phần tử trên 
đường chéo chính. 
Ta có thể chuyển một ma trận vuông bất kỳ về ma trận tam giác bằng thuật toán: 
- Xét cột i (i =0,1...n-2) 
- Trong cột i xét các phần tử a[k,i] ( k=i+1...n-1) 
+ Nếu a[k,i]=0 thì tăng k lên xét phần tử khác 
+ Nếu a[k,i] 0 thì làm như sau: 
Nhân toàn bộ hàng k với - a[i,i]/a[k,i] 
Lấy hàng i cộng vào hàng k sau khi thực hiện phép nhân trên. 
Đổi chỗ hai hàng i và k cho nhau 
Nhân toàn bộ hàng k với -1 sau khi đã đổi chỗ với hàng i 
Tăng k lên xét phần tử khác. 
Viết chương trình tính định thức cấp n thông qua các bước nhập ma trận, in ma trận, 
đưa ma trận về dạng tam giác, in ma trận tam giác, in kết quả tính định thức. 
13. Viết chương trình thực hiện việc trộn hai dãy có thứ tự thành một dãy có thứ tự. Yêu cầu 
không được trộn chung rồi mới sắp thứ tự. Khi trộn phải tận dụng được tính chất đã sắp của 
hai dãy con. 
Trang 79 

File đính kèm:

  • pdfPhan2Chuong6.pdf