一、跳转语句
goto
可以在函数内任意跳转
标签名:
…
goto 标签名;
它可能会破坏已经设计好的分支或循环结构,因此绝大数公司
禁止使用goto
但是在驱动编程时特别适合处理异常
练习1:计算n的阶乘,不能使用循环语句实现
5! 1*2*3*4*5
#include <stdio.h>
int main(int argc,const char* argv[])
{
int n=0,N=1;
printf(“输入n的值:”);
scanf(“%d”,&n);
jie:
N*=n–;
if(0<n)
goto jie;
printf(“%d”,N);
}
break
1、在switch中关闭case执行开关
2、跳出循环,只能跳出当前的一层循环
continue
结束本次循环,进入下一次循环
return
1、结束函数的执行,程序跳转回函数调用的地方继续执行
2、可能返回一个数据给函数的调用者
二、数组
什么是数组:变量的组合,是一种批量定义类型相同变量的方式
定义:类型名 数组名[数量]
int arr[5];
使用:数组名[下标];
下标:从0开始 范围:0~数量减1
遍历:与for循环配合使用,使用循环变量当作数组的下标
初始化:类型名 数组名[数量]={1,2,3,...};
1、因为数组的值默认是随机的一般为了安全起见,要对
数组进行初始化
2、初始化的数据过多,编译器会产生警告并丢失多余的数据
3、初始化的数据不够,编译器会末尾补0
4、初始化时数据可以省略,只写大括号,相当于给所有成员初始化
为0
5、这种初始化语法只能在定义数组时使用,并且只能逐个赋值,不能
整体赋值(int arr[5]=1 错误)
6、初始化时数组的数量可以省略,编译器会自动统计初始化中数据的
个数,并告诉数组确定数组的数量,一旦数组的数量确定,后面无法
改变
sizeof(arr)/sizeof(arr[0])=数组的成员个数
sizeof(arr)==数组的总字节数
sizeof(arr[0])==数组单个成员的字节数
练习2:定义一个长度为10的数组并初始化,计算出最大值、最小值和平均值
#include <stdio.h>
int main(int argc,const char* argv[])
{
int arr[10]={1,2,3,4,5,6,7,8,9,10
};
int max=arr[0];
int min=arr[0];
double avg=0;
int sum=0;
for(int i=0;i<10;i++)
{
if(max<arr[i])
{
max=arr[i];
}
if(min>arr[i])
{
min=arr[i];
}
sum+=arr[i];
avg=sum/10.0;
}
printf(“最大值:%d”,max);
printf(“最小值:%d”,min);
printf(“平均值:%g”,avg);
}
练习3:定义一个长度为10的数组并初始化,进行升序排列
#include <stdio.h>
int main(int argc,const char* argv[])
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<9;i++)
{
for(int j=i+1;j<10;j++)
{
if(arr[i]>arr[j])
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
for(int i=0;i<10;i++)
{
printf("%d ",arr[i]);
}
}
三、数组越界:
为了程序的编译和运行效率,编译器不去检查数组的下标
数组越界的后果:
1、段错误(核心已转储)
2、一切正常
3、脏数据
总结:在使用数组过程中,要时刻注意不能越界
练习4:定义一个长度为10的数组并初始化(数据不重复),找出数组中第二大的数,
不允许排序
四、二维数组
一维数组相当于把变量排成一排,通过编号访问
二维数组相当于把变量排成一个矩阵,通过行号和列号访问
定义:类型 数组名[行数][列数];
int arr[3][5];
使用:数组名[行下标][列下标];
行下标:0~行数-1
列下标:0~列数-1
遍历:需要与双重for循环配合,一般外层循环负责遍历行,内层
循环遍历列
初始化:类型 数组名[行数][列数]={{第一行},{第二行},{第三行}...}
练习5:定义一个5*5的二维数组并初始化,找出数组中最大值的坐标
#include <stdio.h>
int main(int argc,const char* argv[])
{
int arr[5][5]={{1,2,3,4,5},{6,7,8,9,10},{12,14,64,67,89},{93,47,27,57,99},{37,45,68,22,55}};
int max=arr[0][0];
int i=0;
int j=0;
int h=0,l=0;
for(i=0;i<5;i++)
{
for( j=0;j<5;j++)
{
if(max<arr[i][j])
{
max=arr[i][j];
h=i;
l=j;
}
}
}
printf(“%d %d”,h,l);
}
五、变长数组
定义数组时使用变量作为数组的长度,在代码编译期间数组的长度是
不确定的,当运行到数组的定义语句时数组的长度才最终确定下来,
这种数组称为变长数组
注意:长度一旦确定,后面都无法改变
优点;可以根据实际情况来确定数组的长度,以此节约内存空间
缺点:不能进行初始化,因为初始化发生在程序编译期间
练习6:输入两个正整数 m(1<=m<=6) n(1<=n<=6),然后输入数组
arr[m][n],各个元素的值,然后统计每个元素之和、统计非零元素的
个数、计算出所有元素的平均值、大于平均值的元素个数
#include <stdio.h>
int main(int argc,const char* argv[])
{
int m=0,n=0;
int i=0,j=0;
printf(“输入两个正整数:”);
scanf(“%d %d”,&m,&n);
double avg=0;
int arr[m][n];
int sum=0,count_1=0,count_2=0;
int x=0,y=0;
for(i=0;i<m;i++)
{
printf(“输入%d行的数据:”,i+1);
for(j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
sum+=arr[i][j];
x=i+1;
y=j+1;
if(arr[i][j]!=0)
{
count_1++;
}
}
}
avg=(sum/(x*y*1.0));
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(arr[i][j]>(avg))
{
count_2++;
}
}
}
printf("各个元素之和:%d 非零:%d 均值:%lf 大于平均值:%d",sum,count_1,avg,count_2);
}
作业1:定义一个5*5的二维数组并初始化,找出最小值的坐标,计算出
最小值周围一圈数据之和
2 2 2 2 2
2 2 2 2 2
2 2 1 2 2
2 2 2 2 2
2 2 2 2 2
#include <stdio.h>
int main(int argc,const char* argv[])
{
int arr[5][5]={{2,2,2,2,2},{2,2,2,2,2,},{2,2,2,2,2},{2,2,2,2,2},{2,2,2,2,1}};
int min=arr[0][0];
int i=0;
int j=0;
int x=0,y=0;
int sum=0;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(min>arr[i][j])
{
min=arr[i][j];
x=i;
y=j;
}
}
}
printf(“%d %d\n”,x,y);
for(i=x-1;i<=x+1;i++)
{
for(j=y-1;j<=y+1;j++)
{
if(i<0||i>4||j<0||j>4)
{
continue;
}
sum+=arr[i][j];
}
}
sum=sum-min;
printf(“sum=%d”,sum);
}
作业2:输入N,显示前N层杨辉三角
1
1 1
1 2 1
1 3 3 1
#include <stdio.h>
int main(int argc,const char* argv[])
{ int N=0;
printf(“输入N的数据:”);
scanf(“%d”,&N);
int arr[N][N];
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(j>i)
{
arr[i][j]=0;
}
else if((ij)||(j0))
{
arr[i][j]=1;
printf(“%d “,arr[i][j]);
}
else
{
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
printf(”%d “,arr[i][j]);
}
}
printf(”\n”);
}
}
作业3:输入一个日期(yyyy-mm-dd),计算该日期距离1年1月1日
过了多少天
#include <stdio.h>
int main(int argc,const char* argv[])
{
unsigned int day=0,month=0,year=0;
printf(“输入日期:”);
scanf(“%u%u%u”,&year,&month,&day);
if(month>12||day>31)
{
printf(“输入数据有误!”);
}
int sum=0;
int i=0;
for(i=1;i<year;i++)
{
if(i%4000||(i%40&&i%100!=0))
{
sum+=366;
}
else
{
sum+=365;
}
}
int md=0;
int sum_1=0;
for(int m=1;m<month;m++)
{
if(m1||m3||m5||m7||m8||m10||m12)
{
md=31;
}
else if(m4||m6||m9||m11)
{
md=30;
}
else if(year%4000||(year%4==0&&year%100!=0))
{
md=29;
}
else
{
md=28;
}
sum_1+=md;
}
sum=sum+sum_1+day-1;
printf(“距离1年1月1日过了%u天”,sum);
}