【C语言】C语言学习笔记

2023-1-7 markclemens

hello

#include <stdio.h>
 
int main()
{
    /* 我的第一个 C 程序 */
    printf("Hello, World! C\n");
 
    return 0;
}
#include <stdio.h>

int main() {
    printf("FILE LINE: %s / %d\n", __FILE__, __LINE__);

    printf("DATE TIME: %s / %s\n", __DATE__, __TIME__);

    printf("ANSI: %d\n", __STDC__);
    return 0;
}

demo

enum_struct.c

#include <stdio.h>
#include <string.h>

enum DAY {
    MON, TUE=2, WED
} day1 = WED;

struct BOOK {
    char title[50];
    char author[50];
    int book_id;
} book1 = {"CBook", "Clemens", 5};

union Data {
    int i; 
    float f;
    char str[20];
} data;

int main() {
    enum DAY day2;

    day2 = TUE;
    day1 = MON;

    printf("enum day1: %d\n", day1);
    printf("enum day2: %d\n", day2);

    printf("struct book1: title:%s, autthor:%s, id:%d.\n", 
        book1.title, book1.author, book1.book_id);
        
    strcpy(data.str, "union..");
    printf("union data.str: %s", data.str);
    return 0;
}

file.c

file_test.txt

test fputs...
test fprintf...

#include <stdio.h>

int main() {
    FILE *fp = NULL;
    char buff[255];
    const char FIEL_PATH[] = "file_test.txt";

    // overwrite (create if not exists)
    fp = fopen(FIEL_PATH, "w+");
    fputs("test fputs...\n", fp);
    fprintf(fp, "test fprintf...\n");
    fclose(fp);

    // read  // fgets contains line end mark
    fp = fopen(FIEL_PATH, "r");
    fgets(buff, 255, (FILE*)fp);
    printf("LINENO 1: %s*\n", buff);
    fclose(fp);
    return 0;
}

gcd_lcm_algo.c

#include <stdio.h>
#include <stdlib.h>

/*
gcd 最大公约数(因子) divisor
lcm 最小公倍数(倍数) multiple
*/

int main()
{
    int n1, n2, gcd, lcm;
    printf("input two integer:\n");
    scanf("%d %d", &n1, &n2);

    int i = n1 < n2 ? n1 : n2;
    for (; i > 0; i--)
    {
        if (n1 % i == 0 && n2 % i == 0)
        {
            gcd = i;
            break;
        }
    }
    lcm = n1 * n2 / gcd;
    printf("gcd:%d, lcm: %d", gcd, lcm);
    return 0;
}

malloc_free.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void op_judge(void *p)
{
    if (p != NULL)
        return;
    fprintf(stderr, "Error - allocate memory failed\n");
    exit(1);
}
int main()
{
    char name[100];
    char *desc;
    strcpy(name, "~name[100]~");

    // calloc
    // desc = (char *)calloc(50, sizeof(char));

    // malloc
    desc = (char *)malloc(50 * sizeof(char));
    op_judge(desc);
    strcpy(desc, "desc = (char *)malloc(100 * sizeof(char));");
    printf("1. malloc -- %s\n", desc);

    // realloc
    void *p = realloc(desc, 100 * sizeof(char));
    op_judge(p);
    desc = (char *)p;
    strcat(desc, "void *p = realloc(desc, 10 * sizeof(char));desc = (char *)p;");
    printf("2. realloc --  %s\n", desc);

    // free
    free(desc);
    printf("3. free -- free(desc);");
    return 0;
}

pointer2pointer.c

#include <stdio.h>

int main() {
    int v;
    int *p1;
    int **p2;

    v=100;
    p1=&v;
    p2=&p1;

    printf("v = %d\n", v);
    printf("&v = %p\n", &v);
    printf("p1 = %p\n", p1);
    printf("&p1 = %p\n", &p1);
    printf("p2 = %p\n", p2);
    printf("&p2 = %p\n", &p2);
    printf("*p1 = %d\n", *p1);
    printf("**p2 = %d\n", **p2);
    printf("*p2 = %p\n", *p2);

    return 0;
}

pointer4func.c

#include "stdio.h"
#include "stdlib.h"
#include "time.h"

// func declaration  
// 指针函数,即返回值是指针的函数;而函数指针是指向函数的指针。
int *getAvg(int *arr, int size, double *avg);

