Các thao tác trên Mảng một chiều

Khóa học lập trình C++ căn bản

5.0 (10 đánh giá)
Tạo bởi Kteam Cập nhật lần cuối 5 năm trước 176.421 lượt xem 19 bình luận
Tác giả/Dịch giả: Kteam
Học nhanh

Danh sách bài học

01. Giới thiệu về C++ 02. Cài đặt môi trường phát triển (IDE) Visual studio 2015 03. Xây dựng chương trình C++ đầu tiên với Visual Studio 2015 04. Cấu trúc một chương trình C++ (Structure of a program) 05. Ghi chú trong C++ (Comments in C++) 06. Biến trong C++ (Variables in C++) 07. Số tự nhiên và Số chấm động trong C++ (Integer, Floating point) 08. Kiểu ký tự trong C++ (Character) 09. Kiểu luận lý và cơ bản về Câu điều kiện If (Boolean and If statements) 10. Nhập, Xuất và Định dạng dữ liệu trong C++ (Input and Output) 11. Hằng số trong C++ (Constants) 12. Toán tử số học, toán tử tăng giảm, toán tử gán số học trong C++ (Operators) 13. Toán tử quan hệ, logic, bitwise, misc và độ ưu tiên toán tử trong C++ 14. Cơ bản về chuỗi ký tự trong C++ (An introduction to std::string) 15. Biến cục bộ trong C++ (Local variables in C++) 16. Biến toàn cục trong C++ (Global variables in C++) 17. Biến tĩnh trong C++ (Static variables in C++) 18. Ép kiểu ngầm định trong C++ (Implicit type conversion in C++) 19. Ép kiểu tường minh trong C++ (Explicit type conversion in C++) 20. Cơ bản về Hàm và Giá trị trả về (Basic of functions and return values) 21. Truyền Giá Trị cho Hàm (Passing Arguments by Value) 22. Truyền Tham Chiếu cho Hàm (Passing Arguments by Reference) 23. Tiền khai báo và Định nghĩa Hàm (Forward declarations and Definitions of Functions) 24. Giới thiệu về cấu trúc điều khiển (Control flow introduction) 25. Câu điều kiện If và Toán tử điều kiện (If statements and Conditional operator) 26. Câu điều kiện Switch trong C++ (Switch statements) 27. Câu lệnh Goto trong C++ (Goto statements) 28. Vòng lặp While trong C++ (While statements) 29. Vòng lặp Do while trong C++ (Do while statements) 30. Vòng lặp For trong C++ (For statements) 31. Từ khóa Break and continue trong C++ 32. Phát sinh số ngẫu nhiên trong C++ (Random number generation) 33. Mảng 1 chiều trong C++ (Arrays) 34. Các thao tác trên Mảng một chiều 35. Mảng 2 chiều trong C++ (Two-dimensional arrays) 36. Các thao tác trên Mảng 2 chiều 37. Mảng ký tự trong C++ (C-style strings) 38. Các thao tác trên Mảng ký tự (C-style strings) 39. Từ khóa auto trong C++11.(The auto keyword) 40. Vòng lặp for each trong C++11 (For each loops) 41. Lớp dựng sẵn Array trong C++11 42. Con trỏ cơ bản trong C++ 43. Con trỏ NULL trong C++ (NULL pointers) 44. Con trỏ và mảng trong C++ (Pointers and arrays) 45. Các phép toán trên Con trỏ và Chỉ mục mảng trong C++ (Pointers and arrays) 46. Cấp phát động trong C++ (Dynamic memory allocation). 47. Cấp phát mảng động (Dynamically allocating arrays) 48. Con trỏ & Hằng trong C++ 49. Biến tham chiếu trong C++.(Reference variables) 50. Con trỏ void (Void pointers) 51. Con trỏ trỏ đến con trỏ (Pointers to pointers) 52. Cơ bản về lớp Vector 53. Truyền địa chỉ cho hàm (Passing arguments by address) 54. Hàm trả về giá trị, tham chiếu và địa chỉ trong C++(value, reference, and address) 55. Hàm nội tuyến trong C++ (Inline functions) 56. Nạp chồng hàm trong C++ (Function overloading) 57. Hàm có đối số mặc định trong C++ (Default arguments) 58. Con trỏ hàm trong C++ (Function pointers) 59. Đệ quy trong C++ (Recursion) 60. Khuôn mẫu hàm trong C++ (Function templates)

Các thao tác trên Mảng một chiều

Dẫn nhập

Ở bài học trước, mình đã chia sẻ cho các bạn về khái niệm và cách sử dụng MẢNG MỘT CHIỀU TRONG C++ (Arrays).

