数组:
**什么是数组:**相同类型变量的组合,是一种批量定义变量的方式
**定义:**类型 数据名[数量];
int num1,num2,num3,num4,num5;
=int arr[5];
使用: 数组名[下标];
arr[0] ==num1 arr[4] == num5
数组的下标从0开始,从0到n-1
**遍历:**与for循环配合使用,使用循环变量作为数组下标
int arr[5] = {1,2,3,4,5};
for(int i=0;i<5;i++)
{
printf("%d",arr[i]);
}
初始化: 类型 数组名[数量] = {1,2,3,4,5};
-
数组与普通变量一样,默认值是随机的,为了安全起见要对数组进行初始化
-
初始化数据过多时,编译器会产生警告,并且多出来的数据丢弃
-
初始化数据不足时,编译器自动补0
-
初始化只能逐个赋值,不能整体赋值
-
这种初始化语法只能在定义数组时使用,后面就要单个赋值
-
初始化时数组的长度可以省略,编译器会自动统计数据的个数并告诉数组
计算数组的长度:
sizeof(arr)/sizeof(arr[0])
数组越界:
为了程序运行效率不会检查数组下标
结果:
- 一切正常
- 段错误
- 脏数据:
int arr[10] = {};
for(int i=0;i<=10;i++)
{
arr[i] = i;
printf("%d ",arr[i]);//i=10时,arr[10]没有被赋值,i变成了1
}
练习:定义一个长度位10的数组并初始化,不能排序输出第二大的数
作业1:打印一个99乘法表
#include <stdio.h>
int main(int argc,const char* argv[])
{
for(int i = 1;i <= 9; i++)
{
for(int j = 1;j <= i;j++)//注意:j的赋值要在里面,for循环的第一层循环的循环常量可以在外面
{
printf("%d * %d = %02d ",j,i,i*j);
}
printf("\n");
}
}
作业2:编程解决百钱百鸡问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
#include <stdio.h>
int main(int argc,const char* argv[])
{
int gj,mj,xj;
//double xj;
for(gj = 0;gj<=20;gj++)
{
for(mj = 0;mj<=33;mj++)
{
xj=100-mj-gj;
if(gj*15+mj*9+xj==300)
{
printf("%d %d %d\n",gj,mj,xj);
}
/*if(gj*5+mj*3+xj/3==100)
{
printf("%d %d %g\n",gj,mj,xj); %g是除掉不必要的0
}*/
}
}
}
作业3:计算出100~1000的素数
#include <stdio.h>
int main(int argc,const char* argv[])
{
int num,i,cnt = 0;
for(num=100;num<=1000;num++)
{
cnt = 0;//***注意:这里的cnt在每次for循环后要重新置0!否则无法继续!!!
for(int i=2;i<num;i++)
{
if(num%i == 0)
{
cnt=1;
}
}
if(cnt == 0)
{
printf("%d ",num);
}
}
}
作业4:输入一个日期(yyyy-mm-dd),计算出从公元1年1月1日起,到这个日期为止过了多少天?
#include <stdio.h>
int main(int argc,const char* argv[])
{
short year = 0;
char month = 0;
char day = 0;
int days = 0;
int cnt = 0;
printf("请输入年月日:");
scanf("%hd%hhd%hhd",&year,&month,&day);
char isleap = (year%4 == 0 && year%100 != 0 ||year %400 ==0);//可以作为0,1计算
switch(month)
{
case 1:
days = day-1;break;
case 2:
days = 31+day-1;break;
case 3:
days = 31+28+isleap+day-1;break;
case 4:
days = 31+31+28+isleap+day-1;break;
case 5:
days = 30+31+31+28+isleap+day-1;break;
case 6:
days = 31+31+31+28+isleap+day-1;break;
case 7:
days = 30+31+31+31+28+isleap+day-1;break;
case 8:
days = 31+30+31+31+31+28+isleap+day-1;break;
case 9:
days = 31+31+30+31+31+31+28+isleap+day-1;break;
case 10:
days = 30+31+31+30+31+31+31+28+isleap+day-1;break;
case 11:
days = 365+isleap-31-30+day-1;break;
case 12:
days = 365+isleap-31+day-1;break;
}
for(int i=1;i<year;i++)
{
int leap = (i%4 == 0 && i%100 != 0 || i % 400 ==0);
//这里一开始用了前面的isleap,结果将每个年份都判断成了闰年,因为year默认为2020年
//应该重新定义一个,将year换成循环变量i
if(leap==1)
{
cnt++;
}
}
days = (year-1)*365 + days + cnt;
printf("%d\n",days);
}
int arr[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
arr[1] = 28 + (year%4 == 0 && year%100 != 0 ||year %400 ==0);
for(int m = 0)
{
}
作业5:显示以下图形,要求每个printf一次只能输出一个字符
**********
**********
**********
**********
**********
**********
**********
**********
**********
**********
#include <stdio.h>
int main(int argc,const char* argv[])
{
for(int j = 0;j<10;j++)
{
for(int k = 10;k>=j;k--)
{
printf(" ");
}
for(int i = 0;i<10;i++)
{
printf("*");
}
printf("\n");
}
}
练习1:定义一个长度为10的数组并初始化,计算出最大值,最小值,平均值。
练习2:定义一个长度为10的数组并初始化,进行升序排序。
#include <stdio.h>
int main(int argc,const char* argv[])
{
int max = 0,min = 0;
int arr[] = {3,6,2,10,5,4,7,1,8,9};
int t = 0;
float avr = 0,sum = 0;
for(int i = 0;i<9;i++)
{
for(int j = i+1;j<10;j++)
{
if(arr[i]>arr[j])
{
t = arr[i];
arr[i] = arr[j];
arr[j] = t;//交换位置
//注意:赋值时右边的给左边赋值!!!!
}
}
}
for(int i = 0;i<10;i++)
{
printf("%d ",arr[i]);
sum += arr[i];
}
max = arr[9];
min = arr[0];
avr = sum/10;
printf("max = %d,min = %d,avr = %g ",max,min,avr);
}
#include <stdio.h>
int main()
{
int arr[10] = {2,4,2,4,3,5,6,8,9,7};
int max = arr[0],min = arr[0];
float 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];
}
printf("max = %d,min = %d,avg = %g\n",max,min,sum/10);
}