- 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
- 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);
}
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:
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
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
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
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:
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);
}
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;
}
#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
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
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
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);
}
No comments:
Post a Comment