Nhờ mọi người xem giúp code tính giá tiền karaoke

Một điểm Karaoke tính tiền khách hàng theo công thức sau:

  • Mỗi giờ trong 3 giờ đầu tiên tính 30000đ/giờ
  • Mỗi giờ tiếp theo có đơn giá giảm 30% so với đơn giá trong 3 giờ đầu tiên

Ngoài ra, nếu thời gian thuê phòng gọn trong khung giờ từ 8 – 17 giờ thì được giảm giá 10%. Viết chương trình nhập vào giờ bắt đầu, giờ kết thúc và in ra số tiền khách phải trả, biết rằng 8 ≤ giờ bắt đầu ≤ giờ kết thúc ≤ 24
và đây là cách làm của em

int a,b,c,d,tien;
do{

printf("ban hay nhap gio bat dau:\n");
scanf("%i",&a);
printf("ban hay nhap gio ket thuc:\n");
scanf("%i",&b);
}while(a<=8 && b>=24);
c=b-a;
if(a>=17 && b<=24 && c<3)
{
	tien=c*30000;
	printf("so tien ban phai tra :%i",tien);
}
if(c<=3 && a>=8 && b<=17 )
{
	tien=c*30000*90/100;
	printf("so tien phai tra :%i",tien);
}
else if(c>3 && a>=8 && b<=24)
{
	d=c-3;
	tien=(d*30000*70/100*10/100)+(3*30000*10/100);
	printf("so tien phai chi tra %i",tien);
}else if(a>=8 && b<=17 &&c<=3)
{
	tien=c*30000*90/100;
	printf("so tien phai chi tra:%i",tien);
}else if(a>=8 && b<=17 && c>3)
{	
    
	tien=(c*30000*60/100);
	printf("so tien phai tra tien: %i",tien);
}
1 Like
  • a, b, c, d nên đặt tên để dễ kiểm soát. Vd: a đổi thành gio_bat_dau, b đổi thành gio_ket_thuc

  • Điều kiện nhiều nên có ngoặc để không mất công phải nhớ đến thứ tự thực hiện phép tính và đôi khi tránh hiệu ứng lề (side effect), tóm lại là tránh bug.
    (a<=8 && b>=24) đổi thành ((a<=8) && (b>=24))

  • ifelse if dùng không cẩn thận dẫn đến bug, test thử 1 trường hợp nhập a=18b=17 đã bị lỗi ngay.

  • Luôn phải có else ngay cả khi nó không làm gì cả.

5 Likes

Nên gán giá trị cho biến tien = 0; int tien = 0
Không cần phải chia nhiều trường hợp, chỉ cần lồng các trường hợp vào nhau là được. Xét 2 trường hợp C <=3C > 3. Sau đó lồng thêm trường hợp a >=8 && b <=17 là được.

if (...)
   if (...)

Chỉ cần tính giá trị của biến Tien, sau khi hết các if else thì mới cho printf ra, không cần cứ mỗi trường hợp là phải in lẻ tẻ. VD:

if ( ... )
   tien = .....;
else
   tien = ...;
printf("%d",tien);
1 Like

em cám ơn betapcode anh co thể giải thích cho em biết hiệu ứng lề và bug là gì không

em cam ơn nhiều trần đại lợi

bug trong văn nói hay defect trong văn viết là những lỗi trong code dẫn đến chương trình không thực hiện những việc nó cần thực hiện hoặc thực hiện nhưng cho ra kết quả ngoài mong đợi.

Side Effect (hiệu ứng lề) trong trường hợp này mình muốn đề cập là Hidden Side Effect, thường đi với khái niệm Sequence Points (bạn google thêm nhé) để chỉ những hành xử bất qui tắc hoặc vô định của compiler tại các điểm thực thi của chương trình.

Ví dụ với đoạn code:

unsigned int i = 255;
i=i++;

Nếu bạn in ra giá trị của i thì giá trị đó không thể xác định được vì không chắc được compiler sẽ thực hiện gán trước hay ++ trước hay chỉ làm một trong hai.

Và như vậy cách viết trên là dẫn đến lỗi, dòng i=i++ là bug.

1 Like

cho minh hoi c va d o day la gi a?

Viết có dấu rõ ràng nhé bạn.


a: Giờ bắt đầu.
b: Giờ kết thúc.
c: Thời gian thuê dựa vào ab.
d: Thời gian thuê được giảm giá khi c > 3.

1 Like

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

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