C语言复习二(2025.11.7)

位运算

<<:左移,按位左移

说明:原操作数所有二进制位数向左整体移动指定位。(小端模式:低补)

. >>:右移,按位右移

说明:原操作数所有二进制位数据整体向右移动指定位,移除的数据舍弃(高舍低补)

程序的三种基本结构

程序基本的三种结构:顺序结构,分支结构(条件结构、选择结构),循环结构(重复结构)

顺序结构

特点:各操作都是按顺序执行,这个结构是程序默认的。

在这里插入图片描述

分支结构

特点:根据是否满足条件而从一组、两组、多组操作中选择一种去执行。

在这里插入图片描述

P条件成立,则会去执行A操作,否则跳出结构。

分支结构分为:单分支结构、双分支结构、多分支结构。

循环结构

特点:当满足一定条件下,反复执行某一操作,有两种类型:

当型循环

在这里插入图片描述

说明:当P条件成立时,执行S操作,然后再去判断P条件是否成立,如果依然成立,再执行S操作,然后…,如此往复,直到P条件不成立此时不再执行S,结束循环。

举例

while 、for()

特点

先判断,后执行。循环体S有可能一次也不执行。

直到型循环

在这里插入图片描述

说明:首先先执行操作,再去执行P条件是否成立,如果成立再去执行S操作,然后再去判断…,如此反复,如果P条件不成立,结束循环。

举例

do…while

特点

先执行,后判断,循环体S至少执行一次。

用if实现分支结构

单分支:if…

语法

if(条件表达式)
{
	语句;
}
如果是单语句可以省略{}

代码

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  int x,y =-2;
  printf("请输入一个数字:");
  scanf("%d",&x);
  if(x >= 0)
  {
  y = 2;
  }
  printf("x=%d,y=%d",x,y);
  return 0;
  }

案例:

需求:有a,b,c三个数,要求从控制台输入,并求出它们中最大数和最小数。

#include <stdio.h>
  int main(int argc, char *argv[]) {
  int max, min, a, b, c;
  printf("请输入三个数:\n");
  scanf("%d%d%d", &a, &b, &c);
  max = a;
  min = a;
  if (max < b)max = b;
  if (max < c)max = c;
  if (min > b)min = b;
  if (c < min)min = c;
  printf("最大值是:%d,最小值是:%d", max, min);
  return 0;
  }
双分支:if…else…
if (条件表达式)
{
语句1;
}
else
{
语句2;
}
// 如果是单语句,可以省略{},以下两种写法等价
if (条件表达式) 语句1;
else 语句2;
if (条件表达式)
语句1;
else
语句2

注意:else语句不能单独存在,必须和最近的未配对的if配对

代码

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  int x,y;
  printf("请输入一个数:");
  scanf("%d",&x);
  if(x < 0)
  {
  y = -2;
  }
  else{
  y = 2;
  }
  printf("x=%d,y=%d",x,y);
  return 0;
  }

案例

需求:输入一个年份,判断这个年份是闰年还是平年

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  int x;
  printf("请输入一个年份:\n");
  scanf("%d",&x);
  if(x % 4 ==0 && x%100 !=0 ||x%400 ==0)
  {
  printf("%d是闰年",x);
  }
  else
  {
  printf("%d是平年",x);
  }
  return 0;
  }
双分支:三目运算符

语法

表达式1 ?表达式2:表达式3;

说明

如果表达式1的值为真,就执行表达式2,否则执行表达式3。

案例:

通过控制台输入a,b,c三个数,求出最大值

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  int a,b,c,min,max;
  printf("请输入三个数字\n");
  scanf("%d%d%d",&a,&b,&c);
  max =(a > b)?(a > c ? a : c):(b > c ? b : c);
  min =(a < b)?(a < c ? a : c):(b < c ? b : c);
  printf("最大值是%d,最小值是%d",max,min);
  return 0;
  }

循环结构

分类:

无限循环:死循环

有限循环:循环限定循环次数(for)或者终止循环的条件(while,do…while)

循环的构成

循环条件:循环次数或者循环的出口

循环体:需要重复执行的代码

当型循环的实现

特点:先判断,后执行,如果条件不满足一次也不执行。

代表:while、for

while循环

语法

1】循环变量
while(【2】循环条件)
{3】循环语句;4】更新循环变量;
}
// 注意:如果循环语句是单语句,可以省略{}
while (循环条件) 循环单语句;
while (循环条件)
循环单语句;
// 注意:有些特殊场景下,循环体语句糅合到了循环条件中,所以省略掉循环体
while (循环条件); // int i = 1; while(i++ <= 5); printf("%d\n",i);