Hôm nay, mình sẽ giới thiệu cho các bạn về Các thao tác trên mảng một chiều trong C++.


Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về:

Trong bài ta sẽ cùng tìm hiểu các vấn đề:

  • Truyền mảng vào hàm (passing arrays to functions)
  • Nhập và xuất mảng 1 chiều
  • Sao chép mảng 1 chiều
  • Tìm kiếm phần tử trong mảng
  • Sắp xếp mảng 1 chiều
  • Thêm và xóa một phần tử trong mảng

Truyền mảng vào hàm (passing arrays to functions)

Trong bài TRUYỀN GIÁ TRỊ CHO HÀM (Passing Arguments by Value), bạn đã biết khi một biến truyền vào hàm theo phương pháp truyền giá trị, C++ sẽ sao chép giá trị của đối số vào tham số của hàm. Vì tham số hàm là 1 bản sao, nên việc thay đổi giá trị tham số không làm thay đổi giá trị đối số ban đầu.

Đối với kiểu dữ liệu mảng, việc sao chép 1 số lượng lớn các phần tử sẽ gây tốn rất nhiều vùng nhớgiảm hiệu suất. Nên khi truyền mảng vào hàm, tham số của hàm chính là địa chỉ vùng nhớ của phần tử đầu tiên trong mảng. Vì vậy, mảng có thể thay đổi nội dung sau khi thực hiện hàm

Lưu ý khi truyền mảng vào hàm:

  • Tham số kiểu mảng trong khai báo hàm giống như khai báo biến mảng.
  • Tham số kiểu mảng truyền cho hàm chính là địa chỉ của phần tử đầu tiên của mảng.
    • Có thể bỏ số lượng phần tử hoặc sử dụng con trỏ.
    • Mảng có thể thay đổi nội dung sau khi thực hiện hàm.
  • Số lượng phần tử thực sự truyền qua biến khác.

Tất cả các ví dụ bên dưới sẽ sử dụng phương pháp truyền mảng vào hàm.


Nhập và xuất mảng 1 chiều

Bên dưới là ví dụ về nhập, xuất dữ liệu cho mảng 1 chiều:

Output:

Các thao tác trên Mảng một chiều


Sao chép mảng 1 chiều

Ý tưởng: Để tạo ra một bản sao từ một mảng, bạn cần khai báo thêm 1 mảng khác có cùng kích thước với mảng ban đầu.

Chương trình:

Output:

Các thao tác trên Mảng một chiều


Tìm kiếm phần tử trong mảng

Yêu cầu: Tìm xem phần tử x có nằm trong mảng myArray kích thước n hay không? Nếu có thì nó nằm ở vị trí đầu tiên nào?

Ý tưởng: Xét từng phần của mảng myArray. Nếu phần tử đang xét bằng x thì trả về vị trí đó. Nếu không tìm được thì trả về -1.

Chương trình:

Output 1:

Các thao tác trên Mảng một chiều

Output 2:

Các thao tác trên Mảng một chiều


Sắp xếp mảng 1 chiều

Yêu cầu: Cho trước mảng myArray kích thước n. Hãy sắp xếp mảng a đó sao cho các phần tử có giá trị tăng dần.

Ý tưởng: Sử dụng 2 biến ij để so sánh tất cả cặp phần tử với nhau và hoán vị các cặp nghịch thế (sai thứ tự).

Chương trình:

Output:

Các thao tác trên Mảng một chiều


Thêm và xóa một phần tử trong mảng

Thêm một phần tử vào mảng

Yêu cầu: Thêm phần tử x vào mảng myArray kích thước n tại vị trí idx.

Ý tưởng:

  • “Đẩy” các phần tử bắt đầu tại vị trí idx sang phải 1 vị trí.
  • Đưa x vào vị trí idx trong mảng.
  • Tăng n lên 1 đơn vị.

Chương trình:

Output:

Các thao tác trên Mảng một chiều


Xóa một phần tử trong mảng

Yêu cầu: Xóa một phần tử trong mảng a kích thước n tại vị trí vt

Ý tưởng:

  • “Kéo” các phần tử bên phải vị trí idx sang trái 1 vị trí.
  • Giảm n xuống 1 đơn vị.

Chương trình:

Output:

Các thao tác trên Mảng một chiều


Kết luận

Qua bài học này, bạn đã biết được Các thao tác trên Mảng một chiều trong C++. Còn rất nhiều thao tác khác trên mảng 1 chiều, trong phạm vi bài học không thể đề cập hết được, các bạn hãy tự mình tìm hiểu và bình luận bên dưới để chia sẻ cho mọi người nhé.

Trong bài tiếp theo, mình sẽ giới thiệu cho các bạn về MẢNG HAI CHIỀU (Multidimensional arrays) trong C++.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Các thao tác trên Mảng một chiều dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Tác giả/Dịch giả

