C语言学习日记 week2 day1
好了,新的一周开始了,今天学的主要是数组,顾名思义就是一组数据;
一、数组的意义和写法规范
类似于变量,数组同样需要进行定义,根据定义的不同在内存中分配不同的空间,一个数组中的数据会被连续的存储在内存中;
一般定义数组的格式为:
ArrayType ArrayName[值1][值2][值3][值4].....;
ArrayType代表要声明的数组类型比如:int,float,char等等,值得注意的是同一个数组中的数据类型必须相同;
ArrayName代表定义数组的标识符;
[值1][值2][值3]...代表了定义的数组的数量,值1代表第一个纬度,值2代表第二个纬度....根据需求的不同可以定义不同纬度的数组,每个纬度的值代表了这个纬度的数量,从0开始计数;容易得出数组中数据的个数=值1*值2*值3....;
数组中的元素进行引用一般直接直接列出需要引用元素的坐标:arrayName[i][j][k]...其中(i<值1,j<值2...)
例如:a[2][3]指的是数组a中第一维的第3个中第二维的第4个
在对数组定义的时候要注意以下几点:
1、[]中的值一定是一个可以确定的正整数;除非在定义的时候进行初始化,系统会根据要初始化的数据个数来自动分配数组的大小如:int arr[]={1,2,3};(表示定义了一个含有3个整形数据的一维数组,并依次赋值1,2,3)和 int arr[3]; arr[0]=1; arr[1]=2; arr[2]=3; 是等价的;
2、可以在声明的时候对数组初始化,比如:
int arr[3] = {10, 9, 6}; int arr[2][2]={(1,2),(3,4)}; int arr[2][2]={1,2,3,4};跟前者是等价的;
int arr[3] = {10,9}; int arr[][2]={(1,2)(3,4)};跟上面同样等价(我总结为第一维的值可以缺省)
int arr[] = {11, 7, 6};
3、常见的错误:
int a[]; int[4] a; int a[b]; a={10, 11}; a[4]={10,9,8,5};
二、数组应用
示例一:
简单应用
#include<stdio.h> void main() { //声明数组: 数据类型 数组名[数组长度] ; int scores[5]; //为数组赋值: 数组名[下标]=值; --->下标从0开始 scores[0]=10; scores[1]=20; scores[2]=30; scores[3]=40; scores[4]=50; //获取数组中的元素: 数组名[下标]; printf("%d,%d,%d,%d,%d\n",scores[0],scores[1], scores[2],scores[3],scores[4]); //声明赋值一步完成: 数据类型 数组名[长度]={值1,值2....};注意:对应的值的个数应该与长度对应 int nums[5]={1,2,3,4,5}; printf("%d,%d,%d,%d,%d\n",nums[0],nums[1], nums[2],nums[3],nums[4]); }
示例2:
让用户输入5个成绩,根据用户输入的成绩计算最高分,最低分和平均分
#include <stdio.h> void main() { int scores[5];//声明一个数组用于存储用户输入的成绩 int sum=0,avg;//总成绩和平均成绩 int max;//最高分 int min;//最低分 int i; //循环获取用户输入的成绩,并将其输入成绩保持到数组中 for(i=0;i<5;i++){ printf("请输入第%d个人成绩:",i+1); scanf("%d",&scores[i]); sum+=scores[i]; //计算总成绩 } avg=sum/5;//计算平均成绩 min=max=scores[0];//假设第一个人的成绩是最高分,最低分 for(i=1;i<5;i++){ if(scores[i]>max){//获取最高分 max=scores[i]; } if(scores[i]<min){//获取最低分 min=scores[i]; } } printf("平均分为:%d,最高分是%d,最低分%d\n",avg,max,min); }
示例3:
冒泡排序的应用
#include <stdio.h> void main() { int nums[]={10,3,8,1,6}; int i,j,temp;
//外层控制比较的轮数(5个数字比较4轮) for(i=0;i<4;i++){ //内层循环控制每轮比较的次数 for(j=0;j<4-i;j++){ if(nums[j]>nums[j+1]){//每次对前后两个数字进行比较通过交换位置将大者后移一位 temp=nums[j]; nums[j]=nums[j+1]; nums[j+1]=temp; } } //在此行插入 printf("%d\t",num[4-i]);可得到降序结果 } printf("排序后的数字为:"); //利用循环遍历输出 for(i=0;i<5;i++){ printf("%d\t",nums[i]); }
示例4:
另一种数组排序方法(根据老师留的作业自己写得)
#include <stdio.h> void main() { int nums[5],i,j,temp; for(i=0;i<5;i++){ printf("请输入需要进行排序的第%d个数字:",i+1); scanf("%d",&nums[i]); } for(i=0;i<5;i++){ for(j=i;j<5;j++){//每一轮内循环得出一个最大数置于循环内的第一位 if(nums[j]>nums[i]){ //每个数跟循环内的第一个值比较,如果大的交换位置置于第一位 temp=nums[j]; nums[j]=nums[i]; nums[i]=temp; } } printf(" %d :",nums[i]); } printf("即为数组中由高到低顺序\n"); }
示例5:
二维数组应用
打印杨辉三角(这个也是今天老师留的作业之一,稍微润色了一点直接拿了,还没经过老师批改)
#include <stdio.h> void main() //zhaoyi 3.20 test4 //打印杨辉三角 { int size; printf("请输入你要打印的杨辉三角的高度:"); scanf("%d",&size); int arr[size+1][size+1]; //假设杨辉三角为一个正方形其空白处均为0 int i,j; //在杨辉三角外围加一行一列方便计算 for(i=0;i<size+1;i++){ for(j=0;j<size+1;j++){ if(i==0||j==0){ // 将最外围的一行和一列赋值为0 arr[i][j]=0; } else if(i==1&&j==1){ //将第一个基数1定位在第二行第二列开始依次根据公式计算 arr[i][j]=1; }else{ arr[i][j]=arr[i-1][j]+arr[i-1][j-1]; } if(arr[i][j]!=0){ printf("%d\t",arr[i][j]); }else{ continue; //打印出数组中计算所得的数字如果为0则不打印 } } printf("\n\n"); //换行 } }
3.21日修改杨辉三角: 仔细斟酌后发现上面的有很多赘余的部分,经过精简如下:
#include <stdio.h> void main() //zhaoyi 3.20 test4 //打印杨辉三角 { int size; printf("请输入你要打印的杨辉三角的高度:"); scanf("%d",&size); int arr[size][size]; int i,j; for(i=0;i<size;i++){ for(j=0;j<i+1;j++){ if(i==j||j==0){ //定义第一列和对角线均为1 arr[i][j]=1; }else{ arr[i][j]=arr[i-1][j]+arr[i-1][j-1];//杨辉三角内卜元素算法 } printf("%d\t",arr[i][j]); } printf("\n\n"); //换行 } }
至此结束。