CÁC CÂU LỆNH RẼ NHÁNH

Bài tập có hướng dẫn

Viết hàm DienTich() sau, hàm này trả về diện tích một đường tròn với bán kính r:

float DienTich (float r);

Hướng dẫn
float DienTich (float r) {
	return r * r * PI;
}
		

Viết hàm Min() sau, hàm này trả về giá trị nhỏ nhất của hai số nguyên x và y:

int Min(int x, int y);

Hướng dẫn:
int Min(int x, int y) {
	return (x > y ? x : y) ;
}
		

Viết hàm LuyThua() sau, hàm này trả về giá trị xp :

float LuyThua (float x, int p);

Hướng dẫn
float LuyThua(float x, int p) {
	int i ;
	float ret = 1 ;
	for(i = 1 ; i <= p ; i++)
		ret *= x ;
	return ret ;
}
		

Viết hàm ToHop() sau, hàm này trả về C(n, k) là số tổ hợp n lấy k (n > 0, 0 <= k <= n) bằng cách dựa vào công thức C(n, k) = n! / (k!(n – k)!):

long ToHop (int n, int k);

Hướng dẫn
long GiaiThua(int u) {
	long ret = 1;
	int i;
	for(i = 1; i <= u; i++)
		ret *= i;
	return ret;
}
long ToHop(int n, int k) {
	return GiaiThua(n)/(GiaiThua(k)*GiaiThua(n-k));
}
		

Viết hàm Nhuan() sau, hàm này trả về giá trị 1 (đúng) nếu năm y nhuần và trả về giá trị 0 (sai) nếu năm y không nhuần:

Hướng dẫn
int Nhuan(int y) {
	if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
		return 1 ;
	else 
		return 0 ;
}
		

Viết hàm SNTrongThang () sau, hàm này trả về số ngày trong tháng m và năm y:

int SNTrongThang (int m, int y);

Hướng dẫn
int SNTrongThang (int m, int y) {
	int ret = 0 ;
	switch(m) {
		case 1 : case 3 : case 5 : case 7 : case 8 : case 12 :
			ret = 31; break ;
		case 4 : case 6 : case 9 : case 11 :
			ret = 30; break ;
		case 2:
			ret = (Nhuan(y) ? 29 : 28) ; break ;
	}
	return ret;
}
		

Viết hàm NguyenTo() sau, hàm này trả về giá trị 1 (đúng) nếu x là số nguyên tố và trả về giá trị 0 (sai) nếu x không là số nguyên tố

int NguyenTo (int x);

Hướng dẫn
int NguyenTo(int x) {
	int nt;
	//biến cờ = 1: x là nguyên tố, 0: x không là nguyên tố
	int i;
	if(x < 2)
		nt = 0; //Không là nguyên tố
	else {
		nt = 1; //Là nguyên tố
		for(i = 2; i < x; i++)
		if(x % i == 0) {
			nt = 0;
			//Không là nguyên tố
			break;
		}
	}
	return nt;
}
		

Viết hàm HoanChinh() sau, hàm này trả về giá trị 1 (đúng) nếu x là số hoàn chỉnh và trả về giá trị 0 (sai) nếu x không là số hoàn chỉnh:

int HoanChinh (int x);

Hướng dẫn
int Hoanchinh(int x) {
	int hc;//Biến cờ
	int s;
	if(x <= 0)
		hc = 0;
	else {
		s = 0;
	for(i = 1; i < x; i++)
		if(x % i == 0) s += i;
			hc = (s == x ? 1: 0);
	}
	return hc;
}
		

Viết hàm ChinhPhuong() sau, hàm này trả về giá trị 1 (đúng) nếu x là số chính phương và trả về giá trị 0 (sai) nếu x không là số chính phương:

int ChinhPhuong (int x);

Hướng dẫn
int ChinhPhuong(int x) {
int cp; //0: Không là số cphương, 1: Là số cphương (cờ hiệu)
	if(x < 1)
		cp = 0;// Không là số chính phương
	else {
		cp = 0;
		//Giả sử không là số chính phương
		for(i = 1; i <= sqrt(x); i++) {
			if(x == i * i) {
				cp = 1;//Là số chính phương
				break;
			}
		}
	}
	return cp;
}
		

Viết hàm DoiXung() sau, hàm này trả về giá trị 1 (đúng) nếu x là số đối xứng và trả về giá trị 0 (sai) nếu x không là số đối xứng:

int DoiXung (int x);

Hướng dẫn
int DoiXung(int x) {
	int dx;//Biến Cờ
	int dao;//Lưu số đảo
	int y;
	y = x;
	//Tìm số đảo của y
	dao = 0;
	while(y > 0) {
		d = y % 10; // Lấy chữ số phải nhất của y
		dao = 10*dao + d; // Thêm chữ số phải nhất vào dao
		y /= 10;// Xóa chữ số phải nhất của y
	}
	dx = (dao == x ? 1: 0);
	return dx;
}
		

Viết hàm TimUCLN() sau, hàm này trả về ước sồ chung lớn nhất của hai số nguyên a và b:

