Các thao tác cơ bản với mảng một chiều

Bài 1: Ngắn gọn hơn

#include <iostream>

int main() {

	int arr[] = { 1, 2, 3, 4, 5, 6 };
	int num = sizeof(arr) / sizeof(int);

	for (int i = num - 1; i >= 0; --i) 
		std::cout << arr[i] << "  ";

	system("pause");
	return 0;
}
1 Like

Bài 3: sửa lại một chút

// In ra các phần tử trong mảng không bị lặp lại

#include <iostream>

using namespace std;

int main() {

	int arr[] = { 4, 6, 2, 2, 1, 6, 9 };
	int num = sizeof(arr) / sizeof(int);

	for (int i = 0; i < num; ++i) {

		bool flag = 1;

		for (int j = 0; j < i; ++j) {

			if (arr[j] == arr[i]) {

				flag = 0;
				break;
			}
		}

		if (flag)	cout << arr[i] << "  ";
	}

	system("pause");
	return 0;
}
1 Like

Bài 2:

// So sánh tổng các phần tử chẵn với tổng các phần tử lẻ trong mảng một chiều

#include <iostream>

int main() {

	int a[] = { 3, -2, 5, 4, -8, 10, 12, 17, 0 };
	int num = sizeof(a) / sizeof(int);

	int tc = 0;
	int tl = 0;

	for (int i = 0; i < num; ++i) {

		if (a[i] % 2 == 0)	tc += a[i];
		if (a[i] % 2 != 0)	tl += a[i];
	}

	(tc > tl) ? std::cout << "\n tong chan lon hon tong le\n" : 
		std::cout << "\n tong chan nho hon hoac bang tong le\n";

	system("pause");
	return 0;
}
1 Like

Bài 3:
// Mọi người tham khảo và góp ý dùm mình bài này đã tối ưu hay chưa? Còn cách nào khác nhanh hơn không cho mình tham khảo. Cảm ơn!

#include <iostream>
#include <string>
using namespace std;

void main()
{
	//a nhận các giá trị nhập vào. b lưu các giá trị đã xuất ra màn hình.
	int a[100], b[100];
	cout << "Enter number of element: ";
	int n, i, j;
	cin >> n;

	for (i = 0; i < n; i++)
	{
		cout << "a[" << i << "] = ";
		cin >> a[i];
	}

	int number_of_array = 0; // Số lượng hiện tại của mảng b. Tức là các giá trị đã xuất ra màn hình.
	bool check;
	
	for (i = 0; i < n; i++)
	{
		// Kiểm tra số A[i] có trùng với những số đã xuất ra hay chưa.
		check = true; 
		for (j = 0; j < number_of_array; j++)
		{
			if (a[i] == b[j])
			{
				check = false;
				break;
			}
		}
		// Kiểm tra đã trùng số đã xuất ra hay chưa, chưa thì in và lưu giá trị của số vừa xuất ra.
		if (check) 
		{
			cout << a[i] << " ";
			b[number_of_array] = a[i];
			number_of_array++;
		}
	}

	cout << endl;
	system("pause");
}
1 Like
// why (N - 2)?
for (int32_t i = N - 2; i >= insert_position; i--) {

	int32_t after_i = i + 1;
	arr[after_i] = arr[i];
}

mn giai thich ho em dieu kien nay voi

bài 1:

int main()
{
	//initialize array
	int32_t arr[] = { 2, 6, 5, 7, 9, 1, 3 }; 
	int32_t N = sizeof(arr) / sizeof(int32_t); //tinh gia tri cua mang
	//chay mang tu a[n-1] den a[0] 
	for (int32_t i = N  - 1; i >= 0; i--)  
	{
		cout << arr[i];
	}
		_getch();
		return 0;
	
}

Code bài 3 của e như này được ko ạ,

#include <iostream>

using namespace std;

int main()
{
	int arr[]={5,2,4,5,2,3,1,5,3,2};
	int n=sizeof(arr)/sizeof(int);
	int i=0,j=0,k=0;
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(arr[i]==arr[j])
				{
					for(k=j;k<n;k++)
						arr[k]=arr[k+1];
						n--;
				}
		}
	}
	for(i=0;i<n;i++)
	cout<<arr[i]<<"\t";

	system("pause>nul");
	return 0;
}
1 Like

Cho mình hỏi chỗ j-- là sao vậy mọi người?

