- 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ố
  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
  
  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
  
  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
  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ố
    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à: 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
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
    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
    
    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