C语言集训-陈明-第三次作业

175 阅读6分钟

1>视频内容

流程控制

一、选择结构

if结构

1、类型及结构:

    单分支(if(表达式))
               语句;
             ......;
    双分支 (if (表达式) )
               语句;
            else
               语句;
    if嵌套 (if(表达式))    多分支 if (表达式) 
            {                       {
               if(表达式)             语句;
                  语句:            else if(表达式)
               语句;                   语句;
            }                       else
                                        语句; 
                                    }

2、注意的问题:

  • if无break和continue跳转语句,除非其为循环的子句
  • 在多分支存在多个else与if,那么else一定是和最近的if配对
switch结构

1、格式

switch(表达式)
{
case 常量表达式1:语句;
[break;]
case 常量表达式2:语句;
[break;]
[defalt:语句]
[break;]
......
}
  []表示可要可不要,其中defalt表示默认,搞清楚其流程即可
  

2、注意事项:

  • 表达式的值应与常量表达式对应上
  • case与defalt都表示一个程序运行入口的意思。当程序运行时,当表达式的值与某个常量表达式对应上时,则从这个入口进,然后从上往下运行,没遇到break,则就继续执行,直至遇到break跳出程序。
  • switch只有break,无continue,除非作为循环的子句

二、循环结构

for结构

1、格式:

for(1;2;3)
     语句;
其中1、2、3均为表达式

2、空语句:只有一个 ;就代表了一个语句,所以不要 for();这样没意义

while结构

1、格式

while(表达式)
     语句;

2、注意
while可以与for进行互换

例如:1for123while2)   等价于                语句;
     语句;
     3
do while结构

注意不可与while和for进行呼唤。因为它一定会执行一次循环

三、break和continue的用法

break

1、break功能是跳出该流程(循环,switch),然后继续执行流程外的语句
2、break不能用于if,除非if结构为循环内部的一个子句

例子:for(1;2;3)
     {
         if(表达式)
             break;//如果if成立,那么break终止该循环
         printf"....");
     }
     

3、在多层循环(多层switch)中,break只终止最近的那个循环,看下面两个例子,表明是终止最近的循环
当有break时

屏幕截图 2021-11-25 161317.png 当无break时

屏幕截图 2021-11-25 161357.png

continue

1、continue的功能表示继续该结构,且直接跳过后面语句,然后按照流程执行

例如;for(123)
     {
           AB;
           continue;
           C;
           D;
     }   
     则在运行时通过AB语句后,遇到continue,
     则将跳过C,D语句,然后到3去然后在循环
     

四、结构里的一些问题

范围问题:

1、if,while,for,switch都是默认只包含一个语句,所以说为啥for()不要;(单独分号就表示一个语句了)。当其包含语句超过两个,用花括号括起来{}

如何增加流程的可读性?

1,当多个结构并排在一起的时候,我们可以采用花括号或结构结构之间空一行进行区分,便于模块化处理

花括号使模块化: 屏幕截图 2021-11-25 163432.png

空行使模块化: 屏幕截图 2021-11-25 163648.png

C语言对真假的处理
1.计算机对真假的*判断*结果为:非零即是真,零则为假
2.计算机对真假的*显示*结果为:真用1表示,假用0表示
if和while()里表达式问题

()里只要为非零,则就成立

运算符

一、类型及优先级

运算符类型优先级
逻辑非2
自增自减i++,i--,++i,--i2
算术运算符*,/,%3
算术运算符+,-4
关系运算符<=,>=,>,<6
关系运算符==,!=7
逻辑与和逻辑或&&和||11,12
条件运算符C?A:B13
赋值运算符=,+=,-=,*=,/=14
逗号运算符(,,,)15

二、逻辑运算符

短路原则(重点)

逻辑与,逻辑或都有个特性:是逻辑与只要一个为0(假)则值就为零(假),逻辑或只要一个值为1(真)则就为1(真)

所以对于逻辑与:
             假如(3<2)&&(b=2)
             易知第一个表达式就不成立,为零(假),
             则整个表达式一定为假
             则第二个表达式将不被执行
    对于逻辑非:
             假如(3>2)||(a=2)
             易知第一个表达式成立,为1(真)
             则整个表达式一定为真
             则第二个表达式将不被执行
**这就是短路原则**    

屏幕截图 2021-11-25 194922.png

屏幕截图 2021-11-25 195030.png

三、自增自减

1.明白i++,++i的两者区别点在哪
2.尽量避免在复杂运算中使用,以免看不懂
3.通常单独做一个表达式用,代码精炼,速度更快

四、三目运算符

格式
 A?B:C    等价于   if(A)
                     B;
                  else
                     C;
       ( A,B,C均为表达式)

五、运算符中的一些注意事项