int main()
{
    // random seed
    srand(time(NULL));

    // def vars
    const int SIZE = 5;
    int arr[5] = {4564, 4654, 7, 46, 578};
    double avg=0;
    int *res;

    // 指针函数 getAvg()
    res = getAvg(arr, SIZE, &avg);
    printf("1. pointer FUNC: avg of arr: %lf; res: %d\n", avg, *res);

    // 函数指针 pfun=getAvg  *返回值是指针 (*函数指针) *形参中的指针
    int *(*pfun)(int *, int, double *);
    pfun = getAvg;
    res = pfun(arr, SIZE, &avg);
    printf("2. func Pointer: avg of arr: %lf; res: %d", avg, *res);
    return 0;
}

// func definition
int *getAvg(int *arr, int size, double *avg)
{
    int sum = 0;
    for (int i = 0; i < size; i++)
    {
        sum += arr[i];
    }
    *avg = (double)sum / size;

    int r = rand();
    int *res = &r;
    return res;
}

precompile.c

#include <stdio.h>

int main() {
    printf("FILE LINE: %s / %d\n", __FILE__, __LINE__);

    printf("DATE TIME: %s / %s\n", __DATE__, __TIME__);

    printf("ANSI: %d\n", __STDC__);
    return 0;
}

recur_algo.c

#include <stdio.h>

long factorial(int n)
{
    if (n < 0)
        return -1;
    if (n == 0)
        return 1;
    return n * factorial(n - 1);
}

int main()
{
    long res = factorial(5);
    printf("fac(5) = %ld", res);
    return 0;
}

gdb_tool

main.c

#include <stdio.h>
#include <stdlib.h>

struct TEST
{
    int i;
    short sh;
    char *p; // char p[0];
};

int main()
{
    struct TEST *pt = NULL;
    return 0;
}
/*
gcc main.c -o main.exe -g  // prepare
gdb main.exe --silent  //start gdb
  list
  break 13
  run
  next
  print &pt
  print pt->i
  quit
*/

void test_struct(struct TEST *sp)
{
    printf("gdb test: %s", __TIME__);
    sp->i = 2; // (*sp).i = 5;
    sp->p = malloc(sizeof(char) * sp->i);
}

sort_algo

bubble_sort.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define DIM2 2
static int step_count = 0;

void bubble_sort(int arr[][DIM2], const int size);
void quick_sort_3ways(int arr[][DIM2], int start, int end);

void array_print(int arr[][DIM2], const int size)
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            printf("arr[%d][%d]: %d ", i, j, arr[i][j]);
        }
        printf("\n");
    }
}

int swap(int eleA[DIM2], int eleB[DIM2])
{
    int tmp[DIM2] = {eleA[0], eleA[1]};
    eleA[0] = eleB[0];
    eleA[1] = eleB[1];
    eleB[0] = tmp[0];
    eleB[1] = tmp[1];
}

int main()
{
    srand(time(NULL));
    int arr[][DIM2] = {
        {7, 1},
        {2, 1},
        {2, 1},
        {1, 4},
        {2, 6},
        {1, 1},
    };
    const int SIZE = sizeof(arr);
    const int LEN = sizeof(arr) / sizeof(arr[0]);
    printf("size:%d, len:%d\n", SIZE, LEN);
    array_print(arr, LEN);

    // bubble sort >>>>>>>>>>>>>>>>>>>>>>>>>>
    step_count = 0;
    bubble_sort(arr, LEN);
    printf("\nafter bobble sort: (step_count:%d)\n", step_count);
    array_print(arr, LEN);

    int arr2[][DIM2] = {
        {7, 1},
        {2, 1},
        {2, 1},
        {1, 4},
        {2, 6},
        {1, 1},
    };
    // quick sort 3way >>>>>>>>>>>>>>>>>>>>>>>>>>
    step_count = 0;
    quick_sort_3ways(arr2, 0, LEN);
    printf("\nafter quick sort: (step_count:%d)\n", step_count);
    array_print(arr2, LEN);

    return 0;
}

// sort: e1 asc, e2 desc
int compare(int eleA[DIM2], int eleB[DIM2])
{
    if (eleA[0] < eleB[0] || (eleA[0] == eleB[0] && eleA[1] > eleB[1]))
        return -1;
    else if (eleA[0] == eleB[0] && eleA[1] == eleB[1])
        return 0;
    else
        return 1;
}

