01/10/2018, 00:59

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("
Nhap so phan tu: ");
		scanf_s("%d", &n);
		if (n <= 0)
		{
			printf("
So phan tu khong hop le. Xin kiem tra lai !");
		}
	} while (n <= 0);
	for (int i = 0; i < n; i++)
	{
		printf("
Nhap 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("
Mang khong co so am!
");
	}
	else
	{
		float AmMax = amlonnhat(a, n, vitriamdau);
		printf("
So am lon nhat la: %.2f
", AmMax);
	}
}
*grab popcorn* viết 03:03 ngày 01/10/2018

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 đỡ.

Duy Lâm viết 03:08 ngày 01/10/2018

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á ạ :(((

*grab popcorn* viết 03:10 ngày 01/10/2018

Đã mở lại topic nhé

bphvcg viết 03:12 ngày 01/10/2018

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

Trần Hoàn viết 03:15 ngày 01/10/2018

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

#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();
}
kiencon viết 03:06 ngày 01/10/2018

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

Trần Hoàn viết 03:04 ngày 01/10/2018

Đề 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 =))

Duy Lâm viết 03:09 ngày 01/10/2018

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

Trần Hoàn viết 03:04 ngày 01/10/2018

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

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");

Duy Lâm viết 03:15 ngày 01/10/2018

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:

Trần Hoàn viết 03:14 ngày 01/10/2018

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 đó ==’

Duy Lâm viết 03:13 ngày 01/10/2018

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

Bài liên quan
0