Tìm phần tử lớn thứ n của 1 mảng?

Em là người code bài này này.

  • Đề bài là:

Nhập vào một mảng n phần tử, sau đó nhập vào giá trị m để xuất ra màn hình phần tử có giá trị lớn thứ m ( ví dụ m = 4 thì xuất ra màn hình giá trị lớn thứ tư của mảng).

Nhưng khi em chạy thì nó lại xuất ra giá trị không đúng. Nó phụ thuộc vào giá trị phantu[z] của vòng lặp for(int z=2; z<=m; z++)

#include <iostream>;
using namespace std;
void main()
{
	cout <<" nhap vao so phan tu cua mang "<< endl;
	int n;
	cin >> n;
	int *mang = new int[n];
	for(int i=1; i<=n; i++)
	{
		cout<< "nhap vao phan tu thu "<< i << endl;
		int x;
		cin >> x;
		mang[i] = x;
	}
	for(int j=1; j<=n; j++)
	{
		cout << mang[j]<< " ";
	}
	cout << " " << endl;
	int phantu1 = mang[1];
	for(int a=1; a<=n; a++)
	{
		if(mang[a] < mang[a+1])
		{
			phantu1=mang[a+1];
		}
	}
	cout <<"phan tu lon nhat la "<< phantu1 << endl;
	cout << "nhap vao bac phan tu can so sanh "<< endl;
	int m;
	cin >> m;
	int * phantu = new int[m];
	
	for(int z=2; z<=m; z++)
	{
		phantu[z];
		for(int t=1; t<=n; t++)
		{
			if(mang[t] < mang[t+1] && mang[t+1] < phantu1 && mang[t+1] < phantu[z-1])
			{
				phantu[z] = mang[t+1];
			}
		}
		cout << "phan tu lon thu "<< z <<" "<< phantu[z] << endl;
	}
	system("pause");
}

@Th_nh_Le ơi, tiêu đề là tiêu đề, mà nội dung là nội dung. Cớ làm sao mà viết cả nội dung lên tiêu đề thế?

Code này viết khó chịu quá, đặt biến gì mà m với z? Sao @Th_nh_Le không hỏi trực tiếp người code cái này?

Cụ thể @Th_nh_Le nhập vào cái gì, và in ra cái gì? Như thế nào là “giá trị lỗi”?

à, tại lần đầu em post bài nên anh thông cảm. em là người code cái này :smiley: em nhập vào một mảng n phần tử. Sau đó nhập vào giá trị m để xuất ra màn hình phần tử có giá trị lớn thứ m ( ví dụ m = 4 thì xuất ra màn hình giá trị lớn thứ tư của mảng). Nhưng khi em chạy thì nó lại xuất ra giá trị không đúng. nó phụ thuộc vào giá trị phantu[z] của vòng lặp for(int z=2; z<=m; z++)

Vậy cụ thể m là gì và z là gì? Em không thể nghĩ ra cái tên nào khó hiểu hơn à :cry:

Thế sao em không đặt biến m thành phan_tu_lon_thu_m?

Em đưa cho anh xem em nhập cái gì, và nó xuất ra cái gì?

Chốt lại, anh vẫn chưa hiểu z là cái gì?


Code em sai ở đây

for(int i=1; i<=n; i++)

Trong C và C++ và trong nhiều ngôn ngữ lập trình khác, mảng bắt đầu từ 0, chứ không phải 1.

Sửa lại

for(int i=0; i <n; i++)
1 Like
#include <iostream>;
using namespace std;
void main()
{
	cout <<" nhap vao so phan tu cua mang "<< endl;
	int n;
	cin >> n;
	int *mang = new int[n];
	for(int i=1; i<=n; i++)
	{
		cout<< "nhap vao phan tu thu "<< i << endl;
		int x;    //Thừa
		cin >> x;       cin >> mang[i];
		mang[i] = x;  //Thừa
	}
	for(int j=1; j<=n; j++)
	{
		cout << mang[j]<< " ";
	}
	cout << " " << endl;
	int phantu1 = mang[1];
	for(int a=1; a<=n; a++)
	{
		if(mang[a] < mang[a+1])    //mang[a] > phantu1;
		{
			phantu1=mang[a+1];    phantu1 = mang[a];
		}
	}
	cout <<"phan tu lon nhat la "<< phantu1 << endl;
       //Mình chỉ biết sửa tới đây.


	cout << "nhap vao bac phan tu can so sanh "<< endl;
	int m;
	cin >> m;
	int * phantu = new int[m];
	
	for(int z=2; z<=m; z++)
	{
		phantu[z];
		for(int t=1; t<=n; t++)
		{
			if(mang[t] < mang[t+1] && mang[t+1] < phantu1 && mang[t+1] < phantu[z-1])
			{
				phantu[z] = mang[t+1];
			}
		}
		cout << "phan tu lon thu "<< z <<" "<< phantu[z] << endl;
	}
	system("pause");
}

Nếu bạn học mảng động rồi, thì tất nhiên cũng biết về hàm. Tách ra thành hàm đi bạn, hàm nhập, xuất, hàm tìm phần tử lớn nhất, và cái hàm gì ở dưới đó. Chứ biến kiểu lung tung như thế rất khó hiểu. Khi đã học về mảng thì nên theo mọi người biến đầu tiên chạy là 0 kết thúc là < (biến gì đó)

2 Likes

à, vậy m là phan_tu_lon_thu_m. còn z đây giống như biến i trong vòng lặp đấy anh for(int z=2; z<=m; z++).

Vậy thì cứ khai báo là i chứ đừng khai báo là z. Vì mọi người ngầm hiểu i là index, tức là chỉ mục.

