自定义函数的练习题-非指针形式

该文展示了C语言编程中对数组的冒泡排序实现,以及字符串的逆置、比较、拷贝和连接功能的自定义函数。通过Input、Bubble、Output函数完成数组排序,my_strrev函数处理单词逆置,my_strcmp函数进行字符串比较,my_strcpy函数实现字符串拷贝,而字符串连接则是在my_strcpy基础上完成的。
摘要由CSDN通过智能技术生成
  1. 实现对数组的排序

要求:

<1>在自定义函数Input中实现循环输入

<2>在Bubble函数中实现冒泡

<3>在Output函数中输出

#include <stdio.h>

int arr[5];//全局变量

//函数声明
void Input();
void Bubble();
void Output();

int main(void)
{
    //实现对数组的排序

    Input();//自定义输入函数
    Bubble();//冒泡排序函数
    Output();//打印输出函数

    return 0;
}

void Input()
{    
    printf("请输入元素:(长度5)\n");
    for (int i = 0; i < 5; i++)
    {
        scanf("%d", &arr[i]);
    }
}

void Bubble()
{
    for (int i = 0; i < 5 - 1; i++)
    {
        int cnt = 0;
        for (int j = 0; j < 5 - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                cnt++;
            }
        }
        if (!cnt)//标志:如果已经排序完成,则直接退出循环
        {
            break;
        }
    }
}

void Output()
{
    for (int i = 0; i < 5; i++)
    {
        printf("%d ", arr[i]);
    }
}
2.单词逆置

要求:

<1>在主函数输入字符串

<2>定义有参函数void my_ strrev(char str[] ,int start,int end ),start表示起始 下标end表示终止下标

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>

void my_strrev(char str[], int start, int end);

int main(void)
{
    //实现单词的逆置,在自定义函数中输出逆置后的字符串

    char str[20] = "";
    printf("请输入一句话:\n");
    gets(str);

    int start = 0;
    int end = strlen(str) - 1;

    my_strrev(str, start, end);

    return 0;
}

void my_strrev(char str[], int start, int end)
{
    int e = end;
    while (start < end)//首先全部逆置
    {
        char temp = str[start];
        str[start] = str[end];
        str[end] = temp;

        start++;
        end--;
    }
    printf("%s\n", str);

    int i = 0;
    int cnt = 0;
    while(i < e)//每个单词逆置
    { 
        while(str[cnt] != ' ' && str[cnt] != '\0')//找到一个单词的结束下标
        {
            cnt++;
        }

        int k = cnt - 1;
        while (i < k)
        {
            char t = str[i];
            str[i] = str[k];
            str[k] = t;

            i++;
            k--;
        }
        while (str[cnt] == ' ')//找到下一个单词的起始位置
        {
            cnt++;
        }
        i = cnt;
    }

    printf("%s\n", str);
}
3.自定义函数实现字符串比较
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>

int my_strcmp(char str1[], char str2[]);

int main(void)
{
    //自定义函数实现字符串比较
    char str1[20] = "";
    char str2[20] = "";
    printf("请输入两个字符串:\n");
    scanf("%s%s", str1,str2);

    //returns -1 if str1 <  str2
    //returns  0 if str1 == str2
    //returns +1 if str1 > str2
    int ret = my_strcmp(str1, str2);
    printf("%d\n", ret);
    return 0;
}

int my_strcmp(char str1[], char str2[])
{
    int ret = 0;
    int i = 0;
    //比较每个单字符是否相等,并把计算结果赋值给ret
    while ((ret = str1[i] - str2[i]) == 0 && str2[i])
    {
        ++i;
    }

    return ((-ret) < 0) - (ret < 0);
}
4.自定义函数实现字符串拷贝
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>

void my_strcpy(char dest[], char src[]);

int main(void)
{
    //自定义函数实现字符串拷贝
    char str1[20] = "";
    char str2[20] = "";
    printf("请输入字符串:\n");
    scanf("%s",str2);

    my_strcpy(str1, str2);

    return 0;
}

void my_strcpy(char dest[], char src[])
{
    int i = 0;
    while (dest[i] = src[i])
        ++i;
    printf("str1:%s", dest);
}
5.自定义函数实现字符串连接
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>

void my_strcpy(char dest[], char src[]);

int main(void)
{
    //自定义函数实现字符串连接
    char str1[20] = "";
    char str2[20] = "";
    printf("请输入两个字符串:\n");
    scanf("%s%s", str1, str2);

    my_strcpy(str1, str2);

    return 0;
}

void my_strcpy(char dest[], char src[])
{
    int i = 0;
    while (dest[i])//先找到目标字符串末尾下标
        i++;
    int j = 0;
    while ((dest[i++] = src[j++]) != '\0')//从目标末尾开始拷贝
        ;             
    printf("%s", dest);
}

备注:对于库函数的自定义实现,是以学习源码来实现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值