int main() {
    int mangbatky = { 4, 6, 2, 2, 1, 6, 9, 8, 4, 5, 10, 4, 4, 4, 4, 4, 10, 8, 4, 4, 8, 1, 15 };
    int soluong = sizeof(mangbatky) / sizeof(int);
    for (int i = 0; i < soluong; i++) {
        for (int j = i+1; j < soluong; j++) {
            if (mangbatky[j] == mangbatky[i]) {
                for (int t = j + 1; t < soluong; t++) {
                    int before_t = t - 1;
                    mangbatky[before_t] = mangbatky[t];
                }
                j--;
                soluong--;
            }
        }
    }
    for (int i = 0; i < soluong; i))
        cout << mangbatky[i] << " ";
    cout << endl;
    system("pause");
    return 0;
}
1 Like

Cho em hỏi tại sao index trong bài insert position là index = N - 2 với ạ :fearful:
Theo em nghĩ với cách như vậy thì biến trong mảng cuối sau khi N++ không được gán giá trị nào hết.

//inserting
	N++;
	for (int32_t i = N - 2; i >= insert_position; i--) {

		int32_t after_i = i + 1;
		arr[after_i] = arr[i];
	}
	arr[insert_position] = insert_value;
1 Like

N là size của mảng ban đầu. Do đó phần tử cuối cùng có index là N - 1.

Sau khi tăng N lên (N++, do thêm 1 phần tử vào mảng) thì index của phần tử cuối cùng của mảng (ban đầu) phải là N - 2.

Mình thấy code trên không có vấn đề gì. Hay bạn còn thắc mắc chỗ nào.

1 Like

Vâng cảm ơn sau khi post commect này lên thì em mới hiểu ra :v

1 Like

Không nhiều bài trùng ý!

cho mình hỏi tại sao lại có K-- , vậy bạn

Vì để giữ nguyên vị trí lặp, sau khi xóa phần tử trùng.
Khi này, tại vị trí hiện tại sẽ là 1 phần tử với giá trị mới, vẫn xét tại vị trí này.

3 Likes

Bài 1:

