一、循环结构
构成循环的要素:
1.循环体:这是循环中重复执行的核心代码段,包含了要完成的具体任务或操作。
2.结束条件:用于决定循环何时停止执行。当结束条件满足时,循环退出。
3.使循环趋于结束的操作(或语句):例如在 for
循环中的循环变量的递增或递减操作,它会逐步使得结束条件得以满足。
4.循环的初始条件:为循环的开始做好准备,例如设置循环变量的初始值等。
1. goto 语句
goto 语句标号;
例:对1~100求和#include<stdio.h> int main() { int i=1; int sum =0; loop: sum = sum + i; ++i; if(i>100) goto exit; goto loop; exit: printf("sum = %d\n",sum); return 0; }
2.while 语句
(1)语法形式:
while (表达式)
{
语句
}
(2)语义:
判断表达式 ,如果表达式为真,则执行语句,语句执行完之后,继续进行表达式的判断,重复上面的操作,直到表达式为假;如果表达式为假,while 结束,程序继续往下。
注意:while()后面没有分号,如果写了分号,则这个分号就成了空语句。
3. do-while 语句
(1)语法形式:
do
{
语句;
}while (表达式);
(2)语义:
先执行语句, 然后判断表达式,如果表达式为真,则继续执行语句,然后判断,重复这个过程,直到表达式为假,do-while 语句结束;如果表达式为假,do-while 结束,程序继续往下。
注意:while()后面一定要有分号。
例:对1~100求和
#include <stdio.h> int main(void) { int i = 0; int sum = 0; do { sum = sum + i; i++; }while (i <= 10); printf("sum = %d\n",sum); return 0; }
对比 while 和 do-while :
1. do-while 循环至少会被执行一次
2. 逻辑顺序不同:
while --- 先判断 后执行
do-while - 先执行 后判断
4. for 语句
(1)语法形式:
for (表达式1;表达式2;表达式3)
{
循环体语句;
}
(2)语义:
①求解表达式1,②判断表达式2,③如果表达式为真,则执行循环体语句 ,执行完之后,④求解表达式3,求解完之后,继续判断表达式2 ;重复②到④的步骤,直到②判断为假,for循环结束。
for (初始条件 ;循环条件(循环结束条件);使循环趋于结束语句)
//for (循环变量赋初值;循环条件;循环变量增值)
{
循环体语句;
}
注意:for()后面不要写分号 。
例:使用for循环,找水仙花数。
水仙花数是指一个三位数,其每个数位上的数字的立方和等于该数本身。
#include <stdio.h> int main(void) { int i = 0; int a,b,c; for (i = 100;i <= 999; ++i) { a = i/100; b = i/10%10; c = i%10; if (a*a*a+b*b*b+c*c*c == i) { printf("%d\n",i); } } return 0; }
注意:
1.for:多用于有一定范围的
while 和 do-while:多用于只有某个结束条件的
2.for 循环的三个表达式都可以省略,但是对应的循环要素不能省,表达式2如果省略,则表示循环条件永远为真。
5. break 语句
①break 可以用在 switch,while , do-while ,for 中。
②作用:用在循环中,表示跳出本层循环。
6. continue 语句
①只用在循环while , do-while ,for中。
②作用:结束本次循环,继续下一次循环。
例: 从键盘输入一个数,判断是不是素数
#include <stdio.h> int main(void) { int n = 0; scanf("%d",&n); int i = 0; for (i = 2; i < n; ++i) { if (n%i == 0) { printf("no\n"); } } if (i < n) { printf("%d is not a prime num!\n",n); }else { printf("%d is a prime num!\n",n); } return 0; }
if(<n):如果找到了除自身和1以外的别的因数,它就会结束循环,i 就不会累加到 n,所以当 i<n 时就找到了合数。
二、数组(构造类型)
1.概念:
数组是一组相同数据类型的元素按一定顺序排列的集合。数组也是一种数据类型 。
2.应用场景:
①存储一组相同类型的数据;②实现简单的查找和排序;③作为函数的参数传递一组数据;④矩阵和表格的表示;⑤缓存数据;⑥记录历史数据⑦实现队列和栈的数据结构。
3.语法形式:
类型说明符 数组名【常量表达式】
(1)类型说明符 ---数据类型:整型 int/short/long/long long
浮点型 float / double /long double
字符型 char
作用: 用来说明该数组中元素的类型。
(2)数组名 --- 名字 (标识符)(起名字规则与之前变量名起名规则一致)
作用:用来代表这个数组
(3)[常量表达式] --- [] //这个就是数组类型
常量表达式 //数组长度 --代表数组中元素的个数
注意: 1. c99标准之后,数组长度可以是变量,是可变长数组,但是不能初始化 。
2. 数组长度,可以省略,但是必须要有初始化。因为编译器要根据初始化的值算出实际长度。 int len = sizeof(a)/sizeof(int); //计算实际长度
4.数组给值:
(1)初始化: int a[10] = {}; //{} 初始化器
①全部初始化: int a[10] = {1,2,3,4,5,6,7,8,9,10};
②部分初始化:int a[10] = {1,2,3,4,5}; //未初始化的部分会被初始化为0
③不初始化: int a[10]; --- 数组中是随机值(垃圾值)
(2)循环赋值
(3)输入的方式赋值
5.数组元素的引用
(1)语法:
数组名[下标]; //[] 此时表示的是一种运算 --- 数组下标运算
(2)下标含义:
下标表示的是相对于数组名偏移了几个元素 。
(3)数组越界 :
//编译器不会检查,程序员自己小心
注意:
例: int a[10];
①a 所代表的值 数组所占空间的首地址。
②a 所代表的数据类型 a 代表整个数组类型。
③a所代表的类型是int[10] ,这就是所谓的 数组类型
④判断标识符所代表的数据类型 ---去掉标识符,剩下就是标识符对应的数据类型。
6.数组特点:
连续性 --- 数组空间是一片连续内存空间
有序性 --- 数组的元素挨个存放
单一性 --- 数组元素类型是同一类型