Vấn đề về mảng răng cưa

mấy pro hướng dẫn mình về mảng răng cưa vs. việc khởi tạo, khai báo, rồi sử dụng nó như nào. có thể áp dụng vào vector được k…

Bạn học vector chưa ?
Mình nghĩ nếu tạo mảng răng cưa bằng vector sẽ đơn giản hơn con trỏ cấp 2 đó !

1 Like

hướng dẫn vs. khởi tạo mình còn k biết =.=

hép me me me me me me

1 Like

Trước tiên, mảng răng cưa là 1 ma trận, trong đó số phần tử mỗi dòng không đồng đều nhau.
VD:

1 2 3
4 5 6 7
8 9
10

Có 2 cách để tạo mảng răng cưa. Mình sẽ hướng dẫn cho bạn 2 cách luôn nhé !

Con trỏ cấp 2

Khi tạo 1 ma trận thông thường, bạn sẽ khai báo 1 con trỏ cấp 2, và dùng vòng lặp để duyệt.
Nhưng muốn tạo 1 mảng răng cưa, bạn sẽ thay đổi cái biến lưu trữ số phần tử mỗi dòng thành 1 con trỏ (mảng).
Source code:

#include <stdio.h>
#include <stdlib.h>
int main()
{
       int rows = 3; // cho 3 dòng
       int *columns = (int *)calloc(rows, sizeof(int)); // khởi tạo con trỏ cột để lưu trữ số phần tử mỗi dòng
       // tiến hành khởi tạo
       int **matrix = (int **)calloc(rows, sizeof(int *)); // khai báo con trỏ cấp 2
       // Dùng vòng lặp duyệt để cấp phát cho con trỏ mỗi dòng
       for (int i = 0; i < rows; ++i)
       {
              printf("Nhap so phan tu dong %d: ", i + 1);
              scanf("%d", &columns[i]); // nhập số phần tử dòng 1
              matrix[i] = (int *)calloc(columns[i], sizeof(int)); // cấp phát cho con trỏ dòng
       }
       // xuất mảng răng cưa
       for (int i = 0; i < rows; ++i)
       {
              for (int j = 0; j < columns[i]; ++j)
              {
                     printf("%4d", a[i][j]);
              }
       printf("\n"); // xuống dòng cho dễ nhìn
       }
       return 0;
}

Bạn copy đoạn code trên vào IDE rồi compile & run thử sẽ thấy, nếu khó hiểu thì chịu khó debug hoặc hỏi nhé !

Vector

Để tạo mảng răng cưa bằng vector thì khá dễ dàng so với con trỏ cấp 2 do ngôn ngữ C++ đã hỗ trợ nhiều chức năng cho vector rồi. Còn về cách sử dụng vector như thế nào bạn có thể tham khảo trên mạng hoặc xem 3 videos về vector của anh Đạt.
Source code:

#include <iostream>
#include <vector>
#include <iomanip>
int main()
{
       int rows = 3; // gán cứng số dòng là 3
       std::vector<std::vector<int>> matrix; // khởi tạo vector 2 chiều
       matrix.resize(rows); // khởi tạo số dòng của vector
       for (int i = 0; i < rows; ++i)
       {
              int columns;
              std::cout << "Nhap so phan tu dong " << i + 1 << ": ";
              std::cin >> columns;
              matrix.at(i).resize(columns); // khởi tạo số phần tử dòng i của vector
              for (int j = 0; j < columns; ++j)
              {
                     std::cout << "Nhap matrix[" << i << "][" << j << "] = ";
                     std::cin >> matrix.at(i).at(j);
              }
       }
       // xuất mảng răng cưa
       for (int i = 0; i < rows; ++i)
       {
              int columns = matrix.at(i).size(); // lấy ra kích thước dòng 1 của mảng răng cưa
              for (int j = 0; j < columns; ++j)
              {
                     std::cout << std::setw(5) << matrix.at(i).at(j); // xuất ra phần tử nhưng cách 5 khoảng trắng cho dễ nhìn (tương tự %5d trong C)
              }
              std::cout << std::endl;
       }
       return 0;
}

Nhớ là nếu muốn nhập vector 2 chiều thông qua hàm thì tham số truyền dưới dạng tham chiếu nhé:

void Input2DVector(std::vector<std::vector<int>> &matrix)
{
       // function contents
}

Ở trên là hướng dẫn của mình, nếu bạn thấy chỗ nào khó hiểu thì cứ hỏi nhé !
P/S: Bạn có thể tham khảo 1 số tutorial về C++ (bao gồm array, pointer, file, struct, …) ở trang CPP của Dạy Nhau Học nhé: https://cpp.daynhauhoc.com/

3 Likes

cảm ơn b mình thấy bài hướng dẫn của b rất dễ hiểu và bổ ích.

1 Like

xài at(i) chi vậy, sao ko xài [i]. at(i) chậm hơn [i]: chạy chậm hơn, gõ chậm hơn. Nếu mình biết chắc i ko thể < 0 hoặc >= size() thì xài [i] cho lẹ.

1 Like

quên chưa bấm solution cho bác Minh.
việt xài at hat [] không quan trọng, quan trọng là vấn đề thôi. =))

À, cảm ơn anh đã nhắc !
Hôm trước xem videos về vector của anh Đạt cũng có nói về vấn đề này, thấy .at() nó bắn ra thêm cái bảng đẹp quá nên quen dùng .at() luôn :joy:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?