Lỗi trong c++ - Không ra kết quả như mong muốn

Mọi người ơi cho em hỏi sao em ra toàn màu đỏ vậy , sao nó không mã sản phẩm, tên sản phẩm và giá sản phẩm vậy ạ em đang dùng visual studio 2012

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<stdio.h>
#include<conio.h>
#include<string>
#include<math.h>
#include<iomanip>

using namespace std;

struct San_Pham
{
    char ma[50];
    char ten[150];
    float gia;
};

void Nhap_Danh_Sach(San_Pham danh_sach_san_pham[],int n)
{
    for(int i=0;i<n;i++)
    {
        cout<<"nhap san pham thu ["<<i<<"] : \n";
        
        cout<<"nhap ma san pham : ";
        //cin.ignore();
		cin.getline(danh_sach_san_pham[i].ma,50);
		//cin.ignore();
        
        cout<<"nhap ten san pham : ";
        // cin.ignore();
		 cin.getline(danh_sach_san_pham[i].ten,150);
       
        cout<<"nhap gia san pham : ";
        //cin.ignore();
        cin>>danh_sach_san_pham[i].gia;
		cin.ignore();
        
    }
}

void Xuat_Danh_Sach(San_Pham danh_sach_san_pham[],int n)
{
    for(int i=0;i<n;i++)
    {
        San_Pham sp=danh_sach_san_pham[i];
		cout<<sp.ma<<"\t"<<sp.ten<<"\t"<<sp.gia<<"\n";
    }
}

San_Pham * Tim_San_Pham(San_Pham danh_sach_san_pham[],int n,float gia_tim)
{
	int left=0;
	int right=n-1;
	int mid = 0;
	do
	{
		mid=(left+right)/2;
		San_Pham sp=danh_sach_san_pham[mid];
		if(sp.gia == gia_tim)
		{
			return &sp;
		}
		else if(sp.gia>gia_tim)
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
	}while (left<=right);

	return NULL;
}

int main()
{
    //cout<<"Hello World";
    
    int const n=3;
    //cout<<"nhap so san pham : ";
    //cin>>n;
    San_Pham danh_sach_san_pham[n];//khai báo 1 mảng danh sách sản phẩm có n phần tử và có kiểu là sản phẩm
    
    Nhap_Danh_Sach(danh_sach_san_pham,n);
    //cout<<"\n";
    cout<<"san pham sau khi nhap : \n";
    Xuat_Danh_Sach(danh_sach_san_pham,n);

	float giatim;
	cout<<"Nhap gia muon tim : ";
	cin>>giatim;

	San_Pham *sp= Tim_San_Pham(danh_sach_san_pham , n , giatim);

	if(sp == NULL)
	{
		cout<<"khong tim thay san pham co gia : "<<giatim;
	}
	else
	{
		//cout<<"tim thay san pham ";
		cout<<sp->ma<<"\t"<<sp->ten<<"\t"<<sp->gia;
	}

	system("pause");

    return 0;
}

Chào các bạn mình là kiệt đây.
Đùa chứ mình không phải kiệt nhưng mình biết kiệt sai ở đâu.
Thứ nhất là cách đặt câu hỏi:

Mọi người ơi cho em hỏi sao em ra toàn màu đỏ vậy , sao nó không mã sản phẩm, tên sản phẩm và giá sản phẩm vậy ạ em đang dùng visual studio 2012

Từ câu hỏi, người đọc rút ra được rất ít thông tin. Việc hình dung vấn đề mà người đặt câu hỏi đang gặp phải là gần như không thể.

  1. Toàn màu đỏ là đang nói về cái gì màu đỏ? Toàn bộ text trong ảnh chụp console đều là màu đỏ. Cụm từ đúng để mô tả nó phải là ký tự lạ.
  2. Bạn nói

sao em in ra toàn màu đỏ vậy

, là đề cập tới việc muốn in cái gì, vì code của bạn có rất nhiều chỗ sử dụng cout. Nói cách khác, cần chỉ ra hàm nào đang bị lỗi. Nên giảm bớt gành nặng cho người đọc, vì bạn là người đi hỏi.

Chưa kể, thiếu mô tả sơ lược về nội dung của code. Người ta phải đọc code 1 lúc mới biết bạn đang muốn làm những cái gì.

