/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

[Tự Học Lập Trình C - Qua Các Bài Tập] COM108_Nhập Môn Lập Trình - Bài 6 - Mảng (Array) Trong C - P1

MỤC TIÊU: Sau bài thực hành, các bạn có khả năng thực hiện được:
  • Biết sử dụng mảng 1 chiều trong lập trình
  • Biết sử dụng mảng 2 chiều trong lập trình
LÝ THUYẾT:


MẢNG 1 CHIỀU

MẢNG LÀ GÌ?
Mảng là tập hợp các phần tử có cùng kiểu dữ liệu
CÁCH KHAI BÁO
Khai báo KHÔNG khởi tạo
int mangMotChieu[5];// khởi tạo mảng 1 chiều có kiểu dữ liệu là số nguyên (int) có có chiều dài là 5
int mangMotChieu_KhaiBaoKhac[]; // khởi tạo mảng có độ dài không cố định, có kiểu dữ liệu là int

Thêm giá trị vào mảng
mangMotChieu[0] = 25;
mangMotChieu[1] = 50;
mangMotChieu[2] = 75;
mangMotChieu[3] = 100;
mangMotChieu[4] = 200;;

Khai báo CÓ khởi tạo
int mangMotChieu[] = {25, 50, 75, 100, 200};

Chúng ta có thể truy cập/thay đổi giá trị của mảng thông qua chỉ số Index
printf("%d", mangMotChieu[2]);

Ví dụ: Truy cập vào vị trí có Index 2 và xuất giá trị ra màn hình
#include<stdio.h>
int main()
{
  int mangMotChieu[] = {25, 50, 75, 100, 200};
  printf("%d", mangMotChieu[2]); // in ra giá trị của mảng tại vị trí có chỉ số Index là 2
  // Kết quả là 75 vì trong C index bắt đầu từ 0
}

Kích thức/Độ dài của mảng
int mangMotChieu[] = {25, 50, 75, 100, 200};
int soPhanTuTrongMang = sizeof mangMotChieu / sizeof (int);
Kiểu dữ liệu int có 4byte trên mỗi phần tử, nên để biết mảng có bao nhiêu phần tử thì chúng ta phải lấy độ dài của mảng chia cho độ dài của kiểu dữ liệu. Ví dụ trên là 20/4 = 5

Ví dụ:
#include<stdio.h>
int main()
{
  int i;
  int mangMotChieu[] = {25, 50, 75, 100, 200};
  int soPhanTuTrongMang = sizeof mangMotChieu / sizeof (int);
printf("\nMang co '%d' phan tu!", soPhanTuTrongMang);
}

Cách duyệt mảng
#include<stdio.h>
int main()
{
  int i;
  int mangMotChieu[] = {25, 50, 75, 100, 200};
  for (i = 0; i < 5; i++)
  {
    printf("%d ", mangMotChieu[i]);
  }
}

Lợi ích của mảng
- Sử dụng mảng để nắm giữ nhiều giá trị thay vì phải khai báo nhiều biến.
- Truy xuất nhanh
- Dễ dàng đọc dữ liệu từ các phần tử và sắp xếp

MẢNG 2 CHIỀU
Chúng ta tạm hiểu mảng 2 chiều một sheet của file excel nó bao gồm các hàng và các cột.
Ví dụ:

Cách khai báo:
Ví dụ: mảng có 2 hàng và 3 cột
int mangHaiChieu[2][3] = { {1, 4, 2}, {3, 6, 8} };

Truy xuất vào mảng 2 chiều
int mangHaiChieu[2][3] = { {1, 4, 2}, {3, 6, 8} };
printf("%d", mangHaiChieu[0][2]); 
/* 
kết quả là 2
truy xuất và lấy giá trị hàng 0 cột 2 
*/

Thay đổi giá trị của mảng 2 chiều
int mangHaiChieu[2][3] = { {1, 4, 2}, {3, 6, 8} };
mangHaiChieu[0][0] = 9; // thay đổi/gán giá trị hàng 0, cột 0 bằng 9

printf("%d", mangHaiChieu[0][0]); // kết quả là 9 thay vì 1 

Cách duyệt mảng 2 chiều: Duyệt mảng 2 chiều cần 2 vòng lặp (1 cho dòng, 1 cho cột)
int mangHaiChieu[2][3] = { {1, 4, 2}, {3, 6, 8} };
int i, j;
for (i = 0; i < 2; i++) {
  for (j = 0; j < 3; j++) {
    printf("%d\n", mangHaiChieu[i][j]);
  }
}
Chú ý khi khai báo mảng chúng ta phải xác định số cột, nếu không sẽ báo lỗi

Hàm nhập mảng 2 chiều
void nhapMangHaiChieu(int hang, int cot, int mangHaiChieu[][100]){
  int i, j;
  for (i = 0 ; i < hang ; i++)
  {
    for (j = 0 ; j < cot ; j++)
    {
      printf("\nNhap vao phan tu HANG %d COT %d cua mang: ", i + 1, j + 1);
      scanf("%d", &mangHaiChieu[i][j]); 
    }
  }
}

Hàm in/xuất mảng 2 chiều
void xuatMangHaiChieu(int hang, int cot, int mangHaiChieu[][100]){
  int i, j;
  printf("\nCac gia tri trong Mang 2 chieu la:\n");
  for (i = 0 ; i < hang ; i++)
  {
    for (j = 0 ; j < cot ; j++)
    {
      printf("%d\t", mangHaiChieu[i][j]); 
    }
    printf("\n");
  }
}

Hàm chính gọi nhập xuất:
#include<stdio.h>
int main()
{ 
  int hang, cot;
  int mangHaiChieu[100][100];
  printf("\n=====MANG 2 CHIEU=====");
  printf("\nNhap vao so HANG: "); scanf("%d", &hang);
  printf("\nNhap vao so COT: "); scanf("%d", &cot);
  nhapMangHaiChieu(hang, cot, mangHaiChieu);
  xuatMangHaiChieu(hang, cot, mangHaiChieu);
  
}


YÊU CẦU:
BÀI 1:
TÍNH TRUNG BÌNH TỔNG CÁC SỐ CHIA HẾT CHO 3 TRONG MẢNG
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: 
- Xuất ra các phần tử trong mảng
- In ra tổng các phần tử trong mảng
 
BÀI 2:
TÌM GIÁ TRỊ LỚN NHẤT VÀ NHỎ NHẤT TRONG MẢNG
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: Xuất ra màn hình giá trị nhỏ nhất và lớn nhất của mảng

BÀI 3: 
SẮP XẾP MẢNG THEO THỨ TỪ GIẢM DẦN
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: Xuất ra màn hình kết quả mảng đã sắp xếp


BÀI 4: 
TÍNH BÌNH PHƯƠNG CÁC PHẦN TỬ TRONG MẢNG 2 CHIỀU
Input: Nhập vào từ bàn phím 1 ma trận các số nguyên. Mảng gồm n hàng, m cột
Output: Xuất ra màn hình ma trận bình phương

THỰC HIỆN:

BÀI 1: 
TÍNH TRUNG BÌNH TỔNG CÁC SỐ CHIA HẾT CHO 3 TRONG MẢNG
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: 
- Xuất ra các phần tử trong mảng

