C语言程序设计学习第四章

第4章:选择结构

C语言语句有五类

  • 表达式语句:x = x + 1;z + x; [j = j + 3是表达式,不是语句]

  • 函数调用语句:printf("hello");

  • 控制语句:if语句,while语句,return语句等

  • 复合语句:用{}括起来组成的一个语句 if(a>b){c=a;a=b;b=c;}

  • 空语句:仅由一个“;”构成的语句

C语言是结构化程序设计语言

三种基本结构:①顺序结构②分支结构③循环结构 顺序结构:按语句书写的顺序执行

DIPO编程的一般过程

define(定义) input(输入) process(处理,计算) output(输出)

1.分支结构

  1. if语言————条件判断

if的两种形式

形式①:

if(表达式)
    语句A;

功能:当表达式非0时,执行语句A,否则不执行语句A

形式②:

if(表达式)
    语句A;
else
    语句B;

功能:表达式为非0,执行语句A。表达式为0,执行语句B。

  1. if语句的嵌套

在if语句中又包含一个或多个if语句称为if语句的嵌套

if(表达式1)
   if(表达式2)
     语句1;
if(a>0)
  if(b>0)
    printf("%d\n"a,b);

说明:

①else与if必须成对出现,且else总是与最近的一个未配对的if配对

②如果if 与else的数目不同,为实现指定的操作,可以加花括号来确定配对关系

③内层的选择结构必须完整地嵌套在外层的选择结构内,两者不允许交叉。

  1. 嵌套的if语句结构
if(表达式1)
  if(表达式2) 语句1;
    else 语句2;
    else 语句3;
if(表达式1)
{if(表达式2) 语句1;}
else 语句2;
if(表达式1)
    语句1;
else if(表达式2) 语句2;
    else 语句3;
  1. switch语句
switch()
{
  case 常量表达式1:语句组1;break;
    case 常量表达式2:语句组2;break;
    ...
      case 常量表达式n:语句组n;break;
  default:语句组n+1;
}

注意:

①switch后的表达式类型只能是整型、字符型或枚举型(不可以是浮点型)

②case后常量表达式的值必须各不相同,且不可有变量

③各语句组(可为一条或多条语句)不需用{ }括起

④default子句可在任意位置,当与所以case不匹配,则从default执行起

⑤default子句可省(此时若无常量值可匹配,不执行任何操作)

⑥switch语句可嵌套

⑦语法的角度,break语句并不是其中的必须成分

⑧允许多个case共用一组语句

多个case共用一组语句:

switch(x)

{

case 1:

case 2:

case 3:a++;b++;break;

case 4:c++;break;

}

2.循环结构

  • 循环结构也称重复结构,是指在程序执行过程中需要反复执行的程序段

  • 循环语句有三种:①while语句②do-while语句③for语句

  1. while语句

while语句用来实现"当型"循环结构

格式:while(表达式)

         语句;(循环体)

特点:先判断,再执行,有可能一次也不执行

说明:①表达式必须用一对圆括号括起来,如果循环体包含一条以上的语句应用花括号括起来(或逗号表达式)

     ②在循环体内必须修改循环变量的值,否则死循环

     ③在循环体中,循环变量的值可以被引用、修改,但不能另赋新值(否则,可能造成死循环)

     ④循环体通常是一个复合语句,但也可以是一个空语句或单个语句

空语句:while(x++ < 100); //分号不能省

单语句:x = 10;

         while(x- - >0)printf("%d",x);

输出:9 8 7 6 5 4 3 2 1 0

  1. for语句

格式:for(表达式1;表达式2;表达式3) [表达式3无分号]

例题:求1~100的和

#include <stdio.h>

int main()
{
  int i=0;  // 用于1到100循环的计数器。
  int sum=0;  // 用于存放累计的和。
  // 循环从1到100,把全部的值累加起来保存到sum。
  for (i=1;i<=100;i++)
  {
    sum=sum+i;
  }
  printf("sum=%d\n",sum);
}

特点:先判断,再执行,(当型循环)有可能一次也不执行。

  1. goto语句

格式: goto语句标号;

              .....

         标号:语句;

功能:无条件地将控制转移到标号所标识的语句处执行

说明:goto语句中必须有标号,语句标号命名规则同变量名(标识符)

  1. 循环的嵌套

在一个循环体内又包含有一个或多个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环即为多重循环

形式:

    for(  ;  ;)
    {
    for(  ;  ;)
        {      }
     }

两种循环对比:

