整理之前写过的小代码,测试代码

来源:互联网 发布:国际版淘宝学校哪里有 编辑:程序博客网 时间:2024/05/01 20:15

1.对于这个程序测试环境是redhat7.0,编译器用的是gcc,主要是熟悉一下如何使用linux下的这些函数,如何使用man自己查阅

#include <stdio.h>#include <unistd.h>#include <time.h>#include <sys/time.h>void print_week(int );        //输出周void print_annimal_year(int); // 输出生肖年void print_week(int num){   switch(num){     case 1 : printf(" Mon");              break;     case 2 : printf(" Tus");              break;     case 3 : printf(" Wes");              break;     case 4 : printf(" Tue");              break;     case 5 : printf(" Fri");              break;     case 6 : printf(" Sau");              break;     case 7 : printf(" Sun");              break;   }}void print_annimal_year (int num){       int annimal = (num - 1970)%12;       switch(annimal){            case  0:printf(" 狗");                   break;            case  1:printf(" 猪");                   break;            case  2:printf(" 鼠");                   break;            case  3:printf(" 牛");                   break;            case  4:printf(" 虎");                   break;            case  5:printf(" 兔");                   break;            case  6:printf(" 龙");                   break;            case  7:printf(" 蛇");                   break;            case  8:printf(" 马");                   break;            case  9:printf(" 羊");                   break;            case 10:printf(" 猴");                   break;            case 11:printf(" 鸡");                   break;       }       printf("\n");}int main(int argc,char *argv[]){    struct timespec tp;    struct tm *my_tm = NULL;    clock_gettime(CLOCK_REALTIME,&tp);//    printf("tv_sec = %ld\n",tp.tv_sec);//    printf("tv_nsec = %ld\n",tp.tv_nsec);    my_tm = gmtime(&(tp.tv_sec));    printf("%d-%d-%d ",my_tm->tm_year + 1900,my_tm->tm_mon + 1,my_tm->tm_mday + 1);    printf("%d-%d-%d.%d(%d) ",my_tm->tm_hour + 8,my_tm->tm_min,my_tm->tm_sec,tp.tv_nsec/1000,tp.tv_nsec);    //调用周函数    print_week(my_tm->tm_wday);    //调用生肖年函数    print_annimal_year(my_tm->tm_year + 1900);    return 0;}
运行结果



2.对于大小端的问题,这个很好测试,共用体里面一个int 和 char数组,然后分别打印出他们的值运行结果,低位存储的是低位因此是小端


3.在redhat 7.0下gcc编译器中C++中的引用是占用8个字节的


4.处理大数的思路

