C PRIMER PLUS——第4节:三大结构

目录

1.顺序结构

2.选择结构

3. 循环结构

4.3种无限循环

5.跳转控制语句

6.扩展

7.综合训练

(1)while练习

(2)for练习

(3)if-else练习

①判断一个数是奇数还是偶数

②判断一个年份是否为闰年

③实现一个简单的四则运算计算器,能处理加、减、乘、除四种基本运算,并且要考虑除数为零的异常情况。

(4)三大结构综合训练

①输入一个正整数 n,计算 1 到 n 中所有能被 3 整除但不能被 5 整除的数的和,并输出结果。

②输入学生的科目数量,然后依次输入每科成绩,计算平均分,并根据平均分判断成绩等级。

③找出最大公约数和最小公倍数


1.顺序结构

①含义:顺序结构属于最简单的程序结构,程序会按照语句的先后顺序依次执行。也就是说,代码会从第一行开始,逐行向下执行,直至程序结束。

②作用:顺序结构是构建程序的基础,能保证程序按既定步骤逐步完成各项操作。

③用法:只需按顺序编写语句,程序便会自动按顺序执行。

#include 

int main() {
    int a = 10;
    int b = 20;
    int sum = a + b;

    printf("a + b 的和是: %d\n", sum);//    a + b 的和是:30

    return 0;
}

④数据的输入与输出

(1)getchar函数

是从标准输入设备(键盘)上输入字符,该函数无参数,函数值就是从输入设备得到一个字符,调用格式:getchar( );输入一个字符,直到输入回车才结束!

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    char ch;
    ch = getchar(); //输入    b
    printf("%c %d\n", ch, ch);//    b   98
    printf("%c %d\n\n", ch - 32, ch - 32);//B   66
    return 0;
}

(2)putchar函数

是向标准输出设备(屏幕)上输出一个字符,格式:putchar(ch);

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    char c;//定义字符变量
    c = 's'; //赋值
    putchar(c);//输出变量c
    putchar('\ x42');//输出字母b
    putchar(0 * 42);//直接用ASCLL码值输出字母b——s2
    return 0;
}

2.选择结构

①含义:选择结构依据条件的真假来决定执行哪些语句。在 C 语言里,常用的选择结构语句有if-else语句和switch语句。

②作用:选择结构可让程序依据不同的条件执行不同的操作,从而实现程序的分支逻辑。

③用法

  • if(if-else) 语句:当条件为真时,执行if后面的语句块;若条件为假,则执行else后面的语句块。

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    int age = 21;
    if (age < 18)
    {
        printf("青少年\n");
    }
    else if (age >= 18 && age < 28)
    {
        printf("青年\n");
    }
    else if (age >= 28 && age < 40)
    {
        printf("中年\n");
    }
    else if (age >= 40 && age < 60)
    {
        printf("状年\n");
    }
    else
    {
        printf("老寿星\n");
    }
    return 0;
}                                   //结果是:青年
  • switch 语句依据表达式的值来选择执行对应的case分支。把所有的选择一一列举出来,根据不同的条件任选其一。

(1)执行流程:Ⅰ.首先计算表达式的值。

                            Ⅱ.依次和case后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。

                            Ⅲ.如果所有的case后面的值和表达式的值不匹配,就会执行default里面的语句体,然后结束整个switch语句。

(2)细节说明:Ⅰ.表达式:计算结构只能为(字符/整数)。

                           Ⅱ.case:值只能是(字符/整数)的字面量,不能是变量,值不允许重复。

                           Ⅲ.break:表示中断,结束的意思。结束switch语句。

                           Ⅳ.default:所有情况都不匹配,执行该处回答。

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    int day = 4;
	switch (day)
	{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("周内\n");
			break;
		case 6:
		case 7:
			printf("周末\n");
			break;
	}
    return 0;
}						//结果:周内  

3. 循环结构

①含义:循环结构可让程序重复执行某段代码,直至满足特定条件才停止。

②作用:循环结构能够避免代码的重复编写,提高代码的复用性,可用于处理需要重复执行的任务。

