1、一维数组
一维数组是用于存储一维数列中数据的集合。一般形式为
类型说明符 数组标识符[常量表达式] ,例如:int iArray[5];
一维数组的引用:
数组标识符[下标] ;例如:iArray[2];
一维数组的初始化:
(1)定义数组时直接对数组元赋初值
(2)只给一部分元素赋值,为赋值的部分元素值为0
(3)在对全部数组元素赋初值时可以不指定数组长度
2、二维数组
一般形式:
数据类型 数组名[常量表达式1][常量表达式2];
常量表达式1为行下标,常量表达式2为列下标
二维数组元素的引用形式:
数组名[下标][下标];
二维数组的初始化
(1)可以将所有数据写在一个大括号内,按照数组元素排列顺序最元素赋值
(2)在为所有元素赋值时,可以省略行下标,但是不能省略列下标
(3)可以分行个数组元素赋值。例如:int a[2][3]={{1,2,3},{4,5,6}}
(4)二维数组也可以直接对数组元素赋值
3、字符数组
数组中的元素类型为字符型时称为字符数组。字符数组的定义和使用方法和其他类型的数组类似。
字符数组的结束标志是“\0”,即,要比数值型数组存储时多用一个字节。
4、多维数组
多维数组的声明和二维数组相同,只是下标更多。
5、数组的排序算法
(1)、选择法排序:指每次选择所要排序的数组中的最大值(由大到小排序)的数组元素,将这个数组元素的值与前面没有进行排序的数组元素互换。即:
最后一个元素和最前面没有排序的数比较
/*从小到大排序*/
for(i=0;i<9;i++) /*设置外层循环为下标0~8的元素*/
{
iTemp = a[i]; /*设置当前元素为最小值*/
iPos = i; /*记录元素位置*/
for(j=i+1;j<10;j++) /*内层循环i+1到9*/
{
if(a[j]<iTemp) /*如果当前元素比最小值还小*/
{
iTemp = a[j]; /*重新设置最小值*/
iPos = j; /*记录元素位置*/
}
}
/*交换两个元素值*/
a[iPos] = a[i];
a[i] = iTemp;
}
(2)、冒泡法排序:指在排序时,每次比较数组中相邻的两个数组元素的值,将较小的数(从小到大排序)排在较大的数前面。即:
从最后一个元素开始依次和前面的元素比较,小则靠前。
/*从小到大排序*/
for(i=1;i<10;i++) /*外层循环元素下标为1~9*/
{
for(j=9;j>=i;j--) /*内层循环元素下标为i~9*/
{
if(a[j]<a[j-1]) /*如过前一个数比后一个数大*/
{
/*交换两个数组元素的值*/
iTemp = a[j-1];
a[j-1] = a[j];
a[j] = iTemp;
}
}
}
(3)、交换法排序:将每一位数与气候的所有数一一比较,如果发现符合条件的数据则交换数据。即,
依次比较,满足条件换,没满足条件就保持那个位子,然后由又用前面的数依次比较。
/*从小到大排序*/
for(i=0;i<9;i++) /*外层循环元素下标为0~8*/
{
for(j=i+1;j<10;j++) /*内层循环元素下标为i+1到9*/
{
if(a[j] < a[i]) /*如果当前值比其他值大*/
{
/*交换两个数值*/
iTemp = a[i];
a[i] = a[j];
a[j] = iTemp;
}
}
}
(4)、插入法排序:基本工作原理是抽出一个数据,在前面的数据中寻找相应的位置插入,然后继续下一个数据,直到完成排序。
即取一个数放一个位置,取后一个数与前面排好了的数比较再放入。
/*从小到大排序*/
for(i=1;i<10;i++) /*循环数组中元素*/
{
iTemp = a[i]; /*设置插入值*/
iPos = i-1;
while((iPos>=0) && (iTemp<a[iPos])) /*寻找插入值的位置*/
{
a[iPos+1] = a[iPos]; /*插入数值*/
iPos--;
}
a[iPos+1] = iTemp;
}
(5)、折半法排序:又称快速排序,是选择一个中间值middle(在程序中使用数组中间值),然后把比中间值小的数据放在左边,比中间值打的数据放在右边(具体的实现是从两边找,找到一对后进行交换)。然后对两边分别进行递归使用这个过程。即:从两头出发和中间的比较,两边都停止时(左边的比中间的大,右边的比中间的小)然后交换这两个停下的数,下次从
xxxx开始
void CelerityRun(int left, int right, int array[])
{
int i,j;
int middle,iTemp;
i = left;
j = right;
middle = array[(left+right)/2]; /*求中间值*/
do
{
while((array[i]<middle) && (i<right)) /*从左找小于中值的数*/
i++;
while((array[j]>middle) && (j>left)) /*从右找大于中值的数*/
j--;
if(i<=j) /*找到了一对值*/
{
iTemp = array[i];
array[i] = array[j];
array[j] = iTemp;
i++;
j--;
}
}while(i<=j); /*如果两边的下标交错,就停止(完成一次)*/
/*递归左半边*/
if(left<j)
CelerityRun(left,j,array);
/*递归右半边*/
if(right>i)
CelerityRun(i,right,array);
6、排序算法的比较
插入法、冒泡法、交换法排序的速度比较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度;在这种情况下,折半法排序反而会显得速度慢了。当n较小时,对稳定性不作要求时宜用选择法排序,对稳定性有要求时宜用插入法或冒泡法排序。
7、字符串处理函数:要添加头文件string.h
(1)字符串复制:
strcpy(目的字符串组名,源字符串组名)
(2)字符串连接:
strcat(目的字符数组名,源字符数组名)
(3)字符串比较:
strcmp(字符数组名1,字符数组名2)。按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果(1>2=正;1<2=负;1=2=0;)
(4)字符串中小写字母变大写:
strupr(字符串)
(5)字符串中大写字母变小写:
strlwr(字符串)
(6)获得字符串长度:
strlen(字符数组名)
8、反转输出字符串
int main()
{
int i;
char String[7] = {"mrsoft"};
char Reverse[7] = {0};
int size;
size = sizeof(String); /*计算源字符串长度*/
/*循环读取字符*/
for(i=0;i<6;i++) //是6是因为字符串的大小为6,又是从0开始的,
{
Reverse[size-i-2] = String[i]; /*向目标字符串中插入字符*///“size-i-2”是因为String末尾一位是"\0",i的排位是从0开始,“size-1”结束。
}
/*输出源字符串*/
printf("输出源字符串:%s\n",String);
/*输出目标字符串*/
printf("输出目标字符串:%s\n",Reverse);
printf("%d\n",size);
getchar();
return 0; /*程序结束*/
9、获取系统日期和时间(要添加头文件time.h)
输出系统日期:
time_t nowTime;
time(&nowTime); /*获取系统日期*/
sysTime= localtime(&nowTime); /*转换为系统日期*/
printf("系统日期:%d-%d-%d \n",1900 + sysTime->tm_year,sysTime->tm_mon + 1
sysTime= localtime(&nowTime); /*转换为系统日期*/
printf("系统日期:%d-%d-%d \n",1900 + sysTime->tm_year,sysTime->tm_mon + 1
,sysTime->tm_mday);
输出系统时间:
time_t nowTime;
time(&nowTime); /*获取系统时间*/
sysTime = localtime(&nowTime); /*转换为系统时间*/
printf("系统时间:%d:%d:%d \n",sysTime->tm_hour ,sysTime->tm_min
sysTime = localtime(&nowTime); /*转换为系统时间*/
printf("系统时间:%d:%d:%d \n",sysTime->tm_hour ,sysTime->tm_min
,sysTime->tm_sec); /*输出信息*/ /*输出信息*/