#include<stdint.h>
using namespace std;
int main(){
    int32_t arr[]={2,6,5,7,9,1,3};
    int32_t number_of_elements = sizeof(arr)/sizeof(int32_t);
    /*CÁCH 1*/
/*    for(int32_t i=0, j=number_of_elements-1; i<=(number_of_elements-1)/2, j>=(number_of_elements-1)/2; i++, j--){
            int32_t temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;      
    }
*/   
    /*CÁCH 2*/
    for(int32_t i=0; i<=number_of_elements-1; i++){
            for(int32_t j=i+1; j<=number_of_elements-1; j++){
                int32_t temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
    }
    for(int32_t i=0; i<=number_of_elements-1; i++){
        cout << arr[i] << "\t";
    }
    cout << endl;
    system("pause");
    return 0;
}

Bài 2:

    #include<iostream>
    #include<stdint.h>
    using namespace std;
    #define MAX_SIZE 50
    int main(){
        int32_t arr[MAX_SIZE];
        int32_t num;
        cout << "Nhap so luong phan tu: ";
        cin >> num;
        for(int32_t i=0; i<=num-1; i++){
            cout << "arr[" << i << "] = ";
            cin >> arr[i];
        }
        cout << "Mang vua nhap la: " << endl;
   int32_t tong_chan=0, tong_le;
        for(int32_t i=0; i<=num-1; i++){
            cout << arr[i] << endl;
            if(arr[i] % 2 != 0) tong_le+=arr[i];
            else tong_chan+=arr[i];
        }
        cout << "Tong cac so chan co trong mang la : " << tong_chan << endl;
        cout << "Tong cac so le co trong mang la : " << tong_le << endl;
        if(tong_chan > tong_le) cout << "Tong chan lon hon tong le" << endl;
        else if(tong_chan < tong_le) cout <<"Tong le lon hon tong chan" << endl;
        else cout << "Tong chan bang tong le" << endl;
        system("pause");
        return 0;
    }

Bài 3:

#include<iostream>
#include<stdint.h>
using namespace std;
#define MAX 50
int main(){
    int32_t arr[MAX];
    int32_t num;
    cout << "Nhap so phan tu cua mang: ";
    cin >> num;
    for(int32_t i=0; i<=num-1; i++){
        cout << "arr[" << i << "] = ";
        cin >> arr[i];
    }
    for(int32_t i=0; i<=num-1; i++){
        for(int32_t j=i+1; j<=num-1; j++){
            if(arr[j]==arr[i]){
                for(int32_t k=j; k<=num-1; k++){
                int32_t temp=arr[k];
                arr[k]=arr[k+1];
                arr[k+1]=temp;
                }
                num--;
            }
        }
    }
    cout << "Mang sau khi loai cac gia tri trung lap la: " << endl;
    for(int32_t i=0; i<=num-1; i++){
        cout << arr[i] << "\t";
    }
    cout << endl;
    system("pause");
    return 0;
}

CAO NHÂN NÀO RẢNH CHECK GIÚP MÌNH VỚI Ạ? MÌNH CẢM ƠN RẤT NHIỀU :> VÌ RẤT MUỐN BIẾT LỖI SAI ĐỂ CẢI THIỆN HOẶC CÁCH MÌNH LÀM CÓ THẬT SỰ LÀ HIỆU QUẢ NHẤT KHÔNG Ạ?

1 Like

Bài 1: Thay vì sử dụng 2 vòng for để nhích từng chút một các phần tử của mảng sao bạn không dùng 1 vòng for và đổi chỗ phần tử arr[i] với arr[n - i] nhỉ.
Bài 2:

Bắt quả tang chưa gán giá trị cho tổng lẻ nha.
Bài 3: Có vẻ ổn rồi đó nhưng mình chỉ nêu 1 cách nữa(không áp dụng được cho số rất rất lớn) là tìm max sau đó sử dụng kĩ thuật mảng đánh dấu. Nếu bạn chưa biết nó là gì thì có thể google thêm nhé.

P/s: Lần sau chú ý ghi tóm tắt cái tên bài lên đầu bài nhé. Lật lên topic trên cùng mệt lắm. Ví dụ :
Bài 1: Đảo ngược mảng.
Bài 2: So sánh tổng chẵn và lẻ trong mảng
Bài 3: Loại bỏ giá trị trung lặp trong mảng.
Thêm cái nữa là không dùng caplock để viết tất cả các chữ nhé.

4 Likes

Em cảm ơn nhiều ạ! *grateful . Để em edit lại.

  1. E ngu quá, k nghĩ ra cách này, toàn phức tạp hóa, tội compiler.
  2. À câu 2 này, tại sao mình không khai bao giá trị của tong_chan=0 thì tong_chan sẽ tự có kết quả là 1, thành ra kết quả nó sẽ cộng thêm 1 vậy anh?
  3. Okey, để em rút kinh nghiệm.
3 Likes

Cho hỏi lại chút là trường hợp nào cũng bị cộng thêm 1 hay sao ạ. Nếu trường hợp nào cũng như thế thì có lẽ do complier bạn dùng có chức năng dọn rác, còn không thì chỉ là trùng hợp thôi. Nếu bạn học đến con trỏ và cấp phát động thì sẽ rõ hơn về cái này.

3 Likes

E nghĩ khai báo biến k gán giá trị thì compiler sẽ mặc định là 0, nhưng mà tùy hả a, vì bên visual code e khai báo tong_chan nhưng k gán giá trị thì nó mặc định là 1, còn visual studio thì nếu k gán giá trị sẽ bị lỗi chưa khởi tạo.
Cách dùng kĩ thuật mảng đánh dấu làm bài 3 hiệu quả hơn rõ , cảm ơn a nhiều!

2 Likes

code của mình về bài 3 như thế này:

//loai cac gia tri trung lap
#include <iostream>
using namespace std;

int main() {
	int arr[100];
	int n;
	
	//khoi tao mang
	cout << "Nhap so luong phan tu cua mang: " ; cin >> n;
	for (int i = 0; i < n; i++) {
		cout << "Nhap phan tu " << i+1 << ": ";
		cin >> arr[i];
	}
	
	//xoa cac so trung lap
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (arr[i] == arr[j]) {
				for (int k = j; k < n; k++) {					
					arr[k] = arr[k+1];
				}
				n--;
			}
		}
	}
	
	cout << "Mang sau khi loai bo cac gia tri trung lap: ";
	for (int i = 0; i < n; i++) {
		cout << arr[i] << " ";
	}
	cout << endl;
    return 0;
}

khi mình chạy chương trình, thấy có vấn đề chút mà ko hiểu phải xử lí ở đâu ? có bác nào biết chỉ giúp mình với ạ

chạy lần 1 (khi nhập các giá trị trùng lặp 2 lần, chương trình chạy ok)

EDIT (@library): @Quang_Vinh_Vu cậu nhớ sử dụng Markdown để format code từ các post sau nhé!

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