Lỗi ở đây nằm ở hàm Tim_San_Pham. Hàm này trả về 1 con trỏ. Lưu ý, con trỏ trong C++ là một kiểu dữ liệu, chứ không đơn thuần là một dãy địa chỉ. Việc lấy reference dùng & trong return &sp; là không đúng.
Sửa bằng cách trả về 1 con trỏ.

San_Pham * Tim_San_Pham(San_Pham danh_sach_san_pham[], int n, float gia_tim)
{
	int left = 0;
	int right = n - 1;
	int mid = 0;
	while (left <= right)
	{
		mid = (left + right) / 2;
		San_Pham *sp = &danh_sach_san_pham[mid];
		if (sp->gia == gia_tim)
		{
			return sp;
		}
		else if (sp->gia>gia_tim)
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
	} 
	return NULL;
}
7 Likes

Nếu đã trả về con trỏ thì trả thẳng từ vị trí tìm được luôn chứ.

5 Likes

Cũng được bác, vì các phần tử của mảng bản chất cũng là những con trỏ.

3 Likes

anh ơi nhìn trong hình mọi người đều biết màu đỏ là phần nào mà,anh ơi, hình như nhâp thiếu & ở chỗ &sp là sai ạ

Mọi người biết màu đỏ là toàn bộ console của cậu :expressionless:

Seriously, cậu có bị sao không vậy? Cậu mấy tuổi rồi Kiệt? :expressionless:

4 Likes

màu đỏ là phần dưới cùng

Thôi bỏ đi.
Tớ nghĩ cậu under knowledge trầm trọng (cậu giỏi tiếng Anh đúng không?), vậy nên không ai có thể giải thích những thứ đơn giản như vậy cho cậu đâu Kiệt. Mọi người đều kỳ vọng ít nhất cậu nên giỏi tiếng Việt.

Tớ khuyên cậu nên tự học căn bản trước khi động vào những thứ “cao siêu” cậu đang động vào. Nếu cậu tiếp tục như thế này, cậu sẽ chỉ quẩn quanh mấy câu hỏi như thế thôi.
Chúc cậu may mắn nếu cậu không đổi hướng. Tớ không nghĩ ai tốt với cậu khi không ai thèm chỉ hướng học cho cậu như tớ đâu.

p/s: Thêm nữa,

  • Tất cả các topic bị block của cậu đều có lý do, cậu nên đọc lại và cố khắc phục.
  • Tất cả các post off-topic của cậu bị bế đi vì nó không mang lại giá trị gì, chỉ là spam (không ai quan tâm cậu tên Keo hay Kiệt đâu). Cậu cũng nên khắc phục thay vì nghĩ nó đạt được mục đích làm cho mọi người chú ý tới cậu. Very annoying! (cậu giỏi tiếng Anh đúng ko?)
  • Tới giờ mọi người rất friendly và nice với cậu, đó thực ra đang giết cậu, vì 1 đứa trẻ lớn tuổi như cậu không hề có ý thức phát triển nếu như không ai chỉ cho (cậu tưởng tượng xem cậu giữ thói quen này 3 năm nữa, cậu sẽ ra sao?). Đây là red flag đầu tiên và cũng là cuối cùng của tớ cho cậu.
    Cậu đang thiếu trầm trọng kỹ năng giải thích, communicate, lập trình và manner, đồng thời thụ động và lười biếng (có 1 bạn từng đưa cho cậu 1 link solution, nhưng cậu không thèm đọc vì nó là tiếng Anh, và yêu cầu bạn ấy giải thích cho cậu. Cậu nghĩ cậu là ai?)

Tớ không yêu cầu cậu cải thiện ngay, nhưng cho tớ dấu hiệu cậu đang cải thiện đi Kiệt.

6 Likes

Tớ có bổ sung 1 số phần tớ muốn cậu cải thiện ở post trên rồi. Cậu đọc kỹ nhé :slight_smile:
Cậu vẫn chưa nắm được cơ bản đâu. Tớ thậm chí đang nghĩ cậu không phải tác giả của source code trên cơ.

4 Likes

(post withdrawn by author, will be automatically deleted in 24 hours unless flagged)

hả? nó là vấn đề đấy. 1 kiểu là kí tự 1 kiểu là số mà?

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