语句的种类
1.表达式语句:表达式语句是指一个表达式后面跟随一个分号的语句。
#include<stdio.h> int main() { 3 + 5;//表达式语句 return 0; }
2.函数调用语句:函数调用语句是指一个函数调用语句后跟随一个分号的语句
#include<stdio.h> int main() { printf("hello\n");//表达式语句 return 0; }
3.控制语句
4.复合语句:复合语句(也称为代码块)是指在一对花括号 {} 中包含的一系列语句。
#include<stdio.h> int main() { { } //复合语句 return 0; }
5.空语句:空语句是指不包含任何可执行语句的语句。
#include<stdio.h> int main() { ; //空语句 return 0; }
这里我们着重讲解控制语句。
控制语句是一种编程语言中用来控制程序执行流程的语句。它可以通过改变程序的执行顺序、跳转到指定代码块和重复执行一段代码等,来实现程序的各种控制需求。控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选 择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
1. 条件判断语句也叫分支语句:if语句、switch语句;
2. 循环执行语句:do while语句、while语句、for语句;
3. 转向语句:break语句、goto语句、continue语句、return语句。
C语言:结构化是程序设计语言
顺序结构:
顺序结构是一种程序控制结构,它按照代码书写的先后顺序依次执行每个语句。顺序结构是编程中最基本、最基础的结构,几乎所有的程序都包含顺序结构。
顺序结构中的代码会按照书写顺序顺次执行,没有任何条件、跳转或分支的控制。顺序结构通常用于执行一组逻辑上有序的指令序列,例如从文件中读取数据、对数据进行处理、将结果输出到屏幕等。
以下是一个简单的顺序结构示例,它实现了对两个数相加的操作:
int a = 2;
int b = 3;
int c = a + b;
printf("The result is: %d\n", c);
在上面的代码中,变量 a 和 b 分别赋值为 2 和 3,然后使用加号运算符将它们相加,将结果保存到变量 c 中。最后,使用 printf 函数输出变量 c 的值到屏幕上。
顺序结构是一种非常基础的编程结构,它通常是编写任何复杂程序或算法的基础。在编写程序时,需要按照逻辑流程将不同的操作语句按照正确的顺序排列,才能得到正确的结果。
选择结构(分支结构):
选择结构是一种程序控制结构,它允许程序在满足不同条件的情况下执行不同的代码路径。选择结构通常用于根据特定的条件选择不同的处理路径,例如为一个变量赋值、输出不同的结果等。在大多数编程语言中,选择结构有两种类型:if...else 和 switch...case。if...else 结构的语法形式如下:
if (condition)
{
// 条件为真时执行的代码 // ...
}
else
{
// 条件为假时执行的代码 // ...
}
if...else 结构会根据指定的条件来判断执行哪段代码。如果条件为真,那么执行 if 代码块中的语句;否则,执行 else 代码块中的语句。else 代码块是可选的,如果不需要对条件为假的情况进行处理,可以省略该代码块。
选择结构都可以根据特定的条件来执行不同的代码路径,具有很强的灵活性和应用范围。
//if - else 语句 #include<stdio.h> int main() { int age = 0; //输入 scanf("%d", &age); if (age < 18) { printf("未成年!\n"); } else { printf("成年!\n"); } return 0; } //if - else if - else 语句 #include<stdio.h> int main() { int age = 0; //输入 scanf("%d", &age); /* < 18 青少年 18 - 30 青年 31 - 50 中年 51 - 80 中老年 80 - 100 老年 100 + 老寿星 */ if (age < 18) printf("青少年!\n"); //else if (18 <= age <= 30) //18 <= age 当输入15,该表达式为假,假就为0,0<=30变为true,\ 执行下列语句,不符合逻辑,故改写法有误 else if ((age >= 18) && (age <= 30)) printf("青年!\n"); else if ((age >= 31) && (age <= 50)) printf("中年!\n"); else if ((age >= 51) && (age <= 80)) printf("中老年!\n"); else if((age >= 81) && (age <= 100)) printf("老年!\n"); else//else后不可直接带判断 printf("老寿星!\n"); }
当我们写代码时,一定要有良好的代码风格
//悬空else语句 #include <stdio.h> int main() { int a = 0; int b = 2; if (a == 1) if (b == 2) printf("hehe\n"); else printf("haha\n"); //else是与最近的if语句匹配 return 0; } //改进 #include <stdio.h> int main() { int a = 0; int b = 2; if (a == 1) { if (b == 2)//不要写成(b=2),这样写条件表达式将永远是true { printf("hehe\n"); } } else { printf("haha\n"); } //else是与最近的if语句匹配 return 0; }
接下来我们做两个题目练习一下:
1.判断一个数是否为奇数
#include<stdio.h> int main() { int n = 0; scanf("%d", &n); if (n % 2 == 1) { printf("%d是奇数\n", n); } else { printf("%d不是奇数\n", n); } return 0; }
2.输出1-100之间的奇数
#include<stdio.h> int main() { int i = 0; for (i = 0; i <= 100; i++) { //判断i是否为奇数 if (i % 2 == 1) { printf("%d ", i); } } return 0; }
现在我们再来介绍一下switc-case-break语句
switch...case 结构的语法形式如下:
```switch (expression)
{
case value1: // 匹配 value1 时执行的代码
// ...
break;
case value2: // 匹配 value2 时执行的代码
// ...
break;
default: // 所有值都不匹配时执行的代码
// ...
break;
}
switch...case 结构会根据指定的表达式值来判断执行哪个 case 代码块中的语句。如果表达式的值匹配某个 case 中的值,就会执行该代码块中的语句。break语句 的实际效果是把语句列表划分为不同的分支部分。如果没有任何一个值匹配表达式的值,则执行 default 代码块中的语句(default 块是可选的)。
有时候我们的需求变了:
1. 输入1-5,输出的是“工作日”;
2. 输入6-7,输出“休息日”
所以我们的代码就应该这样实现了:
#include<stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) // - day 整型表达式 { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); break; default: printf("输入错误\n"); break; } return 0; }
是时候来验证一下我们学的咋样啦?看代码。
#include <stdio.h> int main() { int n = 1; int m = 2; switch (n) { case 1: m++; // m = 3 case 2: n++; // n = 2 case 3: switch (n) {//switch允许嵌套使用 case 1: n++; case 2: m++; // m = 4 n++; // n = 3 break; } case 4: m++; // m =5 break; default: break; } printf("m = %d, n = %d\n", m, n);// 5 3 return 0; }
1.switch语句是可以嵌套的
2.break语句只会跳出一层switch
循环结构:
循环结构是一种程序控制结构,它允许程序在满足特定条件的情况下反复执行一段代码。
循环结构通常用于处理需要重复执行某一任务的情况,如打印九九乘法表、读取文件中的每一行数据等。在大多数编程语言中,循环结构有两种类型:while 循环和 for 循环。
while 循环的语法形式如下:
while (condition) {
// 待重复执行的代码 // ...
}
while 循环会在每一次循环开始时检查 condition 条件是否满足,只有当条件为真时,才会执行循环体中的代码块。一旦循环体执行完毕,程序将返回到循环开始处,重新检查条件,直到条件不再满足为止,循环结束。
for 循环的语法形式如下:
for (initialization; condition; increment)
{
// 待重复执行的代码 // ...
}
for 循环通常用于计数器的循环。在 for 循环中,初始化语句会在循环开始前执行一次,用于设置计数器的初始值;条件语句会在每次循环开始时执行,用于检查计数器是否满足循环终止条件;增量语句会在每次循环结束时执行,用于更新计数器的值。当计数器不再满足条件时,循环结束。
这两种循环结构都可以用来控制程序的重复执行次数和循环条件,具有很强的灵活性和应用范围。
现在我们来介绍一下循环结构 我们已经掌握了,
if(条件)
语句;
当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。 由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。
//while 语法结构
while(表达式)
循环语句;
//在屏幕上打印1-10 #include <stdio.h> int main() { int i = 1; while (i <= 10) { printf("%d ", i); i++; } return 0; }
while语句中的break和continue
break:
break语句用于完全退出循环。break用于完全退出包含它的循环。当执行到break语句时,程序会跳出当前的循环,不再执行后续的循环代码,而是直接执行循环外的代码。break只能跳出一个循环,不能跳出多个循环。
#include <stdio.h> int main() { int i = 1; while (i <= 10) { if (i == 5) break;//跳出循环 printf("%d ", i);// 1 2 3 4 i++; } return 0; }
continue:
continue语句用于跳过当前单次循环中的某些语句,开始下一次循环。当执行到continue语句时,程序不会执行剩余的循环体,而是直接进行下一次循环。
#include <stdio.h> int main() { int i = 0; while (i < 10) { i++; if (i == 5) continue; //跳过本次循环continue后边的代码,直接去while循环的判断部分 printf("%d ", i);// 1 2 3 4 6 7 8 9 10 } return 0; }
再看几个代码:
#include<stdio.h> int main() { char password[20] = { 0 }; printf("请输入密码:>");//123456 scanf("%d", password); printf("请确认密码(Y/N):>"); char c = 0; scanf("%c", &c); if ('Y' == c || 'y' == c) printf("确认成功\n"); else printf("确认失败\n"); return 0; }
我们发现此程序在我们输入密码之后,没有让我们输入Y程序就自己输出确认失败了,这是为什么呢?
这是因为在输入密码后,scanf函数还会将回车符('\n')留在输入缓冲区中,然后当我们输入确认字符时,scanf会读取到这个回车符,导致程序直接执行了确认失败的代码块。这种情况可以使用一个额外的getchar()函数来解决。
#include<stdio.h> int main() { char password[20] = { 0 }; printf("请输入密码:>");//123456 scanf("%s", password); // 因为是读取字符数组,所以不需要使用 & 符号 while(getchar()!='\n') { ; // 把输入缓冲区中的回车符读取掉 } printf("请确认密码(Y/N):>"); char c = getchar(); // 直接使用 getchar 读取字符 if ('Y' == c || 'y' == c) // 注意对大小写的判断 printf("确认成功\n"); else printf("确认失败\n"); return 0; }
这个代码的作用是:只打印数字字符,跳过其他字符的、
//#include <stdio.h> //int main() //{ // char ch = '\0'; // while ((ch = getchar()) != EOF) // { // if (ch < '0' || ch > '9') // continue; // putchar(ch); // } // return 0; //}