/*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 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!

[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 2 - Input

MỤC TIÊU:
  • Biết cách đọc dữ liệu nhập vào từ bàn phím
  • Biết cách tạo biến để lưu trữ dữ liệu
  • Biết cách sử dụng các toán tử

LÝ THUYẾT:

Các kiểu dữ liệu nguyên thủy/cơ sở trong C:

Kiểu Dữ Liệu Từ Khóa
Số nguyên int
Số thực float
Số thực dạng Double double
Ký tự char
boolean bool


Một số kiểu cơ bản có thể được sửa đổi bởi sử dụng một hoặc nhiều modifier:
  • signed (kiểu có dấu)
  • unsigned (kiểu không có dấu)
  • short
  • long

Kiểu dữ liệu Kích thước (byte) Phạm vi giá trị
short int 2 -32768 tới 32767
int 4 -2147483648 tới 2147483647
long int 4 -2,147,483,647 tới 2,147,483,647

Kiểu dữ liệu Kích thước Phạm vi giá trị Độ chính xác
float 4 1.2E-38 to 3.4E+38 6 chữ số thập phân
double 8 2.3E-308 to 1.7E+308 15 chữ số thập phân
long double 10 3.4E-4932 to 1.1E+4932 19 chữ số thập phân


Kiểu dữ liệu Kích thước Phạm vi giá trị
char or signed char 1 -128 to 127
unsigned char 1 0 to 255
Kiểu char: Miền giá trị: 256 ký tự trong bảng mã ASCII bao gồm:
  • Ký tự số: 0 1 2 3 4 5 6 7 8 9 0
  • Ký tự chữ cái: a b c ... z A B C .... Z
  • Ký tự đặc biệt: @ $ # % ! & * ....

Các định dạng nhập xuất thường dùng trong C

Định dạng Kiểu dữ liệu Ví Dụ Kết quả Giải thích
%c char printf("%c");
%s char chuoi[] = "Hello World!"; printf("%s",chuoi); Hello World!
%s char * (chuỗi) printf("%.8s","Van Cong Khanh"); Van Cong Vì chỉ hiển thị 8 ký tự
%s char * (chuỗi) printf("[%20s]","Van Cong Khanh"); [ Van Cong Khanh] vì độ rộng là 20 nhưng chuỗi không đủ nên chương trình phải thêm các ký tự trắng vào phía trước
%d int, short printf("[%05d]", 1); [00001] Nếu số cần in ra không đủ 5 ký tự, chương trình tự động thêm các số 0 vào cho đủ chiều dài là 5
%f float printf("[%08.3f]", 123.45678); [0123.456] Chỉ lấy 3 số thập phân, nếu tổng chiều dài chưa đủ 8 ký tự thì thêm số 0 vào trước phần số nguyên
%lf double "%8.3lf"
%ld long "%-10ld"

Ví dụ: 
#include<stdio.h>
/*
Xuất chuỗi, độ rộng mỗi chuỗi là 20 ký tự, 
nếu không đủ 20 thì để trống phần phía trước chuỗi (tạm hiểu căn lề phải trong trường hợp này)
*/
int main() {
  	char chuoi[] = "Hello World!";
  	char chuoi1[] = "Hello!";
  	printf("\n%20s%20s", chuoi, chuoi1); 
	printf("\n%20s%20s", chuoi1, chuoi);
}

Toán tử toán học
Toán Tử Giải Thích Ví Dụ
+ Phép cộng a + b
- Phép trừ a - b
* Phép nhân a * b
/ Phép chia lấy nguyên a / b
% Phép chia lấy dư 5 % 2 = 1; vì 5 chia 2 bằng 2 DƯ 1
++ Tăng giá trị ... lên 1 đơn vị ++a
-- Giảm giá trị ... xuống 1 đơn vị --a

Toán tử gán
Toán Tử Ví Dụ Giá Trị Tương Đương
= a = 5 a = 5
+= a += 5 a = a + 5
-= a -= 5 a = a - 5
-= a -= 5 a = a - 5
*= a *= 5 a = a * 5
/= a /= 5 a = a / 5
%= a %= 5 a = a % 5