案例

需求:求1~100的累加和(例如:1+2+3+4+…+100)

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  int i=1,sum=0;
  while(i <= 100)
  {
  sum += i;
  i++;
  }
  printf("1~100的累加和是%d",sum);
  return 0;
  }

案例

需求:求1~100以内的偶数和

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  int i = 2,sum = 0;
  while(i <= 100)
  {
  if(i % 2 == 0)
  {
  sum += i;
  }
  i++;
  }
  printf("1~100偶数累加和是:%d",sum);
  return 0;
  }

案例

需求:通过键盘录入一个整数,判断这个整数是否是水仙花数。

比如一个三位数:

个位的3次幂 + 十位的3次幂 + 百位的3次幂 = 这个数本身

#include <stdio.h>
  #include <math.h>
    int main(int argc, char *argv[])
    {
    int num,n = 0,sum = 0;
    printf("请输入一个数:");
    scanf("%d",&num);
    int originalnum = num;
    while(num != 0)
    {
    num /=10;
    n++;
    }
    num = originalnum;
    while(num != 0)
    {
    int digit=num % 10;
    sum += pow(digit,n);
    num /=10;
    }
    if(sum ==originalnum)
    {
    printf("%d是水仙花数",originalnum);
    }else{
    printf("%d不是水仙花数",originalnum);
    }
    return 0;
    }
for循环

for循环结构清晰,非常适合直到循环次数的循环。

语法:

for (1】循环变量;2】循环条件;4】更新循环变量)
{3】循环语句;
}
// 如果循环体语句是单语句,也是可以省略{}
for (1】循环变量;2】循环条件;4】更新循环变量)3】循环语句;
for (1】循环变量;2】循环条件;4】更新循环变量)3】循环语句;

特点:先判断后执行,有可能一次都不执行。

案例

需求:计算1~100以内的偶数和

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  int sum = 0;
  for(int i = 1;i <= 100;i++)
  {
  if( i % 2 ==0)
  {
  sum += i;
  }
  }
  printf("1~100以内的偶数和是%d",sum);
  return 0;
  }

案例

需求:用户通过键盘输入一个整数n,求n的阶乘。例如:n = 4,n的阶乘 1 * 2 * 3 * 4

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  int num,sum = 1;
  printf("请输入一个数\n");
  scanf("%d",&num);
  for(int i = 1;i <= num;i++)
  {
  sum *= i;
  }
  printf("%d的阶乘是%d",num,sum);
  return 0;
  }

案例

需求:求斐波拉契数列前20个

分析:

斐波拉契数列指的是是符合一定规则的数列,举例:1,1,2,3,5,8…

斐波拉契数列的特点:第3个数等于前两个数之和,最开始的第1,2个数是固定

的,都是1

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  int a,b;
  a = 1;
  b = 1;
  int i = 1;
  for(;i <= 10;i++)
  {
  printf("%d,%d\n",a,b);
  a += b;
  b += a;
  }
  return 0;
  }

直到型循环的实现

特点:先执行,后判断,至少执行一次。

代表:do…while

do…while循环

语法:

1】循环变量;
do
{2】循环体语句;3】更新循环变量;
} while(4】循环条件);

案例

需求:求1~100 以内的偶数和

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  int sum = 0,i = 1;
  do
  {
  if(i % 2 == 0)sum += i;
  i++	;
  }
  while(i <= 100);
  printf("1~100偶数和是:%d",sum);
  return 0;
  }

案例

需求:九九乘法表

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  printf("-------九九乘法表----------\n");
  for(int i =1; i <= 9;i++){
  for(int j = 1; j <= i;j++ )
  {
  printf("%d * %d = %d  ",j,i,i*j);
  }
  printf("\n");
  }printf("\n");
  return 0;
  }

案例

需求:求100~200之间的所有的素数(素数又被称作质数)

#include <stdio.h>
  int main(int argc, char *argv[])
  {
  int num = 100;
  int i ;
  int flag;
  for(;num <= 200;num++)
  {
  flag =1;
  for(int i = 2;i <num / 2;i++)
  {
  if(num % i ==0)
  {
  flag = 0;
  break;
  }
  }
  if(flag)
  {
  printf("%d ",num);
  }
  }
  printf("\n");
  return 0;
  }