查看: 1361|回复: 0

[原创图文] C语言学习第五天 进阶进制转换 分支语句 循环语句

[复制链接]

35

主题

47

帖子

3

精华

解密专家

Rank: 16

学币
440
荣耀
0
rank
0
违规
0
发表于 2020-11-12 23:30:24 | 显示全部楼层 |阅读模式
本帖最后由 鸦领主 于 2020-12-28 16:05 编辑

·目录

一、进制转换(进阶)

1.输入16以内十进制转换一个十六进制

2.输入42亿以内十进制转换八个十六进制

3.printf宽度管理

   4.输入16以内十进制转换一个十六进制(使用分支语句)

   5.输入42亿以内十进制转换八个十六进制(使用循环语句)

       1)pow函数

       2)改进代码

二、分支语句

   1.单分支语句

   2.双分支语句

   3.多分支语句

三、循环语句

   1.while循环语句

   2.do while循环语句
          3.循环控制

四、循环分支语句使用列子

   1.打印菜单栏

   2.判断数字是否为素数

       1)第二种思路

       2)嵌套循环

五、补充

   1.swichi语句(分支)

   2.for语句(循环)



一、十转换十六进制打印


1.输入一个16以内的十进制数,用%X打印成一个十六进制数
#include<stdio.h>
int main()
{
int i;
printf("输入一个16内的数字:");
scanf_s("%d",&i);
printf("0x%04X",i);  // %04X中间的0代表打印出的数字,4代表4个位置,双字节(00是单字节 00 00是双字节等)
return 0;
}
效果:

C语言学习第五天

C语言学习第五天


2.输入一个42亿以内的十进制数,用%X打印成8个十六进制数
#include<stdio.h>
int main()
{
unsigned  int i;  // 不能用 int因为有符号,unsigned int 无符号
printf("输入42亿内的数字:");
scanf_s("%d",&i);
printf("0x%08X\n",i);
printf("或者可以这样输入,每俩个十六进制数间隔\n");
printf("%X",i/16/16/16/16/16/16/16%16);
printf("%X ",i/16/16/16/16/16/16%16);
printf("%X",i/16/16/16/16/16%16);
printf("%X ",i/16/16/16/16%16);
printf("%X",i/16/16/16%16);
printf("%X ",i/16/16%16);
printf("%X",i/16%16);
printf("%XH",i%16);

return 0;
}


错误方式:

C语言学习第五天

C语言学习第五天

正确方式:

C语言学习第五天

C语言学习第五天


3.printf加强功能宽度管理
整数宽度:
(算上自己本身占的位置,比如      55前面6个位置加上自己2个位置是8个位置)
printf("%8d",55);8表示右对齐占8个位置,;
printf("%-8d",44);-8表示左对齐占8个位置;
printf("%08d",33);0表示右对齐8个位置填充为0,左对齐填充0无效。
(字符串,浮点数同理)

C语言学习第五天

C语言学习第五天




4.输入一个16以内的十进制数,不用%X打印出一个十六进制数
#include<stdio.h>
int main()
{
        int i;
        printf("输入一个16内的数字:");
        scanf_s("%d", &i);
        if (i < 10)  //如果输入的是1-9
                printf("%d", i); //将执行这一句
        else if (i == 10)//输入10
                printf("A");//执行这一句
        else if (i == 11)
                printf("B");
        else if (i == 12)
                printf("C");
        else if (i == 13)
                printf("D");
        else if (i == 14)//输入14
                printf("E");//执行这一句
        else if (i == 15)
                printf("F");
        else
                printf("输入的数字无效") //如果没有符合的将直接执行到这一句

return 0;
}
效果:

C语言学习第五天

C语言学习第五天

C语言学习第五天

C语言学习第五天


5.输入一个42亿以内的十进制数,不用%X打印出8个十六进制数(使用循环语句)
#include<stdio.h>
#include<math.h>
int main()
{
    unsigned int i, m;
    printf("输入一个42亿内的数字进行进制转换:");
    scanf_s("%d", &i);
    printf("转换结果为:0x");
    int n = 0;  
    while (n < 8) //n大于等于8就不在循环
    {

        m = i / (int)pow(16, (7-n)) % 16;
        if (m < 10)
            printf("%d", m);
        else if (m == 10)
            printf("A");
        else if (m == 11)
            printf("B");
        else if (m == 12)
            printf("C");
        else if (m == 13)
            printf("D");
        else if (m == 14)
            printf("E");

        else
            printf("F");
        n++; //每次循环n+1
    }
}
效果:

