语句 >> 分支语句 + 循环语句 + 练习

本文详细介绍了C语言中的程序基本结构,包括语句、表达式、分支语句(if、switch)和循环语句(while、for、do...while),并提供了多个实践练习,如计算阶乘、查找有序数组元素、判断闰年等,帮助读者巩固基础知识并提升编程技能。
摘要由CSDN通过智能技术生成

目录

程序的三种基本结构

语句

含义

类型​​​​​​​​​​​​​

表达式

含义

类型

​​​​​​​分支语句

if 语句

语法结构

switch语句

1 语法结构

2 语句项

循环语句

while语句

1 语法结构

2 执行流程

3 死循环

for语句

1 语法结构

2 执行流程

3 会不会死循环呢?结果是什么

4 建议

不可以在for循环体内改变循环变量,防止for循环失去控制

for语句循环变量的取值采取“前闭后开”写法 

5 变种1

5.1 不要随意省略

6 变种二

7 循环了多少次,i最后的值是多少

do..while()语句

1 语法结构

2 执行流程

循环嵌套

break continue

go to语句

作用

练习 

1 计算 n 的阶乘

2 计算 1!+  2!+3!+4!+5!

3 模拟用户登录,密码只能输入三次,密码正确后退出,错误三次后退出

方法二

4 查找有序数组char arr[] = {1, 2, 3, 4....20}中的15所对应的下标

5 编写代码,演示多个字符从两端向中间汇聚

6 输入三个数,将三个数从大到小输出

7 打印1-100之间3的倍数

8 输入两个数,求最大公约数 

9 打印1000-2000年之间的闰年

10 打印1-100之间的素数

11 打印1-100中出现数字9的数,打印1-100中9出现的个数

12 分数求和

13 打印10个数的最大值

14 打印乘法口诀表

15 猜数字


程序的三种基本结构

顺序结构

分支结构

循环结构


语句

  • 含义

是计算机指令,由 ; 结尾

  • 类型​​​​​​​​​​​​​

控制语句条件判断语句if else; switch
循环语句while; do while; for
转向语句break; continue; goto; return
函数调用语句函数调用 + ;    例如: printf("hello, world!");
表达式语句 表达式 + ;
空语句
复合语句/语块

{

         由大括号括起来的语句和声明等

}

​​​​​​​


表达式

  • 含义

是计算机指令,由运算符和运算对象(常量、变量)组成,单独的一个运算对象也是表达式

An expression is a sequence of operators and operands that specifies computation of a value.

表达式是指定计算值的操作符和操作数的序列。

  • 类型

常量表达式1, 3.14, a,  0
算数表达式a + b,  1%b
赋值表达式a = 1, i++, a += 7
关系表达式a > 4, a != 8
逻辑表达式a && b, a | b, ^b
逗号表达式(a, s, 1, 2, a, q + 1)---值为逗号表达式内最右侧表达式的值
复合表达式a * 7 /(a % v + 1)
函数表达式a = Max(x, y)

​​​​​​​分支语句

  • if 语句

语法结构

if else 只对后面一条语句产生效果,之间只能有一条语句

如果if else之间有多条语句,需要用{}

if (表达式)
    语句1;
if else (表达式)
    语句2;
else
    语句3;


// if else 的匹配适用就近原则,所以多语句时需要使用代码块 {}
//条件表达式
测试条件 ?exp1:exp2;
  • switch语句

多重选择语句

1 语法结构

switch (整型表达式)
{
    语句项:
}


switch (expression) // 类型必须为整型或枚举类型
{
case /* constant-expression */:
    /* code */
    break;         // 跳出整个switch continue不对switch产生影响

default:
    break;
}

 break 跳出整个switch

continue不对switch产生影响
 

2 语句项

case 整型常量表达式://不能重复
    语句;
char c;
scanf("%c", &c);
switch (c)
{
    case 'a':
        printf("Alpha\n");
        // break;
    case 'b':
        printf("Bravo\n");
        break;
    case 'c':
        printf("Charlie\n");
        break;
    default:
        printf("don't know\n");
}
 char c;
    while (1)
    {
        scanf("%c", &c);
        switch (c)
        {
        case 'a':
            printf("Alpha\n");
            break;
        case 'b':
            printf("Bravo\n");
            break;
        case 'c':
            printf("Charlie\n");
            break;
        default:
            printf("don't know\n");
        }
        getchar(); // 清除未被吸收的输入
    }

