Loading...

Tự học lập trình C - Bài 11: Mảng nhiều chiều

Khai báo mảng:

Ví dụ 1:

Khai báo mảng 2 chiều int ia[5][10]; với int là kiểu mảng, ia là tên mảng, số phần tử mảng là 5 x 10.

Ý nghĩa: Khai báo một mảng 2 chiều số nguyên gồm 50 phần tử, mỗi phần tử có kiểu int.

Từ ví dụ 1, ta có cú pháp khai báo mảng đa chiều như sau:

tên_kiểu tên_biến[spt1][spt2]…[sptn];

Diễn giải:

-          tên_kiểu: kiểu dữ liệu muốn khai báo cho mảng

-          tên_biến: Tên của biến mảng, tên được đặt theo qui tắc đặt tên của C

-          spt1, spt2,…, sptn: số phần tương ứng của các chiều của mảng n chiều

Tham chiếu đến từng phần tử mảng 2 chiều

Sau khi mảng được khai báo, mỗi phần tử trong mảng 2 chiều đều có 2 chỉ số để tham chiếu, chỉ số hàng và chỉ số cột. Chỉ số hàng bắt đầu từ 0 đến số hàng – 1 và chỉ số cột bắt đầu từ 0 đến số cột – 1. Tham chiếu đến một phần tử trong mảng 2 chiều ia: ia[chỉ số hàng][chỉ số cột]

Nhập dữ liệu cho mảng 2 chiều

Mảng 2 chiều giống như một ma trận hai chiều, có kích thước bằng số dòng nhân số cột, để nhập dữ liệu cho các phần tử trong ma trận bạn cần duyệt qua từng phần tử trên từng hàng trong ma trận và đưa dữ liệu vào cho phần tử tương ứng như một biến thông thường

Ví dụ 2:

for (int i = 0; i < 5; i++) //vòng for có giá trị i chạy từ 0 đến 4 cho dòng

//tương ứng với mỗi dòng sẽ duyệt qua từng phần tử trong mỗi dòng tương ứng

for (int j = 0; j < 10; j++) //vòng for có giá trị j chạy từ 0 đến 9 cho cột

{

printf("Nhap vao phan tu ia[%d][%d]: ", i + 1, j + 1);

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

}

@Lưu ý:Phép lấy địa chỉ đối với các phần tử mảng hai chiều chỉ có thể áp dụng khi các phần tử mảng hai chiều có kiểu nguyên, còn lại thì phép lấy địa chỉ cho các phần tử mảng nhiều chiều là không thực hiện được.

Chúng ta sửa lại  ví dụ trên để có thể nhập được kiểu dữ liệu khác cho mảng hai chiều bằng cách dừng biến trung gian như sau:

float  fa[5][10], tg;

for (int i = 0; i < 5; i++)

for (int j = 0; j < 10; j++)

{

printf("Nhap vao phan tu ia[%d][%d]: ", i + 1, j + 1);

scanf("%f", &tg);

fa[i][j]=tg;

}

Đọc dữ liệu từ mảng 2 chiều

            Để đọc dữ liệu từ mảng hai chiều cần xác định là đọc tại phần tử thứ mấy trong mảng, tức cần biết chỉ số dòng và chỉ số cột của phần tử đó

Ví dụ 3: in giá trị các phần tử mảng 2 chiều ra màn hình.

for (int i = 0; i < 5; i++) //vòng for có giá trị i chạy từ 0 đến 4 cho dòng

{

for (int j = 0; j < 10; j++) //vòng for có giá trị j chạy từ 0 đến 9 cho cột

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

printf("\n"); //xuống dòng để in hàng kế tiếp

}

Ví dụ 4: Viết chương trình nhập vào 1 ma trận số nguyên n x n. In ra ma trận vừa nhập vào và in theo chiều ngược lại của mỗi dòng .

#include <stdio.h>

#include <conio.h>

#define MAX 50;

void main(void)

{

int ia[MAX][MAX], i, j, n;

printf("Nhap vao cap ma tran: ");

scanf("%d", &n);

//Nhap du lieu vao ma tran

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

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

{

printf("Nhap vao phan tu ia[%d][%d]: ", i + 1, j + 1);

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

}

//In ma tran

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

{

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

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

printf("\n"); //xuống dòng để in hàng kế tiếp

}

printf("\n"); //Tao khoang cach giua 2 ma tran

//In ma tran theo thu tu nguoc

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

{

for (j = n-1; j >= 0 j--)

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

printf("\n"); //xuống dòng để in hàng kế tiếp

}

getch();}

