文章标题

来源:互联网 发布:网络女歌手歌曲大全 编辑:程序博客网 时间:2024/06/05 05:36

课堂练习
1、计算器简单实现

#include <stdio.h>#include <unistd.h>//函数的声明float add(float a, float b);float sub(float a, float b);float mul(float a, float b);float div(float a, float b);int main(void){    //用标准输入scanf    printf("从键盘输入两个数,以回车结束:\n");    float a, b, ret;    //默认是行缓冲。留在了你的输入的缓冲区,留下了一个'\n'    scanf("%f %f", &a, &b);    char ch = 0;    printf("从键盘输入你要计算的运算符:+ - * /:\n");    do     {        scanf("%c", &ch);    }while (ch == '\n');    switch (ch)    {        case '+':        ret = add(a, b);        break;        case '-':        ret = sub(a, b);        break;        case '*':        ret = mul(a, b);        break;        case '/':        ret = div(a, b);        break;        default:        printf("error.\n");        break;    }    printf("%.2f %c %.2f = %.2f.\n", a, ch, b, ret);/*    //调用函数    float ret = add(a, b);    //float类型默认精度小数点后6位    printf("ret = %.2f.\n", ret);*/    return 0;}//函数实现(定义)float add(float a, float b){    float c = a + b;    return c;//  return a + b;}float sub(float a, float b){    return a - b;}float mul(float a, float b){    return a * b;}float div(float a, float b){    if (b == 0)    {        printf("除数不能是0.\n");        //高精度向低精度隐式转换,会丢掉数据。低精度向高精度隐式转换,结果更精确。//      return -1;//      结束整个程序        _exit(0);    }    return a / b;}

2、迭代函数练习

#include <stdio.h>#include <unistd.h>//函数的声明float add(float a, float b);float sub(float a, float b);float mul(float a, float b);float div(float a, float b);int main(void){    //用标准输入scanf    printf("从键盘输入两个数,以回车结束:\n");    float a, b, ret;    //默认是行缓冲。留在了你的输入的缓冲区,留下了一个'\n'    scanf("%f %f", &a, &b);    char ch = 0;    printf("从键盘输入你要计算的运算符:+ - * /:\n");/*  scanf("%c", &ch);    //ch = 10.对应‘\n’的asc码值:    printf("ch = %d.\n", ch);*/    do     {        scanf("%c", &ch);    }while (ch == '\n');    switch (ch)    {        case '+':        ret = add(a, b);        break;        case '-':        ret = sub(a, b);        break;        case '*':        ret = mul(a, b);        break;        case '/':        ret = div(a, b);        break;        default:        printf("error.\n");        break;    }    printf("%.2f %c %.2f = %.2f.\n", a, ch, b, ret);    return 0;}//函数实现(定义)float add(float a, float b){    float c = a + b;    return c;}float sub(float a, float b){    return a - b;}float mul(float a, float b){    return a * b;}float div(float a, float b){    if (b == 0)    {        printf("除数不能是0.\n");        _exit(0);    }    return a / b;}

3、递归算法练习

#include <stdio.h>//计算阶乘(递归)int jiecheng(int a){    if (a <= 0)    {        printf("参数错误.\n");        return -1;    }    //回归条件    if (a == 1)        return 1;    return a * jiecheng(a-1);}//递归解决求fibo数列某一项的值: 1 1 2 3 5 8 13 21 34 55int fibo(int num){    if (num > 0)    {        if (1 == num)            return 1;        if (2 == num)            return 1;        return fibo(num-2) + fibo(num-1);    }}int main(void){    int a = 0;    while (1)    {        printf("输入0表示推出.\n");        scanf("%d", &a);        if (0 == a)            break;        printf("%d项的fibo值:%d.\n", a, fibo(a));    }    return 0;}

4、带返回值的函数练习

//函数三要素:返回值、参数列表、声明#include <stdio.h>#include <string.h>//main函数作为整个程序的入口,返回值给了他的父进程//char *argv[]指针数组:[]优先级很高,argv[]代表数组,里面所有的元素是char*类型,每个main函数的参数都是字符串(char *)//直接给main函数传参,一空格表示一个参数的结束int main(int argc, char *argv[]){    //strcmp比较两个字符串大小strcmp(const char *s1, const char *s2)    int ret = strcmp("08", "123467");    printf("ret = %d.\n", ret);    ret = strcmp("923456", "123467");    printf("ret = %d.\n", ret);    char *p = "中国";    printf("%s.\n", p);    char str[] = "123";    char *p_str = "123";    char *p_str1 = "123";    if (p_str == p_str1)        printf("==.\n");    if (str == p_str)        printf("ok.\n");    return 0;}

5、宏定义