循环语句

正确设置有限次数循环的三个条件

1 计数器设置初始值

2 循环条件

3 计数器更新

  • while语句

1 语法结构

while 只对后面一条语句产生效果

如果while后有多条语句,需要用{},构成复合语句

while (/* condition */)
{
    /* code */
}

2 执行流程

  

3 死循环

//结果是什么呢

#include <stdio.h>
int main()
{
    int i = 0;
    while (i < 10)
    {
        if (i == 5)
        {
            continue;
        }
        printf("%d\n", i);
        i++;
    }
    return 0;
}

正确写法

#include <stdio.h>
int main()
{
    int i = 0;
    while (i < 10)
    {
        i++;
        if (i == 5)
        {
            continue;
        }
        printf("%d\n", i);
    }
    return 0;
}
  • for语句

1 语法结构

for 只对后面一条语句产生效果

如果for后有多条语句,需要用{},构成复合语句

 for (int i = 1; i < 9; i++);

//相当于
 for (int i = 1; i < 9; i++)
        ;

for (size_t i = 0; i < count; i++)
{
    /* code */
}


for (expr1 : expr2 : expr3)
{
    statement;
}
expr1 : 循环变量初始化
expr2 : 条件判断
expr3 : 循环判断条件的调整

2 执行流程

3 会不会死循环呢?结果是什么

#include <stdio.h>
int main()
{

    for (int i = 0; i < 10; i++)
    {
        if (i == 5)
            continue;
        printf("%d\n", i);
    }

    return 0;
}
// 注意 = 号; ​
//​尽量不要在for循环体内改变循环变量

​#include <stdio.h>
int main()
{

    for (int i = 0; i < 10; i++)
    {
        if (i = 5)
            printf("%d\n", i);
    }

    return 0;
}

4 建议

  • 不可以在for循环体内改变循环变量,防止for循环失去控制

  • for语句循环变量的取值采取“前闭后开”写法 

for (int i = 0; i < 10; i++)  //推荐----更直观 :10次循环;10次打印;10个元素
for (int i = 0; i <= 9; i++) //不推荐

5 变种1

#include <stdio.h>
int main()
{
    int i = 0;
    int g = 0;
    for (;;)
    {
        printf("a");
    }

    return 0;
}

// for循环的初始化,判断,调整表达式都可以被省略
//判断条件省略代表判断结果恒为真

5.1 不要随意省略

#include <stdio.h>
int main()
{
    int i = 1;
    int g = 1;
    for (; i < 11; i++)
    {
        for(; g < 11; g++)
        {
            printf("%d\n", g);
        }

    }


    return 0;
}

结果为

1
2
3
4
5
6
7
8
9
10

因为在外层第二遍时, g == 10,没有初始化

6 变种二

// 有两个循环变量
#include <stdio.h>
int main()
{
    int i;
    int g;
    for (i = 1, g = 1; i < 11 && g <3; i++, ++g)
    {
        printf("a\n");
    }

    return 0;
}

7 循环了多少次,i最后的值是多少

#include <stdio.h>
int main()
{
    int i;
    for (i = 0; i = 0; i++)
    {
        i++;
    }
    printf("%d",i);

    return 0;
}

结果: 循环0次,i 的值为0;因为判断表达式的结果为0,0为假,程序不再往下运行

  • do..while()语句

1 语法结构

  do
    {
        /* code */
    } while (/* condition */);


do
{
    循环语句;
}
while(表达式);

2 执行流程

  • 循环嵌套

#include <stdio.h>
int main()
{
    for (char a = 'A'; a <= 'E'; a++)
    {
        for (int n = 1; n <= 9; n++)
        {
            printf("%c%d", a, n);
        }
        printf("\n");
    }
}

//
A1A2A3A4A5A6A7A8A9
B1B2B3B4B5B6B7B8B9
C1C2C3C4C5C6C7C8C9
D1D2D3D4D5D6D7D8D9
E1E2E3E4E5E6E7E8E9
  • break continue

break:跳出本级循环

continue:跳过本次循环,不运行continue后代码,直接开始下一次循环

continue  << for  会立即更新计数器, 进入新循环

break       << for  直接跳出循环,不会更新计数器