Bài tập thực hành

1. Viết hàm cho phép nhập vào một ma trận vuông kích thước NxN

2. Viết hàm tính tổng các phần tử trên đường chéo chính

3. Viết hàm tính tổng các phần tử trên đường chéo phụ

4. Viết hàm in ra tổng của từng dòng trong ma trận

5. Viết hàm in ra tổng của từng cột trong ma trận

6. Viết hàm kiểm tra ma trận có phải là ma trận đơn vị không

7. Viết hàm kiểm tra ma trận có phải là ma trận chéo không

8. Viết hàm kiểm tra ma trận có phải là ma trận tam giác trên không

9. Xây dựng menu và hàm main để gọi thực hiện các câu 1 đến câu 8

HtrVy

Mảng 1 chiều là tập hợp các phần tử có cùng kiểu dữ liệu. Giả sử bạn muốn lưu n số nguyên để tính trung bình, bạn không thể khai báo n biến để lưu n giá trị rồi sau đó tính trung bình.

ĐỆ QUI

Giải thuật đệ quy:

Giải thuật đệ quy là giải thuật có chứa thao tác gọi đến chính nó. Giải thuật đệ quy cho phép mô tả một dãy lớn các thao tác bằng một số ít các thao tác trong đó có chứa thao tác gọi lại giải thuật (gọi đệ quy).

Giải thuật giải bài toán bằng đệ quy thường rất đẹp, gọn gàng, dễ hiểu, dễ sửa đổi. Tuy nhiên, việc xử lý giải thuật đệ quy lại thường gây khó khăn cho máy tính (tốn không gian nhớ và thời gian xử lý), hơn nữa không phải mọi ngôn ngữ lập trình đều cho phép mã hóa giải thuật đệ quy (ví dụ: FORTRAN) .

Chương trình con đệ quy:

Chương trình con đệ quy là một chương trình con mà trong thân của nó có ít nhất một câu lệnh là lời gọi đến chính nó.

Chương trình con đệ quy phải có hai thành phần:

-        Thành phần không chứa đệ qui, đó là điều kiện để kết thúc quá trình đệ qui.

-        Thành phần có chứa đệ quy, sau mỗi bước, phạm vi của thành phần này phải thay đổi cho đến khi gặp điều kiện kết thúc.

@Lưu ý: Muốn giải một bài toán bằng giải thuật đệ qui việc đầu tiên ta phải đưa bài toán về một dạng tổng quát. Từ đây ta phải đi xác định cho được điều kiện suy biến của bài toán (tức điều kiện để kết thúc giải thuật đệ qui) và điều kiện gọi đệ qui.

Ví dụ bài toán tính n!
Ta có
n=0, 0!=1,
n=1, 1!=1x1 <=>0!x1
n=2, 2!=1x1x2<=>1!x2
n=3, 3!=1x1x2x3 <=>2!x3
=>n!=1x1x2x3x...x n<=>(n-1)! x n
Như vậy:
- Điều kiện suy biến  khi n=0, 0!=1
- Điều kiện gọi đệ qui n>0, n!=n x (n-1)!
Vậy, khi có được 0! =>1! =>2!=>3! ...=>n! 
Giải thuật tính n!
 
#include <stdio.h>

long int gthua(int n);

void main(void)

{

int n;

scanf(“%d”,&n);

printf(“Giai thừa của%d là: %d”,n,gthua(n));

}

int long gthua(int n)

{

if(n==0)

          return 1;

      elsse

         return(n*gthua(n-1));

}

-      Khi thực hiện lời gọi gthua(3) sẽ phát sinh lời gọi gthua(2), đồng thời phải lưu giữ thông tin về trạng thái xử lý chưa hoàn thành (return(3 * gthua(2))) vào Stack.

-      Gặp lời gọi gthua(2), tiếp tục làm phát sinh lời gọi gthua(1), đồng thời vẩn phải lưu trử thông tin về trạng thái xử lý còn dang dở (return( 2*gthua(1)))vào Stack.

-      Cứ như vậy cho tới khi gặp lời gọi của trường hợp suy biến (return(1))).

-      Khi gặp trường hợp suy biến, những thông tin được lưu tạm trong Stack sẽ được lấy ra xử lý (thông tin lấy ra theo kiểu lưu trữ của Stack, thông tin vào sau sẽ được lấy ra trước). Và như vậy, dùng kết quả của gthua(0) để tính gthua(1), dùng kết quả của gthua(1) để tính gthua(2), dùng kết quả của gthua(2) để tính gthua(3). Cuối cùng được kết quả của phép tính giai thừa.