//借鉴:http://blog.csdn.net/qustdjx/article/details/7907173#include <stdio.h>//宏定义:1、常数#define NUM 5#define X   NUM+NUM#define INT_16 short#define INT_t  int int main(int argc, char *argv[]){    int a  = NUM;    printf("a = %d.\n", a);    int b = X*X;   // NUM + NUM * NUM + NUM    printf("b = %d.\n", b);    INT_16 c;    return 0;}

6、带参宏和普通函数的练习

#include <stdio.h>int cnt_num_1(int num){    //分析:1、& 0x1 2、num >>=1;3、每次判断(num>>=1)& 0x1    int cnt = 0, flag = 0x1;    while (num)    {        //if条件成立,表示统计一次个数//      if (1 == (num & flag))        if (num & flag)        {            cnt++;//          printf("cnt = %d.\n", cnt);        }        //num向右移一位        num >>= 1;      // === num = num>>1    }    return cnt;}//统计带负数的整形int cnt_1(int a){    int cnt = 0;    unsigned flag = 1;    while (flag)    {        if (a & flag)                cnt++;        flag <<= 1;    }        return cnt;}//参数void func(int a, int b, int c){    printf("%d %d %d.\n", a+b+c, b*=2, c*=3);   }int main(){    //14 4 9    //入参的时候,由右向左    func(1, 2, 3);/*    int a = 9;    int b = -9;    //调用函数返回数值里二进制1的个数    int ret = cnt_num_1(a);    printf("ret = %d.\n", ret);    ret = cnt_1(b);    printf("ret = %d.\n", ret);    int in = 0x80000000;    printf("in  =0x%x.\n", in);*//*    unsigned a = 1;    int a = 1;    float b = 3.14;    double c = -3.1415;    //分析:1、a+b整体隐式转换为float,2、第一的结果整体+double又转换为double类型,3、最后转换为整形    //怎么存的,怎么取    int d = a + b + c;    printf("d = %d.\n", d);*//*    int a = -20;    unsigned int b = 6;    //隐式转换:1、低精度向高精度,安全没有错误;2、小范围默认转化为大范围(指的是表示最大数值的那个类型)    //分析:1、C语言是强类型语言,两个操作数之间运算必须类型一致,2、转换问题?    if (a - b > 0)    {        printf(">.\n");    }    else    {        printf("<.\n");    }*//*    int a = -9;    printf("a = 0x%x.\n", a);    unsigned i = 0;     //相当于== unsigned int    for (i=8; i>=0; i--)    {        printf("i = 0x%x.\n", i);    }*/    return 0;}

7、新建一个库函数

//数学库//链接的时候需要-lm#include <stdio.h>#include <math.h>int main(void){    double ret = sqrt(16);    printf("ret = %.2f.\n", ret);    char *p1;    short *p2;    double *p3;    printf("sizeof(p1) = %d.\n", sizeof(p1));    printf("p1 = %p.\n", p1);       return 0;}

8、字符串比较函数

#include <stdio.h>#include <string.h>//清零操作功能子函数//memset清零操作//char *my_memset(char *p, int c, int lenth)void my_memset(char *p, int c, int lenth){    //参数省略    int i = 0;    for (i=0; i<lenth; i++)    {        p[i] = c;    }//  return p;}//复制字符串功能子函数//strcpy复制字符串char *my_strcpy(char *des, const char *src){    //参数判断省略    char *p_store = des;    while ((*des++=*src++) != 0);    return p_store;}int my_strcmp(const char *s1, const char *s2){    //省略    // "1234567"  "1234567"   "\0123" "\00"        while (*s1 == *s2)        {            if (*s1 == 0 && *s2 == 0)            break;            s1++;            s2++;        }        if (*s1 != *s2)        {            return (*s1 > *s2 ? 1 : -1);        }        if (*s1 == *s2)            return 0;}

9、高仿shell

#include <stdio.h>#include <string.h>//定义一些我们自己的命令#define ls_ "ls"#define pwd_ "pwd"#define mkdir_ "mkdir"//自定义命令个数#define NUM 3//每个命令支持最大字符个数#define CNT 100//全局变量,3行100字符的数组, 默认是全为0char buf[NUM][CNT];//进行命令初始化void init_command(void){    strcpy(buf[0], ls_);    strcpy(buf[1], pwd_);    strcpy(buf[2], mkdir_);}int main(void){    //定义一个输入命令的字符数组    char cmd[CNT];    memset(cmd, 0, sizeof(cmd));    //初始化命令    init_command();    //工作    while (1)    {        printf("[root@]# ");        //输入命令        scanf("%s", cmd);        //查找命令        int i = 0;        for (i=0; i<NUM; i++)        {            if (!strcmp(buf[i], cmd))            {                printf("%s是合法命令:%s\n", cmd, buf[i]);                break;            }        }        if (i >= 3)        {            printf("%s是非法命令,请重新输入\n", cmd);        }    }    return 0;}