自学嵌入式第九天C语言篇8

 

目录

二维字符型数组

排序

查找 

函数(function)

函数设计步骤:

函数的调用:表示使用功能。


二维字符型数组

排序

        字符串排序的基本算法思想和数值的排序差不多,只是在判断时,不能整体操作,但可以使用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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值