嵌套多个continue break: 作用于上一层循环

  • go to语句

作用

终止深层嵌套

for(...)
  for(...)
 {
    for(...)
   {
      if(disaster)
        goto error;
   }
 }
  …
error:
if(disaster)
// 处理错误情况

​​​​​​​

  • 练习 

1 计算 n 的阶乘

// n!
#include <stdio.h>
int main()
{
    int re = 1;
    int n;
    scanf("%d", &n);
    for (int j = 1; j < (n+1); j++)
    {
        re = re * j;
    }
    printf("%d\n",re);
    
    return 0;
}

2 计算 1!+  2!+3!+4!+5!

// 1! + 2!+..+ 10!
#include <stdio.h>
int main()
{
    int re = 1;
    int n;
    int sum = 0;
    scanf("%d", &n);
    for (int j = 1; j < (n + 1); j++)
    {
        re = re * j;
        sum = sum + re;
    }
    printf("%d\n%d\n", re, sum);

    return 0;
}

3 模拟用户登录,密码只能输入三次,密码正确后退出,错误三次后退出

方法一

//密码登录
#include <stdio.h>
int main()
{
    int password = 12345;
    int user_loadin;
    int count = 0;
    for (; count < 3; count++)
    {
        printf("请输入密码>>");
        scanf("%d", &user_loadin);
        if (user_loadin == password)
        {
            printf("登录成功!\n");
            break;
        }

        else
        {
            printf("请重新登录\n");

            if (count == 2)
            {
                printf("密码多次错误,请五分钟后再尝试\n");
            }
        }
    }

    return 0;
}

方法二

用strcmp来比较两个字符串是否相等,相等返回1;第一个大于第二个返回大于0的数;小于返回小于0的数;

数组名是数组的首地址

//密码登录
#include <stdio.h>
#include <string.h>
int main()
{
    char password[20];
    int count = 0;
    for (; count < 3; count++)
    {
        printf("请输入密码>>");
        scanf("%s", password);
        if (strcmp("12345", password) == 0)
        {
            printf("登录成功!\n");
            break;
        }

        else
        {
            printf("请重新登录\n");

            if (count == 2)
            {
                printf("密码多次错误,请五分钟后再尝试\n");
            }
        }
    }

    return 0;
}

4 查找有序数组char arr[] = {1, 2, 3, 4....20}中的15所对应的下标

方法一

//查找
#include <stdio.h>
int main()
{
    char arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
    int se = sizeof(arr) / sizeof(arr[0]);
    int aim_num = 15;
    for (int n = 0; n < se; n++)
    {
        if (arr[n] == aim_num)
        {
            printf("%d\n", n);
            break;
        }
    }

    return 0;
}

方法二:用二分法来优化代码

//查找
//l_index 左下标
//r_index 右下标
//m_index 中间值的下标

#include <stdio.h>
int main()
{
    char arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
    int se = sizeof(arr) / sizeof(arr[0]);
    int aim_num = 10;
    int l_index = 0;
    int r_index = se - 1;
    for (; l_index <= r_index;)
    {
        int m_index = (l_index + r_index) / 2;
        if (aim_num < arr[m_index])
            r_index = m_index - 1;
        else if (aim_num > arr[m_index])
            l_index = m_index + 1;
        else
        {
            printf("下标为 : %d\n", m_index);
            break;
        }
    }
    if (l_index > r_index)
    {
        printf("找不到目标数字\n");
    }

    return 0;
}

5 编写代码,演示多个字符从两端向中间汇聚

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[] = "Hello, world!!!!!!";
    char arr2[] = "******************";

    int l = 0;
    int r = strlen(arr1) - 1;

    for (; l <= r;)
    {
        arr2[l] = arr1[l];
        arr2[r] = arr1[r];
        printf("%s\n", arr2);
        l++;
        r--;
    }

    return 0;
}

6 输入三个数,将三个数从大到小输出

// 三个数从大到小输出
#include <stdio.h>
int main()
{
    int a;
    int b;
    int c;
    int n;
    int j;
    int k;
    scanf("%d%d%d", &a, &b, &c);
    if (a < b)
    {
        n = b;
        b = a;
        a = n;
    }
    if (b < c)
    {
        j = c; 
        c = b;
        b = j;
    }
    if (a < b)
    {
        k = a;
        a = b;
        b = k;
    }

    printf("%d %d %d\n", a, b, c);
    return 0;

}