Toán tử so sánh:
Toán Tử Giải Thích Ví Dụ
== Bằng a == b
!= Không bằng hay khác a != b
> Lớn hơn a > b
< Nhở hơn a < b
>= Lớn hơn bằng a >=b
<= Nhở hơn hoặc bằng a <= b

Toán tử logic:
Toán Tử Tên Giải Thích Ví Dụ Kết quả
&& Nếu tất cả các giá trị đúng thì trả về giá trị True x < 5 && x < 10 True
|| Hoặc Trả về giá trị True nếu trong các giá trị là true x < 5 || x < 4 True
! Phủ định, đảo ngược kết quả, trả về false nếu kết quả trả về là True !(x < 5 && x < 10) ??

Chú ý:  Trong toán tử logic:
    Toán tử &(và): nếu một trong các biểu thức là sai (false) -> false
    Toán tử || (hoặc): tất cả các biểu thức đều sai (false) ->  false
    
    0 = false 
    1 = true



YÊU CẦU: Xây dựng chương trình:

Bài 1:
 
Input: nhập vào 2 số
Output: 
- Xuất ra/Hiển thị tổng, hiệu của 2 số vừa nhập
- Xuất ra/Hiển thị số lớn nhất

Bài 2: Tính chu vi diện tích hình chữ nhật
Input: Nhập vào từ bàn phím chiều dài và chiều rộng
Output: Hiển thị ra màn hình chu vi và diện tích của hình chữ nhật


Bài 3: Tính chu vi diện tích hình tròn
Input: Nhập vào bán kính của đường tròn
Output: Hiển thị ra màn hình chu vi và diện tích của hình tròn


Bài 4: Tính điểm trung bình biết hệ số của môn toán: x3, lý: x2, hóa: x1
Input: Nhập vào từ bàn phím điểm môn Toán, Lý, Hóa
Output: Hiển thị ra màn hình điểm trung bình


Bài 5:
Input: nhập vào 3 số
Output:  Xuất ra/Hiển thị số lớn nhất

THỰC HIỆN:

Bài 1: 
Input: nhập vào 2 số
Output: 
  • Xuất ra/Hiển thị tổng, hiệu của 2 số vừa nhập

Code:
#include<stdio.h>
int main()
{
	int a, b;
	printf("Nhap a: ");
	scanf("%d", &a); 
	
	printf("Nhap b: ");
	scanf("%d", &b);	
	//Output
	printf("Tong 2 so: %d",a + b);
	printf("\n"); // in ra dong trang
	
	printf("Tong 2 so: %d",a - b);	
}

  • Xuất ra/Hiển thị số lớn nhất
Code:
#include<stdio.h>

// ham tim so lon nhat
int timSoLonNhat(int a, int b){
	return (a >= b) ? a : b;
}

int main()
{
	int a, b;
	printf("Nhap a: ");
	scanf("%d", &a); 
	
	printf("Nhap b: ");
	scanf("%d", &b);
		 
	int maxNumber = timSoLonNhat(a, b); 
	printf("So lon nhat la: %d", maxNumber);
}



Bài 2: Tính chu vi diện tích hình chữ nhật
Input: Nhập vào từ bàn phím chiều dài và chiều rộng
Output: Hiển thị ra màn hình chu vi và diện tích của hình chữ nhật


Code:
#include<stdio.h>

int main()
{
	int a, b;
	printf("Nhap chieu dai: ");
	scanf("%d", &a); 
	
	printf("Nhap chieu rong: ");
	scanf("%d", &b);	
	
	printf("\n====================\n");
	printf("Chu vi Hinh chu nhat: %d", (a + b) * 2);
	printf("\n");
	printf("Dien tich Hinh chu nhat: %d", a * b);
}


Bài 3: Tính chu vi diện tích hình tròn
Input: Nhập vào bán kính của đường tròn
Output: Hiển thị ra màn hình chu vi và diện tích của hình tròn


Code:
#include<stdio.h>

int main()
{
	int r, pi;
	printf("Nhap ban kinh hinh tron: ");
	scanf("%d", &r); 
	
	pi = 3.14;
	
	printf("\n====================\n");
	printf("Chu vi Hinh chu nhat: %d", (r * 2) * pi);
	printf("\n");
	printf("Dien tich Hinh chu nhat: %d", r * r * pi);
}


