一、循环结构
重复执行同一段代码,则选用循环结构
循环结构分类:While do...while for
while和for:当型循环,至少执行0次
do..while::直到型循环,最少执行1次
1.1while循环
是当型循环,先判断,后执行,最少执行0次
格式1:
表达式1;
while(表达式2)//表达式2为真【非0】,则循环,表达式2为假【0】,则不循环
{
循环体;
表达式3;
}
格式2:
去掉格式1的表达式3;
解析:例如:1-100
1> 表达式1:表示初始值
2>表达式2:循环条件【可以是任意表达式,一般选用关系,算术,逻辑】
3>表达式3:步长
4>while:循环函数,只能放在内部
5>while()后面不允许加分号
6>当只有一条语句时,大括号可以省略
7>死循环 while(1),没有步长
2>随机输入一个数,计算各个位数字之和
1234567=1+2+3+4+5+6+7
int num, sum=0, count=0,t;
printf("请随机输入一个值: ");
scanf( "%d" , &num);
t=num;//使用t保存一下num的值
while( num!=0){
sum+=num%10;//累加余数的和
count++;
num/=10;//步长
}
printf("%d各个位数字之和是: %d ,%d位\n" ,t, sum, count);
return 0;
1.2 do....while循环
直到型循环,先执行,后判断,最少执行一次
格式1:
表达式一;
do
{
循环体;
表达式3;
}while(表达式2);//分号必须加,当表达式2成立【非0】则循环,不成立【0】,循环结束
格式2:
do
{
循环体;
}while(表达式2);//分号必须加
解析:
1>表达式1:表示初始值
2>表达式2:循环条件【可以是任意表达式,一般选用关系,算数,逻辑】
3>表达式3:步长
4>do..while while后面必须加分号
5> 死循环do..while(1);
1.3 for循环
是当型循环,先判断,后执行,最少执行0次
格式:
for(表达式1;表达式2;表达式3)
{
循环体;
}
解析:
1>表达式1:初始值【可以是多个,多个之间使用,隔开】
2>表达式2:循环条件【可以是任意表达式,一般选用关系,算数,逻辑】可以是多个,使用运算符进行连接
3>表达式3:步长,可以是多个
4>当{}里面只有一条语句“{}”是可以省略的
5>表达式1,2,3均可以省略,但是分号不可以省略
6>死循环 for(;;)
1.4 goto
无条件跳转语句
格式:
标识符:
goto 标识符;
解析:
1>标识符:满足命名规范
eg:
int main(int argc,const char *argv[])
int a=1;
int i=0;
A:
printf("bsisudh");
printf("fghj");
i++;
if(i==5)
goto B;
printf("你好");
goto A;B:
printf("结束\n");
return 0;
}
1.5 循环嵌套
* 1 1
** 2 2
***3 3
****4 4
j==i j<=i
for(int i=1;i<=n;i++)//外 曾循环控制行{
for(int j=1;j<=i;j++)//内 存循环控制列{
printf("*");
}
putchar(10);}
**** 1 4
*** 2 3
** 3 2
* 41
i+j=n+1 j<=n+1-i
for(int i=1;i<=n;i++)//外 曾循环控制行{
for(int j=1;j<=n+1- i;j++)//内存循环控制列
{
printf("*");}
putchar(10);
}
1.6循环跳转
1.6.1 break
break:中断,停止,用来跳出一层循环或者switch
适用于所有循环【while\do..while\for】,以及switch,break不可以单独使用在if语句中。
1.6.2 continue
作用:结束本次循环,进入下次循环
场景:只可以用在循环【while\do..while\for】
for(int i=1;i<20;i++)//除了这几个数不打印,其余都打印 7 8 14 15
{
if( i%10==7| i%7==0)
continue;
printf("%d\n",i);
}
1.6.3 return
作用:返回,结束函数
二、数组
定义一个变量,只能储存一个数据,但是想要储存n个,那么定义n个变量不方便,引出数组
数组:使用连续的储存空间,存储类型相同的构造类型
构造类型:可以分割【数组、结构体、共用体】
2.1一维数组
只有一个下标表示的数组
2.2一维数组定义格式
格式:[存储类型] 数据类型 数组名 [常量表达式];
存储类型:
auto:自动类型,一般默认不写就是自动类型
static:静态类型,存储在静态区,延长生命周期
const:修饰词,表示变量的值不可修改
register:寄存器,访问速度快
extern:外部变量
volatile:防止内存优化
数据类型:
int float double char short,结构体,共用体
数组名:命名规范
常量表达式:表示数组的个数【不为0,定义不为空,不为小数,初始化时不为变量】
int arr[0];
int arr[2.5];
int arr [ ];
int n=5;
int arr[n]={1,2,3,4,5};
错误
2.3一维数组初始化
初始化等价赋值
1>全局变量:在函数外定义的称为全局变量
全局变量未初始化的数组,默认结果是0
2>静态变量: static int arr[5];
静态变量数组未初始化,默认结果是0
3>局部变量数组未初始化,默认结果是随机值
4>全部初始化
int arr[5]={11,22,33 , 44, 55};
5>部分初始化:剩余元素默认以0填充
int arr[5]={11,22};
6>特殊初始化:在初始化时,可以省略数组长度,默认数组长度是实际元素的个数
int arr[]={11,22,33}; ===> int arr[3]={11,22,33};
7>错误的初始化
int arr[5];
arr={ 11 , 22,33 , 44,55};
2.4数组的引用
1>数组 下标从0开始,int arr[100]:0-99
2>越界访问, 例如int arr[100], 输出arr[100 ]
2.1当越界访问的空间没有被占用,可以访问,输出垃圾值
2.2当越界访问的空间被占用,不是重要的数据,可以访问,输出的数据没有意义
2.3当越界访问的空间被占用,存储重要的数据,一旦访问,出现段错误
段错误:访问了不该访问的内存空间
2.5数组的地址空间
1>数组名表示数组的首地址,也就是第一个元素的地址
arr=&arr[0]
数组名表示常量,不可以自增或者自减
2>地址的加减运算,表示地址的偏移
例如:int arr[4];
&arr[0]+1:表示向高字节方向偏移数据类型大小
&arr[0]-1:表示向低字节方向偏移数据类型大小
3>地址输出格式控制符是%p
一维数组的练习:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
char num=0;
for(int i=0;i<6;i++){
for(int j=0;j<=i-1;j++){
putchar('_');
}
num='F';
for(int k=0;k<=i;k++){
putchar(num);
num--;
}
putchar(10);
}
return 0;
}
2.输入一个数,判断这个数是含是完美数
完美数:除了本身,约数和等于本身
例如: 6:1+2+3=6
28:1+2+7+4+14=28
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
printf("请输入任意整数,判断是否为完美数");
int num,sum=0;
scanf("%d",&num);
for (int i=1;i<num;i++){
if(num%i==0){
sum+=i;
}
}
if(sum==num){
printf("%d此数为完美数\n",num);
}else{
printf("抱歉,此数不是完美数,再输入一个吧~~\n");
}
return 0;
}