Khóa học

Khóa học lập trình C++ căn bản

Hiện nay, C++ đã là cái tên rất quen thuộc trong ngành lập trình. Mặc dù C++ là ngôn ngữ lập trình đã ra đời khá lâu, nhưng không phải ai cũng có cơ hội để tìm hiểu về nó.

Vì vậy, Kteam đã xây dựng lên khóa học LẬP TRÌNH C++ CĂN BẢN để cung cấp một lượng kiến thức về ngôn ngữ C++ nói riêng, và các khái niệm khác trong lập trình nói chung.

Nội dung khóa học sẽ được phân tách một cách chi tiết, nhằm giúp các bạn dễ hiểu và thực hành được ngay. Serial dành cho những bạn chưa có bất kỳ kiến thức gì về lập trình, hoặc những bạn mất căn bản muốn lấy lại kiến thức nền tảng lập trình, cụ thể là C++.

Đánh giá

5.0
10 đánh giá
Đánh giá
5
10
4
3
2
1
win1702 đã đánh giá 8 tháng trước

dinhcuong1 đã đánh giá 2 năm trước

rarl123 đã đánh giá 2 năm trước

thuong2002 đã đánh giá 3 năm trước

uuvvww đã đánh giá 3 năm trước

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
tronghoang đã bình luận 2 năm trước

Dạ mn cho e hỏi: không biết em viết code xóa 1 số theo form này đúng không ạ, kết quả ra đúng nhưng e sợ trường hợp khác bị lỗi. Em cảm ơn

#include <iostream>
#include <ctime>
#include <cstdlib>   ///dung cho srand() and rand()

using namespace std;

#define MAX 1000


void khoi_tao_mang_1_chieu(int a[], int &n)            // &n nghĩa là n tự sẽ dc lưu lai và dùng được cho toàn bộ ctrinh
{
    srand(time(NULL));                    // giúp tránh trùng lặp số cho hàn random phía dưới => rand() đồng thời khai báo lấy random theo thời gian thực
    cout << "nhap kich thuoc mang:";
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        a[i] = rand() % 1000 + 1;  ///rand() la tạo random 1 chuỗi giá trị  nằm trong khảng (0-Rand_max)
    }
}
void hien_thi_mang_1_chieu(int a[], int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << "array [" << i << "] = " << a[i] << endl;
    }
}

void xoa_1_phan_tu_trong_mang(int ar[],int a[],int &n)
{
    int x;
    cout << "nhap gia tri x can xoa: ";
    cin >> x;
    for (int i = 0; i < n; i++)
    {
        if (a[i] == x)
        {
            for(;i<n;i++)
                ar[i] = a[i + 1];
            n--;
        }
        ar[i] = a[i];
    }
}

int main()
{
    int array[MAX];
    int nSize;          // kích thước mảng do người dùng tự nhập
    int n;

    khoi_tao_mang_1_chieu(array,nSize);    // array = a[], nSize = n, đối với mảng thì k cần kí tự "&" thì mảng cũng tự lưu cho toàn bộ ctrinh
    hien_thi_mang_1_chieu(array, nSize);
    
    //gia tri cần xóa
    //int x;
    //int address;
    //khỏi tao 1 mang cung kich thuoc voi mảng array
    int array_tru[MAX];
    xoa_1_phan_tu_trong_mang(array_tru, array, nSize);
    cout << "mang array sau khi xoa 1 gia tri:" << endl;
    hien_thi_mang_1_chieu(array_tru, nSize);

#if 0    //cách số 2 để xóa 1 phần tử trong mảng
    int idx;
    cout << "nhap vi tri can xoa:";
    cin >> idx;
    xoa_1_phan_tu_trong_mang(array, nSize, idx);
    /// xuất mảng sau khi xóa
    cout << "array: " << endl;
    xuatmang(array, nSize);
#endif
    return 0;
}
huyonezeno đã bình luận 2 năm trước

sao chỗ công đoạn dịch sáng phải khi chèn thêm một phần tử vào vị trí x của mảng nào đo lại bắt đầu từ n mà ko phải từ n-1 v ạ

 

manh12345 đã bình luận 2 năm trước

anh ơi mảng thay đổi sau lời gọi hàm tại sao ko thêm tham số (&) cho nó vậy ạ

 

cvmKteam03 đã bình luận 3 năm trước
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#define MAX 100
using namespace std;

