语句与流程控制

 一、语句

1、基本语句

1.1、数据描述语句

1.1.1、定义语句

  • 变量定义语句,如int a
  • 类型定义语句,如struct node

1.1.2、声明语句

  • 函数声明语句,如int sum();
  • 变量声明语句,如#define PI 3.14

1.2、基本功能语句

  • 表达式语句(是在表达式后边跟一个分号所构成的语句。)
  • 空语句(空语句是仅由一个分号表示的语句。其格式为: ;)
  • 函数调用语句(由一次函数调用加一个分号构成。sum();)

1.3、流程控制语句

1.3.1、选择语句

  • if语句
  • if....else语句
  • if....else.....if语句

1.3.2、多分支结构

  • switch

1.3.3、循环语句

  • while语句
  • do......while语句
  • for语句

1.3.4、转向语句

  • continue语句
  • break语句
  • return语句
  • goto语句

2、复合语句

(复合语句是由一对花括号括起来的若干语句组成)

3、C语言编程基本规范

#include <stdio.h>
 
int main()
{
    return 0;
}

二、三种基本结构

1、顺序结构

1.1、表达式语句

1.2、空语句

1.3、函数调用语句

1.4、复合语句

1.5、程序举例

(1)财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少。
例如,某职工工资为3436元,发放方案为:100元34张,20元1张,10元1张,5元1张,1元1张。

(2)从键盘输入一个大写字母,要求改用小写字母输出。

2、选择结构

2.1、if语句(判定给定的条件,决定执行不同的两段程序之一)

2.1.1、程序举例

(1)输入两个实数a,b,如果a比b大,则将两个数数值交换,按代数值由小到大次序输出这两个数

(2)输入三个实数a,b,c,按代数值由小到大次序输出这三个数。

(3)有一函数如下,编一程序,输入一个x值,输出y值。
                                        -1              (x<0)
        y=     0               (x=0)
                                         1               (x>0) 

(4)写程序,判某一年是否闰年。
输入:年(year)
计算:判是否闰年vim
输出:闰年或非闰年(leap)
闰年条件:
能被4整除,但不能被100整除。
能被4整除,又能被400整除。

2.2、switch语句(格式:switch(表达式)
                       {case  常量表达式1:语句序列1
                         case  常量表达式2:语句序列2                         
                                    M
                         case  常量表达式i:语句序列i
                                    M
                         case  常量表达式n:语句序列n
                         default: 语句序列n+1
                         }
         执行过程为:当表达式的值等于常量表达式i的值,则从语句序列i开始执行到语句序列n+1为止 。若表达式的值不等于任何一个常量表达式的值,则只执行default后面的语句。
   一般在每个语句序列之后加一个break语句,这样在执行语句序列i之后,使流程跳出switch结构,实现多分支选择结构。)

(1)、编写一个能进行两个操作数加减乘除四则运算的计数器模拟程序
输入:两个操作数和运算符
计算:根据运算符确定运算
输出:运算结果

(2)、main()
          {int i=1,j=0,m=1,n=2;
            switch(i++)
               {
                    case 1: 
                        m++;
                        n++;
                    case 2: 
                     {
                                 switch(++j)            // switch 语句嵌套 
                                 {
                                   case  1: 
                                            m++;         
                                   case  2:
                                            n++;
                                  }
                     }
                     case 3: m++;n++;break;
                     case 4: m++;n++;
                }
             printf("m=%d,n=%d\n",m,n);
          }
 
结果是多少?

  (3)、给出一百分制成绩,要求输出成绩等级‘A’、’B’、‘C’、‘D’、‘E’。90分以上为‘A’ ,80~89分为’B’ ,70~79分为‘C’...

3、循环结构

3.1、while语句(while语句是支持“当型”循环控制结构的语句。
一般格式为: 
while  (表达式)  
{
    语句;
 })

(1)、输入:无
计算:1+2+3+L+100
输出:计算的和

(2)、计算一条语句中的空格、字母、数字的个数。

3.2、do-while语句(do_while语句是支持“直到型”循环控制结构的语句。
 一般格式为: 
do
{
    语句;
} while (表达式); )