7 打印1-100之间3的倍数

// 1-100之间3的倍数
#include <stdio.h>
int main()
{
    for (int i = 1; i < 101; i++)
    {
        if (i % 3 == 0)
            printf("%d\n", i);
    }
    return 0;
}

8 输入两个数,求最大公约数 

// 求两个数的最大公约数----辗转相除法
#include <stdio.h>
int main()
{
    int a;
    int b;
    int re;
    scanf("%d%d", &a, &b);

    for (; a % b != 0;)     //while(re = a % b)
    {
        re = a % b;
        a = b;
        b = re;
    }

    printf("%d\n", re);

    return 0;
}

9 打印1000-2000年之间的闰年

// 1000-2000之间的闰年---能被4整除不能被100整除/能被400整除
#include <stdio.h>
int main()
{
    int count = 0;
    for (int year = 1000; year < 2001; year++)
    {
        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
        {
            printf("%d\n", year);
            count++;
        }
    }
    printf("%d\n", count);
    return 0;
}

10 打印1-100之间的素数

方法一

// 1-100之间的素数----只能被1或本身整除
// 试除法

#include <stdio.h>
int main()
{
    int g;
    int count = 0;
    for (int i = 0; i < 101; i++)
    {
        for (g = 2; g < i; g++)
        {
            if (i % g == 0)
                break;
        }
        if (i == g || i < g)
        {
            printf("%d\n", i);
            count++;
        }
    }
    printf("素数:%d\n", count);
    return 0;
}

方法二

// 1-100之间的素数----只能被1或本身整除
// 试除法
// a * b = i ---------  a || b <= sqrt(i)

#include <stdio.h>
#include <math.h>
int main()
{
    int g;
    int count = 0;
    for (int i = 1; i < 101; i += 2)
    {
        for (g = 2; g <= sqrt(i); g++)
        {
            if (i % g == 0)
                break;
        }
        if (g > sqrt(i))
        {
            printf("%d\n", i);
            count++;
        }
    }
    printf("素数:%d\n", count);
    return 0;
}

11 打印1-100中出现数字9的数,打印1-100中9出现的个数

// 1-100中出现多少个数字9
// 不是个位为9就是十位为9
// 所以判断条件为--------除以10,商为9或者余数为9的数
// 注意99里有两个9

#include <stdio.h>
int main()
{
    int count = 0;
    for (int i = 1; i < 101; i++)
    {
        if (i % 10 == 9)
        {
            printf("%d\n", i);
            count++;
        }
        if(i / 10 == 9)
        {
            printf("%d\n", i);
            count++;
        }
    }
    printf("count : %d\n", count);
    return 0;
}

12 分数求和

// 分数求和
// 1/1 - 1/2 + 1/3 - 1/4 + 1/5...+1/99 - 1/100
// 要得到浮点数, 必须保证除号两端有一个数是浮点数!!!!!!!!!

#include <stdio.h>
int main()
{
    double sum = 0.0;
    for (int i = 1, flag = 1; i < 101; i++, flag *= -1)

    {
        sum += flag * 1.0 / i;
    }
    // for (int i = 2; i < 101; i += 2)

    // {
    //     sum -= 1.0/i;
    // }

    printf("%lf\n", sum);
    return 0;
}

13 打印10个数的最大值


//  求十个整数中的最大值
// 注意⚠️设置max = arr[0], 避免max初始值恒大于所有元素
#include <stdio.h>
int main()
{
    int arr[] = { -1,
                  -200,
                  -3,
                  -4,
                  -5,
                  -6,
                  -7,
                  -8,
                  -9,
                  -10 };
    int max = arr[0];
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    for (i = 0; i < sz; i++)
    {
        if (max < arr[i])
        {
            max = arr[i];
        }
    }
    printf("max = %d\n", max);
    return 0;
}

14 打印乘法口诀表

//  打印乘法口诀表
//  %-2d-----------2--打印两位,空格补满
//                 -  左对齐
//                 +  右对齐

#include <stdio.h>
int main()
{
    int re;
    for (int i = 1; i <= 9; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            re = i * j;
            printf("%dX%d = %-2d  ", i, j, re);
        }
        printf("\n");
    }
    return 0;
}

15 猜数字

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值