C语言学习第五天

C语言学习第五天



1)pow函数:x的x次方(用到#include<math.h>头文件,包括了数学计算之类的函数)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
    int i, n;
    printf("请输入:");
    scanf("%d%d",&i,&n);
    printf("%d的%d次方是:%0.0f",i,n,pow(i,n));
    return 0;
}
效果:

C语言学习第五天

C语言学习第五天


2)改进代码
#include<stdio.h>
#include<math.h>
int main()
{
    unsigned int i, m, s;
    printf("请输入42亿以内的数字进行转换:");
    scanf_s("%d", &i);
    printf("0x");
    int n = 0;
    while (n < 8)
    {
        s = (int)pow(16,(7 - n)); //第一次n=7-0 第二次n=7-1
        m = i / s % 16;   //第一次i/16的7次方,第二次i/16的6次方... 第八次i/16的0次方
        if (m < 10)
            putchar(48+m);   //=printf("%d",m)  48在ascii中是0,如果m=5的话,0+5等于5将会打印出5  
        else
            putchar('A' + m - 10);  //A在ascii中是65,如果m是11的话 11-10=1,65+1=66,66是B将会打印B
        n++;
    }
}
效果:

C语言学习第五天 进阶进制转换 分支语句 循环语句

C语言学习第五天 进阶进制转换 分支语句 循环语句

与上面那个效果一样,更加方便了一些
==========================================================================

二、分支语句

1.单分支语句:
if
#include<stdio.h>
int main()
{
        int i, m;
        printf("请输入你的销售数量:");
        scanf_s("%d",&i);
        m = i*20;  //卖一件提成20元,卖i件=i*20元
        if (i >= 100)  //如果卖出大于等于100件
                m = m + 500; //则额外获得500元
        printf("本月获得提成:%d元",m);

        return 0;
}
效果:

C语言学习第五天

C语言学习第五天

C语言学习第五天

C语言学习第五天

2.双分支语句
if
else

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    int i, m; //i是数量,m是多少元
    printf("输入本月销量:");
    scanf("%d", &i);
    if (i < 100)  //如果小于100件
        m = i* 20;//每件提成20元
    else             
        m = i * 30;  //大于100件每件30元
    printf("%d元",m);
    return 0;
}
效果:

C语言学习第五天

C语言学习第五天

C语言学习第五天

C语言学习第五天


3.多分支语句:
if
else if
else if
.....
else
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    int i, m; //i是数量,m是多少元
    printf("输入本月销量:");
    scanf("%d", &i);
    if (i < 100)  //如果小于100件 1-99会执行这里
        m = i * 20;//每件提成20元
    else if (i < 200) //小于200件,  100-199会执行这里
        m = i * 30;  //每件30元
    else
        m = i * 40; //200以上会执行这里
    printf("%d元",m);
    return 0;
}
效果:

C语言学习第五天

C语言学习第五天

C语言学习第五天

C语言学习第五天

C语言学习第五天

C语言学习第五天

==========================================================================

三、循环语句

1.while循环语句:先判断条件成不成立,成立执行不成立不执行
#include<stdio.h>
int main()
{
    int i = 1, n = 0; //初始化区(i是决定从那个数值开始)
    while (i<=100)//<100的话是99加过一次就跳出循环,<=100是100也要加一次
    {
        n = n + i;//(每循环一次n加一次i)等价于n +=i
        i = i + 1;//(每循环一次i加一次1)//等价于i++;/++i;
    }
    return 0;
}

C语言学习第五天

C语言学习第五天


2.do while循环语句:先无条件的执行一次在判断条件成不成立
#include<stdio.h>
int main()
{
    int i = 20,n=0;
    do
    {
        n += i;
        i++;
    } while (i<10);  //可以看到条件不成立但还是执行了一次
    return 0;
}
效果:

C语言学习第五天

C语言学习第五天


3.循环控制
int n=0;
while(n<8) //n从0-7
i++;


int n=7                                                  
while(n>=0)n从7-0                       
 m = i / (int)pow(16, n) % 16;   
i--;

等价于
int n=7 
while(n<8) //n从0-7
m = i / (int)pow(16, 7-n) % 16; //加了7-n变成了n从7-0
i++

==========================================================================
四、循环分支使用列子
1.打印菜单栏(循环分支语句)
system("cls")清除数据     
system("pause")按任意件继续(停顿)
用system需要#include<stdlib.h>或者#include<windows.h>(windows.包括了stdlib.h)

