Code tìm số âm lớn nhất của mảng bị sai

Các pro giúp em bài này với, đề là tìm số âm lớn nhất của mảng

#include<stdio.h>
using namespace std;

void NhapMang(float a[], int &n)
{
    do
    {
        printf("\nNhap so phan tu: ");
        scanf_s("%d", &n);
        if (n <= 0)
        {
            printf("\nSo phan tu khong hop le. Xin kiem tra lai !");
        }
    } while (n <= 0);
    for (int i = 0; i < n; i++)
    {
        printf("\nNhap a[%d]: ", i);
        scanf_s("%f", &a[i]);
    }
}

int vitriam(float a[], int n)
{
    for (int i = 0; i < n; i++)
    {
        if (a[i] < 0)
        {
            return i;
        }
    }
    return 0;
}

float amlonnhat(float  a[], int n, int vitriamdau)
{
    float AmMax = a[vitriamdau];

    for (int i = vitriamdau; i < n; i++)
    {
        if (a[i] < 0 && a[i] > AmMax)
        {
            AmMax = a[i];
        }
    }
    return AmMax;
}

void main()
{
    int n;
    float a[10];

    NhapMang(a, n);
    int vitriamdau = vitriam(a, n);
    if (vitriamdau == 0)
    {
        printf("\nMang khong co so am!\n");
    }
    else
    {
        float AmMax = amlonnhat(a, n, vitriamdau);
        printf("\nSo am lon nhat la: %.2f\n", AmMax);
    }
}

Trong hàm main if(vitriamdau)==0 thì lúc chạy ra kq sai, còn if(vitriamdau)==1 thì chạy kq đúng, hoang mang quá ạ :(((

Sửa lại tiêu đề và nội dung bài viết cho phù hợp. Sau đó pm mình or reply trực tiếp topic này mình sẽ mở lại cho người khác thấy và giúp đỡ.

1 Like

Đã mở lại topic nhé :smiley:

1 Like

Vòng for đầu tiên Tìm vị trí âm đầu tiên gắn đó là max.

Tiếp theo bạn chạy 1 vòng for từ vị trí đó và so sánh (a[i] < 0 && a[i] > max) thì gắn max là giá trị cần tìm

Có thể viết trong 1 hàm cũng được không cần tách nhiều hàm vậy đâu

1 Like

Mình làm C# quen tay nên viết C++ cũng theo kiểu hướng đối tượng :v:

#include <iostream>
#include <conio.h>
using namespace std;
class Mang100So
{
	unsigned short int SoLuong;
	double PhanTu[100];
public:
	Mang100So(unsigned short int Input)
	{
		SoLuong = Input;
		for (int i = 0; i < SoLuong; i++)
		{
			cout << "Nhap so thu " << i + 1 << ":";
			cin >> PhanTu[i];
		}
	}
	void GiaTriAmLonNhat()
	{
		double KetQua;
		unsigned short int ViTri = 0;
		KetQua = PhanTu[0];
		if (KetQua < 0) ViTri = 1;
		for (int i = 0; i < SoLuong; i++)
			if (PhanTu[i] < 0)
				if (KetQua > 0 || KetQua < PhanTu[i])
				{
					KetQua = PhanTu[i];
					ViTri = i + 1;
				}
		if (ViTri == 0) cout << "Trong mang khong co so am";
		else cout << "So am lon nhat trong mang la " << KetQua << " o vi tri thu " << ViTri;
	}
};
void main()
{
	unsigned short int SoLuong;
	do
	{
		cout << ("Nhap so phan tu: ");
		cin >> SoLuong;
		if (SoLuong < 0)
			cout << "So phan tu khong hop le. Xin kiem tra lai !\n";
	}
	while (SoLuong < 0);
	Mang100So Input = Mang100So(SoLuong);
	Input.GiaTriAmLonNhat();
	_getch();
}
1 Like

sort từ nhỏ đến lớn, dùng quick sort cho nhanh, rồi duyệt từ đầu cho đến số không âm, tìm được số âm lớn nhất

1 Like

Đề chỉ yêu cầu tìm số lớn nhất, chứ có yêu cầu sort đâu. Nếu duyệt từ đầu đến cuối rồi lưu lại vị trí như thuật toán của mình thì thời gian thực hiện là O(n). Còn quicksort rồi duyệt thì chắc chắn là không nhanh hơn n, mà trường hợp anh nào nhọ thì ra n^2 =))

tks bác, nhưng vấn đề ở cái return vitriam ạ, chạy thử bài của em và so sánh kq khi if (vitriamdau == 0) và if (vitriamdau == 1) thì mới thấy lạ, help me :persevere:

Thì hàm của bạn sai còn gì :expressionless:

int vitriam(float a[], int n)
{
	for (int i = 0; i < n; i++) //i chạy từ 0 đến n
	{
		if (a[i] < 0)
		{
			return i; //đưa ra vị trí đầu tiên là số âm, nếu số a[0] là số âm thì hàm này cũng trả về 0 =))
		}
	}
	return 0;
}

Cách sửa là trong hàm int vitriam(float a[],int n) đoạn return 0; kia bạn thay bằng return -1; trong hàm void main() thì bạn sửa lại thành if (vitriamdau == -1) printf("\nMang khong co so am!\n");

vậy là lúc nào hàm cũng trả về 0, sửa return 0 thành return -1 hay số nào khác 0 cũng được hả anh:smiley:

Sửa thành số âm. Chứ nếu sửa thành 2, rồi số a[2] lại là số âm đầu tiên thì nó lại lỗi tiếp đó ==’

à em hiểu r, nhưng vụ return vẫn mơ hồ quá ==’

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