C 语言学习四:语句与控制流

语句与控制流

  • 语句与程序块
  • 判断语句
    • if语句
    • switch语句
  • 循环语句
    • for循环
    • goto语句
    • do...while...

语句与程序块

C语言语句(Statements)的种类

类别 说明 示例
标号语句(Labeled Statements) 标号语句是普通语句前面加上一个标号,C语言中有3种类型的标号 goto语句跳转的目标、switch语句中的case和default标号
复合语句(Compound Statements) 复合语句是将多条普通语句组织成一条语句 由大括号{}内的多个语句和声明组成的程序块就是复合语句
表达式语句(Expression Statements) 表达式语句是表达式后面加上分号";" expression;
选择语句(Selection Statements) 选择语句又称为分支语句,有选择性地执行某段代码块 if语句、if-else语句、switch语句
迭代语句(Iteration Statements) 迭代语句又称为循环语句,不断地重复执行同一段代码 for循环、while循环、do-while循环
跳转语句(Jump Statements) 跳转语句可以打破当前的顺序控制流,使其跳转到特定的位置 break语句、continue语句、return语句以及goto语句

判断语句

if语句

任意输入3个整数,使用if语句对这3个整数由小到大进行升序排序。请判断下面哪一项无法实现该功能

#include 
 
/* 交换x和y */
void swap(int* x, int* y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}
 
int main(int argc, char** argv)
{
    int a, b, c;
    printf("请输入 a,b,c:\n"); 
    scanf("%d,%d,%d", &a, &b, &c);
 
    (_____1_____)
 
    printf("升序排序结果:\n");
    printf("%d,%d,%d", a, b, c);
 
    return 0;
}
A. if (a > b)
    {
        swap(&a, &b);
        if (a > c)
            swap(&a, &c);
        if (b > c)
            swap(&b, &c);
    }
    
B. if (a > c)
        swap(&a, &c);
    if ((a < b) && (b < c));	//一个空语句,没有效果
    if ((a < b) && (b > c))
        swap(&b, &c);
    if ((a > b) && (b < c))
        swap(&a, &b);
        
C.  if ((a < b) && (b < c) && (a < c));
    if ((a < b) && (b > c) && (a < c))
        swap(&b, &c);
    if ((a > b) && (b < c) && (a < c))
        swap(&a, &b);
    if ((a < b) && (b > c) && (a > c))
        swap(&a, &b), swap(&a, &c);
    if ((a > b) && (b < c) && (a > c))
        swap(&b, &c), swap(&a, &c);
    if ((a > b) && (b > c) && (a > c))
        swap(&a, &c);

D.  if (a > b)
        swap(&a, &b);
    if (a > c)
        swap(&a, &c);
    if (b > c)
        swap(&b, &c);

正确答案为B

switch语句

注意每个语句后面都要跟break,case里如果没有break,那么程序会一直向下执行

switch(表达式)

{

	case 结果1:执行语句;break;

	case 结果2:执行语句;break;

	...

	default:执行语句;break;

}

循环语句

for循环

使用for循环,打印九九乘法表。下列四个选项中有一项无法实现该功能,请找出该错误选项。

#include 
 
int main(int argc, char** argv)
{
    int i = 0;
    int j = 0;
 
    (_____1_____)
 
    return 0;
}
A. for(i = 1, j = 1; i * j <= 81; ++i, ++j) {
        printf("%d*%d=%2d\t", i, j, i * j);
        if ((i * j) % 9 == 0)
            printf("\n");
    }
    
B.  int row = 0;
    int col = 0;
    for(i = 0; i < 81; ++i) 
    {
        row = i / 9 + 1;
        col = i % 9 + 1;
        printf("%d*%d=%2d\t", row, col, row * col);
        if ((i + 1) % 9 == 0)
            printf("\n");
    }
C.  i = 1;
    for(; ; ) {
        if (i > 9)
            break;
        j = 1;
        for(; ; )
        {
            if (j > 9)
                break;
            printf("%d*%d=%2d\t", i, j, i * j);
            ++j;
        }
        printf("\n");
        ++i;
    }
    
D.  for(i = 1; i <= 9; ++i) 
    {
        for(j = 1; j <= 9; ++j)
            printf("%d*%d=%2d\t", i, j, i * j);
        printf("\n");
    }

答案为A,A的输出结果为
C 语言学习四:语句与控制流_第1张图片

goto语句

​ 作用:可以无条件跳转语句
​ 语法: goto 标记;
​ 解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置

注意:在程序中不建议使用goto语句,以免造成程序流程混乱

do…while…

​ 语法:do{ 循环语句 } while(循环条件);
​ 注意:与while的区别在于do…while会先执行一次循环语句,再判断循环条件

使用while循环求两个正整数的最大公约数和最小公倍数。请分析(1)处缺失的代码,并判断下列四个选项中哪一项无法实现上述功能

#include 
 
int main(int argc, char** argv)
{
    int a, b, c, m, t;
    printf("请输入两个数:");
    scanf("%d,%d", &a, &b);
    if (a < b)
    {
        t = a;
        a = b;
        b = t;
    }
    m = a * b;
    c = a % b;
    (_____1_____)
 
    printf("最大公约数是:%d\n", b);
    printf("最小公倍数是:%d\n", m / b);
}
A.  while (c != 0)
    {
        a = b;
        b = c;
        c = a % b;
    }
    
B.  while (1)
    {
        if (c == 0)
            break;
        a = b;
        b = c;
        c = a % b;
    }
C.  do {
        if (c == 0)
            break;
        a = b;
        b = c;
        c = a % b;
    }
    while (1);
    
D.  do {
        a = b;
        b = c;
        c = a % b;
    }
    while (c != 0);

答案选D

  • 辗转相除法:又称欧几里得算法,用于计算两个非负整数a,b的最大公约数
    比如现在要求这两个数 32,26的最大公约数,解法如下:
    32/26=1…6 (此行除数26作下一行的被除数,余数作为除数)
    26/6=4…2 (此行同理)
    6/2=3…0 (此处余数为零,意味着最大公约数就是2)

你可能感兴趣的:(学习,c++,c语言)