③用法

  • for 循环适用于已知循环次数的情况,由初始化、条件判断和循环变量更新三部分组成。

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() 
{
   int sum = 0;
   for (int i = 1; i <= 10; i++) 
   {
        sum = sum + i;
   }
        printf("1 到 10 的整数之和为: %d\n", sum);//1 到 10 的整数之和为: 55
        return 0;
    }
  • while 循环在每次循环开始前先判断条件,若条件为真则执行循环体,适用于不确定循环次数的情况。

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() 
{
    int i = 1;
    int sum = 0;
    while (i <= 10) 
    {
        sum = sum + i;
        i++;
    }
    printf("1 到 10 的整数之和为: %d\n", sum);//1 到 10 的整数之和为: 55
    return 0;
}
  • do-while 循环先执行一次循环体,再判断条件,若条件为真则继续循环,至少会执行一次循环体。

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() 
{
    int i = 1;
    int sum = 0;
    do 
    {
        sum = sum + i;
        i++;
    } 
    while (i <= 10);

    printf("1 到 10 的整数之和为: %d\n", sum);//1 到 10 的整数之和为: 55
    return 0;
}

4.3种无限循环

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    //  for (;;)
    //  {
    //      printf("aaa\n");
    //  }

    //  while (1)
    //  {
    //       printf("aaa\n");
    //  }

    //  do
    //  {
    //      printf("aaa\n");
    //  } while (1);

    return 0;
}	

5.跳转控制语句

①break:不能单独书写,只能写在switch或循环中,表示结束,跳出的意思。只能跳出单层循环。

②continue:结束本次循环,继续下次循环。


6.扩展

goto:结合标号,可调到代码中任意地方,一般只用于跳出循环嵌套。

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    int sum = 0, i = 1;
loop:sum = sum + i; i++;
    if (i <= 100)goto loop;
    printf("sum=%d\n", sum);//  sum=5050
    return 0;
}

7.综合训练

(1)while练习

//将一个整数反转。例如123456反转成654321

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    int num, reversedNum = 0, remainder;
    printf("请输入一个整数: ");//例如:123456
    scanf("%d", &num);

    while (num != 0) {
        remainder = num % 10;
        reversedNum = reversedNum * 10 + remainder;
        num /= 10;
    }

    printf("反转后的整数是: %d\n", reversedNum);//例如:654321
    return 0;
}

(2)for练习

//生成一个9 * 9乘法表

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    int i, j;
    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= i; j++) {
            printf("%d*%d=%d\t", j, i, i * j);
        }
        printf("\n");
    }
    return 0;
}
//打印矩形

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    int rows = 5;
    int cols = 10;
    int i, j;

    // 外层循环控制行数
    for (i = 0; i < rows; i++) {
        // 内层循环控制列数
        for (j = 0; j < cols; j++) {
            printf("*");
        }
        // 每一行输出结束后换行
        printf("\n");
    }

    return 0;
}
//打印直角三角形

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    int rows = 5;
    int i, j;

    // 外层循环控制行数
    for (i = 1; i <= rows; i++) {
        // 内层循环控制每行打印的星号数量
        for (j = 1; j <= i; j++) {
            printf("*");
        }
        // 每一行输出结束后换行
        printf("\n");
    }

    return 0;
}

(3)if-else练习

①判断一个数是奇数还是偶数
#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    int num;
    printf("请输入一个整数: ");
    scanf("%d", &num);

    if (num % 2 == 0) {
        printf("%d 是偶数。\n", num);
    } else {
        printf("%d 是奇数。\n", num);
    }

    return 0;
}
    
②判断一个年份是否为闰年
#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    int year;
    printf("请输入一个年份: ");
    scanf("%d", &year);

    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        printf("%d 年是闰年。\n", year);
    } else {
        printf("%d 年不是闰年。\n", year);
    }

    return 0;
}
    
③实现一个简单的四则运算计算器,能处理加、减、乘、除四种基本运算,并且要考虑除数为零的异常情况。
#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    double num1, num2, result;
    char operator;

    // 提示用户输入两个数字和运算符
    printf("请输入第一个数字: ");
    scanf("%lf", &num1);
    printf("请输入运算符 (+, -, *, /): ");
    scanf(" %c", &operator);
    printf("请输入第二个数字: ");
    scanf("%lf", &num2);

    // 根据运算符进行相应的计算
    if (operator == '+') {
        result = num1 + num2;
        printf("%.2lf %c %.2lf = %.2lf\n", num1, operator, num2, result);
    } else if (operator == '-') {
        result = num1 - num2;
        printf("%.2lf %c %.2lf = %.2lf\n", num1, operator, num2, result);
    } else if (operator == '*') {
        result = num1 * num2;
        printf("%.2lf %c %.2lf = %.2lf\n", num1, operator, num2, result);
    } else if (operator == '/') {
        if (num2 != 0) {
            result = num1 / num2;
            printf("%.2lf %c %.2lf = %.2lf\n", num1, operator, num2, result);
        } else {
            printf("错误:除数不能为零。\n");
        }
    } else {
        printf("错误:无效的运算符。\n");
    }

    return 0;
}
    