#include <stdio.h>#include <string.h>#define MAXLEN  500int  flag = 0;     //标志数组应该从哪里开始计算int  a[MAXLEN];  int  b[MAXLEN];int  c[2*MAXLEN];  //将每一位的计算结果都保存在里面// 翻转过来好处理void reverse_str(char *str,int *array,int len){      int i = 0;      for(i = 0; i < len; i++){            array[len - i - 1] = str[i] - '0'; //刚开始忘记'0'      }//end for}void multiply(int *a,int *b,int *c,int sa_len,int sb_len){     int  i = 0;    int  j = 0;    int  sum_len = sa_len + sb_len - 1;    for(i = 0; i < sa_len; i++){        for(j = 0; j < sb_len; j++){            c[i + j] += a[i] * b[j];            printf("c[%d]= %d ",i+j,c[i+j]);        }//end for 2        printf("\n");    }//end for 1         for(i = 0; i < sum_len - 1; i++){        c[i+1] += c[i] / 10;        c[i]   %= 10;    }//end for        if(c[i] != 0){        flag = i;    }else{        flag = i - 1;    }//end if else}void print_c_array(int *c,int sa_len,int sb_len){    int i = 0;    int sum_len = sa_len + sb_len;    for(i = flag; i >= 0; i--){        printf("%d",c[i]);    }//end for    printf("\n");}int main(int argc,char *argv[]){    char  sa[MAXLEN];    char  sb[MAXLEN];    int sa_len = 0;    int sb_len = 0;    memset(sa,0x00,sizeof(sa));    memset(sb,0x00,sizeof(sb));    gets(sa);    gets(sb);    sa_len = strlen(sa);    sb_len = strlen(sb);    printf("%s %d\n",sa,sa_len);    printf("%s %d\n",sb,sb_len);    reverse_str(sa,a,sa_len);    reverse_str(sb,b,sb_len);    multiply(a,b,c,sa_len,sb_len);    print_c_array(c,sa_len,sb_len);    return 0;}#include <stdio.h>#include <string.h>#define MAXLEN  100int  flag;     //标志数组应该从哪里开始计算int  a[MAXLEN];  int  b[MAXLEN];int  c[MAXLEN+1];  //将每一位的计算结果都保存在里面// 翻转过来好处理void reverse_str(char *str,int *array,int len){      int i = 0;      int j = MAXLEN - 1;      // 1 2 3 4 5 6      //       4 5 6      for(i = len - 1; i >= 0; i--){            array[j--] = str[i] - '0';      }//end for}void large_number_add(int *a,int *b,int *c,int sa_len,int sb_len){     int  i = 0;    int  j = MAXLEN - 1;    int  m = sa_len>sb_len?sa_len:sb_len;    for(i = 0; i < m; i++,j--){          c[j] += a[j] + b[j];          if(c[j] >= 10){  c[j-1]  += c[j] / 10;              c[j] = c[j] % 10;                   }  printf("c[%d]=%d,c[%d]=%d\n",j,c[j],j-1,c[j-1]);    }    if(c[j] != 0){        flag = j;    }else{        flag = j + 1;    }}void print_c_array(int *c,int sa_len,int sb_len){    int i = 0;    int sum_len = sa_len + sb_len;    for(i = flag; i < MAXLEN; i++){        printf("%d",c[i]);    }//end for    printf("\n");}int main(int argc,char *argv[]){    char  sa[MAXLEN];    char  sb[MAXLEN];    int sa_len = 0;    int sb_len = 0;    memset(sa,0x00,sizeof(sa));    memset(sb,0x00,sizeof(sb));    gets(sa);    gets(sb);    sa_len = strlen(sa);    sb_len = strlen(sb);    printf("%s %d\n",sa,sa_len);    printf("%s %d\n",sb,sb_len);    reverse_str(sa,a,sa_len);    reverse_str(sb,b,sb_len);    large_number_add(a,b,c,sa_len,sb_len);    print_c_array(c,sa_len,sb_len);    return 0;}



5.对于的define和typedef

include <stdio.h>#define  max(a,b)  ((a)>(b)?a:b)//int max(int a,int b);//double max(double a,double b);int main(int argc,char *argv[]){printf("max(5,6)=%d\n",max(5,6));printf("max(2.8,3.2) = %lf\n",max(2.8,3.2));return 0;}#include <stdio.h>#define  print_zero_n(num) do { \    printf("%d\n",num); \num--; \}while(num)int main(int argc,char *argv[]){int num = 10;    print_zero_n(num);return 0;}不会出现硬类型,typedef 也可以屏蔽类型 

6.对于windows下的VC编译器中的可重入读写函数

freopen("data.in","r",stdin)freopen("data.out","w",stdout)

7.malloc是不可重入但是线程安全的函数,因为malloc函数在用户空间要自己管理各进程共享的内存链表,由于有共享资源访问,本身会造成线程不安全。malloc并不是用于大量内存分配操作(容易产生碎片,速度问题),并且在多线程下也不太适合(malloc是不可重入但是线程安全的函数)

8.tcmalloc尝试使用粒度较好和有效的自旋锁,redis用jemalloc来解决内存碎片问题,jemalloc因为Facebook火起来的,FreeBSD很有名的开发人员,现在用在火狐上,tcmalloc是google的


9.在C语言中的struct中不可以写函数,但是C++里面可以写函数

struct node{        int x;    int y;    int max(){        return x>y?x:y;    }}a[10];


10.if 和 for的嵌套问题,其实if 包含for效率更高,寄存器不用来回的切换,if 判断之后,一直执行for语句,肯定效率高。


11.函数指针的简单使用

#include <stdio.h>void (*print)(void *,int);void print_int(void *array,int n){     int i = 0;     for(i = 0; i < n; i++){        printf("%d ",((int*)array)[i]);     }     printf("\n");}void print_double(void *array,int n){    int i = 0;    for(i = 0; i < n; i++){        printf("%.2f ",((double*)array)[i]);    }    printf("\n");}void print_num(void *array,int n,void (*print)(void *,int)){    print(array,n);}int main(int argc,char *argv[]){    int    array_int[5] = {1,2,3,4,5};    double array_double[5] ={1.2,2.5,3.6,4.7,5.8};    print_num(array_int,5,print_int);    print_num(array_double,5,print_double);    return 0; }



0 0
原创粉丝点击