#include<stdio.h>
#include<windows.h>
int main()
{
    int i=1;
    while (i!=0)  // i不等于0继续循环 ( !=不等于,==等于)
    {
        system("cls"); //清除数据
        puts("1.添加数据");
        puts("2.删除数据");
        puts("3.修改数据");
        puts("0.退出程序");
        puts("===============");
        puts("请输入你的选择:");
        scanf_s("%d", &i);
        if (i == 1)
            puts("你选择了添加数据");
        else if (i == 2)
            puts("你选择了删除数据");
        else if (i == 3)
            puts("你选择了修改数据");
        else if (i == 0)
            puts("你选择了退出程序");
        else
            puts("你的选择无效");
        system("pause");  //停顿

    }
    return 0;
}

输入1之后出现你选择了添加数据,输入2之后出现你选择了删除了数据,输入0退出程序

2.判断一个数字是否为素数(循环分支语句)
#include<stdio.h>
int main()
{
    int n;
    printf("请输入一个数字:");  //输入11
    scanf_s("%d" ,& n);
    int i = 2;
    while (i<n)  //循环9次,i=n不在循环 
    {
        if (n % i == 0)  //没有符合条件,继续循环
                break; //不执行中途退出循环
        i++;   //每次循环加1
    }
    if (n == i) //n为11,i为11
        printf("%d是素数", n); // 11是素数
    else
        printf("%d不是素数", n);
    return 0;
}


效果:

C语言学习第五天 进阶进制转换 分支语句 循环语句

C语言学习第五天 进阶进制转换 分支语句 循环语句

C语言学习第五天 进阶进制转换 分支语句 循环语句

C语言学习第五天 进阶进制转换 分支语句 循环语句


1)第二种思路
#include<stdio.h>
int main()
{#include<stdio.h>
int main()
{
    int n,f=0;
    printf("请输入一个数字:"); //输入一个33
    scanf_s("%d" ,& n);
    int i = 2;   //第一次i=2继续循环+1,i=3
    while (i<n)
    {
        if (n % i == 0) //33%3余数0
        {
            f = 1; //执行f=1
            break;//执行中途退出
        }
        i++;
    }
    if (f==0) //此时f=1
        printf("%d是素数", n);
    else
        printf("%d不是素数", n); //f不等于0,则33不是素数
    return 0;
}
复合语句:在函数内用大括号包起来的就是复合语句。
缺省情况:if或while只能控制一个分号;
如果要控制多行就要用大括号包起来。


2)嵌套循环(循环中有循环)
#include<stdio.h>
int main()
{
    int n;
    while (1) //while(1)为死循环,死循环会一直循环,没有退出条件,可以自己加退出条件
    {
        printf("请输入一个数字:");  
        scanf_s("%d", &n);
        if (n == 0) //如果 n=0,
            break; //则退出,
        int i = 2;
        while (i < n)  
        {
            if (n % i == 0) 
                break; 
            i++;   
        }
        if (n == i) 
            printf("%d是素数\n", n); 
        else
            printf("%d不是素数\n", n);
    }
    return 0;
}</span></code></pre>
效果:

C语言学习第五天 进阶进制转换 分支语句 循环语句

C语言学习第五天 进阶进制转换 分支语句 循环语句

俩种复合条件:而且&&,或则||
if(n==0||n==1) n等于1或者等于0才会执行下面代码

if(n==0&&n==1)n等于0而且等于1才会执行下面代码
==========================================================================


补充:
1.swichi语句:
a)if语句所控制的往往范围较大,而switch语句往往是对少量的单一条件判断;

b)switch只有一次无限大范围条件的控制,.就是default语句。
c)case语句中丕能带有变量:必须是一个常量了数字);
d)一个switchi语句下面所有的case都是不可以重复的:.
e)在每个case区域尽量不要定义变量,定义变量最好在switch之前;

格式:
swichi(xxx)
{
case'xxx';
     puts("xxx")
     break;

case'xxx';
     puts("xxx")
     break;
default;
}

2.for语句
for(初始化区;判断区;递增区)
{
   运算区

}
a)递增区是在没每次循环结束时执行
b)当判断区不写入东西的时候代表无条件循环
c)for的括号内3个区都可以为空
============
break;中途退出循环
return 1;直接退出函数
contiune;返回循环开始



温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
学逆向论坛-免费的逆向学习论坛
快速回复 返回顶部 返回列表