#include<stdio.h>
main()
{
  int a=0,b=0,i,j;
  for(i=1,i<=2,i++)
  {
    a++;
    for(j=1;j<=3;j++)
      b++;
  }
  printf("a=%d,b=%d\n",a,b);
}
#include<stdio.h>
main()
{
  int a=0,b=0,i,j;
  i=1;
  while(i<=2)
  {
    a++;
    j=1;
    while(j<=3)
      b++,j++;
    i++;
  }
  printf("a=%d,b=%d\n",a,b);
}

打印九九乘法表!!!

#include <stdio.h>
int main() {
    int i,j;  // i, j控制行或列 
    for(i=1;i<=9;i++) {
        for(j=1;j<=9;j++)
            // %2d 控制宽度为两个字符,且右对齐;如果改为 %-2d 则为左对齐
            // \t为tab缩进
            printf("%d*%d=%2d\t", i, j, i*j);

        printf("\n");
    }

    return 0;
}

说明:①嵌套要完整,不能交叉

    ②并列的循环变量可以同名

③嵌套的循环变量同名会英影响外循环

④三种循环语句可以相互嵌套,但不允许交叉

⑤循环与分支可以相互嵌套但不允许交叉

  1. break语句

格式:break;

作用:提前退出某个循环或跳出switch结构

退出当前switch语句

退出当前循环(在循环体中break语句一般与if语句搭配使用)

用法:只能在switch语句和循环体中使用

  1. continue语句

格式:continue;

作用:结束本次循环,使程序回到循环条件,接着进行下一次是否执行循环的判定

说明:只能用于循环结构中,常与if语句联合起来使用,以便在满足条件时提前结束本次循环

注意:①在while和do-while结构中,在continue语句被执行之后立即进行循环条件的测试

    ②在for结构中,则先执行表达式3,然后进行循环条件的测试(表达式2)

例:break和continue的区别

  1. 几种循环的比较:

①三种循环可以互相代替,不提倡使用goto语句

如循环次数已知,明确始末点,一般用for语句;

如果循环次数是由循环体的执行情况确定的,则一般使用while或do-while语句

循环体至少执行一次时,用do-while语句,反之,如果循环体可能一次也不执行,选用while语句或for语句

②for、while属于当型循环(先判断后执行)

③do-while循环属于直到型循环(先执行后判断)

3.常用算法

  1. 枚举法(穷举法或试凑法)

①确定范围(最小)

②试(利用循环列举出范围内每种可能,一一尝试)

例题一:显示出正整数m的所有因子及因子的个数

①m的因子范围为1-m之间的整数

②设置变量i取1-m之间的每个整数,对i的每个取值进行判断

例题二:显示出正整数m和n的最大公约数(m≥n)

①m和n最大公约数的范围为n~1之间的整数

②设置变量i从n开始向1变化,当找到第一个能够同时整除m和n的数,即是m、n最大公约数

例题三:打印出所有的水仙花数

①范围为100~999

②设置变量n从100开始向999变化,每次循环中求n的各位数字的立方和是否等于n

例题四:百元买百鸡(100元买100只鸡)公鸡每只5元,母鸡每只3元,小鸡1元3只,可买公鸡、母鸡、小鸡各几只,有多少种买法?

分析:设公鸡、母鸡、小鸡的数量分别为x,y,z只

①买百只鸡:x+y+z=100(只)

②用百元钱:5x+3y+(1/3)z=100(元)

统分后:15x+9y+z=300

例题五:爱因斯坦阶梯

设有台阶若干,每跨2阶,最后余1阶,跨3阶余2阶,跨5阶余4阶,跨6阶余5阶,跨7阶正好到达阶梯顶部。问:这条阶梯最少共有多少阶?

例题六:判断整数m是否为素数

例题七:找出2~100间全部的素数

  1. 递推法(迭代法)

从初值出发,归纳出新值与旧值间的关系,利用循环来完成迭代,每次循环时都从旧值的基础上递推出新值,并由新值代替旧值

例题一:小猴有若干个桃子,每天吃掉现有数的一半多一个,到第七天要吃时只剩一个了,问小猴从第一天到第七天,每天桃子多少个?

例题二:已知数列成1,1,2,3,5,8,13,21,34,…。编一程序求该数列的第30项

例题三:累加,连乘

累加或连乘实际就是求若干个数之和或积,这些数之间有一定规律可寻

存放结果要由一个变量,用来存放累加结果的变量也成为累加器

累加器变量初始值应为0值

连乘积的变量应为1

例题一:计算1-100之间所有奇数之和

例题二:计算1-100能被3整除的数字个数

例题三:求s=1+12+123+…+123…n,n值通过键盘输入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值