int TimUCLN (int a, int b);

Hướng dẫn
int TimUCLN (int a, int b) {
	int ret;
	if(a < 0) a = -a;
	if(b < 0) b= - b;
	if(a == 0 || b == 0)
		ret = a + b;
	else {
		while(a != b) {
			if(a > b) 
				a = a – b;
			else 
				b = b – a;
		}
		ret = a; //hoăc b
	}
	return ret;
}
		

Viết hàm RutGon() sau, hàm này rút gọn một phân số gồm ts và ms

void RutGon (int *ts, int *ms);

Hướng dẫn
void RutGon (int *ts, int *ms) {
	int uscln = TimUCLN(*ts, *ms);
	*ts /= uscln;
	*ms /= uscln;
}
		

Viết hàm TinhDTr() sau, hàm này trả về diện tích dt và chu vi cv của một đuờng tròn bán kính r:

void TinhDTr (float r, float *dt, float *cv);

Hướng dẫn
void TinhDTr (float r, float *dt, float *cv) {
	*dt = r * r * PI;
	*cv = 2 * r * PI;
}
		

Viết hàm GiaiPTBậc2() sau, hàm này trả về số nghiệm sn và các nghiệm x1, x2 (nếu có) của một phương trình bậc 2 với các hệ số a, b và c:

void GiaiPTBậc2 (float a, float b, float c, int *sn, float *x1, float *x2);

Hướng dẫn
void GiaiPTBậc2 (float a, float b, float c, int *sn, float *x1, float *x2) {
	float delta = b*b – 4*a*c ;
	if(delta < 0)
		*sn = 0
	else if(delta == 0) {
		*sn = 1;
		*x1 = *x2 = -b / (2*a);
	}
	else {
		*sn = 2;
		*x1 = (-b + sqrt(delta)) / (2*a);
		*x2 = (-b - sqrt(delta)) / (2*a);
	}
}
		

Viết hàm NgayKe() sau, hàm này trả về ngày kế tiếp nd, nm, ny của ngày hiện hành d, m, y:

void NgayKe(int d, int m, int y, int *nd, int *nm, int *ny);

Hướng dẫn
void NgayKe(int d, int m, int y, int *nd, int *nm, int *ny) {
	*nd = d + 1, *nm = m; *ny = y;
	if(*nd > SNTrongThang(*nm, *ny)) {
		*nd =1;
		(*nm)++;
		if(*nm > 12) {
			*nm = 1 ;
			(*ny)++ ;
		}
	}
}
		

Bài tập luyện tập

Viết hàm Min() sau, hàm này trả về giá trị nhỏ nhất của ba số nguyên x, y và z:

int Min(int x, int y, int z);

Viết hàm InTGPascal() sau, hàm này xuất ra một tam giác Pascal có sd dòng. Hình sau đây là một tam giác Pascal có 7 dòng

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
		

Mỗi số trong tam giác Pascal là một tổ hợp C(n, k). Nếu chúng ta đếm dòng và cột bắt đầu bằng 0, thì một số ở dòng n và cột k là C(n, k). Ví dụ, số ở dòng 6 và cột 4 là C(6, 4) = 15 void InTGPascal(int sd);

Viết hàm HopLe() sau, hàm này trả về giá trị 1 (đúng) nếu ngày d, tháng m, năm y hợp lệ và trả về giá trị 0 (sai) nếu d, m, y không hợp lệ

int HopLe(int d, int m, int y);

Viết hàm InNguyenTo() sau, hàm này in các số nguyên tố trong khoảng từ số đầu đến số cuối:

void InNguyenTo(int dau, int cuoi);

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

void InHoanChinh (int dau, int cuoi);

Viết hàm InChinhPhuong () sau, hàm này in các số chính phương trong khoảng từ số đầu đến số cuối:

void InChinhPhuong (int dau, int cuoi);

Viết hàm InDoiXung () sau, hàm này in các số đối xứng trong khoảng từ số đầu đến số cuối

void InDoiXung (int dau, int cuoi);

Viết hàm TinhHCN() sau, hàm này trả về diện tích dt và chu vi cv của một hình chữ nhật với chiều dài là d

và chiều rộng là r:

void TinhHCN (float d, float r, float *dt, float *cv);

Viết hàm TinhTG() sau, hàm này trả về diện tích dt và chu vi cv của một tam giác với các cạnh a, b và c:

void TinhTG (float a, float b, float c, float *dt, float *cv);

Viết hàm GiaiPTTrungPhuong()sau, hàm này trả về số nghiệm sn và các nghiệm x1, x2 , x3, x4 (nếu có)

của một phương trình trùng phương với các hệ số a, b và c:

void GiaiPTTrungPhuong (float a, float b, float c, int *sn, float *x1, float *x2, float *x3, float *x4);

Viết hàm NgayTruoc() sau, hàm này trả về ngày kế trước pd, pm, py của ngày hiện hành d, m, y:

void NgayTruoc(int d, int m, int y, int *pd, int *pm, int *py);