代码解释

  1. 变量定义

    double num1, num2, result;:定义三个双精度浮点数变量,num1 和 num2 用于存储用户输入的两个操作数,result 用于存储计算结果。②char operator;:定义一个字符变量,用于存储用户输入的运算符。

  2. 用户输入:通过 printf 提示用户依次输入第一个数字、运算符和第二个数字,使用 scanf 读取用户输入。

  3. 运算处理:①使用 if - else if - else 语句根据用户输入的运算符进行相应的计算。②当运算符为 +-* 时,直接进行相应的运算并输出结果。③当运算符为 / 时,需要额外使用一个 if - else 语句判断除数 num2 是否为零。如果不为零,则进行除法运算并输出结果;如果为零,则输出错误提示。

  4. 异常处理:如果用户输入的运算符不是 +-*/ 中的任何一个,会输出 “错误:无效的运算符。” 的提示信息。


(4)三大结构综合训练

①输入一个正整数 n,计算 1 到 n 中所有能被 3 整除但不能被 5 整除的数的和,并输出结果。
#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    int n;
    int sum = 0;

    // 顺序结构:输入一个正整数 n
    printf("请输入一个正整数 n: ");
    scanf("%d", &n);

    // 循环结构:遍历 1 到 n 的所有数
    for (int i = 1; i <= n; i++) {
        // 选择结构:判断是否能被 3 整除但不能被 5 整除
        if (i % 3 == 0 && i % 5 != 0) {
            sum = sum + i;
        }
    }

    // 顺序结构:输出结果
    printf("1 到 %d 中能被 3 整除但不能被 5 整除的数的和是: %d\n", n, sum);

    return 0;
}    
  • for (int i = 1; i <= n; i++):这是一个循环结构。int i = 1 是初始化语句,把循环变量 i 初始化为 1;i <= n 是循环条件,只要 i 小于等于 n,循环就会继续执行;i++ 是迭代语句,每次循环结束后,i 的值会增加 1。

  • if (i % 3 == 0 && i % 5 != 0):这是选择结构。i % 3 == 0 用于判断 i 是否能被 3 整除,i % 5 != 0 用于判断 i 是否不能被 5 整除。&& 是逻辑与运算符,只有当这两个条件都满足时,if 语句的代码块才会执行。

  • sum = sum + i;:如果 if 条件成立,就把当前的 i 值累加到 sum 中。


②输入学生的科目数量,然后依次输入每科成绩,计算平均分,并根据平均分判断成绩等级。

等级划分如下:

  • 平均分 >= 90 :A 级

  • 80 <= 平均分 < 90 :B 级

  • 70 <= 平均分 < 80 :C 级

  • 60 <= 平均分 < 70 :D 级

  • 平均分 < 60 :E 级

#define _CRT_SECURE_NO_WARNINGS
#include 

