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




No comments:

Post a Comment

/*header slide*/