30/09/2018, 20:23

Anh chi coi dung em bài tập này code như vậy được chưa

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 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:
");
	scanf("%i",&a);
	printf("ban hay nhap gio ket thuc:
");
	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);
    }
Bé tập Code viết 22:39 ngày 30/09/2018
  • 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ả.

viết 22:31 ngày 30/09/2018

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);
Duc Nguyen viết 22:34 ngày 30/09/2018

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

Duc Nguyen viết 22:38 ngày 30/09/2018

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

Bé tập Code viết 22:31 ngày 30/09/2018

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.

Bài liên quan
0