Bài tập thực hành cấu trúc điều khiển


bài tập thực hành php cơ bản 11/09/2015 Cùng chuyên mục

Các bài tập về cấu trúc rẽ nhánh if then else - switch case - vòng lặp for while

BÀI TẬP CẤU TRÚC IF THEN ELSE

Bài tập 1: Nhập vào một số nguyên dương, in ra thông báo là số chẵn hay số lẻ?
Một số hàm cần biết:

  • is_int() - kiểm tra xem có phải là số nguyên hay không, trả ra TRUE nếu là một số nguyên
  • empty() - trả ra TRUE nếu như một biến nhận giá trị NULL ( nghĩa là chưa có dữ liệu)
  • var_dump() - xem dữ liệu và kiểu dữ liệu của biến, biểu thức, hàm
  • exit; - lệnh  này có tác dụng chấm dứt việc thực thi chương trình
Đáp Án

Phân tích: một số nguyên dương chẵn nếu nó chia hết cho 2 ( chia cho 2 dư 0 ) và ngược lại nó là số lẻ
(*)
- cần phải kiểm tra số nhập vào có phải là số nguyên dương hay không?

<?php
	print "Nhap vao so duong a:";
	//khai báo biến $a 
	$a;
	fscanf(STDIN,"%d\n",$a);
	if(empty($a))
	{
		printf("Ban can chua nhap du lieu!");
		exit; //lệnh exit - dừng việc thực thi chương trình
	}
	//kiểm tra xem $a có phải là một số nguyên dương
	if(!(($a > 0) AND (!is_int($a)))
	{
		printf("Ban phai nhap vao mot so nguyen duong!");
	}
	/*vận dụng bài ép kiểu - $a chia hết 2 sẽ trả ra 0 - sang kiểu bool sẽ là FALSE,
	bạn cũng có thể ghi if( ($a % 2) == 0)
	đôi khi chương trình gặp lỗi logic - dùng hàm vardump($a % 2) - vardump((bool)($a % 2))
	để hiểu kết quả của biểu thức
	*/
	else if(!($a % 2)) 
	{
		printf("%d la mot so chan",$a);
	}
	else
	{
		printf("%d la mot so le",$a);
	}
?>

Sau bài tập trên - các bạn rèn luyện được cho mình , tính chắt chẽ khi lập trình (kiểm tra dữ liệu)

 Bài tập 2: Viết chương trình giải phương trình bậc 2: ax^2+bx+c = 0

Đáp Án

Trước hết các bạn cần mô tả các bước giải phương trình bậc 2 (thuật toán) rồi sau đó chuyển sang ngôn ngữ lập trình:
Bước 1: Tính Delta = b^2 - 4ac;
Bước 2: Nếu Delta < 0 Kết luận: phương trình vô nghiệm
Bước 3: Nếu Delta = 0 thì phương trình có nghiệm kép: x = -b/2a;
Bước 4: Trường hợp còn lại, phương trình có 2 nghiệm phân biệt
x1 = (-b+Delta^(1/2))/2; x2 = (-b-(Delta)^(1/2))/2a;

Các hàm cần biết: sqrt() - bạn có thể tìm từ khóa: hàm tính căn bậc hai trong php - hoặc tìm với tiếng anh square root function php - (*) áp dụng cho các bài toán khác cần tìm các hàm mới, chưa biết hàm. Hàm is_numeric() - kiểm tra xem có phải là một số.
(*) - đặt giá trị mặc định cho biến trong một số trường hợp là cần thiết - vì nếu nó không có dữ liệu sẽ bị sai trong tính toán, bạn cũng giảm bớt được việc kiểm tra dữ liệu quá nhiều

<?php
	print "Nhap vao 3 he so a b c:";
	//đặt giá trị mặc định cho 3 biến $a - $b - $c
	$a = 0;
	$b = 0;
	$c = 0;
	fscanf(STDIN,"%d %d %d\n",$a,$b,$c);
	if(!$a)
	{
		printf("Day khong phai la phuong trinh bac 2!");
		exit; //lenh exit - dung viec thuc thi chuong trinh
	}
	/*Kiem tra tinh quy chuan cua du lieu nhap vao*/
	if(!is_numeric($a) OR !is_numeric($b) OR !is_numeric($c))
	{
		printf("Cac he so nhap bi sai! no phai la mot so(!)");
		exit;
	}
	//tinh delta
	$delta = $b*$b - 4*$a*$c;	
	if($delta < 0) 
	{
		printf("Phuong trinh vo nghiem");
	}
	else if(!$delta) // ban cung co the viet if($delta == 0)
	{
		printf("Phuong trinh co nghiem kep x = %d",(-$b/(2*$a)));
	}
	else
	{
		$x1 = (-$b+sqrt($delta))/(2*$a);
		$x2 = (-$b-sqrt($delta))/(2*$a);
		printf("Phuong trinh co 2 nghiem phan biet x1 = %d\n",$x1);
		printf("x2 = %d\n",$x2);
	}
?>

Bài tập 3: Nhập vào 3 số, tìm giá trị lớn nhất

Đáp Án

Phân tích: Ta phải đặt mình vào trong trường hợp một người (máy) chưa biết đâu là số lớn nhất - nên tạm coi những gì thấy trước mắt sẽ được coi là lớn nhất => xét hết các trường hợp sẽ có kết luận.

Bước 1: Đặt giá trị lớn nhất là số đầu tiên trong 3 số - so sánh nó với số thứ 2 nếu số thứ 2 lớn hơn nó thì số thứ 2 được đặt là max ( đặt = gán)
Bước 3: Chỉ còn 1 số còn lại để xét - nếu nó lớn hơn max là nó là max
Bước 4: Trả ra giá trị lớn nhất
(*) - bạn cần tạo 1 biến max để lưu giá trị vì máy tính ko linh hoạt như não người, cần dùng làm vật chứa tạm - để dựa vào đó, biết mà so sánh - tính toán - nếu là con người chúng ta chỉ cần "nhìn và nhớ".

<?php
	print "Nhap vao 3 so a b c:";
	//khai bao bien $a 
	$a = 0;
	$b = 0;
	$c = 0;
	fscanf(STDIN,"%d %d %d\n",$a,$b,$c);	
	/*Kiem tra tinh quy chuan cua du lieu nhap vao*/
	if(!is_numeric($a) OR !is_numeric($b) OR !is_numeric($c))
	{
		printf("Cac so nhap bi sai! no phai la mot so(!)");
		exit;
	}
	//gán max cho $a
	$max= $a;
	if($max < $b) 
	{
		$max = $b;
	}
	else if($max < $c) 
	{
		$max = $c;
	}
	printf("Gia tri lon nhat trong 3 so vua nhap: %d\n",$max);		
?>

Bài tập switch case

Bài tập 4 : Viết chương trình nhập vào tháng, in ra tháng đó có bao nhiêu ngày
Một số thông tin:
- Nếu là tháng 1, 3, 5, 7, 8, 10, 12 thì có 30 ngày
- Nếu là tháng 4, 6, 9, 11 thì có 31 ngày
- Nếu là tháng 2 và là năm nhuận thì có 29 ngày ngược lại 28 ngày
 (Năm nhuận là năm chia chẵn cho 4) - để đơn giản, coi tháng 2 có 28 ngày
(*) - trong thực tế các bạn sẽ phải tự đi tìm thông tin này

Đáp Án
<?php
	print "Nhap vao thang (so nguyen): ";	
	fscanf(STDIN,"%d\n",$mouth);
	/*kiểm tra tính hợp lệ của tháng nhập vào*/
	if(!is_int($mouth) OR ($mouth>12) OR ($mouth<1))
	{
		printf("Thang nhap vao khong hop le!");
		exit;
	}
	//đặt mặc định cho ngày trong tháng là 30
	$date = 30;
	switch($mouth)
	{
		case 1: $date = 30; break;
		case 3: $date = 30; break;
		case 5: $date = 30; break;
		case 7: $date = 30; break;
		case 8: $date = 30; break;
		case 10: $date = 30; break;
		case 12: $date = 30; break;
		case 4: $date = 31; break;
		case 6: $date = 31; break;
		case 9: $date = 31; break;
		case 11: $date = 31; break;
		case 2: $date = 28; break;
		default: break;
	}
	printf("Thang %d co %d ngay\n",$mouth,$date);
?>

 Bài tập vòng lặp for - while

Bài tập 5: Viết chương trình nhập vào N rồi tính giai thừa của N.

Đáp Án

Chuẩn bị: Công thức tính giai thừa 1 số nguyên: n! = 1*2*3*..*n
Phân tích: Theo công thức sẽ nhân n lần - có tính chất chung n*(n+1) - tưng ứng với giá trị biến duyệt ($i) của vòng lặp - có thể dùng vòng lặp for hay while đều được.

<?php
	print "Nhap vao so nguyen duong n (n < 5000): ";	
	fscanf(STDIN,"%d\n",$n);
	/*kiểm tra tính hợp lệ của tháng nhập vào*/
	if(!is_int($n) OR ($n < 1) OR ($n > 5000))
	{
		printf("Thang nhap vao khong hop le!");
		exit;
	}
	$i = 1;
	$giai_thua = 1;
	while($i < ($n+1))
	{
		$giai_thua *= $i; //tương ứng $n = $n*$i
		$i++; //không quên điều này - lỗi dễ gặp, vòng lặp sẽ ko dừng chương trình bị treo
	}
	printf("n! = %d",$giai_thua);
?>

Bài tập 6: Viết chương trình vẽ hình chữ nhật rỗng bằng các dấu *

Đáp Án

Phân tích: HCN rỗng nghĩa là chỉ vẽ đường viền ( 4 cạnh ) - thông số về chiều dài, chiều rộng có thể được nhập từ bàn phím. Để ý - HCN sẽ là 1 chồng liên tiếp của n doạn thẳng tạo bảo m dấu * - đoạn thẳng thứ 1 có đủ m dấu * - đoạn thứ 2 cho đến (n-1) - nghĩa là ở giữa 2 cạnh trên và dưới sẽ chỉ có 2 dấu * 2 bên - cạnh dưới của HCN cũng có đủ m dấu *.

<?php
	print "Nhap vao chieu dai chieu rong HCN: ";	
	/*$d: dai, $r: rong*/
	fscanf(STDIN,"%d %d\n",$d,$r);
	/*kiểm tra tính hợp lệ của tháng nhập vào - chi gioi han 30 dau * */
	if(!is_int($d) OR ($r < 1) OR ($r > 30))
	{
		printf("Thong tin chieu dai nhap vao khong hop le!");
		exit;
	}
	if(!is_int($r) OR ($r < 1) OR ($r > 30))
	{
		printf("Thong tin chieu rong nhap vao khong hop le!");
		exit;
	}	
	for($i = 0; $i < $r; $i++)
	{
		for( $j = 0; $j < $d; $j++)
		{
			if(!$i OR ($i == ($r-1))) /* neu la canh tren hoac canh duoi thi in toan bo*/
			{
				print "*";
			}
			else if(!$j OR($j == ($d-1))) /*khoang trong o giua*/
			{
				print "*";
			}
			else //con lai in ra cac khoang trang de tao thanh phan rong cho HCN
			{
				print " ";
			}
		}
		print "\n";
	}	
?>



Bài tập 7: Viết chương trình tính dân số của một thành phố sau 10 năm nữa, biết rằng dân số
hiện nay là 6.000.000, tỉ lệ tăng dân số hàng năm là 1.8% .

Đáp Án
<?php	
	$dan_so = 6000000;
	for($i = 0; $i < 10; $i++)
	{
		$dan_so += $dan_so*0.018; //0.018 = 1.8%
	}
	printf("Dan so hien tai 6000 000 sau 10 nam nua se la: %d\n",$dan_so);
?>

 




Bình luận:


bài tập php