C语言集训-王孖豪-第三次作业

200 阅读7分钟

学习内容

运算符

算术运算符

有:+ - * /(除) %(取余数)

关系运算符

有:> >= < <= !=(不等于) ==(等于)

逻辑运算符

有:!(非) &&(并且) ||(或)

赋值运算符

有= += *= /= -=

优先级别

算术运算符>关系运算符>逻辑运算符>赋值运算符

&&左边的表达式为假,右边的表达式肯定不会执行
||左边的表达式为真,右边的表达式肯定不会执行

附录运算符知识

自增(自减)

分类:
前自增 -- ++i
后自增 -- i++

前自增和后自增的异同:
相同:
最终都使i的值加1
不同
前自增整体表达式的值是i加1之后的值
后自增整体表达式的值是i加1之前的值

#include<math.h>
int main(void)
{
  int i;
  int j;
  int k;
  int m;

  i=j=3;
  k=i++;
  m=++j;

  printf("i=%d j=%d k=%d m=%d",i,j,k,m);


  return 0;
}

image.png

为什么会出现自增(自减)
代码更精炼
自增的速度更快

学习自增要明白的几个问题
1.我们编程时应该尽量屏蔽掉前自增和后自增的差别
2.自增表达式最好不要作为一个更大的表达式的一部分来使用
或者说i++和++i单独成一个语句,不要把它作为一个完整复合语句的一部分来使用

三目运算符

A?B:C
等价于
if(A)
B;
else
C;

#include<math.h>
int main(void)
{
  int i;
  i=(3>2?5:1);
  printf("%d\n",i);
  return 0;
}

image.png

逗号表达式

格式:
(A,B,C,D)
功能:
从左到右执行
最终表达式的值时最后一项的值

#include<math.h>
int main(void)
{
  int i;
  int j=2;
  i=(j++,++j,j+2,j-3);
  printf("%d\n",i);
  return 0;
}

image.png

流程控制

什么是流程控制

程序代码执行的顺序

流程控制的分类

顺序执行

选择执行

定义 某些代码可能执行,也可能不执行,有选择的执行某些代码

分类

if
1.if的最简单的用法

格式:
if(表达式)
语句
功能:
如果表达式为真,执行语句
如果表达式为假,语句不执行

image.png

image.png

2.if的范围问题

if(表达式)
语句A;
语句B;
解释:if默认只能控制语句A的执行或不执行,if无法控制语句B的执行或不执行,或者讲语句B一定会执行 image.png

if(表达式)
{
语句A;
语句B;
}
此时if可以控制语句A和语句B

image.png

由此可见,if默认只能控制一个语句的执行或不执行,如果想控制多个语句的执行或不执行,那么就必须把这些语句用{}括起来

链接:www.bilibili.com/video/BV1os…

3.if...else...的用法

image.png

image.png

链接:www.bilibili.com/video/BV1os…

4.if...else...if...else...的用法

格式:
if(1)
A;
else if(2)
B;
else if(3)
C;
else
D;

链接:www.bilibili.com/video/BV1os…

5.C语言对真假的处理

非零是真
零就是假
真用1表示
假用0表示 链接:www.bilibili.com/video/BV1os…

6.if举例

求分数的等级

#include<math.h>
int main(void)
{
  float score;

  printf("please input your score!");
  scanf("%f",&score);

  if(score > 100)
  printf("This is a dream!\n");
  else if(score>=90 && score<=100)
  printf("you are excellent!\n");
  else if(score>=80 && score<90)
  printf("you did well!\n");
  else if(score>=60 && score<80)
  printf("you passed!\n");
  else if(score>=0 && score<60)
  printf("you are fail!\n");
  else
  printf("The input score is too low!\n");
  return 0;
}

image.png

链接:www.bilibili.com/video/BV1os…

三个数排序

#include<math.h>
int main(void)
{
  int a,b,c;
  int t;
  printf("please input three nmubers!\n");
  scanf("%d %d %d",&a,&b,&c);
  if(a<b)
  {
      t=a;
      a=b;
      b=t;
  }
  if(a<c)
  {
      t=a;
      a=c;
      c=t;
  }
  if(b<c)
  {
      t=b;
      b=c;
      c=t;
  }
  printf("%d %d %d\n",a,b,c);
  return 0;
}

image.png