Code:
#include<stdio.h>
int main()
{	
	int n;
	int mangMotChieu[n];

	printf("\nNhap vao so phan tu MANG MOT CHIEU: ");
	scanf("%d", &n);

	// Nhập/ gán giá trị cho mảng
	int i;
	for (i = 0 ; i < n ; i++){
		printf("\nNhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]); // đọc và lưu giá trị vào mảng
	}
	
	// duyệt mảng và int ra màn hình
	for (i = 0 ; i < n ; i++){
		printf("\nGia tri phan tu thu %d MANG MOT CHIEU la: %d ", i + 1, mangMotChieu[i]);
		
	}
}

Khuyến khích viết theo dạng gọi hàm:
- In ra tổng các phần tử trong mảng
code:
#include<stdio.h>

void nhapMangMotChieu(int n, int mangMotChieu[]){
	int i;
	for (i = 0 ; i < n ; i++){
		printf("\nNhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]); 
	}
}

void inMangMotChieu(int n, int mangMotChieu[]){
	int i;
	for (i = 0 ; i < n ; i++){
		printf("\nGia tri phan tu thu %d MANG MOT CHIEU la: %d ", i + 1, mangMotChieu[i]);	
	}
}

int tongPhanTuTrongMang(int n, int mangMotChieu[]){
	int i;
	int tong = 0;
	for (i = 0 ; i < n ; i++){
//		tong = tong + mangMotChieu[i];
		tong += mangMotChieu[i];	
	}
	return tong;
}

int main()
{	
	int n;
	int mangMotChieu[n];

	printf("\nNhap vao so phan tu MANG MOT CHIEU: ");
	scanf("%d", &n);
	
	nhapMangMotChieu(n, mangMotChieu);
	inMangMotChieu(n, mangMotChieu);
	printf("\nTong cac phan tu trong mang %d", tongPhanTuTrongMang(n, mangMotChieu));
	
}


- Xuất ra màn hình kết quả của trung bình tổng các số chia hết cho 3 trong mảng
Code:
#include<stdio.h>
int main()
{	
	int n;
	int mangMotChieu[n];

	printf("\nNhap vao so phan tu MANG MOT CHIEU: ");
	scanf("%d", &n);

	// Nhập/ gán giá trị cho mảng
	int i;
	for (i = 0 ; i < n ; i++){
		printf("\nNhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]); // đọc và lưu giá trị vào mảng
	}
	
	// duyệt mảng và int ra màn hình
	for (i = 0 ; i < n ; i++){
		printf("\nGia tri phan tu thu %d MANG MOT CHIEU la: %d ", i + 1, mangMotChieu[i]);
		
	}

	// tính trung bình cộng của các số chia hết cho 3
	float trungBinhCong = 0;
	float tong = 0;
	int bienDem;
	for (i = 0 ; i < n ; i++){
		if (mangMotChieu[i] % 3 == 0){
			tong = tong + mangMotChieu[i];
			//  tong += mangMotChieu[i]; // hoặc
			bienDem++;
		}
	}
	trungBinhCong = tong / bienDem;
	printf("\nTrung binh cong cua cac so chia het cho 3 la: %.2f", trungBinhCong);
}

Viết hàm:
int trungBinhCacPhanTuChiaHetCho3(int n, int mangMotChieu[n]){
	int i;
	int tong = 0;
	int dem = 0;
	for(i = 0; i < n ;i++){
		if(mangMotChieu[i] % 3 == 0){
			tong = tong + mangMotChieu[i];
			dem ++;
		}
	}
	return tong/dem;
}


Code đầy đủ:
#include<stdio.h>

void nhapMangMotChieu(int n, int mangMotChieu[n]){
		//nhap vao
	int i;
	for(i = 0; i < n ;i++){
		printf("Nhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]);
	}
}

void xuatMangMotChieu(int n, int mangMotChieu[n]){
	int i;
	for(i = 0; i < n ;i++){
		printf("%d\t", mangMotChieu[i]);
	}
}

int tongCacPhanTuTrongMang(int n, int mangMotChieu[n]){
	int i;
	int tong = 0;
	for(i = 0; i < n ;i++){
		tong = tong + mangMotChieu[i];
	}
	return tong;
}

int trungBinhCacPhanTuChiaHetCho3(int n, int mangMotChieu[n]){
	int i;
	int tong = 0;
	int dem = 0;
	for(i = 0; i < n ;i++){
		if(mangMotChieu[i] % 3 == 0){
			tong = tong + mangMotChieu[i];
			dem ++;
		}
	}
	return tong/dem;
}


int main()
{	
 	int n; // chieu dai mang
 	int mangMotChieu[n];
 		
 	printf("\nNhap vao so phan tu Mang MOT chieu: ");
	scanf("%d", &n);
	
	nhapMangMotChieu(n, mangMotChieu);
//	xuatMangMotChieu(n, mangMotChieu);
	printf("%d", trungBinhCacPhanTuChiaHetCho3(n, mangMotChieu));



}

BÀI 2: 
TÌM GIÁ TRỊ LỚN NHẤT VÀ NHỎ NHẤT TRONG MẢNG
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: Xuất ra màn hình giá trị nhỏ nhất và lớn nhất của mảng

#include<stdio.h>
int main()
{	
	int n;
	int mangMotChieu[n];

	printf("\nNhap vao so phan tu MANG MOT CHIEU: ");
	scanf("%d", &n);

	// Nhập/ gán giá trị cho mảng
	int i;
	for (i = 0 ; i < n ; i++){
		printf("\nNhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]); // đọc và lưu giá trị vào mảng
	}
	
	// tìm phần tử LỚN nhất, NHỎ nhất trong mảng
	int min = mangMotChieu[0];
	int max = mangMotChieu[0];
	for ( i = 0; i < n; i++)
	{
		if (mangMotChieu[i] < min){ //NHỎ nhất
			min = mangMotChieu[i];
		}
		if (mangMotChieu[i] > max){ //LỚN nhất
			max = mangMotChieu[i];
		}
	}
	printf("\nPhan tu NHO nhat cua mang la: %d", min);
	printf("\nPhan tu LON nhat cua mang la: %d", max);
}

Viết dạng hàm:
int timPhanTuLonNhat(int n, int mangMotChieu[n]){
	int max = mangMotChieu[0];
	int i;
	for(i = 0; i < n; i++){
		if (mangMotChieu[i] > max) max = mangMotChieu[i];
	}
	return max;
}


int timPhanTuNHONhat(int n, int mangMotChieu[n]){
	int min = mangMotChieu[0];
	int i;
	for(i = 0; i < n; i++){
		if (mangMotChieu[i] < min) min = mangMotChieu[i];
	}
	return min;
}

Code đầy đủ
#include<stdio.h>

void nhapMangMotChieu(int n, int mangMotChieu[n]){
		//nhap vao
	int i;
	for(i = 0; i < n ;i++){
		printf("Nhap vao phan tu thu %d cua mang: ", i + 1);
		scanf("%d", &mangMotChieu[i]);
	}
}

int timPhanTuLonNhat(int n, int mangMotChieu[n]){
	int max = mangMotChieu[0];
	int i;
	for(i = 0; i < n; i++){
		if (mangMotChieu[i] > max) max = mangMotChieu[i];
	}
	return max;
}


int timPhanTuNHONhat(int n, int mangMotChieu[n]){
	int min = mangMotChieu[0];
	int i;
	for(i = 0; i < n; i++){
		if (mangMotChieu[i] < min) min = mangMotChieu[i];
	}
	return min;
}

int main()
{	
 	int n; // chieu dai mang
 	int mangMotChieu[n];
 		
 	printf("\nNhap vao so phan tu Mang MOT chieu: ");
	scanf("%d", &n);
	
	nhapMangMotChieu(n, mangMotChieu);
//	xuatMangMotChieu(n, mangMotChieu);
	printf("\nPhan tu LON nhat cua mang la: %d", timPhanTuLonNhat(n, mangMotChieu));
//	printf("\nPhan tu NHO nhat cua mang la: %d", timPhanTuNHONhat(n, mangMotChieu));

}


Viết kiểu CON TRỎ

BÀI 3: 
SẮP XẾP MẢNG THEO THỨ TỪ GIẢM DẦN
Input: Nhập vào từ bàn phím 1 mảng các số nguyên. Mảng gồm n phần tử
Output: Xuất ra màn hình kết quả mảng đã sắp xếp

lưu file dạng .CPP
void hoanVi(int &a, int &b) 
{
    int temp = a;
    a = b;
    b = temp;
}

void sapXepMang(int n, int mangMotChieu[]){
	int i, j;
	for (i=0; i < n -1; i++){
		for (j=i+1; j < n ; j++){
			if (mangMotChieu[i] > mangMotChieu[j]){ // thay đổi dấu theo yêu cầu tăng hay giảm
				
				hoanVi(mangMotChieu[i], mangMotChieu[j]);
			}
				
		}
	}
}




BÀI 4: 
TÍNH BÌNH PHƯƠNG CÁC PHẦN TỬ TRONG MẢNG 2 CHIỀU
Input: Nhập vào từ bàn phím 1 ma trận các số nguyên. Mảng gồm n hàng, m cột
Output: Xuất ra màn hình ma trận bình phương



Viết Hàm Nhập Xuất

// Nhập mảng hai chiều
void taoMangHaiChieu(int n, int m, int mangHaiChieu[n][m]) {
  int i, j;
  for ( i = 0; i < n; i++) {
    for ( j = 0; j < m; j++) {
      printf("Nhap phan tu mangHaiChieu[%d][%d]: ", i, j);
      scanf("%d", &mangHaiChieu[i][j]);
    }
  }
}

// Xuất mảng hai chiều
void xuatMangHaiChieu(int n, int m, int mangHaiChieu[n][m]) {
  int i, j;
  for ( i = 0; i < n; i++) {
    for ( j = 0; j < m; j++) {
      printf("%d\t", mangHaiChieu[i][j]);
    }
    printf("\n");
  }
}

Viết hàm tính bình phương
// Hàm tính bình phương số nguyên
int binhPhuong(int x) {
  return x * x;
}

void tinhBinhPhuong(int n, int m, int mangHaiChieu[n][m]) {
  int i, j;
  for ( i = 0; i < n; i++) {
    for ( j = 0; j < m; j++) {
//    	mangHaiChieu[i][j] = mangHaiChieu[i][j] * mangHaiChieu[i][j]; // có thể tính trực tiếp
      mangHaiChieu[i][j] = binhPhuong(mangHaiChieu[i][j]); // hoặc có thể gọi hàm tính bình phương
    }
  }
}


Hàm chính
int main() {
  int n, m;
//  printf("Nhập số hàng: ");
//  scanf("%d", &n);
//  printf("Nhập số cột: ");
//  scanf("%d", &m);

  // gắng trực tiếp để test
  n = 2; m =3;
  int mangHaiChieu[n][m];
  khoiTaoMangHaiChieu(n, m, mangHaiChieu);
  tinhBinhPhuong(n, m, mangHaiChieu);
  xuatMangHaiChieu(n, m, mangHaiChieu);
}


Xong!

[Tự Học Lập Trình C - Qua Các Bài Tập] COM108_Nhập Môn Lập Trình - Bài 5 - P1 Xây Dựng Hàm

MỤC TIÊU:
  • Biết cách sử dụng hàm để xây dựng các chức năng
  • Biết cách sử dụng con trỏ và gọi hàm theo tham chiếu
LÝ THUYẾT:

Hàm là gì?
Hàm là khối dòng lệnh mà nó chỉ chạy khi gọi nó. Các hàm thường dùng như: main(), printf(), scanf(), gets(), puts(), ceil(), floor()...

Có 2 loại hàm trong C
- Các hàm thư viện: Là các hàm được khai báo trong tập tin header của chương trình
- Các hàm do người dùng định nghĩa: Là các hàm do lập trình viên định nghĩa.



Cú pháp hàm:



Kiểu dữ liệu trả về có 2 loại:


- Void: Không trả về giá trị nào cả 
Ví dụ:
#include<stdio.h>
void goiHamTrongC()
{
	printf("\nHam chi thuc hien khi no duoc goi") ;	
	printf("\nDay la ham khong tra ve gia tri nao ca") ;
}

int main()
{
	goiHamTrongC(); // gọi hàm
}

- float / int / long / char … : Trả về giá trị kết quả có kiểu dữ liệu tương ứng
Ví dụ:

Tên hàm: Do người dùng tự đặt theo một quy ước
[]: có thể có hoặc không có
[ Danh sách các tham số truyền vào ]: Những tham số này sẽ nhận giá trị thực bằng cách truyền tham số mỗi khi hàm này được gọi đến.

Cách gọi hàm:



Ví dụ:
#include<stdio.h>

int tinhTong (int a, int b)
{
	int tong ;
	tong = a + b ;
	return tong ; // trả về giá trị là tổng của 2 số int
}

int main()
{
	int tong;
	tong = tinhTong(1,2); // gọi hàm tính tổng
	printf("\nTong cua 2 so la: %d", tong) ;
}
Con trỏ:
Con trỏ (Pointer) trong C là một biến, nó còn được gọi là locator hoặc indicator chỉ ra một địa chỉ của một giá trị.

Các ký hiệu sử dụng trong con trỏ:

Ví dụ:
#include<stdio.h>
int main()
{
	int a = 10 ;
	printf("\nGia tri cua a la: %d", a);
	printf("\nDia chi cua bien a la: %x", &a); //& là trả về địa chỉ của một biến, %x hiển thị giá trị của biến
}
Cách khai báo biến con trỏ trong C:
Con trỏ bằng ngôn ngữ C được khai báo bằng cách sử dụng dấu '*'
Ví dụ: int *p;

Ví dụ 1: Viết hàm tính tổng của 2 số, tổng của 2 số là biến con trỏ 
Code tham khảo:
#include<stdio.h>
void tinhTongConTro(int a, int b, int *tongHaiSo){
	*tongHaiSo = a + b; 
}

int main(){
	int a, b;
	a = 10;
	b = 200;
		
	int tong;
	tinhTongConTro(a, b, &tong);
	printf("\nTong 2 so %d + %d = %d", a, b, tong);
}

Ví dụ 2: Nhập vào 2 số tự nhiên a và b, viết hàm trả về 2 giá trị là số lớn và số bé (dùng biến con trỏ để lưu các giá trị trả về của chúng)
Code tham khảo:
#include<stdio.h>
void traVeLonBe(int a, int b, int *soLon, int*soBe){
	if (a > b){
		*soLon = a;
		*soBe = b;
	} else {
		*soLon = b;
		*soBe = a;
	}
}

int main(){
	int a, b;
	a = 1000;
	b = 200;
	
	int i, j;
	traVeLonBe(a, b, &i, &j);
	printf("\nSoLon: %d", i);
	printf("\nSoBe: %d", j);
}


YÊU CẦU:

Bài 1: Xây dựng chương trình tìm số lớn nhất trong 3 số
Input: Nhập từ bàn phím 3 số bất kỳ
Output: Xuất ra màn hình số lớn nhất trong 3 số

Bài 2: Xây dựng chương trình tính năm nhuận
Input: Nhập vào năm
Output: Có phải là năm nhuận hay không?
Biết rằng: Năm nhuận là năm chia hết cho 400 hoặc chia hết cho 4 nhưng không chia hết cho 100


Bài 3: Xây dựng chương trình hoán vị (hoán vị giá trị của 2 số) sử dụng con trỏ và gọi hàm theo tham chiếu
Input: Nhập vào từ bàn phím 2 giá trị a,b
Output: hoán vị 2 giá trị của a và b


Bài 4 (làm thêm): Xây dựng hàm có truyền tham số đầu vào, và trả về kết quả cho các yêu cầu:
- Hàm kiểm tra chẵn lẻ
- Hàm kiểm tra số chính phương
Input: Nhập vào số có kiểu dữ liệu integer từ bàn phím
Output: in ra các số chẵn và là số chính phương trong khoảng từ 1 đến số vừa nhập

Bài 5 (làm thêm): Xây dựng hàm có truyền tham số đầu vào, và trả về kết quả cho các yêu cầu:
- Hàm kiểm tra số nguyên tố
Input: Nhập vào số có kiểu dữ liệu integer từ bàn phím
Output: in ra các số nguyên tố trong khoảng từ 1 đến số vừa nhập

Bài 6 (làm thêm): Xây dựng hàm với 2 tham số đầu vào a, b; kiểm tra a có chia hết cho b hay không và trả về kết quả kiểm tra, giá trị trả về có thể là kiểu int, bool, char,..
Input: Nhập 2 số có kiểu dữ liệu integer a, b từ bàn phím
Output: in ra kết quả có chia hết hay không

THỰC HIỆN

Bài 1: Xây dựng chương trình tìm số lớn nhất trong 3 số
Input: Nhập từ bàn phím 3 số bất kỳ
Output: Xuất ra màn hình số lớn nhất trong 3 số

Code:
/*
Xây dựng chương trình tìm số lớn nhất trong 3 số
Input: Nhập từ bàn phím 3 số bất kỳ
Output: Xuất ra màn hình số lớn nhất trong 3 số
*/
#include<stdio.h>

int timSoLonNhat(int a, int b, int c){
    int MaxTemp;
    MaxTemp = a;
    if (b > MaxTemp)
    {
        MaxTemp = b;
    }
    if (c > MaxTemp)
    {
        MaxTemp = c;
    }
    return MaxTemp;
}

int main()
{
    int a, b, c;
    int soLonNhat;
    
    // soLonNhat = timSoLonNhat(5, 50, 12); // có thể truyền số trực tiếp
    printf("Nhap vao so a b c: "); 
    scanf("%d%d%d", &a, &b, &c); // có thể đọc 3 số một lần, mỗi số nhập vào cách nhau MỘT KHOẢNG TRẮNG

    soLonNhat = timSoLonNhat(a, b, c);
    printf("%d la so lon nhat!", soLonNhat);
}

Các hàm tìm max 2 số tham khảo khác:
int timMax(int a, int b){
	if (a > b) return a;
	return b;
}

int timSoLonNhat(int a, int b){
	return (a >= b) ? a : b;
}


Bài 2: Xây dựng chương trình tính năm nhuận
Input: Nhập vào năm
Output: Có phải là năm nhuận hay không?
Biết rằng: Năm nhuận là năm chia hết cho 400 hoặc chia hết cho 4 nhưng không chia hết cho 100


Những năm nhuận của thế kỷ 21 là:
    2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032,
    2036, 2040, 2044, 2048, 2052, 2056, 2060, 2064,
    2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096.

Code:
/*
Xây dựng chương trình tính năm nhuận
Input: Nhập vào năm
Output: Có phải là năm nhuận hay không?
Biết rằng: Năm nhuận là năm chia hết cho 400 hoặc chia hết cho 4 nhưng không chia hết cho 100

Những năm nhuận của thế kỷ 21 là: 
    2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 
    2036, 2040, 2044, 2048, 2052, 2056, 2060, 2064, 
    2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096.

*/
#include<stdio.h>

int tinhNamNhuan(int nam)
{ 
    if ((nam % 400 == 0) || ((nam % 4 == 0) && (nam % 100 != 0)))
    {
        return 1;
    }
    else return 0;
     
}

int main()
{
    int nam;
    printf("Nhap vao nam can kiem tra: ");
    scanf("%d", &nam);
    if (tinhNamNhuan(nam) == 1)
    {
        printf("%d la NAM NHUAN!", nam);
    }
    else printf ("%d KHONG PHAI nam nhuan!", nam);
    
}

Bài 3: Xây dựng chương trình hoán vị (hoán vị giá trị của 2 số) sử dụng con trỏ và gọi hàm theo tham chiếu
Input: Nhập vào từ bàn phím 2 giá trị a,b
Output: hoán vị 2 giá trị của a và b

Code:
/*
Xây dựng chương trình hoán vị (hoán vị giá trị của 2 số) sử dụng con trỏ và gọi hàm theo tham chiếu
Input: Nhập vào từ bàn phím 2 giá trị a,b
Output: hoán vị 2 giá trị của a và b
*/
#include<stdio.h>

// hóa vị thông thường
void hoanVi(int a, int b) 
{
    int temp = a;
    a = b;
    b = temp;
}

// hoán vị dùng con trỏ
void hoanViTro(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int a, b;
    printf("Nhap vao so a b: "); 
    scanf("%d%d", &a, &b);
    
    printf("\n===========================\n");
    printf("Hai so vua nhap la: %d & %d\n", a, b);

    // hoanVi(a, b);
    hoanViTro(&a, &b); // gọi hàm nếu hàm có sử dụng con trỏ chúng ta thêm dấu và vào trước các biến
    printf("Hai so sau khi thuc hien HOAN VI: %d & %d\n", a, b);
}

Chú ý:
Khi chúng ta dùng hàm hoanVi(a, b) sẽ cho kết quả là sai (không hoán đổi) tại sao?
Khi ta gọi  thì giá trị của a và b được đưa vào hàm chứ không phải là các biến a, b nên biến a, b của chúng ta không hề thay đổi.

Khuyến khích dùng con trỏ khi viết hàm hoán vị hoặc thêm chữ và (&) trước mỗi biến sau đó lưu thành file .CPP



code:
void hoanVi(int &a, int &b) 
{
    int temp = a;
    a = b;
    b = temp;
}

Bài 4 (làm thêm): Xây dựng hàm có truyền tham số đầu vào, và trả về kết quả cho các yêu cầu:
- Hàm kiểm tra chẵn lẻ
- Hàm kiểm tra số chính phương
Input: Nhập vào số có kiểu dữ liệu integer từ bàn phím
Output: in ra các số chẵn và là số chính phương trong khoảng từ 1 đến số vừa nhập

- Hàm kiểm tra chẵn lẻ:
int kiemTraChanLe(int n){
	int kiemTra;
	
	if (n % 2 == 0){
		kiemTra = 1;
	}else{
		kiemTra = 0;
	}
	
	return kiemTra;
}

- Hàm kiểm tra chẵn lẻ viết cách khác gọn hơn:
int chanLeRutGon(int n){
	if (n % 2 ==0) return 1;
	else return 0;
}

- Hàm kiểm tra số chính phương:
int kiemTraChinhPhuong(int n){
	int kiemTra = 0;
	int canBacHai = sqrt(n); // #include<math.h>
    
	if(canBacHai * canBacHai == n){
    	kiemTra = 1;
    }else{
    	kiemTra = 0;
	}
    return kiemTra;
}

- Chương trình chính:
#include<stdio.h>
int main(){
    int i, n;
   
    printf("\nNhap vao so: ");scanf("%d", &n);

	for (i = 1; i < n; i++){
		if (kiemTraChanLe(i) ==1 && kiemTraChinhPhuong(i) == 1){
			printf(" %d ", i);
		}
	}

}

- Full code chương trình:
#include<stdio.h>
#include<math.h>

int kiemTraChinhPhuong(int n){
	int kiemTra;
	int canBacHai = sqrt(n); // #include<math.h>
    
	if(canBacHai * canBacHai == n){
    	kiemTra = 1;
    }else{
    	kiemTra = 0;
	}
    return kiemTra;
}

int kiemTraChanLe(int n){
	int kiemTra;
	
	if (n % 2 == 0){
		kiemTra = 1;
	}else{
		kiemTra = 0;
	}
	
	return kiemTra;
}

int chanLeRutGon(int n){
	if (n % 2 ==0) return 1;
	else return 0;
}

int main(){
    int i, n;
   
    printf("\nNhap vao so: ");
    scanf("%d", &n);

	for (i = 1; i < n; i++){
		if (kiemTraChanLe(i) ==1 && kiemTraChinhPhuong(i) == 1){
			printf(" %d ", i);
		}
	}

}

Bài 5 (làm thêm): Xây dựng hàm có truyền tham số đầu vào, và trả về kết quả cho các yêu cầu:
- Hàm kiểm tra số nguyên tố
Input: Nhập vào số có kiểu dữ liệu integer từ bàn phím
Output: in ra các số nguyên tố trong khoảng từ 1 đến số vừa nhập

Code gợi ý:
Kiểm tra nguyên tố:
int kiemTraNguyenTo(int x){
	int i;
	int kiemTra = 1;
	for (i = 2; i < x; i++){
        if (x % i == 0) {
        	kiemTra = 0;
            return kiemTra;
        }
    }
	return kiemTra;
} 

int kiemTraNguyenTo1(int x){
	int i;
	for (i = 2; i < x; i++){
        if (x % i == 0) {
            return 0;
        }
    }
	return 1;
} 

int kiemTraNguyenTo2(int x){
	int i;
	for (i = 2; i <= sqrt(x); i++){ // thu vien math.h
        if (x % i == 0) {
            return 0;
        }
    }
	return 1;
}

Hàm  chính:
int main() {
	int x = 100;//????
	for (int i = 2; i <= x; i++){
		if(kiemTraNguyenTo(i) == 1) {
			printf("%d ", i);		
		}
	}
}


Bài 6 (làm thêm): Xây dựng hàm với 2 tham số đầu vào a, b; kiểm tra a có chia hết cho b hay không và trả về kết quả kiểm tra, giá trị kiểm tra có thể là kiểu int, bool, char,.. 
Input: Nhập 2 số có kiểu dữ liệu integer a, b từ bàn phím
Output: in ra kết quả có chia hết hay không
#include<stdio.h>
int kiemTraChiaHet(int a, int b){
	if (a % b == 0) return 1;
	return 0;
}
bool kiemTraChiaHet_bool(int a, int b){ // bool
	if (a % b == 0) return true;
	return false;
}

int main()
{	
	int a, b;
	printf("\nNhap vao 2 so a, b: "); scanf("%d%d", &a, &b); 
	if (kiemTraChiaHet_bool(a, b)){
		printf("\n%d CHIA HET cho %d", a, b);
	}else printf("\n%d KHONG chia het cho %d", a, b);
}

Xong!

[Tự Học Lập Trình C - Qua Các Bài Tập] COM108_Nhập Môn Lập Trình - Bài 4 - WHILE DO-WHILE

MỤC TIÊU:
- Biết cách sử dụng vòng lặp while
- Biết cách sử dụng vòng lặp do while

LÝ THUYẾT:
while


Ví dụ:
/*
int ra màn hình 10 chữ Hello
*/
#include<stdio.h>
int main()
{
	int i;
	i = 0;
	while (i < 10) { //khi i < 10
		printf("\nHello %d", i); // xuất ra dòng chữ Hello
		i++;  // tăng i lên 1 đơn vị
	}
}

for 

Ví dụ:
/*
int ra màn hình 10 chữ Hello
*/
#include<stdio.h>
int main()
{
	int i;
	for (i = 0 ; i < 10 ; i++) { // tương tự như while, biến khởi tạo, điều kiện, bước nhảy nằm trên 1 dòng lệnh
		printf("\nHello %d", i);
	}
}


Cách chuyển đổi while sang for


do - while


Ví dụ:
#include<stdio.h>
int main()
{
	int a;
	a = 6;
 	do {
 		printf("\nHello %d", a);
 		a++;
	} while (a < 3); // điều kiện là a = 3, tuy nhiên chương trình vẫn in dữ liệu ra ngay cả a = 6
}

Khác nhau while và do while



break - continue  

Break: Câu lệnh break được sử dụng để thoát/nhảy ra khỏi vòng lặp (nếu có nhiều vòng lặp lồng nhau thì nó chỉ thoát ra vòng lặp gần nó nhất)

Ví dụ:
/*
int ra màn hình 10 chữ Hello
tuy nhiên gặp break nó phải thoát ra khỏi vòng lặp
Kết quả:
Hello 0
Hello 1
Hello 2
Hello 3
*/
#include<stdio.h>
int main()
{
	int i;
	for (i = 0 ; i < 10 ; i++) { 
		if (i == 4) // nếu i = 4 thì
			break; // thoát ra khỏi vòng lặp gần nó nhất
		printf("\nHello %d", i);
	}
}


Continue: Câu lệnh continue lệnh ngắt/bỏ qua một lần lặp và không thực hiện khối lệnh phía sau nó (trong vòng lặp), nếu một điều kiện cụ thể xảy ra và tiếp tục với lần lặp tiếp theo trong vòng lặp.

Ví dụ:
/*
int ra màn hình 10 chữ Hello
tuy nhiên gặp continue nó bỏ qua không thực hiện lệnh sau đó mà quay lại vòng lặp
Kết quả:
Hello 0
Hello 1
Hello 2
Hello 3
Hello 5
Hello 6
Hello 7
Hello 8
Hello 9
*/
#include<stdio.h>
int main()
{
	int i;
	for (i = 0 ; i < 10 ; i++) { 
		if (i == 4) // nếu i = 4 thì
			continue; // không in dòng Hello mà quay lại vòng lặp
		printf("\nHello %d", i);
	}
}


goto

goto: Câu lệnh goto cung cấp một bước nhảy vô điều kiện đến một câu lệnh có nhãn trong cùng một hàm

Noted: goto có nhiều hạn chế nên nó rất ít được sử dụng (chỉ dùng trong 1 vài trường hợp đặc biệt) trong nhiều ngôn ngữ.



YÊU CẦU:
Bài 1:  Tính trung bình tổng các số tự nhiên chia hết cho 2
Input: nhập từ bàn phím 2 giá trị min, max
Output: Trung bình tổng của các số tự nhiên chia hết cho 2 từ min tới max

 
Bài 2: Xác định số nhập vào có phải là số nguyên tố hay không
Input: Nhập vào từ bàn phím số x
Output: Kết luận x có phải là số nguyên tố hay không
Biết rằng: Số nguyên tố là số chỉ chia hết cho 1 và chính nó.

Bài 3: Xây dựng chương trình xây dựng số chính phương
Input: Nhập vào từ bàn phím số x
Output: Kết luận x có phải là số chính phƣơng hay không?
Biết rằng: Số chính phƣơng là một số mà giá trị của nó là bình phƣơng của một số tự nhiên. (ví dụ: 9 = 3 x 3; 16 = 4 x 4; 25 = 5 x 5; 1,000,000 = 1,000 x 1,000)

Bài 4: Xây dựng menu cho 3 bài tập trên
Yêu cầu:
- Nếu người dùng nhập từ bàn phím số 1: -> Chạy chương trình bài 1
- Nếu người dùng nhập từ bàn phím số 2: -> Chạy chƣơng trình bài 2
- Nếu người dùng nhập từ bàn phím số 3: -> Chạy chƣơng trình bài 3
- Nếu người dùng nhập từ bàn phím số 4: -> Thoát khỏi chương trình
- Nếu người dùng nhập từ bàn phím số khác: Hiển thị menu như cũ

Gợi ý: Sử dụng vòng lặp do while kết hợp với cách tạo menu thông thường để làm bài tập số 4


THỰC HIỆN:

Bài 1:  Tính trung bình tổng các số tự nhiên chia hết cho 2
Input: nhập từ bàn phím 2 giá trị min, max
Output: Trung bình tổng của các số tự nhiên chia hết cho 2 từ min tới max

code:
/*
Bài 1:  Tính trung bình tổng các số tự nhiên chia hết cho 2
Input: nhập từ bàn phím 2 giá trị min, max
Output: Trung bình tổng của các số tự nhiên chia hết cho 2 từ min tới max
*/
#include<stdio.h>
int main()
{
    int min, max;
    int tong = 0,  trungBinhTong = 0;
    int bienDem = 0;

    printf("Nhap vao so min: ");
    scanf("%d", &min);
    printf("Nhap vao so max: ");
    scanf("%d", &max);

	int i = min;

    while (i <= max)
    {
        if (i % 2 == 0) // chia lấy dư
        {
            tong = tong + i; // tong +=i
            bienDem ++; // tăng biến đếm lên 1
        }
        i ++; // tăng i lên 1, đây là điều kiện dừng nếu không tăng thì chương trình lặp vô hạn
    }
    trungBinhTong = tong/bienDem;
    printf("\n============================\n");
    printf("Trung binh tong so chia het cho 2 la: %d", trungBinhTong);
}

 

Bài 2: Xác định số nhập vào có phải là số nguyên tố hay không
Input: Nhập vào từ bàn phím số x
Output: Kết luận x có phải là số nguyên tố hay không
Biết rằng: Số nguyên tố là số chỉ chia hết cho 1 và chính nó.

code:
/*
Kiểm tra nguyên tố
Input: Nhập vào từ bàn phím số x
Output: Kết luận x có phải là số nguyên tố hay không
Biết rằng: Số nguyên tố là số chỉ chia hết cho 1 và chính nó (phải đảm bảo 2 điều kiện).


*/
#include<stdio.h>
int main(){
    int x;
    int bienDem = 0;
    // bool kiemTra = true; // giả thiết số nhập vào là số nguyên tố
    printf("Nhap vao so can kiem tra X: ");
    scanf("%d", &x);

    for (int i = 2; i < x; i++){
        if (x % i == 0)
        {
            bienDem ++; // mục đích là đánh dấu số chia hết i 
            // kiemTra = false;
            break; // nếu chia hết cho bất kỳ số nào trong khoảng từ i đến x là có thể khẳng định KHÔNG phải là số nguyên tố
         }
    }
    if (bienDem == 0)
   // if (kiemTra == true)
    {
        printf("%d la so NGUYEN TO!", x);
    } 
    else {
        printf("%d KHONG PHAI so nguyen to!", x);
    }

}
 

Bài 3: Xây dựng chương trình xây dựng số chính phương
Input: Nhập vào từ bàn phím số x
Output: Kết luận x có phải là số chính phương hay không?
Biết rằng: Số chính phương là một số mà giá trị của nó là bình phương của một số tự nhiên. (ví dụ: 9 = 3 x 3; 16 = 4 x 4; 25 = 5 x 5; 1,000,000 = 1,000 x 1,000)

code:
/*
Kiểm tra số chính phương
Input: Nhập vào từ bàn phím số x
Output: Kết luận x có phải là số chính phƣơng hay không?
Biết rằng: Số chính phƣơng là một số mà giá trị của nó là bình phƣơng của một số
tự nhiên. (ví dụ: 9 = 3 x 3; 16 = 4 x 4; 25 = 5 x 5; 1,000,000 = 1,000 x 1,000)
*/

#include<stdio.h>
int main(){
    int x;
    
    printf("Nhap vao so can kiem tra X: ");
    scanf("%d", &x);

    int i;
    int bienDem = 0;
    // char kiemTra = 'k'; // đánh dấu biến kiểm tra 'k' 
    for ( i = 1; i < x; i++)
    {
        if (i * i == x)
        {
            bienDem = 1;
            // kiemTra = 'c'; // đánh dấu = 'c' là số chính phương
            break;
        }
    }
    if (bienDem == 1)
    // if (kiemTra == 'c')
    {
        printf("%d la so CHINH PHUONG!", x);
    }
    else
    {
        printf("%d KHONG PHAI so chinh phuong!", x);
    }   
}

Tham khảo thêm kiểm tra số chính phương KHÔNG DÙNG VÒNG LẶP:
#include<stdio.h>
#include<math.h>

int main(){
    int n;
    int kiemTra = 0;
    printf("\nNhap so can kiem tra: ");scanf("%d", &n);
//    n = 9;
	int canBacHai = sqrt(n);
    
	if(canBacHai * canBacHai == n){
    	kiemTra = 1;
    }
       
    if(kiemTra == 1){
        printf("%d la SO CHINH PHUONG!\n", n);
    }else{
        printf("%d KHONG PHAI so chinh phuong!\n", n);
    }
}
 

Bài 4: Xây dựng menu cho 3 bài tập trên
Yêu cầu:
- Nếu người dùng nhập từ bàn phím số 1: -> Chạy chương trình bài 1
- Nếu người dùng nhập từ bàn phím số 2: -> Chạy chƣơng trình bài 2
- Nếu người dùng nhập từ bàn phím số 3: -> Chạy chƣơng trình bài 3
- Nếu người dùng nhập từ bàn phím số 4: -> Thoát khỏi chương trình
- Nếu người dùng nhập từ bàn phím số khác: Hiển thị menu như cũ

Gợi ý: Sử dụng vòng lặp do while kết hợp với cách tạo menu thông thường để làm bài tập số 4

code:
/*Xây dựng menu cho 3 bài trên
Yêu cầu:
-Nếu ngƣời dùng nhập từ bàn phím số 1: -> Chạy chƣơng trình bài 1
-Nếu ngƣời dùng nhập từ bàn phím số 2: -> Chạy chƣơng trình bài 2
-Nếu ngƣời dùng nhập từ bàn phím số 3: -> Chạy chƣơng trình bài 3
-Nếu ngƣời dùng nhập từ bàn phím số 4: -> Thoát khỏi chƣơng trình
-Nếu ngƣời dùng nhập từ bàn phím số khác: Hiển thị menu nhƣ cũ
*/
#include<stdio.h>

// trung bình tổng chẳn
int bai_01()
{
    int min, max;
    int tong = 0,  trungBinhTong = 0;
    int bienDem = 0;

    printf("Nhap vao so min: ");
    scanf("%d", &min);
    printf("Nhap vao so max: ");
    scanf("%d", &max);

	int i = min;

    while (i <= max)
    {
        if (i % 2 == 0) // chia lấy dư
        {
            tong = tong + i; // tong +=i
            bienDem ++; // tăng biến đếm lên 1
        }
        i ++; // tăng i lên 1, đây là điều kiện dừng nếu không tăng thì chương trình lặp vô hạn
    }
    trungBinhTong = tong/bienDem;
    printf("\n============================\n");
    printf("Trung binh tong so chia het cho 2 la: %d", trungBinhTong);
}

// kiểm tra nguyên tố
int bai_02(){
    int x;
    int bienDem = 0;
    printf("Nhap vao so can kiem tra X: ");
    scanf("%d", &x);

    for (int i = 2; i < x; i++){
        if (x % i == 0)
        {
            bienDem ++; // mục đích là đánh dấu số chia hết i
            break;
        }
    }
    if (bienDem == 0)
    {
        printf("%d la so NGUYEN TO!", x);
    } 
    else {
        printf("%d KHONG PHAI so nguyen to!", x);
    }

}

// kiểm tra số chính phương
int bai_03(){
    int x;
    
    printf("Nhap vao so can kiem tra X: ");
    scanf("%d", &x);

    int i;
    int bienDem = 0;
    for ( i = 1; i < x; i++)
    {
        if (i * i == x)
        {
            bienDem = 1;
            break;
        }
    }
    if (bienDem == 1)
    {
        printf("%d la so CHINH PHUONG!", x);
    }
    else
    {
        printf("%d KHONG PHAI so chinh phuong!", x);
    }   
}

// hàm chính
int main()
{
    int luaChon;
    do
    {
        printf("\n=========== MENU LUA CHON =========\n");
        printf("1. Trung Binh Tong\n");
        printf("2. Kiem Tra Nguyen To\n");
        printf("3. Kiem Tra Chinh Phuong\n");
        printf("0. THOAT CHUONG TRINH!\n");
        printf("\n");
        printf("Lua chon cua ban la: ");
        scanf("%d", &luaChon);
        printf("==================================\n");
        switch (luaChon)
        {
        case 1:
            bai_01(); // gọi hàm bai_1 phía trên hàm main()
            break;
        case 2:
            bai_02();
            break;
        case 3:
            bai_03();
            break;
        case 0: 
            break;
        default:
            printf("Lua chon KHONG DUNG!\n");
            break;
        }
    } while (luaChon != 0);
    
}   
    

Xong!

[Database-Tự Học SQL] COM2034_SQL Server - Lab 6: SQL Trigger

MỤC TIÊU:
Sử dụng Sql trigger thực thi các ràng buộc, qui định trong csdl.
- Khai báo, tạo trigger
- Thực thi trigger.
- Trigger DML, Trigger AFTER, Trigger INSTEAD OF


YÊU CẦU:

Bài 1:
Viết trigger DML:
- Ràng buộc khi thêm mới nhân viên thì mức lương phải lớn hơn 15000, nếu vi phạm thì xuất thông báo “luong phải >15000’
- Ràng buộc khi thêm mới nhân viên thì độ tuổi phải nằm trong khoảng 18 <= tuổi <=65.
- Ràng buộc khi cập nhật nhân viên thì không được cập nhật những nhân viên ở TP HCM

Bài 2:
Viết các Trigger AFTER:
- Hiển thị tổng số lượng nhân viên nữ, tổng số lượng nhân viên nam mỗi khi có hành động thêm mới nhân viên.
- Hiển thị tổng số lượng nhân viên nữ, tổng số lượng nhân viên nam mỗi khi có hành động cập nhật phần giới tính nhân viên
- Hiển thị tổng số lượng đề án mà mỗi nhân viên đã làm khi có hành động xóa trên bảng DEAN

Bài 3:
Viết các Trigger INSTEAD OF
- Xóa các thân nhân trong bảng thân nhân có liên quan khi thực hiện hành động xóa nhân viên trong bảng nhân viên.
- Khi thêm một nhân viên mới thì tự động phân công cho nhân viên làm đề án có MADA là 1.

THỰC HIỆN:

Bài 1:
Viết trigger DML:
- Ràng buộc khi thêm mới nhân viên thì mức lương phải lớn hơn 15000, nếu vi phạm thì xuất thông báo “luong phải >15000’

  • Code:
CREATE OR ALTER TRIGGER trg_CheckLuong_NV ON NHANVIEN 
FOR INSERT 
AS
	BEGIN
		IF (select LUONG from inserted) < 15000
		BEGIN
			PRINT N'Luong phai > 15000'
			ROLLBACK TRANSACTION
		END
	END
GO

  • Test trigger (cố tình nhập mức lương <15000, trong trường hợp này là 4000)
insert into NHANVIEN
values(N'Nguyễn',N'Văn',N'Ti','0921','1960-03-11',N'45 Lê Văn Sỹ,TP HCM','Nam',4000,'001',4,35)

- Ràng buộc khi thêm mới nhân viên thì độ tuổi phải nằm trong khoảng 18 <= tuổi <=65.
Có nhiều cách làm các bạn có thể chọn 1 trong các cách bên dưới
  • [Dùng OR] Code:
CREATE OR ALTER TRIGGER trg_KiemTraTuoi ON NHANVIEN 
FOR INSERT 
AS
BEGIN
	IF (SELECT YEAR(GETDATE()) - YEAR(NGSINH) FROM INSERTED) < 18 
    	OR (SELECT YEAR(GETDATE()) - YEAR(NGSINH) FROM INSERTED) > 65 
    
		BEGIN
			PRINT '[Trigger cua OR] Tuoi trong khoang 18 - 65'
			ROLLBACK TRANSACTION
		END
END
GO
  • [Dùng NOT BETWEEN] Code:
CREATE OR ALTER TRIGGER trg_KiemTraTuoi ON NHANVIEN 
FOR INSERT 
AS
BEGIN
	IF ((SELECT YEAR(GETDATE()) - YEAR(NGSINH) FROM INSERTED) 
		NOT BETWEEN 18 AND 65)
		BEGIN
			PRINT '[Trigger cua NOT BETWEEN] Tuoi trong khoang 18 - 65'
			ROLLBACK TRANSACTION
		END
END
GO    
  • [Dùng BIẾN] Code:
CREATE OR ALTER TRIGGER trg_KiemTraTuoi ON NHANVIEN 
FOR INSERT 
AS
BEGIN
	DECLARE @age INT
	SET @age = (SELECT YEAR(GETDATE()) - YEAR(NGSINH) FROM INSERTED)

	IF ( @age NOT BETWEEN 18 AND 65)
		BEGIN
			PRINT '[Trigger cua DUNG BIEN] Tuoi trong khoang 18 - 65'
			ROLLBACK TRANSACTION
		END
END
GO

  • Test trigger (xóa trigger trg_CheckLuong_NV, thực hiện thêm nhân viên mới như bình thường, riêng trường ngày sinh cố tình nhập 2020 hoặc 193x)
INSERT INTO NHANVIEN VALUES(N'Nguyễn',N'Văn',N'Ti','0921','2020-03-11',N'45 Lê Văn Sỹ,TP HCM','Nam',1600,'001',4,35)
GO

- Ràng buộc khi cập nhật nhân viên thì không được cập nhật những nhân viên ở TP HCM

  • Code:
CREATE OR ALTER TRIGGER trg_KiemTra_DiaChi_HCM ON NHANVIEN 
FOR UPDATE
AS
BEGIN
	IF (SELECT DCHI FROM inserted) LIKE '%HCM%'
		BEGIN
			PRINT 'Khong duoc cap nhat dia chi HCM'
			ROLLBACK TRANSACTION
		END
END
GO

  • Để test chúng ta nên query bảng nhân viên để xem những nhân viên nào có địa chỉ HCM, sau đó mới test
SELECT * FROM NHANVIEN
GO

  • Test trigger:
UPDATE NHANVIEN SET	LUONG = 30001 WHERE MANV = 001
GO


Bài 2:
Viết các Trigger AFTER:
- Hiển thị tổng số lượng nhân viên nữ, tổng số lượng nhân viên nam mỗi khi có hành động THÊM MỚI nhân viên.

Code:
CREATE OR ALTER TRIGGER tg_Dem_NamNu ON NHANVIEN 
AFTER INSERT
AS
BEGIN
	DECLARE @a INT;
	SELECT @a = COUNT(*) 
		FROM NHANVIEN 
		WHERE PHAI = 'Nam'
		GROUP BY PHAI
	PRINT 'So nhan vien NAM hien tai la: ' + CAST(@a AS CHAR(5));
	
	DECLARE @b INT;
	SELECT @b = COUNT (*) 
		FROM NHANVIEN 
		WHERE PHAI = N'Nữ'
		GROUP BY PHAI
	PRINT 'So nhan vien NU hien tai la: ' + CONVERT(CHAR(5), @b);
END
GO

  • Test trigger
INSERT INTO NHANVIEN VALUES(N'Nguyễn',N'Văn',N'Ti','99999','1978-03-11',N'45 Lê Văn Sỹ,TP HCM','Nam',1600,'001',4,35)
GO
- Hiển thị tổng số lượng nhân viên nữ, tổng số lượng nhân viên nam mỗi khi có hành động CẬP NHẬT phần giới tính nhân viên

  • Code:
CREATE OR ALTER TRIGGER tg_Dem_NamNu_CapNhat ON NHANVIEN 
AFTER UPDATE
AS
BEGIN
	DECLARE @a INT;
	SELECT @a = COUNT(*) 
		FROM NHANVIEN 
		WHERE PHAI = 'Nam'
		GROUP BY PHAI
	PRINT 'So nhan vien NAM hien tai la: ' + CAST(@a AS CHAR(5));
	
	DECLARE @b INT;
	SELECT @b = COUNT (*) 
		FROM NHANVIEN 
		WHERE PHAI = N'Nữ'
		GROUP BY PHAI
	PRINT 'So nhan vien NU hien tai la: ' + CONVERT(CHAR(5), @b);
END
GO

  • Test trigger
UPDATE NHANVIEN SET PHAI = N'Nữ' WHERE MANV = '003'
GO

- Hiển thị tổng số lượng đề án mà mỗi nhân viên đã làm khi có hành động xóa trên bảng DEAN

  • Code:
CREATE OR ALTER TRIGGER trg_DemSoLuongDeAn_Xoa ON DEAN 
AFTER DELETE 
AS
BEGIN
	SELECT PHANCONG.MA_NVIEN, COUNT (*) 
		FROM DEAN
			INNER JOIN CONGVIEC ON DEAN.MADA = CONGVIEC.MADA
			INNER JOIN PHANCONG ON CONGVIEC.MADA = PHANCONG.MADA AND CONGVIEC.STT = PHANCONG.STT
		GROUP BY PHANCONG.MA_NVIEN
END
GO

  • Test trigger
DELETE FROM DEAN WHERE PHONG = 1;
GO

Bài 3:
Viết các Trigger INSTEAD OF
- Xóa các thân nhân trong bảng thân nhân có liên quan khi thực hiện hành động xóa nhân viên trong bảng nhân viên.

  • Code:
CREATE OR ALTER TRIGGER trg_DELETE_NhanVien_ThanNhan ON NHANVIEN
INSTEAD OF DELETE
AS
BEGIN
	DECLARE @Ma_nv NVARCHAR(9) 
	SELECT  @Ma_nv = MANV FROM deleted;
	DELETE FROM PHANCONG WHERE MA_NVIEN IN (SELECT MANV FROM deleted);
	DELETE FROM PHONGBAN WHERE TRPHG IN (SELECT MANV FROM deleted);
	DELETE FROM THANNHAN WHERE MA_NVIEN IN (SELECT MANV FROM deleted);
	DELETE FROM NHANVIEN WHERE MANV IN (SELECT MANV FROM deleted);
	SELECT 'Da xoa THANH CONG ' + @Ma_nv;
END
GO
  • Thực hiện xóa
DELETE FROM NHANVIEN WHERE MANV ='022';

- Khi thêm một nhân viên mới thì tự động phân công cho nhân viên làm đề án có MADA là 1.

  • Code:
CREATE OR ALTER TRIGGER trg_TuDong_PhanCong ON NHANVIEN 
AFTER INSERT AS
BEGIN
	INSERT INTO PHANCONG VALUES ((SELECT MANV FROM inserted),1 ,1 ,30)
END
GO

  • Thực hiện chèn để test
INSERT [dbo].[NHANVIEN] ([HONV], [TENLOT], [TENNV], [MANV], [NGSINH], [DCHI], [PHAI], [LUONG], [MA_NQL], [PHG]) 
	VALUES (N'Đinh ', N'Bá ', N'Tiên', N'091', CAST(N'2000-02-11T00:00:00.000' AS DateTime), N'119 Cống Quỳnh, Tp Y', N'N', 17000, N'005', 5)
GO


Xong!

[Tự Học Lập Trình C - Qua Các Bài Tập] COM108_Nhập Môn Lập Trình - Bài 3 - IF-ELSE SWITCH-CASE


MỤC ĐÍCH:
  • Biết cách sử dụng lệnh if-else
  • Biết cách sử dụng lệnh switch-case

LÝ THUYẾT:

Lệnh if (rẽ nhánh) được sử dụng để ra quyết định thực hiện một công việc nào đó tùy vào điều kiện đúng hay sai

Các ký hiệu lưu đồ căn bản


if-else:

Switch-case:




YÊU CẦU:

Bài làm quen: Nhập vào số nguyên, kiểm tra số vừa nhập là số chẵn hay số lẻ


Bài 1: 
Xây dựng chương trình tính học lực biết:
Học lực xuất sắc: Điểm >= 9
Học lực giỏi: 9 > điểm >= 8
Học lực khá: 8 > điểm >= 6.5
Học lực trung bình: 6.5 > điểm >= 5
Học lực yếu: 5 > điểm >= 3.5
Học lực kém: 3.5 > điểm

Input: Nhập vào điểm của sinh viên (0-10)
Output: Hiển thị ra màn hình học lực của sinh viên

Bài 2: Xây dựng chương trình giải phương trình:
2.1: Phương trình bậc 1 có dạng ax + b = 0
Input: nhập vào từ bàn phím giá trị của a, b
Output: Hiển thị nghiệm của phương trình
Biết rằng:
Nếu a == 0,
- b == 0: Phương trình có vô số nghiệm
- b != 0: Phương trình vô nghiệm
Ngược lại: Phương trình có nghiệm x = -b/a


2.2: Phương trình bậc 2 có dạng: ax2 + bx + c = 0
Input: Nhập vào từ bàn phím: a, b, c
Output: Nghiệm của phương trình
Biết rằng:
Nếu a == 0, phương trình thành bx + c = 0
Ngược lại nếu a != 0
- Tính delta
- Nếu delta < 0: Phương trình vô nghiệm
- Nếu delta == 0: Phương trình có nghiệm kép x = -b/(2*a)
- Nếu delta > 0: Phương trình có 2 nghiệm riêng biệt
  + X1 = (-b + căn(delta))/(2*a)
  + X2 = (-b – căn(delta))/(2*a)

Bài 3: Chương trình tính tiền điện
Input: Nhập vào số điện tiêu thụ hàng tháng
Output: Hiển thị số tiền cần phải đóng
Biết rằng:
TT Số kWh sử dụng được tính theo bậc Giá bán điện (đồng/kWh)
Bậc 1: Cho kWh từ 0 - 50 giá 1.678 (đồng/kWh)
Bậc 2: Cho kWh từ 51 - 100 giá 1.734
Bậc 3: Cho kWh từ 101 - 200 giá 2.014
Bậc 4: Cho kWh từ 201 - 300 giá 2.536
Bậc 5: Cho kWh từ 301 - 400 giá 2.834
Bậc 6: Cho kWh từ 401 trở lên giá 2.927

Bài 4: Sử dụng lệnh Switch-case để xây dựng menu chương trình cho 3 bài tập trên

Bài làm thêm:
Chương trình tính tiền cho quán Karaoke
Input: Nhập vào giờ bắt đầu, giờ kết thúc
Output: Hiển thị giá tiền cần thanh toán
Biết rằng:
Giá tiền 3 giờ đầu là 150000, bắt đầu giờ thứ 4 giảm 30%.
Quán chỉ hoạt động trong khoảng giờ từ 12 giờ -> 23 giờ.
Nếu giờ bắt đầu trong khoảng 14 -> 17 thì giảm tiếp 10% tổng tiền thanh toán

THỰC HIỆN:

Bài làm quen: 
Nhập vào số nguyên, kiểm tra số vừa nhập là số chẵn hay số lẻ
Lưu đồ thuật toán (Flowchart)

Code:
/*
Nhập vào số nguyên, 
Kiểm tra số vừa nhập là số chẵn hay số lẻ
Gợi ý:
Lấy số đó chia cho 2 mà không dư thì đó là số chẵn, ngược lại là số lẻ
*/
#include<stdio.h>

int main()
{
	int x ;
	printf("Nhap so nguyen: "); 
	scanf("%d", &x); 
	printf("\n=======================\n") ;
	if (x % 2 == 0) // chia lấy dư
	{
		printf("%d la so CHAN!\n", x);	
	} else {
		printf("%d la so LE!\n", x);
	}

}


Bài 1: Xây dựng chương trình tính học lực biết:
Học lực xuất sắc: Điểm >= 9
Học lực giỏi: 9 > điểm >= 8
Học lực khá: 8 > điểm >= 6.5
Học lực trung bình: 6.5 > điểm >= 5
Học lực yếu: 5 > điểm >= 3.5
Học lực kém: 3.5 > điểm

Input: Nhập vào điểm của sinh viên (0-10)
Output: Hiển thị ra màn hình học lực của sinh viên

code:
#include<stdio.h>
#include<conio.h>

int main()
{
	float diem;
	printf("Nhap vao diem Sinh Vien: "); 
	scanf("%f", &diem); 
	if (diem >=9)
	{
		printf("Hoc luc: XUAT SAC");
	} 
	else if (diem >=8)
	{
		printf("Hoc luc: GIOI");
	} 
	else if (diem >=6.5)
	{
		printf("Hoc luc: KHA");
	} 
	else if (diem >=5)
	{
		printf("Hoc luc: TRUNG BINH");
	} 
	else if (diem >=3.5)
	{
		printf("Hoc luc: YEU");
	} 
	else if (diem < 3.5)
	{
		printf("Hoc luc: KEM");
	}

return 0;
}


Bài 2: Xây dựng chương trình giải phương trình:
2.1: Phương trình bậc 1 có dạng ax + b = 0
Input: nhập vào từ bàn phím giá trị của a, b
Output: Hiển thị nghiệm của phương trình
Biết rằng:
Nếu a == 0,
- b == 0: Phương trình có vô số nghiệm
- b != 0: Phương trình vô nghiệm
Ngược lại: Phương trình có nghiệm x = -b/a

flow chart:





code:
/*
Xây dựng chương trình giải phương trình:
2.1: Phương trình bậc 1 có dạng ax + b = 0
Input: nhập vào từ bàn phím giá trị của a, b
Output: Hiển thị nghiệm của phương trình
Biết rằng:
Nếu a == 0,
- b == 0: Phương trình có vô số nghiệm
- b != 0: Phương trình vô nghiệm
Ngược lại: Phương trình có nghiệm x = -b/a

*/
#include<stdio.h>
#include<conio.h>

int main()
{
	float a, b;
	printf("Nhap vao he so a: "); 
	scanf("%f", &a); 
	printf("Nhap vao he so b: "); 
	scanf("%f", &b); 

	if (a == 0)
	{
		if (b == 0)
		{
			printf("Phuong trinh co VO SO NGHIEM!");
		} else {
			printf("Phuong trinh VO NGHIEM!");
		}
		
	} else {
		printf("Phuong trinh co nghiem x= %.2f", -b/a);

	}

return 0;
}

2.2: Phương trình bậc 2 có dạng: ax2 + bx + c = 0
Input: Nhập vào từ bàn phím: a, b, c
Output: Nghiệm của phương trình
Biết rằng:
Nếu a == 0, phương trình thành bx + c = 0
Ngược lại nếu a != 0
- Tính delta
- Nếu delta < 0: Phương trình vô nghiệm
- Nếu delta == 0: Phương trình có nghiệm kép x = -b/(2*a)
- Nếu delta > 0: Phương trình có 2 nghiệm riêng biệt
  + X1 = (-b + căn(delta))/(2*a)
  + X2 = (-b – căn(delta))/(2*a)

flow chart:



code:
/*
Xây dựng chương trình giải phương trình:
Phương trình bậc 2 có dạng: ax2 + bx + c = 0
Input: Nhập vào từ bàn phím: a, b, c
Output: Nghiệm của phương trình
Biết rằng:
Nếu a == 0, phương trình thành bx + c = 0
Ngược lại nếu a != 0
- Tính delta
- Nếu delta < 0: Phương trình vô nghiệm
- Nếu delta == 0: Phương trình có nghiệm kép x = -b/(2*a)
- Nếu delta > 0: Phương trình có 2 nghiệm riêng biệt
  + X1 = (-b + căn(delta))/(2*a)
  + X2 = (-b – căn(delta))/(2*a)

hàm căn bậc 2 là: sqrt()
*/
#include<stdio.h>
#include<conio.h>

int giaiPhuongTrinhBacNhat(float a, float b){
	if (a == 0)
		{
			if (b == 0)
			{
				printf("Phuong trinh co VO SO NGHIEM!");
			} else {
				printf("Phuong trinh VO NGHIEM!");
			}
			
		} else {
			printf("Phuong trinh co nghiem x= %.2f", -b/a);

		}
}

int main()
{
	float a, b, c, delta;
	printf("Nhap vao he so a: "); 
	scanf("%f", &a); 
	printf("Nhap vao he so b: "); 
	scanf("%f", &b); 
	printf("Nhap vao he so c: "); 
	scanf("%f", &c); 


	if (a == 0)
	{
		printf("Phuong trinh co dang phuong trinh Bac-Nhat\n");
		giaiPhuongTrinhBacNhat(c, b); // gọi hàm giải phương trình bậc nhất
	}
	else {
		// tính delta
		delta = b * b - 4 * a * c;
		if (delta < 0)
		{
			printf("Phuong trinh VO NGHIEM!");
		}
		else if (delta ==0)
		{
			printf("Phuong co NGHIEM KEP x= %.2f", -b/(2*a));
		}
		else
		{
			printf("Phuong trinh co 2 nghiem rieng biet\n");
			printf("X1 = %.2f\n", (-b + sqrt(delta))/(2*a));
			printf("X2 = %.2f\n", (-b - sqrt(delta))/(2*a));

		}
		
	}

return 0;
}

Bài 3: Chương trình tính tiền điện
Input: Nhập vào số điện tiêu thụ hàng tháng
Output: Hiển thị số tiền cần phải đóng
Biết rằng:
TT Số kWh sử dụng được tính theo bậc Giá bán điện (đồng/kWh)
Bậc 1: Cho kWh từ 0 - 50 giá 1.678 (đồng/kWh)
Bậc 2: Cho kWh từ 51 - 100 giá 1.734
Bậc 3: Cho kWh từ 101 - 200 giá 2.014
Bậc 4: Cho kWh từ 201 - 300 giá 2.536
Bậc 5: Cho kWh từ 301 - 400 giá 2.834
Bậc 6: Cho kWh từ 401 trở lên giá 2.927

code:
/*
Chương trình tính tiền điện
Input: Nhập vào số điện tiêu thụ hàng tháng
Output: Hiển thị số tiền cần phải đóng
Biết rằng:
tt_ Số kWh sử dụng được tính theo bậc Giá bán điện (đồng/kWh)
Bậc 1: Cho kWh từ 0 - 50 giá 1.678 (đồng/kWh)
Bậc 2: Cho kWh từ 51 - 100 giá 1.734
Bậc 3: Cho kWh từ 101 - 200 giá 2.014
Bậc 4: Cho kWh từ 201 - 300 giá 2.536
Bậc 5: Cho kWh từ 301 - 400 giá 2.834
Bậc 6: Cho kWh từ 401 trở lên giá 2.927
*/
#include<stdio.h>
#include<conio.h>

int main()
{
	int soDien, thanhTien;
    int tt_050, tt_100, tt_200, tt_300, tt_400, tt_401;
    // khởi tạo giá trị ban đầu = 0
    tt_050 = 0;
    tt_100 = 0;
    tt_200 = 0; 
    tt_300 = 0;
    tt_400 = 0;
    tt_401 = 0;
	printf("Nhap vao so kWh tieu thu: "); 
	scanf("%d", &soDien); 
	thanhTien = 0;
	if (soDien <= 50)
    {
        tt_050 = 50 * 1806;
        thanhTien = tt_050;
    }
    else if (soDien <= 100)
    {
        tt_050 = 50 * 1806;
        tt_100 = (soDien - 50) * 1866;
        thanhTien = tt_050 + tt_100;
    }
    else if (soDien <= 200)
    {
        tt_050 = 50 * 1806;
        tt_100 = (100 - 50) * 1866;
        tt_200 = (soDien - 100) * 2167;
        thanhTien = tt_050 + tt_100 + tt_200;
    }
    else if (soDien <= 300)
    {
        tt_050 = 50 * 1806;
        tt_100 = (100 - 50) * 1866;
        tt_200 = (200 - 100) * 2167;
        tt_300 = (soDien - 200) * 2729;
        thanhTien = tt_050 + tt_100 + tt_200 + tt_300;
    }
    else if (soDien <= 400)
    {
        tt_050 = 50 * 1806;
        tt_100 = (100 - 50) * 1866;
        tt_200 = (200 - 100) * 2167;
        tt_300 = (300 - 200) * 2729;
        tt_400 = (soDien - 300) * 3050;
        thanhTien = tt_050 + tt_100 + tt_200 + tt_300 + tt_400;
    }
    else
    {
        tt_050 = 50 * 1806;
        tt_100 = (100 - 50) * 1866;
        tt_200 = (200 - 100) * 2167;
        tt_300 = (300 - 200) * 2729;
        tt_400 = (400 - 300) * 3050;
        tt_401 = (soDien - 400) * 3151;
        thanhTien = tt_050 + tt_100 + tt_200 + tt_300 + tt_400 + tt_401;
    }
    printf("\n===========KET QUA===========\n");
    printf("So tien phai Thanh toan la: %d\n", thanhTien);
    printf("Chi tiet: %d\t%d\t%d\t%d\t%d\t%d", tt_050, tt_100, tt_200, tt_300, tt_400, tt_401);
return 0;
}

Bài 4: Sử dụng lệnh Switch-case để xây dựng menu chương trình cho 3 bài tập trên

code:
/*
Sử dụng lệnh Switch-case để xây dựng menu chương trình cho 3 bài tập trên
*/

#include<stdio.h>

// các hàm 
int bai_01() // tính học lực
{
	float diem;
	printf("Nhap vao diem Sinh Vien: "); 
	scanf("%f", &diem); 
	if (diem >=9)
	{
		printf("Hoc luc: XUAT SAC");
	} 
	else if (diem >=8)
	{
		printf("Hoc luc: GIOI");
	} 
	else if (diem >=6.5)
	{
		printf("Hoc luc: KHA");
	} 
	else if (diem >=5)
	{
		printf("Hoc luc: TRUNG BINH");
	} 
	else if (diem >=3.5)
	{
		printf("Hoc luc: YEU");
	} 
	else if (diem < 3.5)
	{
		printf("Hoc luc: KEM");
	}

return 0;
}

int bai_21() // phương trình bậc nhất
{
	float a, b;
	printf("Nhap vao he so a: "); 
	scanf("%f", &a); 
	printf("Nhap vao he so b: "); 
	scanf("%f", &b); 

	if (a == 0)
	{
		if (b == 0)
		{
			printf("Phuong trinh co VO SO NGHIEM!");
		} else {
			printf("Phuong trinh VO NGHIEM!");
		}
		
	} else {
		printf("Phuong trinh co nghiem x= %.2f", -b/a);

	}

return 0;
}

int giaiPhuongTrinhBacNhat(float a, float b){ // phương trình bậc nhất truyền tham số
	if (a == 0)
		{
			if (b == 0)
			{
				printf("Phuong trinh co VO SO NGHIEM!");
			} else {
				printf("Phuong trinh VO NGHIEM!");
			}
			
		} else {
			printf("Phuong trinh co nghiem x= %.2f", -b/a);

		}
}
int bai_22() // phương trình bậc hai
{
	float a, b, c, delta;
	printf("Nhap vao he so a: "); 
	scanf("%f", &a); 
	printf("Nhap vao he so b: "); 
	scanf("%f", &b); 
	printf("Nhap vao he so c: "); 
	scanf("%f", &c); 


	if (a == 0)
	{
		printf("Phuong trinh co dang phuong trinh Bac-Nhat\n");
		giaiPhuongTrinhBacNhat(c, b); // gọi hàm giải phương trình bậc nhất
	}
	else {
		// tính delta
		delta = b * b - 4 * a * c;
		if (delta < 0)
		{
			printf("Phuong trinh VO NGHIEM!");
		}
		else if (delta ==0)
		{
			printf("Phuong co NGHIEM KEP x= %.2f", -b/(2*a));
		}
		else
		{
			printf("Phuong trinh co 2 nghiem rieng biet\n");
			printf("X1 = %.2f\n", (-b + sqrt(delta))/(2*a));
			printf("X2 = %.2f\n", (-b - sqrt(delta))/(2*a));

		}
		
	}

return 0;
}

int bai_03() // tính tiền điện
{
	int soDien, thanhTien;
    int tt_050, tt_100, tt_200, tt_300, tt_400, tt_401;
    // khởi tạo giá trị ban đầu = 0
    tt_050 = 0;
    tt_100 = 0;
    tt_200 = 0; 
    tt_300 = 0;
    tt_400 = 0;
    tt_401 = 0;
	printf("Nhap vao so kWh tieu thu: "); 
	scanf("%d", &soDien); 
	thanhTien = 0;
	if (soDien <= 50)
    {
        tt_050 = 50 * 1806;
        thanhTien = tt_050;
    }
    else if (soDien <= 100)
    {
        tt_050 = 50 * 1806;
        tt_100 = (soDien - 50) * 1866;
        thanhTien = tt_050 + tt_100;
    }
    else if (soDien <= 200)
    {
        tt_050 = 50 * 1806;
        tt_100 = (100 - 50) * 1866;
        tt_200 = (soDien - 100) * 2167;
        thanhTien = tt_050 + tt_100 + tt_200;
    }
    else if (soDien <= 300)
    {
        tt_050 = 50 * 1806;
        tt_100 = (100 - 50) * 1866;
        tt_200 = (200 - 100) * 2167;
        tt_300 = (soDien - 200) * 2729;
        thanhTien = tt_050 + tt_100 + tt_200 + tt_300;
    }
    else if (soDien <= 400)
    {
        tt_050 = 50 * 1806;
        tt_100 = (100 - 50) * 1866;
        tt_200 = (200 - 100) * 2167;
        tt_300 = (300 - 200) * 2729;
        tt_400 = (soDien - 300) * 3050;
        thanhTien = tt_050 + tt_100 + tt_200 + tt_300 + tt_400;
    }
    else
    {
        tt_050 = 50 * 1806;
        tt_100 = (100 - 50) * 1866;
        tt_200 = (200 - 100) * 2167;
        tt_300 = (300 - 200) * 2729;
        tt_400 = (400 - 300) * 3050;
        tt_401 = (soDien - 400) * 3151;
        thanhTien = tt_050 + tt_100 + tt_200 + tt_300 + tt_400 + tt_401;
    }
    printf("\n===========KET QUA===========\n");
    printf("So tien phai Thanh toan la: %d\n", thanhTien);
    printf("Chi tiet: %d\t%d\t%d\t%d\t%d\t%d", tt_050, tt_100, tt_200, tt_300, tt_400, tt_401);
return 0;
}

// hàm main
int main()

{
    int luaChon;
    printf("===== MENU LUA CHON ====\n");
    printf("1. Tinh hoc luc - Lab3: bai 1\n");
    printf("2. Giai phuong trinh bac nhat - Lab3 bai 2.1\n");
    printf("3. Giai phuong trinh bac hai -  Lab3 bai 2.2\n");
    printf("4. Chuong trinh tinh tien dien - Lab3 bai 3\n");
    printf("0. THOAT CHUONG TRINH!\n");
    printf("\n");
    printf("Lua chon cua ban la: ");
    scanf("%d", &luaChon);
    printf("==================================\n");
    switch (luaChon)
    {
    case 1:
        bai_01(); // gọi hàm bai_1 phía trên hàm main()
        break;
    case 2:
        bai_21();
        break;
    case 3:
        bai_22();
        break;
    case 4:
        bai_03();
        break;
    case 0: 
        break;
    default:
        printf("Lua chon KHONG DUNG!");
        break;
    }
}


Bài làm thêm:
Chương trình tính tiền cho quán Karaoke
Input: Nhập vào giờ bắt đầu, giờ kết thúc
Output: Hiển thị giá tiền cần thanh toán
Biết rằng:
Giá tiền 3 giờ đầu là 150000, bắt đầu giờ thứ 4 giảm 30%.
Quán chỉ hoạt động trong khoảng giờ từ 12 giờ -> 23 giờ.
Nếu giờ bắt đầu trong khoảng 14 -> 17 thì giảm tiếp 10% tổng tiền thanh toán

Code:
/*
Chương trình tính tiền cho quán Karaoke
Input: Nhập vào giờ bắt đầu, giờ kết thúc
Output: Hiển thị giá tiền cần thanh toán
Biết rằng:
Giá tiền 3 giờ đầu là 150000, bắt đầu giờ thứ 4 giảm 30%.
Quán chỉ hoạt động trong khoảng giờ từ 12 giờ  23 giờ.
Nếu giờ bắt đầu trong khoảng 14  17 thì giảm tiếp 10% tổng tiền thanh toán
*/
#include<stdio.h>
int main()
{
	int gioVao;
	int gioRa;
	int tongThoiGianHat;
	
//	gioVao = 13;
//	gioRa = 19;
	printf ("Nhap gio vao: "); 
	scanf ("%d", &gioVao);
	printf ("Nhap gio ra: "); 
	scanf ("%d", &gioRa);
	tongThoiGianHat = gioRa - gioVao;
	
	int giaFull = 150000;
	int giaGiam = giaFull * 0.7 ; 
	// int giaGiam = giaFull - giaFull * 0.3 ; // Hoặc

	int tongTienThanhToan;
	int tongTienDuoi_3gio;
	int tongTienTren_3gio_NeuCo;
	
	if (tongThoiGianHat <= 3){
		tongTienTren_3gio_NeuCo = 0;
		tongTienDuoi_3gio = tongThoiGianHat * giaFull;
	}else{
		tongTienTren_3gio_NeuCo = (tongThoiGianHat - 3 ) * giaGiam;
		tongTienDuoi_3gio = 3 * giaFull;
	}
	
	tongTienThanhToan = tongTienDuoi_3gio + tongTienTren_3gio_NeuCo;
	
	if (gioVao >= 14 && gioVao <= 17){
		tongTienThanhToan = tongTienThanhToan - tongTienThanhToan * 0.1; 
	}
	printf("\nTong tien thanh toan: %d", tongTienThanhToan);
}

Xong!
/*header slide*/