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;
}