/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

[Tự Học Lập Trình C - Qua Các Bài Tập] COM108_Nhập Môn Lập Trình - Bài 6 - Mảng (Array) Trong C - P1

MỤC TIÊU: Sau bài thực hành, các bạn có khả năng thực hiện được:
  • Biết sử dụng mảng 1 chiều trong lập trình
  • Biết sử dụng mảng 2 chiều trong lập trình
LÝ THUYẾT:


MẢNG 1 CHIỀU

MẢNG LÀ GÌ?
Mảng là tập hợp các phần tử có cùng kiểu dữ liệu
CÁCH KHAI BÁO
Khai báo KHÔNG khởi tạo
int mangMotChieu[5];// khởi tạo mảng 1 chiều có kiểu dữ liệu là số nguyên (int) có có chiều dài là 5
int mangMotChieu_KhaiBaoKhac[]; // khởi tạo mảng có độ dài không cố định, có kiểu dữ liệu là int

Thêm giá trị vào mảng
mangMotChieu[0] = 25;
mangMotChieu[1] = 50;
mangMotChieu[2] = 75;
mangMotChieu[3] = 100;
mangMotChieu[4] = 200;;

Khai báo CÓ khởi tạo
int mangMotChieu[] = {25, 50, 75, 100, 200};

Chúng ta có thể truy cập/thay đổi giá trị của mảng thông qua chỉ số Index
printf("%d", mangMotChieu[2]);

Ví dụ: Truy cập vào vị trí có Index 2 và xuất giá trị ra màn hình
#include<stdio.h>
int main()
{
  int mangMotChieu[] = {25, 50, 75, 100, 200};
  printf("%d", mangMotChieu[2]); // in ra giá trị của mảng tại vị trí có chỉ số Index là 2
  // Kết quả là 75 vì trong C index bắt đầu từ 0
}

Kích thức/Độ dài của mảng
int mangMotChieu[] = {25, 50, 75, 100, 200};
int soPhanTuTrongMang = sizeof mangMotChieu / sizeof (int);
Kiểu dữ liệu int có 4byte trên mỗi phần tử, nên để biết mảng có bao nhiêu phần tử thì chúng ta phải lấy độ dài của mảng chia cho độ dài của kiểu dữ liệu. Ví dụ trên là 20/4 = 5

Ví dụ:
#include<stdio.h>
int main()
{
  int i;
  int mangMotChieu[] = {25, 50, 75, 100, 200};
  int soPhanTuTrongMang = sizeof mangMotChieu / sizeof (int);
printf("\nMang co '%d' phan tu!", soPhanTuTrongMang);
}

Cách duyệt mảng
#include<stdio.h>
int main()
{
  int i;
  int mangMotChieu[] = {25, 50, 75, 100, 200};
  for (i = 0; i < 5; i++)
  {
    printf("%d ", mangMotChieu[i]);
  }
}

Lợi ích của mảng
- Sử dụng mảng để nắm giữ nhiều giá trị thay vì phải khai báo nhiều biến.
- Truy xuất nhanh
- Dễ dàng đọc dữ liệu từ các phần tử và sắp xếp

MẢNG 2 CHIỀU
Chúng ta tạm hiểu mảng 2 chiều một sheet của file excel nó bao gồm các hàng và các cột.
Ví dụ:

Cách khai báo:
Ví dụ: mảng có 2 hàng và 3 cột
int mangHaiChieu[2][3] = { {1, 4, 2}, {3, 6, 8} };

Truy xuất vào mảng 2 chiều
int mangHaiChieu[2][3] = { {1, 4, 2}, {3, 6, 8} };
printf("%d", mangHaiChieu[0][2]); 
/* 
kết quả là 2
truy xuất và lấy giá trị hàng 0 cột 2 
*/

Thay đổi giá trị của mảng 2 chiều
int mangHaiChieu[2][3] = { {1, 4, 2}, {3, 6, 8} };
mangHaiChieu[0][0] = 9; // thay đổi/gán giá trị hàng 0, cột 0 bằng 9

printf("%d", mangHaiChieu[0][0]); // kết quả là 9 thay vì 1 

Cách duyệt mảng 2 chiều: Duyệt mảng 2 chiều cần 2 vòng lặp (1 cho dòng, 1 cho cột)
int mangHaiChieu[2][3] = { {1, 4, 2}, {3, 6, 8} };
int i, j;
for (i = 0; i < 2; i++) {
  for (j = 0; j < 3; j++) {
    printf("%d\n", mangHaiChieu[i][j]);
  }
}
Chú ý khi khai báo mảng chúng ta phải xác định số cột, nếu không sẽ báo lỗi

