鸦领主 发表于 2020-11-12 23:30:24

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

本帖最后由 鸦领主 于 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;
}效果:


2.输入一个42亿以内的十进制数,用%X打印成8个十六进制数
#include<stdio.h>
int main()
{
unsignedint 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;
}

错误方式:


正确方式:


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





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;
}效果:


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
    }
}效果:




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;
}效果:


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++;
    }
}效果:

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

二、分支语句
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;
}效果:


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;
}
效果:


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;
}效果:

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

三、循环语句
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;
}

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


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;
}

效果:


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>效果:

俩种复合条件:而且&&,或则||
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]
查看完整版本: C语言学习第五天 进阶进制转换 分支语句 循环语句