Dưới đây là code của cậu, với format tốt hơn, dễ nhìn thấy lỗi hơn
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main() {
srand(time(NULL));
int i;
int n;
do {
printf ("\nmoi ban nhap so:");
scanf("%d",&n);
for(i = 1; i < 11 ; i++) {
int random = rand() % (99-1+1) + 1;
printf("giai %d:%2d\n", i, random);
}
if (n == random)
printf("chuc mung ban da trung giai %d",i);
else
printf("chuc ban may man lan sau");
} while (n>0);
return 0;
}
Tớ build chương trình này trên mac OS thì nhận được warning này:
warning: comparison between pointer and integer ('int' and 'long (*)(void)')
if (n == random)
~ ^ ~~~~~~
1 warning generated.
Ở dòng if (n == random)
, cậu có thể thấy scope của biến random
chỉ nằm trong vòng for. Ra ngoài vòng lặp, biến đó không còn nữa, và thực chất cậu đang so sánh giá trị trong biến n
với địa chỉ của hàm long random(void)
.
Đó là lý do khối lệnh trong else luôn được thực thi, vì chỉ khi cậu random đúng địa chỉ của hàm random
kể trên (vốn không thể, do cậu chỉ lấy các số trong phạm vi 100) thì khối lệnh if mới được thực thi.
Cậu chỉ cần đưa if condition vào trong for loop là được
...
for(i = 1; i < 11 ; i++) {
int random = rand() % (99-1+1) + 1;
printf("giai %d:%2d\n", i, random);
if (n == random)
printf("chuc mung ban da trung giai %d", i);
else
printf("chuc ban may man lan sau");
}
...
Cậu nhớ format code cẩn thận, ít nhất để tránh mấy lỗi lặt vặt này. Thường tớ không bao giờ đọc code không format đâu, vì người không format code thường có cái tôi rất cao, đánh giá thấp kỷ luật và không tôn trọng người đọc code (tớ không có ý bảo cậu như vậy đâu. Nếu chẳng may có trúng thì tớ rất xin lỗi).