一维数组
一般形式:
数组类型 数组名[下标]; //数组下表从0开始
一维数组初始化
1.在定义数组是直接对数组元素赋初值
2.在定义数组是对部分数组元素赋初值,未赋值的部分元素值为0
3.在对全部数组元素赋初值时可以不指定数组长度
二维数组
一般形式
数组类型 数组名[常量表达式1][常量表达式2];
二维数组的初始化
1.将所有数组元素写在一个大括号内,如int array[2][2]={1,2,3,4};
2.为所有元素赋值,可以省略行下标但不能省略列下标int array[][3]={1,2,3,4,5,6};
3.也可以分组给数组元素赋初值int array[2][3]={{1,2,3,},{4,5,6}};
4.直接对数组元素赋初值int a[2][3]; a[0][0]=1;
字符数组
一般形式
char 数组名[下标]; //数组下表从0开始
字符数组的初始化
1.逐个字符元素赋初值
2.在数组赋初值时进行初始化,可以省略数组长度
3.利用字符串给字符数组赋初值例char array={"hello"};或者char array="hello";
字符数组的结束标志
c语言中字符数组保存字符串会自动在结束为止添加”\0“,因此在使用字符串赋值是会比字符逐个赋值时多占一个字节用于存放结束标志”\0“
字符数组的输入和输出
1.使用格式化%c进行输入和输出 printf("%c",array[3]);
2.使用格式化%s进行输入和输出 printf("%s",array);
备注:
1.%s格式化输出时,不包括结束符”\0“
2.printf的输出项是数组名
3.当数组长度大于字符串长度时,只输出到”\0“为止
4.若一个数组包含多个”\0“,那也只输出到第一个”\0“为止
多维数组
多维数组合理根据二维数组类比得到,这里略。
数组排序
数组的排序算法
选择法排序
选择法排序即每次选择所要排序的数组中的最大值的数组元素(由大至小排序,若是由小至大则每次选择最小值),将这个值与最前面没有排序的数组元素的值交换
即每次选出未排序部分的最值放到排序部分的最后面
#include <stdio.h>
int main()
{
int i,j;
int a[10];
int iTemp;
int iPos;
printf("为数组元素赋值:\n");
/*从键盘为数组元素赋值*/
for(i=0;i<10;i++)
{
printf("a[%d]=",i);
scanf("%d", &a[i]);
}
/*从小到大排序*/
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;
}
/*输出数组*/
for(i=0;i<10;i++)
{
printf("%d\t",a[i]);/*输出制表位*/
if(i == 4) /*如果是第5个元素*/
printf("\n"); /*输出换行*/
}
return 0; /*程序结束*/
}
冒泡法排序
冒泡法排序是每次比较数组中相邻两个元素的值将较较小的值排在较大的值前面(从小到大排序)
#include<stdio.h>
#include <iostream.h>
int main()
{
int i,j;
int a[10];
int iTemp;
printf("为数组元素赋值:\n");
/*从键盘为数组元素赋值*/
for(i=0;i<10;i++)
{
printf("a[%d]=",i);
scanf("%d", &a[i]);
}
/*从小到大排序*/
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;
}
}
}
/*输出数组*/
for(i=0;i<10;i++)
{
printf("%d\t",a[i]);/*输出制表位*/
if(i == 4) /*如果是第5个元素*/
printf("\n"); /*输出换行*/
}
return 0; /*程序结束*/
}
交换法排序
交换排序法是将每一位数同其后面的所有数进行比较,若发现符合条件就交换两个数据。
#include <stdio.h>
int main()
{
int i,j;
int a[10];
int iTemp;
printf("为数组元素赋值:\n");
/*从键盘为数组元素赋值*/
for(i=0;i<10;i++)
{
printf("a[%d]=",i);
scanf("%d", &a[i]);
}
/*从小到大排序*/
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;
}
}
}
/*输出数组*/
for(i=0;i<10;i++)
{
printf("%d\t",a[i]);/*输出制表位*/
if(i == 4) /*如果是第5个元素*/
printf("\n"); /*输出换行*/
}
return 0; /*程序结束*/
}
插入排序法
插入排序法较为复杂。原理是抽出一个数据在前面的数据中选择一个合适的位置插入,然后继续下一个数据,直至完成排序。
#include <stdio.h>
int main()
{
int i;
int a[10];
int iTemp;
int iPos;
printf("为数组元素赋值:\n");
/*从键盘为数组元素赋值*/
for(i=0;i<10;i++)
{
printf("a[%d]=",i);
scanf("%d", &a[i]);
}
/*从小到大排序*/
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;
}
/*输出数组*/
for(i=0;i<10;i++)
{
printf("%d\t",a[i]);/*输出制表位*/
if(i == 4) /*如果是第5个元素*/
printf("\n"); /*输出换行*/
}
return 0; /*程序结束*/
}
折半法排序
折半法排序又成为快速排序,是选择一个中间值,然后把比中间值小的放在左边,大的放在右边,然后对两边递归这个过程。
#include <stdio.h>
void CelerityRun(int left, int right, int array[]);
int main()
{
int i;
int a[10];
printf("为数组元素赋值:\n");
/*从键盘为数组元素赋值*/
for(i=0;i<10;i++)
{
printf("a[%d]=",i);
scanf("%d", &a[i]);
}
/*从小到大排序*/
CelerityRun(0,9,a);
/*输出数组*/
for(i=0;i<10;i++)
{
printf("%d\t",a[i]);/*输出制表位*/
if(i == 4) /*如果是第5个元素*/
printf("\n"); /*输出换行*/
}
return 0; /*程序结束*/
}
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);
}
排序算法的比较
1.选择法排序 共进行n*(n-1)/2次比较,n-1次互换,简单容易,适用于数量较小
2.冒泡法排序 冒泡法是稳定的排序算法,最好情况比较n-1次,最差n^2次,待排序列有序时效果较好
3.交换法排序 和冒泡法类似,但是不稳定。待排序列有序时效果较好
4.插入法排序 需经过n-1次插入操作,若待排序列有序时运算速度较快
5.折半法排序 在排序数据较大时具有较快的排序速度,数据较小时反而较慢,而且是不稳定的算法。
字符串处理
字符串处理函数的使用需要引用头文件string.h
字符串复制
strcpy(目的字符数组名,源字符数组名);
把源字符数组中的字符串复制到目的字符数组中,字符串结束标志“\0"也一同复制。
字符串连接
strcat(目的字符数组名,源字符数组名);
把源字符数组中的字符串连接到目的字符数组的后面,并删除目的字符数组中的原来的结束标志“\0"
字符串比较
strcmp(字符数组名1,字符数组名2);
按照ASCⅡ码顺序比较两个数组中的字符串,并由函数返回值返回结果。
1=2返回值为0;1>2但会值为正数;1<2返回值为负数
字符串大小写转换
strupr(字符串);
将字符串中的小写字母换成大写字母其他不变
strlwr(字符串);
将字符串中的大写字母换成小写字母其他不变
strlen(字符数组名);
计算字符串的实际长度(不含结束标志"\0")
数组应用
反转输出字符串
#include <stdio.h>
int main()
{
int i;
char String[7] = {"mrsoft"};
char Reverse[7] = {0};
int size;
size = sizeof(String); /*计算源字符串长度*/
/*循环读取字符*/
for(i=0;i<6;i++)
{
Reverse[size-i-2] = String[i]; /*向目标字符串中插入字符*/
}
/*输出源字符串*/
printf("输出源字符串:%s\n",String);
/*输出目标字符串*/
printf("输出目标字符串:%s\n",Reverse);
return 0; /*程序结束*/
}
输出系统日期和时间
#include <stdio.h>
#include <time.h>
int main()
{
int command[4] = {0,1,2,3}; /*定义一个数组*/
int num;
struct tm *sysTime;
printf("如需帮助可输入数字0!\n"); /*输出字符串*/
printf("请输入命令符:\n"); /*输出字符串*/
while (1)
{
scanf("%d", &num); /*获得输入数字*/
/*判断用于输入的字符*/
if (command[0] == num) /*如果输入数字0 */
{
/*输出帮助信息*/
printf("输入数字1显示系统日期, 输入数字2显示系统时间, 输出字母3退出系统!\n");
}
else if (command[1] == num) /*如果是命令数字1*/
{
time_t nowTime;
time(&nowTime); /*获取系统日期*/
sysTime= localtime(&nowTime); /*转换为系统日期*/
printf("系统日期:%d-%d-%d \n",1900 + sysTime->tm_year,sysTime->tm_mon + 1
,sysTime->tm_mday); /*输出信息*/
}
else if (command[2] == num) //如果是命令数字2*/
{
time_t nowTime;
time(&nowTime); /*获取系统时间*/
sysTime = localtime(&nowTime); /*转换为系统时间*/
printf("系统时间:%d:%d:%d \n",sysTime->tm_hour ,sysTime->tm_min
,sysTime->tm_sec); /*输出信息*/
}
else if (command[3] == num)
{
return 0; /*退出系统*/
}
printf("请输入命令符:\n"); /*输出字符串*/
}
return 0; /*程序结束*/
}
字符串的加密和解密
#include <stdio.h>
#include<string.h>
int main()
{
int result = 1;
int i;
int count = 0;
char Text[128] = {'\0'}; /*定义一个明文字符数组*/
char cryptograph[128] = {'\0'}; /*定义一个密文字符数组*/
while (1)
{
if (result == 1) /*如果是加密明文*/
{
printf("请输入要加密的明文:\n"); /*输出字符串*/
scanf("%s", &Text); /*获取输入的明文*/
count = strlen(Text);
for(i=0; i<count; i++) /*遍历明文*/
{
cryptograph[i] = Text[i] + i + 5; /*设置加密字符*/
}
cryptograph[i] = '\0'; /*设置字符串结束标记*/
/*输出密文信息*/
printf("加密后的密文是:%s\n",cryptograph);
}
else if(result == 2) /*如果是解密字符串*/
{
count = strlen(Text);
for(i=0; i<count; i++) /*遍历密文字符串*/
{
Text[i] = cryptograph[i] - i - 5; /*设置解密字符*/
}
Text[i] = '\0'; /*设置字符串结束标记*/
/*输出明文信息*/
printf("解密后的明文是:%s\n",Text);
}
else if(result == 3) /*如果是退出系统*/
{
break; /*跳出循环*/
}
else
{
printf("请输入正确命令符:\n"); /*输出字符串*/
}
/*输出字符串*/
printf("输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:\n");
printf("请输入命令符:\n"); /*输出字符串*/
scanf("%d", &result); /*获取输入的命令字符*/
}
return 0; /*程序结束*/
}