四则运算、进制转换、变量内存分配

Posted on 2019-10-13 00:17  金色的省略号  阅读(246)  评论(0编辑  收藏  举报

1、四则运算

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define eps 1e-6
int main()
{
    srand(time(NULL));
    int a,b;
    char op[5] = "+-*/";
    int index;
    /* 计算 */
    printf("除法精确到小数点后2位,四舍五入!\n");
    while(1)
    {    //随机操作数
        a = rand()%101;
        b = rand()%100+1;
        printf("请选择(输入数字):1.加法 2.减法 3.乘法 4.除法 5.随机 6.退出\n" );
        // 1.随机、退出、+-*/
        scanf("%d",&index);
        if(5==index)
            index = rand()%4;
        else if(6==index)
            exit(0);
        else
            index--;
        // 2.题目、答案输入
        printf("%d%c%d=",a,op[index],b);
        double answer, result;
        scanf("%lf",&answer);
        // 3.判题
        switch(op[index]){
            case '+':
                result = a+b; break;
            case '-':
                result = a-b; break;
            case '*':
                result = a*b; break;
            case '/':
                if(b==0)printf("除数不可以为零\n");//b已经处理过了
                else {
                    int r = ((double)a/b+0.005)*100;//4舍5入保留2位
                    result = (double)r/100;
                }
                break;
        }
        if(fabs(result - answer)<=eps)
            printf("对\n");
        else
            printf("错\n");
        printf("正确答案:%.2f\n", result);
    }
    return 0;
}
View Code

2、10进制转16进制并输出

/* 10进制转为16进制,限定8位16进制 */
#include <stdio.h>
int main()
{
    long long x = 0xffffffff;  /* long long 类型 */
    const char* hexChar = "0123456789ABCDEF";
    char out[] = "00000000";   /* 8位字符 */
    int index = 7;   /* 最高位 */
    while(x)
    {
        out[index--] = hexChar[x%16];
        x /=16;
    }
    printf("%s\n",out);
    return 0;
}
View Code

3、小端,栈区,基本数据类型变量内存分配,联合体及联合体的内存分配,内存对齐

/*    结构体成员为基本数据类型,按声明次序,从低地址向高地址分配内存,
union共用一个存储单元*/

#include <stdio.h>
int main()
{    
    int x = 0x5ff;
    char y;
    /* 
        在栈区,基本数据类型变量 x,y 从高地址向低地址分配内存, 
        小端,变量的地址始于低地址,
        若x的地址为0022ff38,y的地址就是0022ff37
        x内存空间为0022ff38~0022ff3c
    */
    printf("&x = %p,&y = %p\n",&x,&y); 

    char *p = (char*)&x;
    printf("%x\n",*(++p)); /* x地址上移一个字节, 打印5 */
    
    union {     
        int i[2]; /* 数组元素从低地址向高地址分配内存 */
        double d;
        char c[9];
    }r, *s = &r;
    
    printf("%d\n", sizeof(r)); //8*2=16个字节 内存对齐
    
    printf("%p,%p\n",&r.i[0],&r.i[1]);/* 从低地址向高地址 */
    printf("%p,%p\n", &r.d,&r.c[0]);  /* 联合体成员地址相同 */
    
    s->i[0] = 0x39;  /* 十进制57 */
    s->i[1] = 0x38;

    /* s->i[0] 与 s->c[0] 共用内存 */
    printf("%c\n",s->c[0]); /* 字符'9'的ascii码值57 */
    return 0;
}
View Code