int main() {
    int num_subjects;
    float total_score = 0;
    float average_score;
    char grade;

    // 顺序结构:输入科目数量
    printf("请输入科目数量: ");
    scanf("%d", &num_subjects);

    // 循环结构:依次输入每科成绩并累加总分
    for (int i = 0; i < num_subjects; i++) {
        float score;
        printf("请输入第 %d 科成绩: ", i + 1);
        scanf("%f", &score);
        total_score += score;
    }

    // 计算平均分
    average_score = total_score / num_subjects;

    // 选择结构:根据平均分判断等级
    if (average_score >= 90) {
        grade = 'A';
    } else if (average_score >= 80) {
        grade = 'B';
    } else if (average_score >= 70) {
        grade = 'C';
    } else if (average_score >= 60) {
        grade = 'D';
    } else {
        grade = 'E';
    }

    // 顺序结构:输出平均分和等级
    printf("平均分是: %.2f\n", average_score);
    printf("成绩等级是: %c\n", grade);

    return 0;
}    
    • int num_subjects;:定义一个整型变量 num_subjects,用于存储用户输入的科目数量。

    • float total_score = 0;:定义一个浮点型变量 total_score 并初始化为 0,用于累加每科成绩。

    • float average_score;:定义一个浮点型变量 average_score,用于存储计算得到的平均分。

    • char grade;:定义一个字符型变量 grade,用于存储根据平均分判断出的成绩等级。

    • printf("请输入科目数量: ");:使用 printf 函数在屏幕上输出提示信息,告知用户输入科目数量。

    • scanf("%d", &num_subjects);:使用 scanf 函数读取用户输入的整数,并将其存储到 num_subjects 变量中。& 是取地址运算符,用于获取 num_subjects 的内存地址。

    • for (int i = 0; i < num_subjects; i++):这是一个循环结构,i 从 0 开始,每次循环后 i 加 1,只要 i 小于 num_subjects 就会继续循环。循环的作用是让用户依次输入每科成绩。

    • float score;:在每次循环中定义一个浮点型变量 score,用于临时存储当前输入的成绩。

    • printf("请输入第 %d 科成绩: ", i + 1);:输出提示信息,提示用户输入第几科的成绩。

    • scanf("%f", &score);:读取用户输入的成绩并存储到 score 变量中。

    • total_score += score;:将当前输入的成绩累加到 total_score 中。

    • 计算平均分,将总分 total_score 除以科目数量 num_subjects,结果存储在 average_score 变量中。

    • 这是一个选择结构,根据平均分 average_score 的值来判断成绩等级,并将对应的等级字符存储到 grade 变量中。

    • 首先判断 average_score 是否大于等于 90,如果是则等级为 'A'。

    • 若不满足,则判断是否大于等于 80,若是则等级为 'B',以此类推。

    • 如果以上条件都不满足,则等级为 'E'。

    • printf("平均分是: %.2f\n", average_score);:输出平均分,%.2f 表示以浮点数形式输出,保留两位小数。

    • printf("成绩等级是: %c\n", grade);:输出成绩等级,%c 表示以字符形式输出。

    • return 0;main 函数返回 0,表示程序正常结束。


    ③找出最大公约数和最小公倍数
    #define _CRT_SECURE_NO_WARNINGS
    #include 
    
    int main() {
        int num1, num2;
        int gcd, lcm;
    
        // 顺序结构:输入两个正整数
        printf("请输入两个正整数: ");
        scanf("%d %d", &num1, &num2);
    
        // 选择结构:确定较小的数,用于寻找最大公约数
        int min = (num1 < num2) ? num1 : num2;
        for (int i = min; i >= 1; i--) {
            if (num1 % i == 0 && num2 % i == 0) {
                gcd = i;
                break;
            }
        }
    
        // 计算最小公倍数
        lcm = (num1 * num2) / gcd;
    
        // 顺序结构:输出最大公约数和最小公倍数
        printf("最大公约数是: %d\n", gcd);
        printf("最小公倍数是: %d\n", lcm);
    
        return 0;
    }    
    • #include :包含标准输入输出库头文件。

    • int main():程序入口函数。

    • int num1, num2;:定义两个整型变量 num1 和 num2,用于存储用户输入的两个正整数。

    • int gcd, lcm;:定义两个整型变量 gcd 和 lcm,分别用于存储最大公约数和最小公倍数。

    • printf("请输入两个正整数: ");:输出提示信息,让用户输入两个正整数。

    • scanf("%d %d", &num1, &num2);:读取用户输入的两个整数,并分别存储到 num1 和 num2 变量中。

    • int min = (num1 < num2) ? num1 : num2;:使用三目运算符判断 num1 和 num2 哪个更小,将较小的值赋给 min 变量。

    • for (int i = min; i >= 1; i--):这是一个循环结构,从较小的数开始递减,直到 1。循环的目的是寻找能同时整除 num1 和 num2 的最大数。

    • if (num1 % i == 0 && num2 % i == 0):判断 i 是否能同时整除 num1 和 num2,如果可以,则 i 就是最大公约数。

    • gcd = i;:将找到的最大公约数赋值给 gcd 变量。

    • break;:找到最大公约数后,使用 break 语句跳出循环。

    • 根据公式 “最小公倍数 = 两数之积 / 最大公约数”,计算最小公倍数并存储到 lcm 变量中。

    你可能感兴趣的:(C,PRIMER,PLUS,c语言,开发语言,visual,studio)