链接:www.bilibili.com/video/BV1os… \

7.if的常见问题解析

1.空语句的问题 if(3>2);
等价于
if(3>2)
;//这是一个空语句

2.if(表达式1)
A;
else
B;
是正确的

if(表达式1);
A;
else
B;
是错误的

3.if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
else
D;
即便表达式1和2都成立,也只会执行A语句

4.if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
这样写语法不会出错,但逻辑上有漏洞

5.if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
else (表达式4)//7行
D;
这样写是不对的,正确的写法是:
要么去掉第七行的(表达式4),要么在七行的else后面加if

6.if(表达式1)
A;
else if(表达式2)
B;
else if(表达式3)
C;
else(表达式4);
D;
这样写语法不会出错,但逻辑上是错误的
else(表达式4);
D;
等价于
else
(表达式4);
D;\

链接:www.bilibili.com/video/BV1os…

switch
#include<math.h>
int main(void)
{
  int val;

  printf("please enter the floor you want to enter!\n");
  scanf("%d",&val);

  switch(val)
  {
      case 1:
      printf("on the first floor open!\n");
      break;
      case 2:
      printf("on the second floor open!\n");
      break;
      case 3:
      printf("on the third floor open!\n");
      break;
      default:
      printf("fault!\n");
      break;
  }
  return 0;
}

image.png

格式: switch(表达式) { case常量表达式1:语句1; case常量表达式2:语句2; ... case常量表达式n:语句n; default:语句n+1; }

循环执行

定义 某些代码会被重复执行

分类

for
#include<math.h>
int main(void)
{
  int i;
  int sum = 0;

  for(i = 1;i<=10;++i)
  sum = sum + i;
  printf("sum is %d\n",sum);
  return 0;
}

image.png

1.格式

for(A;B;C)
语句A;

2.执行的流程

单个for循环的使用

多个for循环的嵌套使用

for(1;2;3)//1
for(4;5;6)//2
A;//3
B;//4
整体是两个语句,1 2 3是第一个语句,4是第二个语句

for(1;2;3)
for(4;5;6)
{
A;
B;
}
整体是一个语句

for(1;2;3)
for(4;5;6)
{
A;
B;
for(7;8;9)
C
}
整体是一个语句

#include<math.h>
int main(void)
{
  int i,j;
  for(i=0;i<3;++i)
  printf("heihei!\n");
  for(j=2;j<5;++j)
  printf("haha!\n");
  printf("xixi!\n");
  return 0;
}

image.png

#include<math.h>
int main(void)
{
  int i,j;
  for(i=0;i<3;++i)
  printf("1111!\n");
  for(j=2;j<5;++j)
  {
  printf("2222!\n");
  printf("3333!\n");
  }
  printf("4444!\n");
  return 0;
}

image.png

3.范围问题
4.举例

1+2+3+4……+100
1+1/2+1/3+1/4+……+1/100

#include<math.h>
int main(void)
{
  int i;
  float sum = 0;

  for(i = 1;i<=100;++i)
  sum = sum + 1.0/i;
  printf("sum is %f\n",sum);
  return 0;
}

image.png

5.for和if的嵌套使用

1到100之间奇数之和

#include<math.h>
int main(void)
{
  int i;
  int sum=0;
  for(i=1;i<101;++i)
  {
      if(i%2 == 1)
      sum += i;
  }
  printf("sum = %d\n",sum);

  return 0;
}

image.png

1到100之间奇数的个数

#include<math.h>
int main(void)
{
  int i;
  int cnt = 0;
  for(i=1;i<101;++i)
  {
      if(i%2 == 1)
      ++cnt;
  }
  printf("cnt = %d\n",cnt);

  return 0;
}

image.png

1到100之间奇数的平均值

#include<math.h>
int main(void)
{
  int i;
  int sum = 0;
  int cnt = 0;
  float avg;
  for(i=1;i<101;++i)
  {
      if(i%2 == 1)
      {
      sum += i;
      ++cnt;
      }
  }
  avg = 1.0*sum/cnt;
  printf("sum = %d\n",sum);
  printf("cnt = %d\n",cnt);
  printf("avg = %f\n",avg);

  return 0;
}

image.png

1到100之间奇数之和,1到100之间偶数之和

