Kỹ thuật Lập trình C: Biến Tĩnh, Đệ quy và Xử lý Số

Hiển thị văn bản tại vị trí ngẫu nhiên:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define COL_MAX 80

void hien_thi(int dong, int cot, char chuoi[]);
void in_khoang_trong(int so);
void in_dong_trong(int so);

int main() {
    int dong, cot, i;
    char chuoi[] = "Chào bạn!";
    
    srand(time(0));
    
    for(i = 0; i < 10; i++) {
        dong = rand() % 25;
        cot =  rand() % COL_MAX;
        hien_thi(dong, cot, chuoi);
        Sleep(1000);
    }
    return 0; 
}

void in_khoang_trong(int so) {
    for(int j = 0; j < so; j++)
        printf(" ");
}

void in_dong_trong(int so) {
    for(int j = 0; j < so; j++)
        printf("\n");
 } 

void hien_thi(int dong, int cot, char chuoi[]) {
    in_dong_trong(dong);
    in_khoang_trong(cot);
    printf("%s", chuoi);
}

Tính giai thừa sử dụng biến tĩnh:

#include <stdio.h>
long long tinh_giai_thua(int n);

int main() {
    int n;
    printf("Nhập n: ");
    scanf("%d", &n);

    for (int i = 1; i <= n; i++)
        printf("%d! = %lld\n", i, tinh_giai_thua(i));
    return 0;
}

long long tinh_giai_thua(int n) {
    static long long ket_qua = 1;
    ket_qua *= n;
    return ket_qua;
}

Hiển thị giá trị biến tĩnh khi tính giai thừa:

#include <stdio.h>
long long tinh_giai_thua(int n);

int main() {
    int n;
    printf("Nhập n: ");
    scanf("%d", &n);

    for (int i = 1; i <= n; i++)
        printf("%d! = %lld\n", i, tinh_giai_thua(i));
    return 0;
}

long long tinh_giai_thua(int n) {
    static long long ket_qua = 1;
    ket_qua *= n;
    printf("Giá trị hiện tại: %lld\n", ket_qua); 
    return ket_qua;
}

Đặc tính biến tĩnh trong hàm:

#include <stdio.h>
int xu_ly(int a, int b);

int main() {
    int k = 4, m = 1, p1, p2;
    p1 = xu_ly(k, m);
    p2 = xu_ly(k, m);
    printf("%d, %d\n", p1, p2);
    return 0;
}

int xu_ly(int a, int b) {
    static int m = 0, i = 2;
    i += m + 1;
    m = i + a + b;
    return m;
}

Hàm đệ quy tính giá trị:

#include <stdio.h>
long long tinh_de_quy(int n);

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        printf("n = %d, f = %lld\n", n, tinh_de_quy(n));
    }
    return 0;
}

long long tinh_de_quy(int n) {
    return (n == 1) ? 1 : 2 * tinh_de_quy(n - 1) + 1;
}

Tính tổ hợp sử dụng vòng lặp:

#include <stdio.h>
int to_hop(int n, int m);

int main() {
    int n, m;
    while(scanf("%d%d", &n, &m) != EOF)
        printf("n = %d, m = %d, kết quả = %d\n", n, m, to_hop(n, m));
    return 0;
}

int to_hop(int n, int m){
    long tich_a = 1, tich_b = 1, tich_c = 1;
    for(int i = 1; i <= n; i++) tich_a *= i;
    for(int j = 1; j <= m; j++) tich_b *= j;
    for(int k = 1; k <= n - m; k++) tich_c *= k;
    return tich_a / (tich_b * tich_c);
}

Tính tổ hợp sử dụng đệ quy:

#include <stdio.h>
int to_hop_de_quy(int n, int m);

int main() {
    int n, m;
    while(scanf("%d%d", &n, &m) != EOF)
        printf("n = %d, m = %d, kết quả = %d\n", n, m, to_hop_de_quy(n, m));
    return 0;
}

int to_hop_de_quy(int n, int m) {
    if(m > n) return 0;
    if(m == 0 || m == n) return 1;
    return to_hop_de_quy(n-1, m) + to_hop_de_quy(n-1, m-1);
}

Giải thuật Tháp Hà Nội:

#include <stdio.h>
void thap_ha_noi(int n, char nguon, char trung_gian, char dich, int *dem);
void di_chuyen(int n, char nguon, char dich, int *dem);

int main() {
    int n;
    while(scanf("%d", &n) != EOF) {
        int buoc = 0;
        thap_ha_noi(n, 'A', 'B', 'C', &buoc);
        printf("Tổng số bước: %d\n", buoc);
    }
    return 0;
}

void di_chuyen(int n, char nguon, char dich, int *dem) {
    printf("%d: %c -> %c\n", n, nguon, dich);
    (*dem)++;
}

void thap_ha_noi(int n, char nguon, char trung_gian, char dich, int *dem) {
    if(n == 1) {
        di_chuyen(n, nguon, dich, dem);
    }
    else {
        thap_ha_noi(n-1, nguon, dich, trung_gian, dem);
        di_chuyen(n, nguon, dich, dem);
        thap_ha_noi(n-1, trung_gian, nguon, dich, dem);
    } 
}

Lọc chữ số lẻ từ số nguyên:

#include <stdio.h>
long loc_so_le(long num);

int main() {
    long num;
    printf("Nhập số: ");
    while (scanf("%ld", &num) != EOF) {
        printf("Số mới: %ld\n\n", loc_so_le(num));
        printf("Nhập số: ");
    }
    return 0;
}

long loc_so_le(long num) {
    long ket_qua = 0, he_so = 1;
    while(num != 0) {
        int chu_so = num % 10;
        if(chu_so % 2) {
            ket_qua = chu_so * he_so + ket_qua;
            he_so *= 10;
        }
        num /= 10;
    }
    return ket_qua;
}

Thẻ: C static_variable Recursion Hanoi_tower factorial

Đăng vào ngày 23 tháng 6 lúc 03:03