Cụ thể thực hiện lấy và tính toán trong Stack như sau:

-      Lấy return(1*gthua(0)) để thực hiện gthua(1)=1*gthua(0)=1*1=1

-      Lấy return(2*gthua(1)) để thực hiện gthua(2)=2*gthua(1)=2*1=3

-      Lấy return(3*gthua(2)) để thực hiện gthua(3)=3*gthua(2)=3*2=6

 Bài tập thực hành

1. Sử dụng đệ qui để viết hàm tìm ước số chung lớn nhất của 2 số

2. Sử dụng đệ qui để viết hàm tính tổng S = 1+2+….+n.

Vyht

Một chương trình viết trong ngôn ngữ C là một dãy các hàm, trong đó có một hàm chính (hàm main()). Hàm chia các bài toán lớn thành các công việc nhỏ hơn, giúp thực hiện những công việc lặp lại nào đó một cách nhanh chóng mà không phải viết lại đoạn chương trình. Thứ tự các hàm trong chương trình là bất kỳ, song chương trình bao giờ cũng đi thực hiện từ hàm main(). Trong C chương trình con chỉ tồn tại dới dạng hàm chứ không có thủ tục.

Biểu thức: có thể là một biểu thức hoặc nhiều biểu thức con. Nếu là nhiều biểu thức con thì cách nhau bởi dấu phẩy (,) và tính đúng sai của biểu thức được quyết định bởi biểu thức con cuối cùng.

Với mỗi biểu thức có thể viết thành một dãy biểu thức con phân cách nhau bởi dấu phẩy. Khi đó các biểu thức con được xác định từ trái sang phải. Tính đúng sai của dãy biểu thức con trong biểu thức thứ 2 được xác định bởi biểu thức con cuối cùng.

Trước tiên ta cho giá trị a là giá trị lớn nhất bằng cách gán a cho max (max là biến được khai báo cùng kiểu dữ liệu với a, b). Sau đó so sánh b với a, nếu b lớn hơn a ta gán b cho max và cuối cùng ta được kết quả max là giá trị lớn nhất.

 

<Đối mục 1>, <Đối mục >…: là các mục dữ kiện cần in ra màn hình. Các <đối mục này> có thể là biến, hằng hoặc biểu thức phải được định trị trước khi in ra. 

 

Hằng là các đại lượng mà giá  trị của nó không thay đổi trong quá trình tính toán.   Nguyên tắc đặt tên hằng theo nguyên tắc đặt tên của C.Bài 3: Khai báo hằng, biến – Toán tử - Biểu thức.

Một chương trình bao gồm một hoặc nhiều hàm, mỗi hàm được người lập trình tổ chức để giải quyết một hoặc một số công việc nào đó của bài toán cần giải quyết. Một chương trình C để có thể thực thi được luôn cần phải có hàm main().

 

Khái niệm tên rất quan trọng trong quá trình lập trình, nó không những thể hiện rõ ý nghĩa trong chương trình mà còn dùng để xác định các đại lượng khác nhau khi thực hiện chương trình. Tên thường được đặt cho hằng, biến, mảng, con trỏ, nhãn,… Chiều dài tối đa của tên là 32 ký tự.

Hãy đăng quảng cáo trên TuHocAnNinhMang.com

Bài xem nhiều nhất

Tự học lập trình C - Bài 1: Một số khái niệm cơ bản

Khái niệm tên rất quan trọng trong quá trình lập trình, ...

MySQL – Bài 8: Khóa chính (primary key) và khóa ngoại (foreign key) của table

Với ràng buộc này thì, việc người sử dụng vô tình hay cố ...

Tự học lập trình JAVA – Bài 1: Bước đầu với Java

Một chương trình java có thể được định nghĩa như là một ...

Tự học lập trình C - Bài 10: Mảng một chiều

Mảng 1 chiều là tập hợp các phần tử có cùng kiểu dữ ...

Tự học lập trình C - Bài 2: Cấu trúc chương trình C

Một chương trình bao gồm một hoặc nhiều hàm, mỗi hàm ...

Hướng dẫn in ấn trong Word 2007/2010 – Step by Step

[Tự học] - Tiêu đề đầu trang (Header)/tiêu đề cuối ...

Tự học lập trình Assembly - Bài 1: Bước đầu với lập trình Assembly trên vi xử lý Intel 8086/8088

Như đã biết, lệnh ngôn ngữ máy là một dãy các con số 0, ...

Hãy đăng quảng cáo trên TuHocAnNinhMang.com

Về đầu trang Hỏi - Đáp