Bài 4: Tính điểm trung bình biết hệ số của môn toán: x3, lý: x2, hóa: x1
Input: Nhập vào từ bàn phím điểm môn Toán, Lý, Hóa
Output: Hiển thị ra màn hình điểm trung bình


Code:
#include<stdio.h>

int main()
{
	float toan, ly, hoa;
	printf("Nhap diem mon Toan: ");
	scanf("%f", &toan); 
	printf("Nhap diem mon Ly: ");
	scanf("%f", &ly); 
	printf("Nhap diem mon Hoa: ");
	scanf("%f", &hoa); 
	
	
	printf("\n====================\n");
	printf("Diem trung binh 3 mon la: %.1f", (toan*3 + ly*2 + hoa*1)/6);
	
	printf("\n=========HOAC===========\n");
	float diemTB = (toan*3 + ly*2 + hoa*1)/6;
	printf("Diem trung binh 3 mon la (Dung bien trung gian): %.1f", diemTB);

}


Bài 5:
Input: nhập vào 3 số
Output:  Xuất ra/Hiển thị số lớn nhất

Gợi ý: tương tự như bài 1, chúng ta tìm số lớn nhất theo từng cặp
Code:
int maxTemp = timSoLonNhat(a, b); 
int maxNumber = timSoLonNhat(c, maxTemp); 
printf("So lon nhat la: %d", maxNumber);



Xong!

[Database-Tự Học SQL] COM2034_SQL Server - Lab 5: Stored Procedure Trong SQL Server

CÁC BƯỚC THỰC HIỆN STORED-PROCEDURE:
1. Khởi tạo
2. Biên dịch (chọn toàn bộ nội dung của stored-procedure -> nhấn F5)
3.Thực thi (EXEC procedure_name;)

LÝ THUYẾT:


  • Cú pháp tạo mới stored-procedure:
CREATE PROCEDURE procedure_name
AS
	BEGIN
		sql_statement  // khối lệnh cần xử lý
	END
GO;

  • Hoặc (chúng ta có thể viết đầy đủ PROCEDURE hoặc viết kiểu rút gọn PROC)
CREATE PROC procedure_name
AS
	BEGIN
		sql_statement  // khối lệnh cần xử lý
	END
GO;

  • Cú pháp sửa stored-procedure đã tồn tại:
ALTER PROCEDURE procedure_name
AS
	BEGIN
		sql_statement  // khối lệnh cần xử lý
	END
GO;

  • Cú pháp viết gộp stored-procedure:
CREATE OR ALTER PROCEDURE procedure_name // tạo mới stored-procudure, nếu đã tồn tại thì thay đổi nội dung stored-produre thành nội dung mới
AS
	BEGIN
		sql_statement  // khối lệnh cần xử lý
	END
GO;

  • Cú pháp xóa stored-procedure đã tồn tại:
DROP PROCEDURE procedure_name; // tên stored-procedure cần xóa

  • Cách thực thi stored-procedure:
EXEC procedure_name; // tên stored-procedure cần thực thi

  • Kiểm tra nội của stored-procedure đã tồn tại:
sp_helptext procedure_name; // tên stored-procedure cần kiểm tra



NỘI DUNG:

Bài 1: 
Viết stored-procedure:
+ In ra dòng ‘Xin chào’ + @ten với @ten là tham số đầu vào là tên Tiếng Việt có dấu của bạn. Gợi ý:
-  sử dụng UniKey để gõ Tiếng Việt ♦
-  chuỗi unicode phải bắt đầu bởi N (vd: N’Tiếng Việt’) ♦
-  dùng hàm cast (<biểuThức> as <kiểu>) để đổi thành kiểu <kiểu> của<biểuThức>.
+ Nhập vào 2 số @s1,@s2. In ra câu ‘Tổng là : @tg’ với @tg=@s1+@s2.
+ Nhập vào số nguyên @n. In ra tổng các số chẵn từ 1 đến @n.
+ Nhập vào 2 số. In ra ước chung lớn nhất của chúng theo gợi ý dưới đây:
-  b1. Không mất tính tổng quát giả sử a <= A
-  b2. Nếu A chia hết cho a thì : (a,A) = a ngược lại : (a,A) = (A%a,a) hoặc (a,A) = (a,A-a)
-  b3. Lặp lại b1,b2 cho đến khi điều kiện trong b2 được thỏa