1、关系运算符和&&和||的最终结果均为0(假)或者1(真)
2、尽量不要弄复杂计算,使可读性降低
3、最好你想表达某个式子,可以多用括号括起来,增强可读性

其他一些知识

一、强制类型转换

格式
 (数据类型)(已被赋值的变量或常量)
 例如:int i=1float k;
      k=(float)(i)/5
      printf("%f",k)
       则k输出为0.200000,如果无这个强制转换,则输出0.000000
用途

用于整除运算

二、进制转换原理

十进制转换r进制

即为对数对r一直取余,直至取余结果为0,然后在将排列的取余结果倒过来即可

QQ图片20211125165312.jpg

r进制转换十进制

十六进制:0x63f6=6*16^3+3*16^2+15*16^1+6*16^0
其他进制相同做法

三、浮点数存错带来的一些问题

float和double都不能保证可以精确的存储一个小数
判断一个数是否为零: 屏幕截图 2021-11-25 170741.png

老师传授的经验

一、对待那些怪异,难题的题。

思考了之后,不必纠结,只需看懂流程,分析答案流程后,背下来即可。如何去看懂才是关键,想要看懂就要弄懂其核心 流程-每个语句功能-试数

二、做一道难算法程序步骤

尝试-敲代码-看答案-看懂-再次敲代码-尝试修改其中步骤-总结

三、试数的关键

帮助我们检验代码,理清代码流程,看懂代码。

2>作业

5.10

第七题

打印的内容为sos:5 5.0000

第十三题

a:x--;
b:m=n%k;
c:p=q/b-a;
d:(a+b)/c*d;

5.11

第三题

代码

int main()
{
  int a, b, c;

  printf("输入天数:");
  scanf("%d", &a);
  while (a > 0) //循环输入天数,当输入天数为一个非正值,循环结束。
  {
    b = a / 7;
    c = a % 7;
    printf("%d days are %d weeks, %d days\n", a, b, c);
    printf("输入天数:");
    scanf("%d", &a);
  }
  return 0;

} 

运行结果如下: 屏幕截图 2021-11-25 204213.png

第八题

看不懂题目。。。。

6.16

第五题

代码如下

int main()
{
   char a, t, g;
   int i, j, k, n;

   printf("输入一个大写字母:");
   scanf("%c", &a);
   
   for (i = 1; i <= 5; i++)
   {
      a = a - 1;//不要(2)
      for (j = 1; j <= 5 - i; j++) //按照行来循环打印空格
         printf(" ");
      for (k = 0; k <= i - 1; k++) //按照行来循环打印升序字母
      {
         a = a + 1;//替换g=a+1(2)
         printf("%c", a);
      }
      for (n = 1; n <= i - 1; n++) //按照行来循环降序打印字母
      {
         a = a - 1;//替换t=g-1(2)
         printf("%c", a);
      }
      printf("\n"); //换行
   }

   return 0;
}

运行后如下 屏幕截图 2021-11-25 204546.png

第十二题

代码如下

int main()
{
    int i, j, n = -1;
    int k;
    float s = 0, t = 0;

    printf("输入你想循环的次数:");
    scanf("%d", &k);

    for (i = 1; i <= k; i++) //计算只加的和
        s = s + 1.0 / i;
    printf("%f\n", s);
    
    for (i = 1; i <= k; i++) //计算加减相间的和
    {
        for (j = 1; j <= k; j++) //循环正负相间
           {
            n = n * -1;
           }
        t = t + n * (1.0 / i);
    }
    printf("%f\n", t);

    return 0;
}

运行后如下

屏幕截图 2021-11-25 204735.png

第十八题

代码如下

int main()
{
    int i, n = 5;
 
    
        for (i = 1; i > 0; i++) //i>0的无限循环
        {
            n = 2 * (n - i);
            if(n>150)
               break;
            printf("第%d周,Rabnud博士的朋友数量为:%d\n", i, n);
        }
    

    return 0;
}

屏幕截图 2021-11-25 204935.png

7.11

第二题

a:number>=90&&number<100;
b:ch!='k'||ch!='q';
c:number>1&&number<9&&number!=5;
d:number>=9||number<=1;

第十题

代码如下

int main()
{
    char ch;

    while ((ch = getchar()) != '#')
    {
        if (ch == '\n')
            while ((ch = getchar()) == '#' || (ch = getchar()) == '\n')
                ;//空语句作用
        printf("step 1\n");
        if (ch == 'c')
            while ((ch = getchar()) == '#' || (ch = getchar()) == '\n' || (ch = getchar()) == 'c')
                ;//空语句作用
        else if (ch == 'b')
            break;
        else if (ch == 'h')
            printf("step 3");
        else
            printf("step 2");
    }
    return 0;
}

运行后如下: 屏幕截图 2021-11-25 205549.png