(1)、输入:无
计算:1+2+3+L+100 
输出:计算的和

3.3、for语句(for语句是一种使用比while语句更加灵活的循环控制语句。
一般格式为: 
for (表达式1;表达式2;表达式3)  
语句
 
先求解表达式1;
再解表达式2,若为真(非0)值,则
 执行语句,然后求解表达式3,再
 转到求解表达式2。若为假(0)值,
    则结束for语句的执行。

(1)、输入:无
计算:1+2+3+L+100
输出:计算的和

(2)、用for语句编写一个计算1+3+5+ L +(2*i-1)的程
        序,其中  i=1, 2, 3, L, 100。

(3)、输入:n
计算: 1!+2!+3!+ L+n!
输出:计算的和

(4)、判断数字m是否为素数(质数)。

(5)、求100到200之间的素数。
输入:无
计算: 求素数
输出: 输出素数 每4个一行 每个数占4位

3.4、循环语句嵌套(一个循环语句内又包含另一个完整的循环语句,称为循环语句的嵌套。内嵌的循环语句一般称为内循环,包含内循环的循环语句称为外循环。内循环再嵌套内层循环,就够成了多重循环。)

(1)、main() 
{int i=1,a=0;
 for  ( ;a<=5;i++)
 {
      do
      {
            i++;
            a++;
      }while (i<3);
       i++;    

  printf("a=%d,i=%d\n",a,i);
}

3.5、break和continue语句

3.5.1、break语句(break语句的功能是:
在switch语句中使流程跳出switch结构。
在循环语句中使流程跳出当前循环。)

(1)、将从键盘上输入的若干个正整数求和,遇到负数则终止
程序,并且输入的数不超过10个。
 
输入:正整数
计算:求累加和
输出:和

3.5.2、continue语句(continue语句的功能是在循环语句中使本次循环结束,即跳过循环体中下面尚未执行的语句,接着进行下次是否执行循环的判断。)

(1)、编程把100~200之间的不能被3整除的数输出。

3.6、循环语句的注意点

3.6.1、第一点

在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
示例:
长循环层在最内层,效率高
for (col = 0; col<5; col++)
{
    for (row = 0; row<100; row++)
    {
        sum = sum + a[row][col];
    }
}
 
长循环放在最外层,效率低
for (row = 0; row<100; row++)
{
    for (col = 0; col<5; col++)
    {
        sum = sum + a[row][col];
    }
}

3.6.2、第二点

建议for语句的循环控制变量的取值采用"半开半闭区间"写法。
半开半闭区间写法和闭区间写法虽然功能相同,但相比之下,半开半闭区间写法更加直观。二者对比如下:
半开半闭区间写法:
for (n = 0; n < 10; n++)
{
    ....
}
 
闭区间写法
for (n = 0; n <= 9; n++)
{
    ....
}

3.6.3、第三点

不能在for循环体内修改循环变量,防止循环失控
for (n = 0; n < 10; n++)
{
    ....
    n = 8;       // 不可,很可能违背了你的意愿
    ....
}

3.6.4、第四点

循环要尽可能短,要使代码清晰,一目了然。
 
如果所写的一个循环的代码超过以显示屏,那肯定会让读代码的人发狂的。解决办法有两个:
第一:重新设计这个循环,确认是否这些操作都必须放在这个循环里。
第二:将这些代码改写成一个子函数,循环中只调用这个子函数即可。
 
一般来说循环内的代码不要超过20行。

3.6.5、第五点

把循环嵌套控制在3层以内
 
国外有研究数据表明,当循环嵌套超过3层时,程序员对循环的理解能力会极大的降低。如果你的循环嵌套超过3层,那么就建议你重新设计循环或是将循环内的代码改写成一个子函数。

3.6.6、第六点

for语句的控制表达式不能包含任何浮点类型的对象

3.7、习题

(1)、

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手

(2)、题目:通过编程实现,统计0~n有多少个9 
提示:n通过参数传入

猜你喜欢

转载自blog.csdn.net/smellydog1996/article/details/81172913