目录
1.顺序结构
2.选择结构
3. 循环结构
4.3种无限循环
5.跳转控制语句
6.扩展
7.综合训练
(1)while练习
(2)for练习
(3)if-else练习
①判断一个数是奇数还是偶数
②判断一个年份是否为闰年
③实现一个简单的四则运算计算器,能处理加、减、乘、除四种基本运算,并且要考虑除数为零的异常情况。
(4)三大结构综合训练
①输入一个正整数 n,计算 1 到 n 中所有能被 3 整除但不能被 5 整除的数的和,并输出结果。
②输入学生的科目数量,然后依次输入每科成绩,计算平均分,并根据平均分判断成绩等级。
③找出最大公约数和最小公倍数
①含义:顺序结构属于最简单的程序结构,程序会按照语句的先后顺序依次执行。也就是说,代码会从第一行开始,逐行向下执行,直至程序结束。
②作用:顺序结构是构建程序的基础,能保证程序按既定步骤逐步完成各项操作。
③用法:只需按顺序编写语句,程序便会自动按顺序执行。
#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;
}
①含义:选择结构依据条件的真假来决定执行哪些语句。在 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;
} //结果:周内
①含义:循环结构可让程序重复执行某段代码,直至满足特定条件才停止。
②作用:循环结构能够避免代码的重复编写,提高代码的复用性,可用于处理需要重复执行的任务。
③用法
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;
}
#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;
}
①break:不能单独书写,只能写在switch或循环中,表示结束,跳出的意思。只能跳出单层循环。
②continue:结束本次循环,继续下次循环。
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;
}
//将一个整数反转。例如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;
}
//生成一个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;
}
#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;
}
代码解释
变量定义:
①double num1, num2, result;
:定义三个双精度浮点数变量,num1
和 num2
用于存储用户输入的两个操作数,result
用于存储计算结果。②char operator;
:定义一个字符变量,用于存储用户输入的运算符。
用户输入:通过 printf
提示用户依次输入第一个数字、运算符和第二个数字,使用 scanf
读取用户输入。
运算处理:①使用 if - else if - else
语句根据用户输入的运算符进行相应的计算。②当运算符为 +
、-
、*
时,直接进行相应的运算并输出结果。③当运算符为 /
时,需要额外使用一个 if - else
语句判断除数 num2
是否为零。如果不为零,则进行除法运算并输出结果;如果为零,则输出错误提示。
异常处理:如果用户输入的运算符不是 +
、-
、*
、/
中的任何一个,会输出 “错误:无效的运算符。” 的提示信息。
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
变量中。