我要成为嵌入式高手之1月30日第十四天!!

昨日回顾

快速排序

1、注意:第2、3步不能交换

2、快速排序流程图

3、指针迭代方式实现选择排序 和 冒泡排序

#include <stdio.h>

void Input(int *a,int len)
{
    int i = 0;
    for (i = 0; i < len; ++i)
    {
        scanf("%d",a+i);
    }
}

void swap (int *a,int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

void ChooseSort(int *a,int len)
{
    int i,j;

    for (i = 0; i < len-1; ++i)
    {
        for (j = i+1; j < len; ++j)//从i后面的一个数起
        {
            if (*(a+j) < *(a+i))
            {
                swap ((a+j) , (a+i));
              // int t = *(a+j);
              // *(a+j) = *(a+i);
              // *(a+i) = t;
            }
        }
    }
}

void BubbleSort(int *a,int len)
{
    int i,j;

    for (j = 1; j < len; ++j)
    {
        for (i = 0; i < len-j; ++i)
        {
            if (*(a+i) > *(a+i+1))
            {
                swap((a+i),(a+i+1));
               // int t = *(a+i);
               // *(a+i) = *(a+i+1);
               // *(a+i+1) = t;
            }
        }
    }
}

void Output(int *a,int len)
{
    int i = 0;
    for (i = 0; i < len; ++i)
    {
        printf("%d ",*(a+i));
    }
    putchar('\n');
}

int main(void)
{
    int len;
    printf("Input array len: ");
    scanf("%d",&len);
    int a[len];

    Input(a,len);
    ChooseSort(a,len);
    //BubbleSort(a,len);
    Output(a,len);
}

4、编写程序实现单词的倒置

     如:"how are you" -> "you are how" 

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

void Gets(char *s)
{
    do
    {
        *s = getchar();
    }while (*s++ != '\n');
    s--;
    *s = '\0';
}

void Puts(const char *s)
{
    while (*s != '\0')
    {
        putchar(*s);
        ++s;
    }
    putchar('\n');
}

void ReverseStr(char *begin,char *end)
{
    while (begin < end)
    {
        char t = *begin;
        *begin = *end;
        *end = t;
        ++begin;
        --end;
    }
}

void ReverseWord(char *begin,char *end)
{
    ReverseStr(begin,end);

    char *p = begin;
    char *q = NULL;

    while (p <= end)
    {
        q = p;//记录单词开始的位置
        while (*p != ' ' && *p != '\0')
        {
            ++p;//记录空格处或者整个字符串结束处的位置
        }
        ReverseStr(q,p-1);//将单词逆序
        ++p;//从空格处的下一个位置继续循环
    }
}

int main(void)
{
    char s[100];

    printf("Input string: \n");
    Gets(s);
    printf("Before: %s\n",s);
    ReverseWord(s,s+strlen(s)-1);
    printf("After: ");
    Puts(s);
   
    return 0;
}

5、编写程序实现将"12345" 转化为12345 (数值)

#include <stdio.h>

void Gets(char *s)
{
    do
    {
        *s = getchar();
    }while (*s++ != '\n');
    s--;
    *s = '\0';
}

void Puts(const char *s)
{
    while (*s != '\0')
    {
        putchar(*s);
        ++s;
    }
    putchar('\n');
}

int Atoi(const char *s)
{
    int k = 0;
    while (*s != '\0')
    {
        if (*s >= '0' && *s <= '9')
        {
            int t = *s - '0';//字符转为数字
            k = k * 10 + t;
        }else
        {
            break;
        }
        ++s;
    }
    return k;
}

int main(void)
{
    char s[100];

    printf("Input string: \n");
    Gets(s);
    printf("Before: %s\n",s);
    printf("After: %d\n",Atoi(s));
    
    return 0;
}

 

一、指针 + 一维字符型数组

        char  *s = "hello" ; (空间在常量区,不能被修改)

        char   s[ ] = "hello" ; (空间在栈上,可以修改)

     练习1:指针实现字符串的输入输出

     练习2: 字符串逆序(最后一个字符位置不要定位到‘ \ 0 ’)

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

void Gets(char *s)
{
    do
    {
        *s = getchar();
    }while (*s++ != '\n');
    s--;
    *s = '\0';
}

void Puts(const char *s)
{
    while (*s != '\0')
    {
        putchar(*s);
        ++s;
    }
    putchar('\n');
}

void ReverseStr(char *begin,char *end)
{
    while (begin < end)
    {
        char t = *begin;
        *begin = *end;
        *end = t;
        ++begin;
        --end;
    }
}

int main(void)
{
    char s[100];
    printf("Input string: \n");
    Gets(s);
    printf("Before: %s\n",s);
    ReverseStr(s,s+strlen(s)-1);
    printf("After: ");
    Puts(s);

    return 0;
}

        

练习3:指针实现

puts        gets        strlen        strcat        strcpy        strcmp

#include <stdio.h>

void Gets(char *s)
{
    do
    {
        *s = getchar();
    }while (*s++ != '\n');
    --s;
    *s = '\0';
}

void Puts(char *s)
{
    while (*s != '\0')
    {
        putchar(*s);
        ++s;
    }
    putchar('\n');
}

size_t Strlen(char *s)
{
    int i = 0;
    while (*s != '\0')
    {
        ++i;
        ++s;
    }
    return i;
}

char * Strcat(char *dest,const char *src)
{
    char *ret = dest;

    while (*dest != '\0')
    ++dest;
    while ((*dest = *src) != '\0')//将src中字符赋值给dest‘\0’位置及以后
    {
        ++dest;
        ++src;
    }
    return ret;
}

char *Strcpy(char *dest,const char *src)
{
    char *ret = dest;
    
    while (*dest = *src)
    {
        ++dest;
        ++src;
    }

    return ret;
}

int Strcmp(const char*s1,const char *s2)
{
    while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
    {
        ++s1;
        ++s2;
    }

    return *s1 - *s2;
}

int main(void)
{
    char s1[100];
    char s2[100];
    printf("请输入字符串s1和s2:\n");
    Gets(s1);
    Gets(s2);

    printf("s1的长度为:%ld\n",Strlen(s1));
    printf("s2的长度为:%ld\n",Strlen(s2));

    Strcat(s1,s2);
    printf("将s2拼接到s1后:");
    Puts(s1);

    Strcpy(s1,s2);
    printf("将s2拷贝到s1后:");
    Puts(s1);
    
    Strcmp(s1,s2);
    int t = Strcmp(s1,s2);
    if (t > 0)
    {
        printf("s1 > s2\n");
    }else if (s1 < s2)
    {
        printf("s1 < s2\n");
    }else
    {
        printf("s1 = s2\n");
    }

    return 0;
}

练习4: strn

strncat

        // n < strlen(src) 拼n下就结束   n == 0
        // n >= strlen(src) src拼完就结束  src=='\0'

strncpy

        // 结束条件 *src == '\0'
        // n次 拷贝完成没有

strncmp

#include<stdio.h>

void Gets(char *s)
{
    do
    {
        *s = getchar();
    }while (*s++ != '\n');
    --s;
    *s = '\0';
}

void Puts(char *s)
{
    while (*s != '\0')
    {
        putchar(*s);
        ++s;
    }
    putchar('\n');
}

char *Strncat(char *dest,const char *src,int n)//将src字符串的前n项拼接到dest字符串后面
{
    char *ret = dest;

    while (*dest != '\0')
    {
        ++dest;
    }
    while (n && *src != '\0')//n给完或者src给完为结束条件
    {
        *dest = *src;
        ++src;
        ++dest;
        --n;
    }
    *dest = '\0';
    return ret;
}

char *Strncpy(char *dest,const char *src,int n)
{
	char *ret = dest;

	while (n && (*dest = *src) )//n降为0或者src全部拷贝到dest里结束
	{
		dest++;
		src++;
		--n;
	}
    if (n == 0)
    {
        *dest = 0;
        ++dest;
    }else
    {
	    while(n)//若全部拷贝完,则将dest后面的值全置为0,直到n为0
	    {
		*dest = '\0';
		++dest;
		--n;
	    }
    }
	return ret;
}

int Strncmp(const char *s1,const char *s2,int n)//比较s1和s2的前n项
{
	n--;
	while (n&&*s1==*s2 && *s1!='\0' && *s2 != '\0')//n为0、s1字符与s2字符相同、s1为0、s2为0 四种情况任一发生时停止
	{
		++s1;
		++s2;
	    --n;
	}
	return *s1 - *s2;
}

int main(void)
{
    char s1[100];
    char s2[100];
    int n;
    int t;
    
    printf("请输入字符串s1和s2:\n");
    Gets(s1);
    Gets(s2);
#if 0
    printf("请输入n(将s2的前n个字符拼接到s1后面):");
    scanf("%d",&n);
    Strncat(s1,s2,n);
    Puts(s1);
#endif
#if 0
    printf("请输入n(将s2的前n个字符拷贝到s1):");
    scanf("%d",&n);
    Strncpy(s1,s2,n);
    Puts(s1);
#endif
    printf("请输入n(比较s1和s2的前n位):");
    scanf("%d",&n);
    t = Strncmp(s1,s2,n);
    if (t > 0)
    {
        printf("s1 > s2\n");
    }else if (t < 0)
    {
        printf("s1 < s2\n");
    }else
    printf("s1 = s2\n");
    
    return 0;
}

注意:

        1. const能加都加

        2. 函数功能  尽可能写的全面

二、指针操作二维数组

int a[3][4]; //本质还是一维数组

int[4] a[3]; //a --数组名 --代表类型 int [3][4]

                //a --代表的值 -- 首元素的地址 -- a[0] 

                //a[0] 的数据类型 int[4]

                //&a[0]--对应的数据类型 int(*)[4] //数组类型 (一维整型数组类型)

                //数组类型的指针 --- 数组指针  int *

int (*p)[4] = a;

                *p 就相当于 int[4]这个数组的 数组名

*(*(p+i) + j)<=>a[i][j]

练习1:定义一个二维数组,找出数组中的最大值

#include <stdio.h>

int Max(int (*p)[4],int row)
{
    int i = 0;
    int j = 0;
    int max = **p;
    for (i = 0; i < row; ++i)
    {
        for (j = 0; j < 4; ++j)
        {
            if (*(*(p+i)+j) > max)
            {
                max = (*(*(p+i)+j));
            }
        }
    }

    return max;
}

int main (void)
{
    int a[3][4] = {2,4,3,2,6,7,3,5,6,9,5,6};

    printf("max = %d\n",Max(a,3));

    return 0;
}

三、指针 + 函数

char * strcpy() ; // 返回值类型 —— 指针类型 —— 指针函数

函数类型:去掉函数名,剩下的是函数类型

回调函数:通过函数指针调用的函数

                  技术上:通过函数指针的实现

                  函数指针( ) 

1、指针 操作 函数

2、函数名  就是函数的入口地址

3、定义一个 函数指针变量 获得 函数名

4、使用   通过指针变量的方式   进行函数调用

5、用途   回调

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值