数组
⑴知识点
1.定义一维数组
数组类型 数组名数组下标
例如:int a[10];
定义数组时不能使用变量定义数组的大小.
2.初始化一维数组
例如:a[5]={1,2,3,4,5};
3.定义二维数组时第二维的长度声明永远都不能省略.
4.排序
㈠交换排序
int i,j,temp,n,a[1000];
for(i=0;i<n–1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[j]>a[i])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
}
㈡选择排序(效率较高)
int i,j,k,temp;
for(i=0;i<n-1;i++)
{
k=1;
for(j=i+1;j<n;j++)
{
if(a[j]>a[k])//按数组a的元素值从高到低排序
{
k=j;//记录最大数下标位置
}
}
if(k!=i)//若最大数所在的下标位置不在下标位置i
{
temp=a[k];
a[k]=a[i];
a[i]=temp;
}
}
㈢插入排序
int i,l,temp,a[num];
for(i=1;i<num;i++) { l= i-1;temp=a[i]; while(l>=0&&a[l]>temp) { a[l+1]=a[l]; l–; } a[l+1]=temp; }
}
㈣冒泡排序
int a[n],t;
for (int i=1; i<=n; ++i)
cin>>a[i];//输入十个数 for (int j=1; j<=n-1; ++j)//冒泡法排序 for (int i=1; i<=n-j; ++i)//两两相比较 if (a[i]<a[i+1])//比较与交换 {
t=a[i]; a[i]=a[i+1]; a[i+1]=t;
} 5.查找
折半查找
int low,high,a[n],mid,temp;
low=0,high=n-1,mid=0; while(low<=high)
{ mid=(low+high)/2; if(a[mid]>temp) high=mid-1; else if(a[mid]<temp) low=mid+1; else couture<<a[mid]<<endl; } cout<<“Not Found!”<<endl; }
6.字符数组与字符串数组
㈠定义并初始化字符数组
存放5个字符char a[5]={‘a’,‘b’,‘c’,‘d’,‘e’};
存放1个字符串
char a[5]={‘a’,‘b’,‘c’,‘d’,’\0’};
char a[5]=“abcd”;
二维数组初始化
char a[3][4]={“abc”,“cvx”,“rty”}
㈡输入字符串
①scanf("%s",字符串名称);
scanf("%s%s%s",s1,s2,s3);
输入多个字符串时,以空格分离.
②gets语句
gets(字符串名称);
只能输入一个字符串.
从光标开始到换行符也就是说读入的是一整行.
例如输入Hello World!获取的是Hello World!
㈢输出字符串
①printf("%s",字符串名称);
输出项只能是字符串名称,不能是数组元素。
输出字符串不包括字符串结束标识符’\0’。
②puts语句
puts(字符串名称);
puts语句输出一个字符串和一个换行符。
⑵解决问题
一维数组
①输入n个数,要求程序按输入时的逆序把这n个数打印出来,已知整数不超过100个。
②将a数组中第一个元素移到数组末尾,其余数据依次往前平移一个位置。
③服务员开关门问题
④约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;···输出依次出圈的人的编号。M,N由键盘输入。
⑤编程输入十个正整数,然后自动按从大到小的顺序输出。
二维数组
①蛇形填数:在nn方阵里填入1,2,3,···,nn,要求填成蛇形。
②变化的矩阵
③打印杨辉三角形的前10行。
字符数组
①一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。
②判断最长的单词。
⑶感想
在学习数组之后,又能进一步解决复杂的问题,还能在实际问题中应用编程语言,数组与循环的密切联系是我们对于程序设计有了更深的理解。而在本章节中,对问题的理解和分析能力更加重视,先在脑海中对问题有个大概的框架,再在编程的过程中一步一步完善。数组的应用在c语言中是非常重要的,可以将前面学的知识联系起来。数组的内容比较难,所以我们要多联系,多做题,理解本质。