Hàm nhập mảng 2 chiều
void nhapMangHaiChieu(int hang, int cot, int mangHaiChieu[][100]){
  int i, j;
  for (i = 0 ; i < hang ; i++)
  {
    for (j = 0 ; j < cot ; j++)
    {
      printf("\nNhap vao phan tu HANG %d COT %d cua mang: ", i + 1, j + 1);
      scanf("%d", &mangHaiChieu[i][j]); 
    }
  }
}

Hàm in/xuất mảng 2 chiều
void xuatMangHaiChieu(int hang, int cot, int mangHaiChieu[][100]){
  int i, j;
  printf("\nCac gia tri trong Mang 2 chieu la:\n");
  for (i = 0 ; i < hang ; i++)
  {
    for (j = 0 ; j < cot ; j++)
    {
      printf("%d\t", mangHaiChieu[i][j]); 
    }
    printf("\n");
  }
}

Hàm chính gọi nhập xuất:
#include<stdio.h>
int main()
{ 
  int hang, cot;
  int mangHaiChieu[100][100];
  printf("\n=====MANG 2 CHIEU=====");
  printf("\nNhap vao so HANG: "); scanf("%d", &hang);
  printf("\nNhap vao so COT: "); scanf("%d", &cot);
  nhapMangHaiChieu(hang, cot, mangHaiChieu);
  xuatMangHaiChieu(hang, cot, mangHaiChieu);
  
}


YÊU CẦU:
BÀI 1:
TÍNH TRUNG BÌNH TỔNG CÁC SỐ CHIA HẾT CHO 3 TRONG MẢNG
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: 
- Xuất ra các phần tử trong mảng
- In ra tổng các phần tử trong mảng
 
BÀI 2:
TÌM GIÁ TRỊ LỚN NHẤT VÀ NHỎ NHẤT TRONG MẢNG
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: Xuất ra màn hình giá trị nhỏ nhất và lớn nhất của mảng

BÀI 3: 
SẮP XẾP MẢNG THEO THỨ TỪ GIẢM DẦN
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: Xuất ra màn hình kết quả mảng đã sắp xếp


BÀI 4: 
TÍNH BÌNH PHƯƠNG CÁC PHẦN TỬ TRONG MẢNG 2 CHIỀU
Input: Nhập vào từ bàn phím 1 ma trận các số nguyên. Mảng gồm n hàng, m cột
Output: Xuất ra màn hình ma trận bình phương

THỰC HIỆN:

BÀI 1: 
TÍNH TRUNG BÌNH TỔNG CÁC SỐ CHIA HẾT CHO 3 TRONG MẢNG
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: 
- Xuất ra các phần tử trong mảng

