Code in ra các số hoàn chỉnh sai ở đâu?

code của bạn nhiều chỗ sai quá.
Thứ 1: for(i = 1; i < n; i++)

  • trong hàm for thì phải khai báo biến i nhé: for(int i = 1; i < n; i++)

Thứ 2:

void inHoanChinh(int dau, int cuoi)
{
for(i = dau; i <= cuoi; i++)
if(hc)
printf("Day la so hoan chinh");
else
printf("Day khong la so hoan chinh");
}
}
  • Biến hc ở đây là biến cục bộ trong hàm main nên trong hàm inHoanChinh() không sử dụng được.
  • Và mục đích của hàm này chỉ là in ra 2 dòng: “Day la so hoan chinh” hoặc “Day la so khong hoan chinh”

Thứ 3: Mình chỉ mới đọc code thôi nhưng mình nghĩ thuật toán của bạn cho bài này chưa chính xác. Nếu bạn muốn thì mình có thể viết lại cho bạn

ban có thể viết lại cho mk đc k
mk tham khảo

#include<stdio.h>
int hc = 0;
void kiemTraSoHoanChinh(int soCanTimUocSo){
    int tongUocSo = 0;
    for(int i = 1; i < soCanTimUocSo; i++){
        if(soCanTimUocSo % i == 0) 
            tongUocSo += i;
    }
    hc = (tongUocSo == soCanTimUocSo ? 1 : 0);
    
    
}
int main(){
    int soDau,soCuoi;
    printf("Nhap so dau: ");
    scanf("%d", &soDau);
    
    printf("Nhap so cuoi: ");
    scanf("%d", &soCuoi);
    
    for(int i = soDau ; i <= soCuoi ; i++){
        kiemTraSoHoanChinh(i);
        if(hc == 1){
            printf("so hoan chinh la %d", i);
            printf("--");
        }
        
    }
    
}

không hiểu chỗ nào thì hỏi mình nhé

for(int i = 1; i < soCanTimUocSo; i++)
nó báo lỗi chỗ này là sao b

bạn đã include stdio chưa

mk khai báo biến i ở ngoài thì mới đk

kết quả thế này

mk dùng codeblock
chác nó khác cái dev này

cái đó thì mình không biết. Sau khi khái báo biến i ở ngoài thì nó có ra kết quả không

6 posts were merged into an existing topic: Bài tập về cấu trúc rẽ nhánh

1 Like

có ra kết quả b à cảm ơn b nhiều

Tag @drgnz @moderators vì topic này trùng với topic: Các bác xem giúp e code này vs
Có merge topic được không nhỉ?

Và cmt này: Cho e hỏi sai chỗ nào vậy cũng không liên quan với bài này.
cmt này trùng topic https://daynhauhoc.com/t/bai-tap-ve-cau-truc-re-nhanh/49414.

1 Like

Mình nghĩ chỗ nào có mâu thuẫn

void inHoanChinh(int dau, int cuoi)
{
    for(i = dau; i <= cuoi; i++)
    {
        if(hc) // hc? Nó ở đâu ra đây?
        printf("Day la so hoan chinh");
        else
        printf("Day khong la so hoan chinh");
    }
}

Mình nghĩ nên cho đoạn này vào một hàm gọi là int ktHoanChinh(int n). return 0 if not hc else return 1
Khi đó thì trong hàm inHoanChinh bạn sẽ kiểm tra từng số một trong dãy đầu đến cuối. if (ktHoanChinh(i)) // same as ktHoanChinh == 1

mk vẫn chưa hiểu yk bạn

Có phải trong hàm inHoanChinh bạn sẽ kiểm tra xem biến hc1 (true) hay 0 (false) để xem in ra hoàn chỉnh hay không hoàn chỉnh đúng không. Nhưng khó ở chỗ trong hàm inHoanChinh của bạn biến hc vô danh. Vì tất cả xử lí nó nằm ở main(). Một điều nữa là ở main() bạn đang kiểm tra số hoàn chỉnh cho người ta nhập vào thôi, chứ đâu phải các số trong khoảng từ số đầu đến số cuối.

1 Like

à nhầm chỗ đấy hình như là if(HoanChinh(1))

Mình gợi ý bạn thế này

int ktHoanChinh(số cần kiểm tra)
{
    thuật toán của bạn
    nếu đúng thì trả về 1
    trả về 0 nếu ngược lại
}

void inHoanChinh(đầu, cuối)
{
    chạy for và cho một biến nhận các giá trị là các số từ đầu đến đuôi
    Sử dụng hàm ktHoanChinh kiểm tra từng số một
}

int main()
{
    nhập đầu;
    nhập cuối
    gọi hàm inHoanChinh(đầu, cuối);
}
2 Likes

Viết hàm inHoanChinh() sau, hàm này in ra các số hoàn chỉnh trong khoảng từ số đầu đến số cuối: void inHoanChinh ( int dau, int cuoi);

nếu mà đề chi như thế này thôi thì sao b

Nếu không cho sử dụng hàm khác mà chỉ một cái đó thôi thì đương nhiên bạn phải đưa việc kiểm tra vào trong hàm inHoanChinh. Cứ mỗi số bạn lại chạy kiểm tra.
Mà mình nghĩ là phải dùng hàm khác kiểm tra dùm thì logic mới cao được

1 Like

đề bài mk đọc cũng chả hiểu nên cảm thấy khó sao yk

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