Bài 2:
Sử dụng cơ sở dữ liệu QLDA, Viết các Proc:
- Nhập vào @Manv, xuất thông tin các nhân viên theo @Manv.
- Nhập vào @MaDa (mã đề án), cho biết số lượng nhân viên tham gia đề án đó
- Nhập vào @MaDa và @Ddiem_DA (địa điểm đề án), cho biết số lượng nhân viên tham gia đề án có mã đề án là @MaDa và địa điểm đề án là @Ddiem_DA
- Nhập vào @Trphg (mã trưởng phòng), xuất thông tin các nhân viên có trưởng phòng là @Trphg và các nhân viên này không có thân nhân.
- Nhập vào @Manv và @Mapb, kiểm tra nhân viên có mã @Manv có thuộc phòng ban có mã @Mapb hay không

Bài 3:
Sử dụng cơ sở dữ liệu QLDA, Viết các Proc
- Thêm phòng ban có tên CNTT vào csdl QLDA, các giá trị được thêm vào dưới dạng tham số đầu vào, kiếm tra nếu trùng Maphg thì thông báo thêm thất bại.
- Cập nhật phòng ban có tên CNTT thành phòng IT.
- Thêm một nhân viên vào bảng NhanVien, tất cả giá trị đều truyền dưới dạng tham số đầu vào với điều kiện:
 + nhân viên này trực thuộc phòng IT
 + Nhận @luong làm tham số đầu vào cho cột Luong, nếu @luong<25000 thì nhân viên này do nhân viên có mã 009 quản lý, ngươc lại do nhân viên có mã 005 quản lý
 + Nếu là nhân viên nam thi nhân viên phải nằm trong độ tuổi 18-65, nếu là nhân viên nữ thì độ tuổi phải từ 18-60

THỰC HIỆN:

Bài 1: 
Viết stored-procedure:
a. In ra dòng ‘Xin chào’ + @ten với @ten là tham số đầu vào là tên Tiếng Việt có dấu của bạn. Gợi ý:
-  sử dụng UniKey để gõ Tiếng Việt ♦
-  chuỗi unicode phải bắt đầu bởi N (vd: N’Tiếng Việt’) ♦
-  dùng hàm cast (<biểuThức> as <kiểu>) để đổi thành kiểu <kiểu> của<biểuThức>.

  • Khởi tạo stored-procedure
CREATE PROC sp_Bai1a @ten NVARCHAR(50)
AS
BEGIN
	PRINT 'Xin chào ' + CAST(@ten AS NVARCHAR);
END	
GO

Ngoài ra chúng ta cũng có viết CREATE OR ALTER PROC .... có nghĩa rằng khi thực thi nó sẽ kiểm tra xem tên của stored-procedure có tồn tại chưa nếu không có thì tạo mới nếu đã có rồi thì cập nhật

