昨日回顾
快速排序
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、用途 回调