[Bài tập C] Hàm nhập xuất mảng 2 chiều sử dụng con trỏ và cấp phát bộ nhớ động
Phân tích bài toán
Để thao tác với mảng hai chiều ta sẽ sử dụng đến khái niệm Con trỏ cấp hai. Hiểu một cách đơn giản đó là một con trỏ trỏ đến trỏ( Pointer to Pointer).Con trỏ cấp hai dùng để lưu địa chỉ của biến con trỏ.
Ví dụ khi ta sử dụng con trỏ thông thường:
int info;
int *pointer = &info;
int *pointer = &info;
Ở đây ta có một giá trị info kiểu int và một con trỏ luu địa chỉ của biến info qua việc gán sử dụng toán tử lấy địa chỉ &. Kết quả trả về sẽ kiểu (int *).
Vậy khi sử dụng một biến biến con trỏ khác để trỏ đến pointer:
int info;
int *pointer = info;
int **pToPointer = &pointer;
int *pointer = info;
int **pToPointer = &pointer;
Khi đó pToPointer là một con trỏ cấp hai(Pointer to Pointer). Chúng ta phải khai báo kiểu dữ liệu (int **) để gán địa chỉ kiểu (int *).
Quay trở lại bài toán, một mảng hai chiều sẽ có hai thông số là dòng và cột(row, col).
Ta sẽ sử dụng con trỏ cấp hai, cấp phát cho nó row phần tử con trỏ cấp một, mỗi con trỏ cấp một ta sẽ cấp cho col phần tử.
int **Mat = (int**)malloc(sizeof(int*)*row);
for(int i = 0; i < row; i++) {
Mat[i] = (int*)malloc(sizeof(int)*col);
}
________________________________________________________________________________________for(int i = 0; i < row; i++) {
Mat[i] = (int*)malloc(sizeof(int)*col);
}
Bài hoàn chỉnh:
#include <stdio.h>
#include <stdlib.h>
int** Mat; //Khai bao con tro hai chieu
int row, col; //Khai bao dong va cot
//Ham nhap mang
void nhapMang() {
printf("Nhap kich thuoc ma tran: ");
scanf("%d %d", &row, &col);
Mat = (int**)malloc(sizeof(int*)*row); //Cap phat bo nho cho row con tro cap 2
for(int i = 0; i < row; i++) {
Mat[i] = (int*)malloc(sizeof(int)*col); //Cap phat bo nho cho col con tro cap 1
}
//Nhap mang hai chieu
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
printf("Mat[%d][%d] = ", i+1, j+1);
scanf("%d", &Mat[i][j]);
}
printf("\n");
}
}
//In ra mang hai chieu
void xuatMang() {
printf("________");
printf("\nMat:\n\n");
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
printf("%d\t", Mat[i][j]);
}
printf("\n\n\n");
}
}
//___________MAIN_______________
int main()
{
int menu;
do {
printf("|-----------------|\n");
printf("|1.Nhap mang |\n");
printf("|2.Xuat mang |\n");
printf("|3.Thoat |\n");
printf("|_________________|\n");
printf("Nhap lua chon: ");
scanf("%d", &menu);
switch(menu) {
case 1:
nhapMang();
break;
case 2:
xuatMang();
break;
case 3:
return 0;
default:
printf("Lua chon khong hop le!");
}
} while(menu != 3);
return 0;
}
#include <stdlib.h>
int** Mat; //Khai bao con tro hai chieu
int row, col; //Khai bao dong va cot
//Ham nhap mang
void nhapMang() {
printf("Nhap kich thuoc ma tran: ");
scanf("%d %d", &row, &col);
Mat = (int**)malloc(sizeof(int*)*row); //Cap phat bo nho cho row con tro cap 2
for(int i = 0; i < row; i++) {
Mat[i] = (int*)malloc(sizeof(int)*col); //Cap phat bo nho cho col con tro cap 1
}
//Nhap mang hai chieu
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
printf("Mat[%d][%d] = ", i+1, j+1);
scanf("%d", &Mat[i][j]);
}
printf("\n");
}
}
//In ra mang hai chieu
void xuatMang() {
printf("________");
printf("\nMat:\n\n");
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
printf("%d\t", Mat[i][j]);
}
printf("\n\n\n");
}
}
//___________MAIN_______________
int main()
{
int menu;
do {
printf("|-----------------|\n");
printf("|1.Nhap mang |\n");
printf("|2.Xuat mang |\n");
printf("|3.Thoat |\n");
printf("|_________________|\n");
printf("Nhap lua chon: ");
scanf("%d", &menu);
switch(menu) {
case 1:
nhapMang();
break;
case 2:
xuatMang();
break;
case 3:
return 0;
default:
printf("Lua chon khong hop le!");
}
} while(menu != 3);
return 0;
}
Nhận xét
Đăng nhận xét