一、循环结构
一、构成循环的要素
- 循环体 //反复被执行的代码
- 结束条件
- 使循环趋于结束的操作(或语句)
- 循环的初始条件
二、while语句
1、语法
while (表达式)
{
语句
}
2、语义:
先判断表达式的真假;
如果为真,则执行语句;执行语句完成之后,继续表达式判断;重复以上操作。
直到表达式为假,while结束,程序继续往下进行。
流程图:
3、注意:
while()之后不能有分号!
用 while 实现 1 到 100 累加求和:
#include <stdio.h>
int main(void)
{
int n, sum=0;
do{
sum=sum+n;
n++;
}
while(n<=100);{
printf ("sum=%d",sum);
}
return 0;
}
三、do while 语句
1、语法
do
{
语句;
}while (表达式);
2、语义
先执行语句,然后判断表达式
如果为真,继续执行语句,然后判断表达式,重复这个过程。
直到表达式为假,do while语句结束,程序继续往下。
3、流程图
注意:while();分号一定要有!
用do while 求出1000以内的水仙花数
#include<stdio.h>
int main(void)
{
int tens,hunds,ones;
int n=100;
do{
hunds=n/100;
tens=(n/10)%10;
ones=n%10;
if(hunds*hunds*hunds+tens*tens*tens+ones*ones*ones==n){
printf("n=%d\n",n);
}
++n;
}
while(n<=999);
return 0;
}
4、对比
while
while (表达式) //先判断
{
语句; //后执行
}
do-while
do
{
语句; //先执行
}while(表达式); //后判断
注意:
1. do-while 循环 至少会被执行一次
2. 他们的逻辑顺序不同:
while - 先判断 后执行
do-while - 先执行 后判断
四、for 循环
1、语法
for (表达式1;表达式2;表达式3)
{
循环体语句;
}
注意:for()之后没有分号!!不然就会空循环
2、语义
- 求解表达式1
- 判断表达式2
- 如果为真,执行循环体语句
- 执行完之后,求解表达式3,求解完成之后,继续判断表达式2
- 重复2、3、4步骤,直到判断表达式2为假,for循环结束
- 继续下面的程序
3、流程图
总结:
for ( 初始条件 ; 循环条件(循环结束条件) ; 使循环趋于结束语句 )
//for ( 循环变量赋初值 ; 循环条件 ; 循环变量增值 )
{
循环体语句;
}
for循环,寻找水仙花数
#include<stdio.h>
int main(void)
{
int a,b,c;
int n;
for(n=100;n<=999;n++)
{
a=n/100;
b=(n/10)%10;
c=n%10;
if( n==a*a*a+b*b*b+c*c*c){
printf("n=%d\n",n);}
}
return 0;
}
五、三种循环如何选用
- for 多用于 有一定范围
- while
do-while //多用于 只有某个结束条件的 - for 循环的三个表达式都可以省略
但是对应的循环要素不能省
表达式2 省略 ---表示循环条件永远为真
六、break 语句 与 continue 语句
1、break 语句
- break 可以用在 switch ;循环 :while , do-while ,for
- 作用:用在循环中 ,表示跳出 本层循环
2、continue 语句
只用在循环中
作用:
结束本次循环,继续下一次循环 。
二、数组
一、概念
数组是 一组相同类型的数据的集合 ,也可以称作 一组相同类型的变量的集合 。
数组也是一种数据类型 ,可以批量处理多个数据,
二、语法
类型说明符 数组名[常量表达式]
(1)类型说明符 --- 数据类型
整型 int/short/long/long long
浮点型 float / double /long double
字符型 char
作用: 用来说明 该数组中元素的类型
(2)数组名 --- 名字 (标识符)
用来代表这个数组
起名字规则 与 之前变量名起名规则一致
(3)[常量表达式]
--- [ ] //这个就是数组类型
常量表达式 //数组长度 --代表数组中元素的个数
注:
1. c99标准之后,数组长度 可以是变量
但是,不能初始化
2. 数组长度,可以省略,但是必须要有初始化
编译器要根据初始化的值,来推算实际的长度
int len = sizeof(a)/sizeof(int); //计算实际长度 。
三、数组给值:
1.初始化
int a[10] = { }; // { } 初始化器
//全部初始化
int a[10] = {1,2,3,4,5,6,7,8,9,10};
//部分初始化 ---未初始化的部分会被初始化为0
int a[10] = {1,2,3,4,5};
//不初始化 --- 数组中是随机值(垃圾值)
int a[10];
2.赋值
可以用循环赋值
也可以用 输入的方式 赋值
#include <stdio.h>
int main(void)
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for (i = 0; i < 10; ++i)
{
a[i] = i*2;} //循环赋值
scanf("%d",&a[i]); //输入赋值
3、数组特点:
连续性 --- 数组空间是一片连续内存空间
有序性 --- 数组的元素挨个存放
单一性 --- 数组元素类型是同一类型
四、数组元素的引用:
1、语法:
数组名[下标]; //[ ] 此时表示的是一种运算 --- 数组下标运算
下标含义:
a[0] //下标表示的是相对于 数组名 偏移了几个元素
数组越界 :超出下标值
//编译器不会检查,程序员自己小心
2、注意:
int a[10];
a 所代表的值 数组所占空间的首地址
a 所代表的数据类型 a 代表整个数组类型
a所代表的类型是int[10] ,这就是所谓的 数组类型
int a; //判断标识符所代表的数据类型 ---去掉标识符,剩下就是标识符对应的数据类型
int a[10];
运用数组找出十个数中能被3整除的数
#include <stdio.h>
int main(void)
{
int a[10]={1,32,18,99,66,52,31,24,26,95};
int i=0;
for(i=0;i<10;++i){
if(a[i]%3==0)
printf("a[%d]=%d\n",i,a[i]);
}
return 0;
}
键盘输入5个值找出最大值
#include <stdio.h>
int main(void)
{
int n = 0;
scanf("%d",&n);
int a[n];
int i = 0;
for (i = 0; i < n; ++i)
{
scanf("%d",&a[i]);
}
int max = a[0];
for (i = 1; i < n; ++i)
{
if (a[i] > max)
{
max = a[i];
}
}
printf("max = %d\n",max);
return 0;
}
键盘输入五个值找出第二大的值
#include <stdio.h>
#include <limits.h>
int main(void)
{
int n = 0;
scanf("%d",&n);
int a[n];
int i = 0;
for (i = 0; i < n; ++i)
{
scanf("%d",&a[i]);
}
int max = a[0];
for (i = 1; i < n; ++i)
{
if (a[i] > max)
{
max = a[i];
}
}
//int second = 0x80000000;
int second = INT_MIN;
for (i = 0; i < n; ++i)
{
if (a[i] != max && a[i] > second)
{
second = a[i];
}
}
printf("second = %d\n",second);
return 0;
}