30/09/2018, 16:14

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");
}
Nguyễn Minh Dũng viết 18:28 ngày 30/09/2018

@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ế?

Mình ko hiểu từ cái phần vòng lặp của z

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?

mình ko biết sai chỗ nào mà sao lúc chạy ra màn hình thì nó toàn ra giá trị lỗi?

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”?

Thịnh Lê viết 18:19 ngày 30/09/2018

à, 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 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++)

Nguyễn Minh Dũng viết 18:25 ngày 30/09/2018

em là người code cái này

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 à

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

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

Nhưng khi em chạy thì nó lại xuất ra giá trị không đúng

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++)
Amq viết 18:27 ngày 30/09/2018
#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ì đó)

Thịnh Lê viết 18:31 ngày 30/09/2018

à, 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++).

Nguyễn Minh Dũng viết 18:25 ngày 30/09/2018

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

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, ....)
Thịnh Lê viết 18:21 ngày 30/09/2018

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

Thịnh Lê viết 18:19 ngày 30/09/2018

vâng, em cảm ơn anh

Nguyễn Minh Dũng viết 18:20 ngày 30/09/2018

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

biến đầu tiên chạy là 0 kết thúc là < (biến gì đó)

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++)
Amq viết 18:24 ngày 30/09/2018

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.

Nguyễn Minh Dũng viết 18:23 ngày 30/09/2018

chứ lớn thứ n mình chưa học tới.

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é

#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;
}
X viết 18:23 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:22 ngày 30/09/2018

cin >> mang[i] luôn không được hay sao

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

Thịnh Lê viết 18:14 ngày 30/09/2018

à, 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

Bài liên quan
0