目录
二维字符型数组
排序
字符串排序的基本算法思想和数值的排序差不多,只是在判断时,不能整体操作,但可以使用strcmp来完成字符串的比较,涉及交换时,用strcpy完成拷贝,完成的操作和单个数值赋值的思想差不多。
//定义一个二维字符型数组用来存放多个字符串
char s[5][20];
int i,j;
//用gets获得5个字符串
for (i = 0;i < 5;i++)
{
gets(s[i]);
}
//选择排序
for (i = 0;i < 4;i++)
{
for (j = i+1;j < 5;j++)
{
//如果后一个字符串比当前位置上的字符串小,则将后一个字符串与当前字符串进行交换
if (strcmp(s[i],s[j]) > 0)
{
//数组不能整体操作,但是从字符串角度出发,可以用strcpy函数将字符串拷贝存放到临时的
//字符型数组中。
char temp[20];
strcpy(temp,s[i]);
strcpy(s[i],s[j]);
strcpy(s[j],temp);
}
}
}
//冒泡排序
for (i = 0;i < 4;i++)
{
for (j = 0;j < 4-i;j++)
{
//相邻两个字符串两两比较,如果前面的字符串比后面大,则交换位置,知道倒数第二个与最后一个比完,进入下一次冒泡
if (strcmp(s[j],s[j+1]) > 0)
{
char temp[20];
strcpy(temp,s[j+1]);
strcpy(s[j+1],s[j]);
strcpy(s[j],temp);
}
}
}
//选择排序
for (i = 0;i < 5;i++)
{
//记录想要插入的位置(不一定是最后的位置)
j = i;
//用临时的字符型数组存放当前的字符串
char temp[20];
strcpy(temp,s[i])
//找到最后应该放的位置
//用当前取出的字符串与前一个比较,如果前一个更小,那最后应该放的位置就是当前位置
//如果当前的字符串比前一个还小,那就将前一个字符串往后挪一个位置,记录位置的j就应该-1
//再跟更新了值的j的前一个比较,重复上面的操作,知道没有位置可以再往前或者找到的前一个字符串比自己小,就不找了,当前j的值就是最后的位置
while (j > 0 && strcmp(temp,s[j-1]) < 0)
{
strcpy(s[j],s[j-1]);
j--;
}
//将当前的值插入到最后应该放的位置
strcpy(s[j],temp);
}
//打印输出所有字符串
for (i = 0;i < 5;i++)
{
printf("%s ",s[i]);
}
查找
查找使用的是二分查找方法,设计比较时,用strcmp来实现比较大小。
//二分查找法,假设输入的字符串s是有序的
char s[5][20];
int i;
for (i = 0;i < 5;i++)
{
gets(s[i]);
}
//定义一个dest字符型数组,并用gets获取要查找的字符串存储到dest中
char dest[20];
gets(dest);
int begin,end,mid;
//找到开始查找和结束查找的字符串的下标(即位置)
begin = 0;
end = 4;
while (begin <= end)
{
//找到中间位置
mid = (begin + end) / 2;
//如果中间位置的字符串小于要查找的字符串,则往上半区找
if (strcmp(dest,s[mid]) > 0)
{
begin = mid + 1;
}
//如果大于,就往下半区找
else if (strcmp(dest,s[mid]) < 0)
{
end = mid - 1;
}
//找到则提前退出循环
else
{
break;
}
}
//如果循环是提前结束的,循环的条件还满足,表示找到了和目标字符串一样的字符串
if (begin <= end)
{
printf("have found\n");
}
//否则,循环正常结束,begin的位置比end的位置还靠后,说明没找打
else
{
printf("not found\n");
}
函数(function)
函数的思想:从上到下,逐步求解的过程。即将要解决的问题拆解成不同的部分,使问题更容易解决。
函数的定义:表示把功能实现出来,跟数学相似,你要求一个正方形的面积时,你得知道正方形面积的公式,就是把这个公式造出来。
//1.类型标识符:返回值的数据类型 表示函数要带出的结果的类型
//注意:数组类型不能做函数返回值的类型
//如果设计为为void类型,一般不写return,或者return后不接其他东西
//2.函数名:命名方法跟变量命名方法相同
//3.形式参数:表示该函数需要用到的数据 表明将来这个函数使用时要用到的实际参数怎么写
//4.函数体代码:完成该函数的功能的代码
类型标识符 函数名()
{
函数体代码
}
//类型说明符不写默认为int类型
//如果返回结果的类型与类型说明符不一致,最终都会转换为类型说明符的类型。
函数设计步骤:
1.先确认函数名(要求命名时需要能让人表面该函数大概是什么功能)
2.考虑函数需要用到哪些数据——形参 (必须明确参数的类型)
3.处理数据,完成函数体代码的编写。
4.考虑要不要返回结果,这个结果的数据类型是类型标识符规定的。如果不需要返回值,一般设计为空类型(void)。
函数设计实例:
int add(int num1,int num2)
{
//局部变量
int sum;
//实现两个数求和功能的代码
sum = num1 + num2;
//return语句,表示从函数中返回,函数执行结束
return sum;
}
函数的调用:表示使用功能。
语法:函数名(实际参数);
实参的形参必须做到类型匹配和个数相同,且顺序一一对应。
函数传参时传递的是实际参数的值(值传递),还有一种是传的是地址(址传递)。
如果不需要接收实际参数,形参一般设计位空类型(void)。
使用的地方:
1.可以直接写成函数语句
2.可以作为一个表达式参与运算
3.可以作为另一个函数的参数
//函数的声明,如果你的函数写在了main函数后,就需要声明
//如果你再main函数前完成了函数的构造,不用声明也行
int add(int num1,int num2);
int main()
{
int num1,num2;
int sum;
scanf("%d%d",&num1,&num2);
//调用add函数,并用sum变量接受函数的返回值
sum = add(num1,num2);
//打印处sum的值
printf("sum = %d\n",sum);
return 0;
}