Code:
    CREATE OR ALTER PROC sp_Bai1a @ten NVARCHAR(50)
    AS
    BEGIN
    	PRINT 'Xin chào ' + cast(@ten AS NVARCHAR);
    END	
    GO
    
    • Thực thi stored-procedure
    EXEC sp_Bai1a 'tony Tèo';
    


    b. Nhập vào 2 số @s1,@s2. In ra câu ‘Tổng là : @tg’ với @tg=@s1+@s2.

    Code:
    CREATE OR ALTER PROCEDURE sp_Sum @So1 INT = 5, @So2 INT = 4
    AS
    BEGIN
    	DECLARE @tong INT;
    	SET @tong = @So1 + @So2;
    	PRINT 'Tong là: ' + cast(@tong AS NVARCHAR);
    END
    GO
    
    • Thực thi stored-procedure
    EXEC sp_Sum // nếu không truyền đối số vào thì chương trình sẽ lấy giá trị đã khởi tạo của trong chương trình để thực hiện phép tính
    EXEC sp_Sum 7,8;
    


    c. Nhập vào số nguyên @n. In ra tổng các số chẵn từ 1 đến @n.

    Code:
    CREATE PROC sp_TongChan @n INT
    AS
    BEGIN
    	DECLARE @tong INT = 0, @i INT = 1;
    	WHILE (@i <= @n)
    	BEGIN
    		IF(@i % 2= 0)
    		BEGIN
    			SET @tong = @tong + @i
    		END
    		SET @i= @i +1
    	END
    	select @tong AS 'Tong chan'
    END
    GO
    

    d. Nhập vào 2 số. In ra ước chung lớn nhất của chúng theo gợi ý dưới đây:
    -  b1. Không mất tính tổng quát giả sử a <= A
    -  b2. Nếu A chia hết cho a thì : (a,A) = a ngược lại : (a,A) = (A%a,a) hoặc (a,A) = (a,A-a)
    -  b3. Lặp lại b1,b2 cho đến khi điều kiện trong b2 được thỏa

    Code:
    CREATE PROC sp_UCLN @s3 INT,@s4 INT
    AS
    BEGIN
    	
    	WHILE (@s4 % @s3 != 0)
    	BEGIN
    		IF (@s4 > @s3)
    		SET @s4 = @s4-@s3
    		ELSE
    		SET @s3 = @s3-@s4
    	END
    	PRINT N'Ước chung lớn nhất là ' + CAST(@s3 AS VARCHAR(10))
    END
    GO
    


    Bài 2:
    Sử dụng cơ sở dữ liệu QLDA, Viết các Proc:
    - Nhập vào @Manv, xuất thông tin các nhân viên theo @Manv.

    Code:
    CREATE PROCEDURE sp_ThongtinNV @MaNV NVARCHAR(9)
    AS
    BEGIN
     SELECT * FROM NHANVIEN WHERE MaNV = @MaNV
    END
    GO
    

    - Nhập vào @MaDa (mã đề án), cho biết số lượng nhân viên tham gia đề án đó

    Code:
    CREATE PROC sp_Bai2b @MaDa INT
    AS
    BEGIN
    	SELECT MADA, count(*) AS 'SL nhan vien tg du an' 
    	FROM PHANCONG
        WHERE MADA = @MaDa
    	GROUP BY MADA
    	
    END
    GO
    

    - Nhập vào @MaDa và @Ddiem_DA (địa điểm đề án), cho biết số lượng nhân viên tham gia đề án có mã đề án là @MaDa và địa điểm đề án là @Ddiem_DA

    Code:
    CREATE PROC sp_Bai2c @MaDa INT, @Ddiem_DA NVARCHAR(15)
    AS
    BEGIN
    	SELECT PHANCONG.MADA, count(*) AS 'SL'
    	FROM DEAN, PHANCONG, CONGVIEC
    	WHERE DEAN.MADA = CONGVIEC.MADA and
        	  PHANCONG.MADA = CONGVIEC.MADA and
    		  DDIEM_DA = @Ddiem_DA	and
    		  DEAN.MADA = @MaDa	
    	GROUP BY PHANCONG.MADA
    END
    GO
    

    - Nhập vào @Trphg (mã trưởng phòng), xuất thông tin các nhân viên có trưởng phòng là @Trphg và các nhân viên này không có thân nhân.

    Code:
    CREATE PROC sp_Bai2d @Trphg NVARCHAR(9)
    AS
    BEGIN 
    	SELECT *
    	FROM NHANVIEN
    	WHERE MA_NQL = @Trphg and
    	 NHANVIEN.MANV not in (SELECT MA_NVIEN
    						   FROM THANNHAN
    						   WHERE THANNHAN.MA_NVIEN = NHANVIEN.MANV)
    END
    GO
    

    - Nhập vào @Manv và @Mapb, kiểm tra nhân viên có mã @Manv có thuộc phòng ban có mã @Mapb hay không

    Code:
    CREATE PROC sp_Bai2e @Manv NVARCHAR(9), @Mapb INT
    AS
    BEGIN
    	IF exists (SELECT * FROM nhanvien WHERE phg= @Mapb and manv = @Manv)
    		PRINT N'Có thuộc'
    	ELSE
    		PRINT N'Không Thuộc'
    END
    GO
    

    Bài 3:
    Sử dụng cơ sở dữ liệu QLDA, Viết các Proc
    - Thêm phòng ban có tên CNTT vào csdl QLDA, các giá trị được thêm vào dưới dạng tham số đầu vào, kiếm tra nếu trùng Maphg thì thông báo thêm thất bại.

    Code:
    CREATE PROC sp_InsertPhongBan @TenPHG NVARCHAR(15),
    	@MaPHG INT, @TRPHG NVARCHAR(9), @NG_NHANCHUC date
    AS
    BEGIN
    	IF EXISTS(SELECT * FROM PHONGBAN WHERE MAPHG = @MaPHG)
    		PRINT 'Da ton tai, khong them vao duoc';
    	ELSE
    		INSERT INTO PHONGBAN
    		VALUES(@TenPHG, @MaPHG,@TRPHG,@NG_NHANCHUC)
    END
    GO
    

    Thực thi stored-produre:
    Code:

    EXEC sp_InsertPhongBan 'Hanh Chinh',2,'007','2020-06-04'
    


    - Cập nhật phòng ban có tên CNTT thành phòng IT.

    Code:
    CREATE PROC sp_phongbandoiten @tenphg NVARCHAR(30)
    AS
    BEGIN
    	update phongban SET tenphg = @tenphg
    	WHERE tenphg = N'Công Nghệ Thông Tin'
    END
    Exec sp_phongbandoiten 'IT'
    GO
    
    Thực thi stored-produre:

    Code:

    Exec sp_phongbandoiten 'IT'
    

    - Thêm một nhân viên vào bảng NhanVien, tất cả giá trị đều truyền dưới dạng tham số đầu vào với điều kiện:
     + nhân viên này trực thuộc phòng IT
     + Nhận @luong làm tham số đầu vào cho cột Luong, nếu @luong<25000 thì nhân viên này do nhân viên có mã 009 quản lý, ngươc lại do nhân viên có mã 005 quản lý
     + Nếu là nhân viên nam thi nhân viên phải nằm trong độ tuổi 18-65, nếu là nhân viên nữ thì độ tuổi phải từ 18-60

    Code:
    CREATE PROC sp_InsertNhanVien
    @honv NVARCHAR(15),@tenlotnv NVARCHAR(15), @tennv NVARCHAR(15),@manv NVARCHAR(9),
    @ngsinh date,@dchi NVARCHAR(30), @phai NVARCHAR(3),@luong float, @ma_nql NVARCHAR(9), @phg INT
    AS
    BEGIN
    	IF (@phg = (SELECT maphg FROM phongban WHERE tenphg ='IT'))
    	BEGIN
    		IF(@luong < 25000)
    		BEGIN
    			SET @ma_nql = '009'
    			insert into nhanvien
    			values(@honv,@tenlotnv,@tennv,@manv,@ngsinh,@dchi,@phai,@luong,@ma_nql,@phg)
    		END
    		ELSE
    		BEGIN
    			SET @ma_nql = '005'
    			insert into nhanvien
    			values(@honv,@tenlotnv,@tennv,@manv,@ngsinh,@dchi,@phai,@luong,@ma_nql,@phg)
    		END
    		IF (@phai = 'Nam')
    		BEGIN
    			IF(datedIFf(yy,@ngsinh,getdate()) between 18 and 65)
    			BEGIN
    				insert into nhanvien
    				values(@honv,@tenlotnv,@tennv,@manv,@ngsinh,@dchi,@phai,@luong,@ma_nql,@phg)
    			END
    			ELSE
    			PRINT N'Không thỏa'
    		END
    		ELSE
    		BEGIN
    			IF(datedIFf(yy,@ngsinh,getdate()) between 18 and 60)
    			BEGIN
    				insert into nhanvien
    				values(@honv,@tenlotnv,@tennv,@manv,@ngsinh,@dchi,@phai,@luong,@ma_nql,@phg)
    			END
    			ELSE
    			PRINT N'Không Thỏa'
    		END
    	END
    	ELSE
    	PRINT N'NHAN VIEN PHONG IT MOI THEM DUOC'
    END
    GO
    

    Thực thi stored-produre:

    Code:
    Exec sp_InsertNhanVien N'Nguyễn',N'Văn',N'Tèo','010','1975-04-30','30 Lê Văn Sỹ','Nam',25000,1,6
    


    Xong!
    /*header slide*/