void bubble_sort(int arr[][DIM2], const int size)
{
    for (int i = size - 1; i > 0; i--)
    {
        for (int j = 0; j < i; j++)
        {
            step_count++; // todo
            int sorter = compare(arr[j], arr[j + 1]);
            if (sorter == 1)
            {
                swap(arr[j], arr[j + 1]); // let bigger move to right
            }
        }
    }
}

void quick_sort_3ways(int arr[][DIM2], int start, int end)
{
    // terminate condition
    if (end - start <= 1)
        return;
    int PIVOT_POS = rand() % end; // choose a pivot randomly
    int pivot[DIM2] = {arr[PIVOT_POS][0], arr[PIVOT_POS][1]};

    // partition: lt pivot / eq pivot / gt pivot
    int cur = start, j = start, k = end - 1; // *j <= pivot < *k

    while (cur < k)
    {
        step_count++; // todo
        int sorter = compare(arr[cur], pivot);
        if (sorter == -1)
        {
            swap(arr[cur], arr[j++]); // 扩充less区  *j是第一个等于pivot的
            cur++;                    // swap后,当前变成了equal点 // 不加不影响功能,影响效率
        }
        else if (sorter == 1)
            swap(arr[cur], arr[k--]); // 扩充great区 *j是第一个大于pivot的
        else
            cur++; // 跳过equal点
    }
    // quick sort subarray
    quick_sort_3ways(arr, start, j);
    quick_sort_3ways(arr, k, end - k);
}

qsort_test.c

#include <stdio.h>
#include <stdlib.h>

#define DIM2 2
void array_print(int arr[][DIM2], const int size)
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            printf("arr[%d][%d]: %d ", i, j, arr[i][j]);
        }
        printf("\n");
    }
}

// sort: e1 asc, e2 desc
// int compare(const int eleA[DIM2], const int eleB[DIM2])
int compare(const void *eleA1, const void *eleB1)
{
    int *eleA = (int *)eleA1;
    int *eleB = (int *)eleB1;
    if (eleA[0] < eleB[0] || (eleA[0] == eleB[0] && eleA[1] < eleB[1]))
        return -1;
    else if (eleA[0] == eleB[0] && eleA[1] == eleB[1])
        return 0;
    else
        return 1;
}

int main()
{
    int arr[][DIM2] = {
        {7, 1},
        {2, 1},
        {2, 1},
        {1, 4},
        {2, 6},
        {1, 1},
    };
    const int bytes = sizeof(arr);
    const int size = sizeof(arr) / sizeof(arr[0]); // arr[0] : 
    printf("bytes:%d, size:%d,\n", bytes, size);
    printf("\nafter qsort: \n");

    // qsort >>>>>>>>>>>>>>>>>>>>>>>>>>
    qsort(arr, size, sizeof(arr[0]), compare);
    array_print(arr, size);

    return 0;
}

rand.c

#include "stdio.h"
#include "stdlib.h"
#include "time.h"

// func declaration  
// 指针函数,即返回值是指针的函数;而函数指针是指向函数的指针。
int *getAvg(int *arr, int size, double *avg);

int main()
{
    // random seed
    srand(time(NULL));

    // def vars
    const int SIZE = 5;
    int arr[5] = {4564, 4654, 7, 46, 578};
    double avg=0;
    int *res;

    // 指针函数 getAvg()
    res = getAvg(arr, SIZE, &avg);
    printf("1. pointer FUNC: avg of arr: %lf; res: %d\n", avg, *res);

    // 函数指针 pfun=getAvg  *返回值是指针 (*函数指针) *形参中的指针
    int *(*pfun)(int *, int, double *);
    pfun = getAvg;
    res = pfun(arr, SIZE, &avg);
    printf("2. func Pointer: avg of arr: %lf; res: %d", avg, *res);
    return 0;
}

// func definition
int *getAvg(int *arr, int size, double *avg)
{
    int sum = 0;
    for (int i = 0; i < size; i++)
    {
        sum += arr[i];
    }
    *avg = (double)sum / size;

    int r = rand();
    int *res = &r;
    return res;
}

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值