void inputMatrix(int arr[], int &nSize);
void outputMatrix(int arr[], int size);
void addEltMatrix(int fromMatrix[], int &fromSize);
void deleteEltOfMatrix(int arr[], int &size);
void SortAZ(int arr[], int size);
int main() {
    Origin:
    int arr[MAX];
    int nSize;
    int selection;
    cout << setfill('_');
    cout << setw(20) << left << "_";
    cout << setw(6) <<" Menu ";
    cout << setw(20) << left << "_" << endl;
    cout << setfill(' ');
    cout << setw(5) << left << "|";
    cout << setw(36)<< left <<"1. Enter array";
    cout <<  setw(5) << right << "|" << endl;
    cout << setw(5) << left << "|";
    cout << setw(36)<< left <<"2. Export array";
    cout <<  setw(5) << right << "|" << endl;
    cout << setw(5) << left << "|";
    cout << setw(36)<< left <<"3. Add element to array";
    cout <<  setw(5) << right << "|" << endl;
    cout << setw(5) << left << "|";
    cout << setw(36)<< left <<"4. Delete elements of array";
    cout <<  setw(5) << right << "|" << endl;
    cout << setw(5) << left << "|";
    cout << setw(36)<< left <<"5. Sort array from small to large";
    cout <<  setw(5) << right << "|" << endl;
    cout << setw(5) << left << "|";
    cout << setw(36)<< left <<"6. Clear Screen";
    cout <<  setw(5) << right << "|" << endl;
    cout << setw(5) << left << "|";
    cout << setw(36)<< left <<"0. Exit";
    cout <<  setw(5) << right << "|" << endl;
    cout << setfill('_') << setw(46) << left << "_" << endl;
    do {
        cout << "Enter your option: ";
        cin >> selection;
        switch(selection) {
            case 1:
                inputMatrix(arr, nSize);
                break;
            case 2:
                outputMatrix(arr, nSize);
                break;
            case 3:
                addEltMatrix(arr, nSize);
                break;
            case 4:
                deleteEltOfMatrix(arr, nSize);
                break;
            case 5:
                SortAZ(arr, nSize);
                break;
            case 6:
                system("cls");
                goto Origin;
                break;
        }
    } while(selection != 0);
    return 0;
}
void inputMatrix(int arr[], int &nSize) {
    // GOTO/////////
    enterNumArrayElt:
    ////////////////
    int i = 0;
    srand(time(0));
    cout << "Enter the number of array elements: ";
    cin >> nSize;
    if(cin.fail()) {
        cin.clear();
        cin.ignore();
        cout << "ERROR!  ";
        goto enterNumArrayElt;
    }
    while(i < nSize) arr[i++] = rand();
}
void outputMatrix(int arr[], int size) {
    int i = 0;
    while(i < size)
    cout << "a[" << i++ << "] = " << arr[i] << endl; 
}
void addEltMatrix(int fromMatrix[], int &fromSize) {
    int nQuantity;
    int idBegin;
    cout << "Enter the number of elements to add: ";
    cin >> nQuantity;
    cout << "Index starts from: ";
    cin >> idBegin;
    for(int i = fromSize + nQuantity-1; i >= nQuantity+idBegin; i--)
    fromMatrix[i] = fromMatrix[i - nQuantity];    
    for(int i = idBegin; i < idBegin+nQuantity; i++) {
        cout << "a[" << i << "] = ";
        cin >> fromMatrix[i];
    }
    cout<< endl << setfill('/') << setw(46) << left << "/" << endl;
    cout << endl << "New array!" << endl << endl;
    outputMatrix(fromMatrix, fromSize+nQuantity);
    fromSize += nQuantity;
}
void deleteEltOfMatrix(int arr[], int &size) {
    int from, to;
    cout << "Index starts from: ";
    cin >> from;
    cout << "to: ";
    cin >> to;
    int quantity = to - from + 1;
    int goOn = 1;
    while(goOn) {
        for(int i = from; i <= to; i++) {
            if(i+quantity >= size) {
                size = i;
                goOn = 0;
                break;
            }
            arr[i] = arr[i + quantity];
        }
        if(goOn) {
            from += quantity;
            to += quantity;
        }
    }
    cout << endl << setfill('/') << setw(46) << left << "/" << endl;
    cout << endl <<"New array!" << endl << endl;
    outputMatrix(arr, size);
}
void SortAZ(int arr[], int size) {
    for(int i=0; i<size-1; i++)
    for(int j=size-1; j>i; j--)
    if(arr[j-1] > arr[j]) {
        int swap = arr[j-1];
        arr[j-1] = arr[j];
        arr[j] = swap;
    }
    cout << endl << setfill('/') << setw(46) << left << "/" << endl;
    cout << endl <<"New array!" << endl << endl;
    outputMatrix(arr, size);
}
Huy60kg đã bình luận 4 năm trước

đoạn truyền tham trị rối luôn

 

Không có video.