#include<math.h>
int main(void)
{
  int i;
  int sum1 = 0;
  int sum2 = 0;
  
  for(i=1;i<101;++i)
  {
      if(i%2 == 1)
      sum1 += i;
      else
      sum2 += i;
  }

  printf("sum1 = %d\n",sum1);
  printf("sum2 = %d\n",sum2);

  return 0;
}

image.png

链接:www.bilibili.com/video/BV1os…

while
1.执行顺序

格式:
while(表达式)
语句;

2.与for的相互比较

while和for可以相互转换
for(1;2;3)
A;
等价于
1;
while(2)
{
A;
3;
}
while和for可以相互转化
但ford的逻辑性更强,更不容易出错

#include<math.h>
int main(void)
{
  int i;
  int sum = 0;
  i=1;
  while(i<101)
  {
  sum = sum + i;
  i++;
  }
  printf("sum = %d\n",sum);
  return 0;
}

image.png

3.举例

从键盘输入一个数字,如果该数字是回文数,则返回yes,否则返回no
回文数:正着写和倒着写都一样,比如:121,12321都是回文数

#include<math.h>
int main(void)
{
  int val;//存放待判断的数字
  int m;
  int sum = 0;

  printf("enter a number to determine!\n");
  scanf("%d",&val);

  m=val;
  while(m)
  {
      sum = sum*10 + m%10;
      m/=10;
  }
  if(sum == val)
  printf("yes!\n");
  else
  printf("no!\n");

  return 0;
}

image.png 斐波拉契序列

#include<math.h>
int main(void)
{
  int n;
  int f1,f2,f3;
  int i;
  f1=1;
  f2=2;

  printf("please enter the sequence of items you want:\n");
  scanf("%d",&n);

  if(1 == n)
  {

      f3=1;
  }
  else if(2 == n)
  {

      f3=2;
  }
  else
  {
      for(i=3;i<=n;++i)
      {
          f3=f1+f2;
          f1=f2;
          f2=f3;
      }
  }
  printf("%d\n",f3);
  return 0;
}

image.png

4.do...while

格式:
do
{
A;
}
while(表达式)
do...while并不等价于for,当然也不等价于while

一元二次方程

#include<math.h>
int main(void)
{
  double a,b,c;
  double delta;
  double x1,x2;

  printf("please enter three coefficients:\n");
  printf("a = ");
  scanf("%lf",&a);
  printf("b = ");
  scanf("%lf",&b);
  printf("c = ");
  scanf("%lf",&c);

  delta = b*b - 4*a*c;

  if(delta >0)
  {
      x1=(-b + sqrt(delta)) / 2*a;
      x2=(-b - sqrt(delta)) / 2*a;
      printf("there are two solutions!\n");
  }
  else if(0 == delta)
  {
  x1=x2=(-b) / 2*a;
  printf("there is a solutions!\n");
  }
  else
  printf("no solution!\n");

  return 0;
}

image.png

break和continue
break

如果用于循环是用来终止循环
如果用于switch,则是用于终止switch
不能直接用于if,除非if属于循环内部的一个子句

在多重循环中,break只能终止离它最近的循环
例如:

#include<math.h>
int main(void)
{
  int i,j;
  for(i=0;i<3;i++)
  {
    for(j=1;j<4;j++)
    break;
    printf("haha!\n");
  }
  return 0;
}

image.png

在多层switch嵌套中,break只能终止距离它最近的switch

continue

用于跳过本次循环余下的语句,转去判断是否需要执行下次循环 例子: 1. for(1;2;3)
{
A;
B;
continue;//如果执行该语句,则执行完该语句后,会执行语句3,C和D都会被跳过去,C和D不会被执行
C;
D;
}

while(表达式)
{
A;
B;
continue;//如果执行该语句,则执行完该语句后,会执行表达式,C和D都会被跳过去,C和D不会被执行
C;
D;
}

强化类型转换

格式:
(数据类型)(表达式)
功能:
把表达式的值强制转化为前面所执行的数据类型

浮点数的存储所带来的问题

float和double都不能保证可以精确的存储一个小数
循环中更新的变量不能定义成浮点型

课后作业答案

5.10

第七题

image.png

第十三题

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

5.11

第三题

image.png

第八题

image.png

6.16

第五题

image.png

第十二题

image.png

第十八题

image.png

7.11

第二题

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

第十题

image.png