Code:
#include<stdio.h>
int main()
{	
	int n;
	int mangMotChieu[n];

	printf("\nNhap vao so phan tu MANG MOT CHIEU: ");
	scanf("%d", &n);

	// Nhập/ gán giá trị cho mảng
	int i;
	for (i = 0 ; i < n ; i++){
		printf("\nNhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]); // đọc và lưu giá trị vào mảng
	}
	
	// duyệt mảng và int ra màn hình
	for (i = 0 ; i < n ; i++){
		printf("\nGia tri phan tu thu %d MANG MOT CHIEU la: %d ", i + 1, mangMotChieu[i]);
		
	}
}

Khuyến khích viết theo dạng gọi hàm:
- In ra tổng các phần tử trong mảng
code:
#include<stdio.h>

void nhapMangMotChieu(int n, int mangMotChieu[]){
	int i;
	for (i = 0 ; i < n ; i++){
		printf("\nNhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]); 
	}
}

void inMangMotChieu(int n, int mangMotChieu[]){
	int i;
	for (i = 0 ; i < n ; i++){
		printf("\nGia tri phan tu thu %d MANG MOT CHIEU la: %d ", i + 1, mangMotChieu[i]);	
	}
}

int tongPhanTuTrongMang(int n, int mangMotChieu[]){
	int i;
	int tong = 0;
	for (i = 0 ; i < n ; i++){
//		tong = tong + mangMotChieu[i];
		tong += mangMotChieu[i];	
	}
	return tong;
}

int main()
{	
	int n;
	int mangMotChieu[n];

	printf("\nNhap vao so phan tu MANG MOT CHIEU: ");
	scanf("%d", &n);
	
	nhapMangMotChieu(n, mangMotChieu);
	inMangMotChieu(n, mangMotChieu);
	printf("\nTong cac phan tu trong mang %d", tongPhanTuTrongMang(n, mangMotChieu));
	
}


- Xuất ra màn hình kết quả của trung bình tổng các số chia hết cho 3 trong mảng
Code:
#include<stdio.h>
int main()
{	
	int n;
	int mangMotChieu[n];

	printf("\nNhap vao so phan tu MANG MOT CHIEU: ");
	scanf("%d", &n);

	// Nhập/ gán giá trị cho mảng
	int i;
	for (i = 0 ; i < n ; i++){
		printf("\nNhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]); // đọc và lưu giá trị vào mảng
	}
	
	// duyệt mảng và int ra màn hình
	for (i = 0 ; i < n ; i++){
		printf("\nGia tri phan tu thu %d MANG MOT CHIEU la: %d ", i + 1, mangMotChieu[i]);
		
	}

	// tính trung bình cộng của các số chia hết cho 3
	float trungBinhCong = 0;
	float tong = 0;
	int bienDem;
	for (i = 0 ; i < n ; i++){
		if (mangMotChieu[i] % 3 == 0){
			tong = tong + mangMotChieu[i];
			//  tong += mangMotChieu[i]; // hoặc
			bienDem++;
		}
	}
	trungBinhCong = tong / bienDem;
	printf("\nTrung binh cong cua cac so chia het cho 3 la: %.2f", trungBinhCong);
}

Viết hàm:
int trungBinhCacPhanTuChiaHetCho3(int n, int mangMotChieu[n]){
	int i;
	int tong = 0;
	int dem = 0;
	for(i = 0; i < n ;i++){
		if(mangMotChieu[i] % 3 == 0){
			tong = tong + mangMotChieu[i];
			dem ++;
		}
	}
	return tong/dem;
}


Code đầy đủ:
#include<stdio.h>

void nhapMangMotChieu(int n, int mangMotChieu[n]){
		//nhap vao
	int i;
	for(i = 0; i < n ;i++){
		printf("Nhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]);
	}
}

void xuatMangMotChieu(int n, int mangMotChieu[n]){
	int i;
	for(i = 0; i < n ;i++){
		printf("%d\t", mangMotChieu[i]);
	}
}

int tongCacPhanTuTrongMang(int n, int mangMotChieu[n]){
	int i;
	int tong = 0;
	for(i = 0; i < n ;i++){
		tong = tong + mangMotChieu[i];
	}
	return tong;
}

int trungBinhCacPhanTuChiaHetCho3(int n, int mangMotChieu[n]){
	int i;
	int tong = 0;
	int dem = 0;
	for(i = 0; i < n ;i++){
		if(mangMotChieu[i] % 3 == 0){
			tong = tong + mangMotChieu[i];
			dem ++;
		}
	}
	return tong/dem;
}


int main()
{	
 	int n; // chieu dai mang
 	int mangMotChieu[n];
 		
 	printf("\nNhap vao so phan tu Mang MOT chieu: ");
	scanf("%d", &n);
	
	nhapMangMotChieu(n, mangMotChieu);
//	xuatMangMotChieu(n, mangMotChieu);
	printf("%d", trungBinhCacPhanTuChiaHetCho3(n, mangMotChieu));



}

BÀI 2: 
TÌM GIÁ TRỊ LỚN NHẤT VÀ NHỎ NHẤT TRONG MẢNG
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: Xuất ra màn hình giá trị nhỏ nhất và lớn nhất của mảng

#include<stdio.h>
int main()
{	
	int n;
	int mangMotChieu[n];

	printf("\nNhap vao so phan tu MANG MOT CHIEU: ");
	scanf("%d", &n);

	// Nhập/ gán giá trị cho mảng
	int i;
	for (i = 0 ; i < n ; i++){
		printf("\nNhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]); // đọc và lưu giá trị vào mảng
	}
	
	// tìm phần tử LỚN nhất, NHỎ nhất trong mảng
	int min = mangMotChieu[0];
	int max = mangMotChieu[0];
	for ( i = 0; i < n; i++)
	{
		if (mangMotChieu[i] < min){ //NHỎ nhất
			min = mangMotChieu[i];
		}
		if (mangMotChieu[i] > max){ //LỚN nhất
			max = mangMotChieu[i];
		}
	}
	printf("\nPhan tu NHO nhat cua mang la: %d", min);
	printf("\nPhan tu LON nhat cua mang la: %d", max);
}

Viết dạng hàm:
int timPhanTuLonNhat(int n, int mangMotChieu[n]){
	int max = mangMotChieu[0];
	int i;
	for(i = 0; i < n; i++){
		if (mangMotChieu[i] > max) max = mangMotChieu[i];
	}
	return max;
}


int timPhanTuNHONhat(int n, int mangMotChieu[n]){
	int min = mangMotChieu[0];
	int i;
	for(i = 0; i < n; i++){
		if (mangMotChieu[i] < min) min = mangMotChieu[i];
	}
	return min;
}

Code đầy đủ
#include<stdio.h>

void nhapMangMotChieu(int n, int mangMotChieu[n]){
		//nhap vao
	int i;
	for(i = 0; i < n ;i++){
		printf("Nhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]);
	}
}

int timPhanTuLonNhat(int n, int mangMotChieu[n]){
	int max = mangMotChieu[0];
	int i;
	for(i = 0; i < n; i++){
		if (mangMotChieu[i] > max) max = mangMotChieu[i];
	}
	return max;
}


int timPhanTuNHONhat(int n, int mangMotChieu[n]){
	int min = mangMotChieu[0];
	int i;
	for(i = 0; i < n; i++){
		if (mangMotChieu[i] < min) min = mangMotChieu[i];
	}
	return min;
}

int main()
{	
 	int n; // chieu dai mang
 	int mangMotChieu[n];
 		
 	printf("\nNhap vao so phan tu Mang MOT chieu: ");
	scanf("%d", &n);
	
	nhapMangMotChieu(n, mangMotChieu);
//	xuatMangMotChieu(n, mangMotChieu);
	printf("\nPhan tu LON nhat cua mang la: %d", timPhanTuLonNhat(n, mangMotChieu));
//	printf("\nPhan tu NHO nhat cua mang la: %d", timPhanTuNHONhat(n, mangMotChieu));

}


Viết kiểu CON TRỎ

BÀI 3: 
SẮP XẾP MẢNG THEO THỨ TỪ GIẢM DẦN
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: Xuất ra màn hình kết quả mảng đã sắp xếp

lưu file dạng .CPP
void hoanVi(int &a, int &b) 
{
    int temp = a;
    a = b;
    b = temp;
}

void sapXepMang(int n, int mangMotChieu[]){
	int i, j;
	for (i=0; i < n -1; i++){
		for (j=i+1; j < n ; j++){
			if (mangMotChieu[i] > mangMotChieu[j]){ // thay đổi dấu theo yêu cầu tăng hay giảm
				
				hoanVi(mangMotChieu[i], mangMotChieu[j]);
			}
				
		}
	}
}




BÀI 4: 
TÍNH BÌNH PHƯƠNG CÁC PHẦN TỬ TRONG MẢNG 2 CHIỀU
Input: Nhập vào từ bàn phím 1 ma trận các số nguyên. Mảng gồm n hàng, m cột
Output: Xuất ra màn hình ma trận bình phương



Viết Hàm Nhập Xuất

// Nhập mảng hai chiều
void taoMangHaiChieu(int n, int m, int mangHaiChieu[n][m]) {
  int i, j;
  for ( i = 0; i < n; i++) {
    for ( j = 0; j < m; j++) {
      printf("Nhap phan tu mangHaiChieu[%d][%d]: ", i, j);
      scanf("%d", &mangHaiChieu[i][j]);
    }
  }
}

// Xuất mảng hai chiều
void xuatMangHaiChieu(int n, int m, int mangHaiChieu[n][m]) {
  int i, j;
  for ( i = 0; i < n; i++) {
    for ( j = 0; j < m; j++) {
      printf("%d\t", mangHaiChieu[i][j]);
    }
    printf("\n");
  }
}

Viết hàm tính bình phương
// Hàm tính bình phương số nguyên
int binhPhuong(int x) {
  return x * x;
}

void tinhBinhPhuong(int n, int m, int mangHaiChieu[n][m]) {
  int i, j;
  for ( i = 0; i < n; i++) {
    for ( j = 0; j < m; j++) {
//    	mangHaiChieu[i][j] = mangHaiChieu[i][j] * mangHaiChieu[i][j]; // có thể tính trực tiếp
      mangHaiChieu[i][j] = binhPhuong(mangHaiChieu[i][j]); // hoặc có thể gọi hàm tính bình phương
    }
  }
}


Hàm chính
int main() {
  int n, m;
//  printf("Nhập số hàng: ");
//  scanf("%d", &n);
//  printf("Nhập số cột: ");
//  scanf("%d", &m);

  // gắng trực tiếp để test
  n = 2; m =3;
  int mangHaiChieu[n][m];
  khoiTaoMangHaiChieu(n, m, mangHaiChieu);
  tinhBinhPhuong(n, m, mangHaiChieu);
  xuatMangHaiChieu(n, m, mangHaiChieu);
}


Xong!
/*header slide*/