21-11-17循环与掩码

输入任意十进制数,转化成十六进制数显示:
在这里插入图片描述

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

char *int2hex(unsigned int num)
{
    int temp;
    unsigned int mask = 0xf;

   //static char hex[11]; //0x12345678; !!!:hex的空间在栈空间:

   char *hex = (char *)malloc(sizeof(char) * 11); //hex的空间在堆空间

   hex[0] = '0';
    hex[1] = 'X';
    hex[10] = '\0';

   for (int i = 0; i < 8; i++)
    {
        temp = num & mask;

   if(temp >= 10)
        {
            hex[9 - i] = temp - 10 + 'A';
        }
        else
        {
            hex[9 - i] = temp + '0'; // 9 + '0' = '9'
        } 

   num = num >> 4;
    }

   return hex;
}

int main(int argc, char *argv[])
{
    unsigned int num;

   printf("Please input num:\n");
    scanf("%u", &num);

   char *hex = int2hex(num);
    //释放int2hex的栈空间

   printf("hex = %s\n", hex);

   free(hex); //内存泄露

   return 0;
}

hex数组定义在栈上面(局部变量)
栈空间的特点:先进后出、系统管理、生命周期(所在函数体执行结束后释放)
堆空间:先进先出、用户管理

控制语句
if的使用注意事项:
1、条件:成立:非零
2、if后;的问题
3、判断相等时,将常量写在左边
4、规范:if必须匹配else
5、if条件中的运算符的优先级
6、判断条件的零值比较
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
循环语句:
死循环:while(1) for(;😉
使用注意事项:
循环条件的多分号
循环体里不要直接修改循环变量的值;
编程:通过编程实现,统计1~n有多少个9 提示:n通过参数传入
算法:
在这里插入图片描述
程序:
我的:错误!!!

#include <stdio.h>

int main()
{
    int num;
    int count=0;
    int temp;
    int p;
    printf("please input a num:\n");
    scanf("%d",&num);
    printf("another num:\n");
    scanf("%d",&p);
    for(int i = 0;i<num;i++)
    {
        while(num / 10 != 0)
        {
            temp = num % 10;
            num =num / 10;
            if(temp == p)
            {
                count++;
            }
        }

    }
   printf("%d",count);
    return 0 ;
}

正确答案:

#include <stdio.h>

int main()
{
    int num;
    int count = 0;
    
   printf("please input a num:\n");
    scanf("%d",&num);

   for(int i = 1; i <= num;i++)
    {
        while(i != 0)
        {
            if (i % 10 == 9)
            {
                count++;
            }
            i = i / 10;
        }

    }
   printf("count = %d\n",count);
    
   return 0 ;
}

出现死循环:在循环体中修改了循环变量的值
i = i / 10;(i = 0;)
for循环中i++(i又等于1了)
优化:定义一个temp作为替死鬼

#include <stdio.h>

int main()
{
    int num;
    int count = 0;
    int temp;
    int p;

   printf("please input a num:\n");
    scanf("%d",&num);
    printf("please input another num:\n");
    scanf("%d",&p);

   for(int i = 1; i <= num;i++)
    {
        temp = i;
        while(temp != 0)
        {
            if (temp % 10 == p)
            {
                count++;
            }
            temp = temp / 10;
        }

   }
   printf("count = %d\n",count);

   return 0 ;
}

嵌套循环体的优化:长循环体在最里面;逻辑判断在循环体外;
编码规范:即使循环体只有一条语句都要加{}
do-while:

do
{

}
while()

多路分支语句:
switch(条件):条件只能是整数或者字符 表达式
不管case下语句有多少条都要加{}
一旦匹配到就会一直执行
在这里插入图片描述break VS continue:
continue:结束当前这次循环,进行下一次循环判断
break:结束当前全部循环
在这里插入图片描述
结果会出现死循环
在这里插入图片描述在这里插入图片描述

goto语句:
注意事项:
1、尽可能少用goto语句:goto语句会破坏代码结构;导致代码可读性差
2、标签和goto语句之间切记不要出现变量的定义
在这里插入图片描述

在这里插入图片描述
goto使用场景:异常处理
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值