for(int i, ....)

cảm ơn bạn :smiley: mà cái phần tử lớn thứ m, mình chạy ko được

vâng, em cảm ơn anh :smiley:

Anh đã trả lời ởi trên, @Amq cũng đã chỉ ra lỗi sai của em

1 Like

Tìm phần tử lớn thứ n mình ko biết, lớn nhất lớn 2, lớn 3 mình còn tìm theo cách đơn giản, chứ lớn thứ n mình chưa học tới.

for (int i = 0; i < n; i++) //Bình thường sử dụng biến i, j, k để chạy vòng lập                               nhé. 
{
}

Khi bạn khai báo biến i ở đây, thì biến i chỉ tồn tại đến dấu }, ra dấu } thì i ko còn tồn tại. Bạn có thể sử dụng biến i này để chạy vòng for khác, không cần nhiều biến chạy thế đâu, nhìn rất rối mắt.

À còn nữa, nếu bạn khai báo mảng động, đã khai báo thì phải giải phóng nhé. Khi khai báo thì giải phóng luôn để quên.

Cài này hơi phức tạp tí, em xếp cái mảng lại trước rồi đếm.

@Th_nh_Le anh sửa cho em rồi này, mà hôm nay a mệt quá nên code có thể hơi khó hiểu tí. Em thảo luận với mọi người nhé. Anh sửa dụng thuật toán merge sort của @minh_vu_03. Có gì @minh_vu_03 giải thích dùm mấy bạn nhé :smile:

#include <iostream>
#include <stdio.h>

using namespace std;

void merge(int* array,int left,int mid,int right)
{

    int temp1[mid-left+1];
    int temp2[right-mid];
    int index_array = left;

    for(int i = 0; i < mid-left+1; i++)
        temp1[i] = array[index_array++];

    for(int i = 0; i < right - mid; i++)
        temp2[i] = array[index_array++];

    int index_temp1 = 0,index_temp2 = 0;
    index_array = left;

    while(index_temp1 <= mid - left && index_temp2 < right - mid)
    {
        if(temp1[index_temp1] < temp2[index_temp2])
        {
            array[index_array] = temp1[index_temp1];
            index_temp1++;
        }
        else
        {
            array[index_array] = temp2[index_temp2];
            index_temp2++;
        }
        index_array++;
    }

    while(index_temp1 <= mid - left)
    {
        array[index_array] = temp1[index_temp1];
        index_array++;
        index_temp1++;
    }

    while(index_temp2 < right - mid)
    {
        array[index_array] = temp2[index_temp2];
        index_array++;
        index_temp2++;
    }
}

void merge_sort(int* array,int left,int right)
{
    int mid = (right+left)/2;
    if(left < right)
    {
        merge_sort(array,left,mid);
        merge_sort(array,mid+1,right);
        merge(array,left,mid,right);
    }
}

int main()
{
    cout <<"Nhap vao so phan tu cua mang: ";
    int n;
    cin >> n;

    int *mang = new int[n];
    for(int i = 0; i < n; ++i)
    {
        cout<< "Nhap vao phan tu thu "<< i+1 << ": ";
        cin >> mang[i];
    }

    cout << "Mang vua nhap\n";
    for(int i = 0; i < n; ++i)
    {
        cout << mang[i]<< " ";
    }
    cout << endl;

    int max = mang[0];
    for(int i = 0; i < n; ++i)
    {
        if (max < mang[i])
            max = mang[i];
    }
    cout <<"Phan tu lon nhat la: "<< max << endl;
    cout << "Nhap vao bac phan tu can so sanh: ";
    int phan_tu_lon_thu_m;
    cin >> phan_tu_lon_thu_m;

    if (phan_tu_lon_thu_m > n) {
        cout << "khong ton tai phan tu lon thu " << phan_tu_lon_thu_m << endl;
        return 1;
    }


    merge_sort(mang,0,n-1);

    cout << "Mang sau khi sap xep\n";
    for(int i = 0; i < n; ++i)
    {
        cout << mang[i]<< " ";
    }
    cout << endl;

    int bien_dem = 0;
    bool found = false;
    for(int i = n-1; i > 0; --i)
    {
        if (mang[i] == mang[i-i])
            continue;

        if (++bien_dem == phan_tu_lon_thu_m)
        {
            found = true;
            cout << "Phan tu lon thu " << phan_tu_lon_thu_m << " la " << mang[i];
            break;
        }
    }

    if (!found)
        if (phan_tu_lon_thu_m == n)
            cout << "Phan tu lon thu " << phan_tu_lon_thu_m << " la " << mang[0] << endl;
        else
            cout << "khong ton tai phan tu lon thu " << phan_tu_lon_thu_m << endl;

    getchar();
    return 0;
}
2 Likes

mình trước giờ hình như k khai báo kiểu “int x” trong vòng for :smiley: cin >> mang[i] luôn không được hay sao mà lằng nhằng v ta :wink: nói chung là code nhìn chóng mặt quá :))))

Bạn ấy mới học nên ko biết đấy.

à, em ko nghĩ ra là sắp xếp lại mảng rồi sau đó mới tính đến phần tử lớn thứ m. em cứ lẩn quẩn ở chỗ cái vòng lặp là cho so sánh phần tử thứ i nhỏ hơn phần tử lớn hơn nó 1 bậc và phần tử thứ i lớn hơn phần tử thứ i+1. hôm qua em hiểu sao mà kết quả lại ko như mong muốn rồi. tại phần tử lớn hơn nó 1 bậc chưa định vị được. cảm ơn anh và mọi người nhiều :smiley:

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