一、do-while 语句:
语法:
do
{
语句;
}while (表达式);
语义:
先,执行 语句
然后 判断 表达式
真
继续 执行语句,然后判断,重复这个过程,直到 表达式为假,do-while 语句结束
假
do-while 结束,程序继续往下
流程图:
注意:
while 后面的分号一定要有,否则编译时会报错
eg:
do-while 实现 1到100求和
#include <stdio.h>
2
3 int main(void)
4 {
5 int i,sum;
6
7 i=1;
8 do
9 {
10 sum =sum+i;
11 i++;
12 }while(i<=100);
13
14 printf("sum = %d\n",sum);
15
16 return 0;
17 }
对比:
while
while (表达式) //先判断
{
语句; //后执行
}
do-while
do
{
语句; //先执行
}while(表达式); //后判断
注意:
1. do-while 循环 至少会被一次
2. 逻辑顺序不同
while - 先判断 后执行
do-while - 先执行 后判断
eg:
编写一个程序,用以记录在键盘上输入的字符个数,直到输入回车换行符时止
#include <stdio.h>
2
3 int main(void)
4 {
5 char ch;
6 printf("input char:\n");
7
8 int i=0;
9 do
10 {
11 ch = getchar();
12 i++;
13 }while(ch != '\n');
14
15 printf("total num:%d\n",i);
16 return 0;
17 }
eg:打印出所有的水仙花数
a.水仙花数是一个三位数
b.每位数的三次方的和值为该数本身
153 == 1*1*1+5*5*5+3*3*3
#include <stdio.h>
int main(void)
{
int a,b,c;
int num=100;
do
{
a=num/100;
b=(num/10)%10;
c=num%100%10;
if(num == a*a*a+b*b*b+c*c*c)
{
printf("%d\n",num);
}
num++;
}while(num>=100&&num<=999);
return 0;
}
二、for 循环 :
语法:
for (表达式1;表达式2;表达式3)
{
循环体语句;
}
语义:
s1 求解 表达式1,
s2 判断 表达式2,
s3 真, 则 执行 循环体语句
执行完之后,
s4 求解 表达式3
求解完之后,继续判断表达式2
重复 s2 到 s4
直到 s2 判断为假,for循环结束
流程图:
for (初始条件 ;循环条件(循环结束条件);使循环趋于结束语句)
//for (循环变量赋初值;循环条件;循环变量增值)
{
循环体语句;
}
eg:
for 循环 找水仙花数
1 #include <stdio.h>
2
3 int main(void)
4 {
5 int a,b,c;
6 for(int num = 100;num<=999;num++)
7 {
8 a =num/100;
9 b =(num/10)%10;
10 c =num%10;
11
12 if(num == a*a*a+b*b*b+c*c*c)
13 {
14 printf("num=%d\n",num);
15 }
16 }
17 return 0;
18 }
选用:
1.for //多用于 有一定范围
while
do-while //多用于 只有某个结束条件的
2.for 循环的三个表达式都可以省略
但是对应的循环要素不能省
表达式2 省略 ---表示循环条件永远为真
break 语句
break 可以用在 switch
循环 while , do-while ,for
作用:
用在循环中 ,表示跳出 本层循环
continue 语句
只用在循环中
作用:
结束本次循环,继续下一次循环
eg:
#include <stdio.h>
int main(void)
{
int i,j;
for(i=0;i<5;i++)
{
printf("i=%d\n",i);
for(j=0;j<5;j++)
{
printf("j=%d\n",j);
if(j>2)
{
break;
}
}
if(i%2==0)
{
continue;
}
printf("i=%d, j=%d\n",i,j);
}
return 0;
}
j>2也就是说当j为3时会跳出循环,由于在判断之前有一个打印语句,所以会j打印0,1,2,3。continue会结束本次循环,也就是说当i为偶数时,是不会执行后面那一句打印语句的。
eg:
打印100内的素数
#include <stdio.h>
int main(void)
{
int i=0;
int j=0;
for(i=2;i<=100;++i)
{
for(j=2;j<i;++j)
{
if(i%j==0)
{
break;
}
}
if(j ==i)
{
printf("%d\n",i);
}
return 0;
}
2是最小的素数,所以从2开始;通过break跳出循环,因为当i对j取余发现有能整除的,证明这个数不是素数,直接跳出循环,此时的循环次数j一定比i小,通过判断i和j之间的关系,可以知道这是不是个素数,如果是素数,证明循环完都没发现可以整除的,所以此时的j与i相等。
三、数组
概念
//一组数据
一组相同类型的数据的集合
一组相同类型的变量的集合
数组也是一种数据类型
应用场景:
批量的处理多个数据
语法:int a[10];
类型说明符 数组名[常量表达式]
(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); //计算实际长度
eg:
int array[10]; //表示此时定义了一个数组
//这个数组中存放的是int型的数据
//存放了10个int型的数据
//表示定义了一个可以存放10个int型数据的数组
//理解的角度,相当于一下子定义出10个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.赋值
循环赋值
输入的方式
数组特点:
连续性 --- 数组空间是一片连续内存空间
有序性 --- 数组的元素挨个存放
单一性 --- 数组元素类型是同一类型
数组元素的引用:
语法:
数组名[下标]; //[] 此时表示的是一种运算 --- 数组下标运算
下标含义:
a[0] //下标表示的是相对于 数组名 偏移了几个元素
偏移量
a[1]
a[2]
...
a[9]
数组越界
如果定义a[10] ,确实用了a[10],这时会出现数组越界,此时a[10]的值是一个垃圾值
注意:
int a[10];
a 所代表的值 数组所占空间的首地址
a 所代表的数据类型 a 代表整个数组类型
a所代表的类型是int[10] ,这就是所谓的 数组类型
int a; //判断标识符所代表的数据类型 ---去掉标识符,剩下就是标识符对应的数据类型
int a[10];
eg:
定义一个数组,准备10个数
找出数组中能被3整除的数
#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++)
{
if(a[i]%3==0)
{
printf("%d\n",a[i]);
}
}
return 0;
}
eg:
从键盘输入5个 值
找出最大值
通过定义max = a[0],让剩下的元素都与其进行比较,大于它就替换。从而找到最大值
#include <stdio.h>
int main(void)
{
int a[5]={0};
int i=0;
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
int max = a[0];
for(i=1;i<5;i++)
{
if(max<a[i])
{
max = a[i];
}
}
printf("max = %d\n",max);
return 0;
}