数组
数组:是一种特殊的变量, 主要用于批量存储,声明数组相当于向计算机内存申请”一片”连续的存储单元。
数组的分类:一维数组和多维数组(二维数组,三维数组…)
一维数组声明的语法:
数据类型 数组名[数组的长度];
int nums[5];
数组的元素:数组中保存的值。
数组的下标:数组是同过下标进行表示元素的位置,数组的下标取值范围[0,长度-1]。
声明并赋值: 值的个数应该小于等于长度的个数。
数据类型 数组名[长度]={值1,值2….}
eg:int nums[5]={1,2,3,4,5};//正确
int nums[5]={1,2,3,4};//正确
int nums[5]={1,2,3,4,5,6};//错误,出现越界情况
int nums[]={1,2,3,4,5,6};//正确
注意: 数组的元素类型必须与声明数组时的数据类型相对应,数组中保存元素的个数的个数不能超过数组的长度。
int nums[5]; nums[0]=10; nums[1]=20; nums[2]=30; nums[3]=40; nums[4]=50; //nums[5]=60; //数组下标越界 printf("下标位置为%d的元素为:%d\n",0,nums[0]); printf("下标位置为%d的元素为:%d\n",1,nums[1]); printf("下标位置为%d的元素为:%d\n",2,nums[2]); printf("下标位置为%d的元素为:%d\n",3,nums[3]); printf("下标位置为%d的元素为:%d\n",4,nums[4]);
int nums[5]; int i,j; for(i=0;i<5;i++){ nums[i]=(i+1)*10;//nums[0]=10,nums[1]=20;... } for(j=0;j<5;j++){ printf("下标位置为%d的元素为:%d\n",j,nums[j]); }
/*获取5个学生的成绩,计算其最高分,最低分,平均分。 分析: 1.获取用户输入的5个学生的成绩(声明一个长度为5的数组用于保存学生成绩) 2. 计算平均分: 平均分=总成绩/人数; 总成绩=学生1的成绩+学生2的成绩+....+学生5的成绩 3.最低分如何计算? 最高分如何计算? 假设第一个元素是最高的,然后让其后的元素挨个与其比较,如果后边的元素必当前元素高,后边这个元素就是最高的 假设第一个元素是最低的,然后让其后的元素挨个与其比较,如果后边的元素必当前元素第,后边这个元素就是最低的*/ int scores[5];//声明一个数组用于保存学生成绩 int i,sum=0,avg=0,max,min; //循环获取用户输入的成绩,并将其保存到数组中 for(i=0;i<5;i++){ printf("请输入第%d个学生的成绩:\n",i+1); //获取用户输入的成绩,并将其保持到数组中 scanf("%d",&scores[i]);//&scores[0],&score[1]...scores[4] } //假设第一个学生的成绩为最高的 max = scores[0]; //假设第一个学生的成绩为最低的 min = scores[0]; //遍历:获取数组中的每一个元素 for(i=0;i<5;i++){ sum+=scores[i]; //计算总成绩 //计算最高分 if(scores[i]>max){ max = scores[i];// } //计算最低分 if(scores[i]<min){ min = scores[i]; } } avg = sum/5;//计算平均成绩 printf("平均分为:%d,最高分:%d,最低分:%d\n",avg,max,min);
/*在数组查找(搜索)指定元素,如果存在打印其在数组中下标,否则打印"该元素不存在" 分析: 1.获取用户要查找的元素 2.遍历数组中元素,挨个进行比较,如果相等则输出其下标,否则输出"该元素不存在" */ int nums[]={10,20,30,40,50}; int i,search,flag=0;//flag代表是否存在该元素,0代表不存在,1代表存在 printf("请输入要查找的元素:\n"); scanf("%d",&search);//获取用户要查找的元素 for(i=0;i<5;i++){ if(nums[i]==search){ printf("您要查找的元素%d在数组下标位置%d\n",search,i); flag=1; break; } } if(flag==0){ printf("您要查找的元素%d在数组不存在!\n",search); }
/*完成数组元素复制。 分析: int nums[5]={10,20,30,40,50}; int nums2[5]; 1.声明连个数组,并为第一个数组赋值 2.遍历第一个数组,并将其值赋值给第二数组*/ int nums[5]={10,20,30,40,50}; int nums2[5]; int i; for(i=0;i<5;i++){ nums2[i]=nums[i]; } //遍历输出nums2 printf("nums2数组中的元素为:"); for(i=0;i<5;i++){ printf("%d\t",nums2[i]); }
/*数组的合并:将nums1和nums2进行合并,将nums2中的元素追加到nums1的后边。*/ int nums1[5]={1,2,3,4,5}; int nums2[5];//用于保存用户输入的数据 int nums3[10]; //获取用户输入的数并将其保存到nums2中 int i,j,k; for(i=0;i<5;i++){ printf("请输入第%d个数:",i+1); scanf("%d",&nums2[i]);//将用户输入的数据保存到nums2中 } //合并nums1和nums2:将nums2中元素追加到nums1中的后边 // for(j=0;j<5;j++){ // nums3[j]=nums1[j];//将nums1中元素保存到nums3中 // nums3[5+j]=nums2[j];//将nums2中的元素保存到nums3中 //} for(j=0;j<5;j++){ nums3[2*j]=nums1[j];//将nums1中元素保存到nums3中 nums3[2*j+1]=nums2[j];//将nums2中的元素保存到nums3中 } printf("nums3数组中的元素为:"); for(k=0;k<10;k++){ printf("%d\t",nums3[k]); }
//删除数组中指定下标元素 int nums[5]; int i,j,k,index; for(i=0;i<5;i++){ printf("请输入第%d个元素",i+1); scanf("%d",&nums[i]);//获取用户输入 } printf("请输入删除元素的下标(0~4):\n"); scanf("%d",&index); if(index<0||index>4){ printf("您输入的下标越界,请重新输入!\n"); }else{ for(j=index;j<5;j++){ nums[j]=nums[j+1]; } printf("删除后元素为:"); for(k=0;k<4;k++){ printf("%d\t",nums[k]); } }
数组中常用的算法
冒泡排序: 将相邻的元素进行两两比较,大的向后”冒”, 小的向前”赶”。
口诀: N个数字来排队,两两比较小靠前
外层循环N-1(控制需要比较的轮数)。
内层循环N-1-i(控制每轮需要比较的次数)。
int nums[5]; int i,j,k,temp; for(i=0;i<5;i++){ printf("请输入第%d个元素:",i+1); scanf("%d",&nums[i]);//获取用户输入的元素,并将其保存到数组中 } //对数组中元素进行排序 //外层循环控制需要比较的轮数:每轮比较结束后可以确定一个最大的。 for(j=0;j<4;j++){ //内层循环控制每轮需要比较的次数 for(k=0;k<4-j;k++){ //两两进行比较,如果前边元素大于后边的元素,需要交换位置 if(nums[k]>nums[k+1]){ temp = nums[k]; nums[k]=nums[k+1]; nums[k+1]=temp; } } } printf("排序后:\n"); for(i=0;i<5;i++){ printf("%d\t",nums[i]); }
二分法查找(折半查找):前提查找的元素必须有序。
原理:将待查找的数字与数组中的中间位置进行比较。
如果比中间位置的元素值小,去左边查找(更改结束位置)
如果比中间位置的元素值大,去右边查找(更改起始位置)
int nums[9]={1,2,3,4,5,6,7,8,9}; int search,left,right,middle; int count=0; printf("请输入待查找的元素:\n"); scanf("%d",&search); left=0;//起始下标,默认第一个元素的下标 right=8;//结束下标,默认最后一个元素的下标 while(left<right){ count++;//统计查找的次数 middle=(left+right)/2;//中间位置 //待查找的元素必中间位置元素的值大,到右边查找,更改起始位置 if(search>nums[middle]){ left = middle+1; }else if(search<nums[middle]){ //待查找的元素必中间位置元素的值小,到左边查找,更改结束位置 right = middle-1; }else{ printf("您要查找的元素位于数组的下标位置为:%d\n",middle); break; } } printf("总共用了%d次查找到元素\n",count);
二维数组:一维数组的每一个元素又一个数组。
声明的语法:
数据类型 数组名[一维长度][二维长度];
int nums[4][2];
声明并赋值:
数据类型 数组名[一维长度][二维长度] ={{值1,值2..},{值n,值n+1..}}
int num[3][2]={{1,2},{3,4},{5,6}};//正确
int num[][2]={{1,2},{3,4},{5,6}};//正确
int num[3][]={{1,2},{3,4},{5,6}};//错误
//声明一个二维数组用于保存3个班级的成绩信息,每个班级包含3名学生。 int scores[3][3];//用于保存三个班级的学生信息,每个班级3个人。 int i,j; //为一班学生的成绩赋值 scores[0][0]=10; scores[0][1]=20; scores[0][2]=30; //为二班学生的成绩赋值 scores[1][0]=40; scores[1][1]=50; scores[1][2]=60; //为三班学生的成绩赋值 scores[2][0]=70; scores[2][1]=80; scores[2][2]=90; //二维数组的遍历 for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf("%d\t",scores[i][j]); } printf("\n"); }
//声明一个"3行3列"的二维数组,用于保存用户输入的整数,计算其对角线之和. int nums[3][3]; int i,j,sum=0;//sum保存对角线之和 for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf("请输入第%d行第%d列的数据",i+1,j+1); scanf("%d",&nums[i][j]); } } //遍历二维数组 for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf("%d\t",nums[i][j]); //对角线上的数据在二维数组中的保存位置是i和j相同 if(i==j){ sum+=nums[i][j]; } } printf("\n"); } printf("对角线之和为:%d\n",sum);
//从键盘上输入9个整数,保存在二维数组中按数组原来位置输出第一行和第一列的所有元素之和. int nums[3][3]; int i,j,sum=0; for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf("请输入第%d行第%d列:",i+1,j+1); scanf("%d",&nums[i][j]); } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf("%d\t",nums[i][j]); //计算第一行和第一列所有元素之和 if(i==0||j==0){ sum+=nums[i][j]; } } printf("\n"); } printf("第一行和第一列所有元素之和为%d:",sum);
//求二维数组(3行3列)中最大元素值及其行列号 int nums[3][3]; int i,j,max, x,y; for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf("请输入第%d行第%d列:",i+1,j+1); scanf("%d",&nums[i][j]); } } //假设第1行第1列最大 max = nums[0][0]; for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf("%d\t",nums[i][j]); if(nums[i][j]>max){ max = nums[i][j]; //保存最大元素的下标 x=i; y=j; } } printf("\n"); } printf("最大元素的值为%d,其位于第%d行%d列\n",max,x+1,y+1);
/*打印杨辉三角 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 分析: 1.声明一个二维数组用于保存杨辉三角中的数据 int nums[5][5]; 2.第一列nums[i][0]和对角线上的数字(nums[i][i])为1。 3.除第一列和对角线上的数字之外,其余数字nums[i][j]=nums[i-1][j]+nums[i-1][j-1]; */ int nums[5][5]; //为第一列和对角线赋值为1 int i,j; for(i=0;i<5;i++){ nums[i][0]=1;//为第一列上的元素赋值为1 nums[i][i]=1;//为对角线上的元素赋值为1 } //为除第一列和对角线之外元素赋值 for(i=2;i<5;i++){ for(j=1;j<i;j++){ nums[i][j]=nums[i-1][j]+nums[i-1][j-1]; } } //遍历输出 for(i=0;i<5;i++){ for(j=0;j<=i;j++){ printf("%d\t",nums[i][j]); } printf("\n"); }