赞
踩
函数封装思想也是模块化编程思想
实例95
具体要求请参考实例61
使用函数封装mystrcat函数 , 封装如下
// 函数定义
char *mystrcat(char *dest, const char *src)
{
// 自己实现代码 , 把前面做过的代码放到这个函数内
}
// 函数调用
mystrcat(str1,str2) ;
01-cbase\95-mystrcat.c
#include <stdio.h> #include <string.h> #include <assert.h> // dest = str1 , src = str2 // 指针函数 char * my1strcat(char * dest,char * src) { // 先把 str1的下标定位到'\0'位置 int len = 0 , i=0 ; while(dest[len] != '\0') len ++; // len 就是'\0' 字符串结尾的下标 // 优化的实现 while((dest[len++] = src[i++]) != '\0' ) ;// str1[len] != '\0' 要继续复制, 等于'\0'结束循环 return dest; } char * my2strcat(char *dest, char *src) { //断言dest和src不为空,这一句就可以看出代码的严谨性 assert(dest != NULL && src != NULL); //保留源地址用于返回,用于支持链式操作, //如strcat(str1, strcat(str2, str3)); //在strcpy等中也有同样的操作,很好的思想。 char *p = dest; //移动到dest末尾,不能while(*dest++),这样会移动到'\0'的下一位,想想为什么? while(*dest)//等价于(while(*dest) != '\0') { dest++; } //把src拼接到dest后面 while(*dest++ = *src++); return p; } int main(int argc, char const *argv[]) { char str1[100]={0},str2[50]={0}; printf("请输入第1个字符串 >:") ; scanf("%s",str1); printf("请输入第2个字符串 >:"); scanf("%s",str2); printf("str1=%s\n",str1); printf("str2=%s\n",str2); //strcat(str1,str2) ; // 把str2 接到str1的后面,形成一个新的字符串 (str1 + str2) //my1strcat(str1,str2); // dest = str1 , src = str2 my2strcat(str1,str2); // dest = str1 , src = str2 printf("str1=%s\n",str1); printf("str2=%s\n",str2); return 0; }
请输入第1个字符串 >:goodbye
请输入第2个字符串 >:hello
str1=goodbye
str2=hello
str1=goodbyehello
str2=hello
实例96
// 函数定义
char *mystrcpy(char *dest, const char *src)
{
// 自己实现代码 , 把前面做过的代码放到这个函数内
}
// 函数调用
mystrcpy(str1,str2) ;
01-cbase\96-mystrcpy.c
#include <stdio.h> #include <string.h> char * my1strcpy(char *dest, char *src) { int i=0,j=0; while( (dest[i++] = src[j++]) != '\0' ) ; return dest ; } char *my2strcpy(char *dst, const char *src) { char *cp = dst; while (*cp++ = *src++) ; /* Copy src over dst */ return (dst); } int main(int argc, char const *argv[]) { char str1[100]={0},str2[50]={0}; printf("请输入第1个字符串 >:") ; scanf("%s",str1); printf("请输入第2个字符串 >:"); scanf("%s",str2); printf("str1=%s\n",str1); printf("str2=%s\n",str2); //strcpy(str1,str2) ; // 把str2 复制到str1 , str1 == str2 , '\0' 会被一同复制 //my1strcpy(str1,str2); // dest = str1, src = str2 my2strcpy(str1,str2); // dest = str1, src = str2 printf("str1=%s\n",str1); printf("str2=%s\n",str2); return 0; }
// 第一次运行
请输入第1个字符串 >:good
请输入第2个字符串 >:bye
str1=good
str2=bye
str1=bye
str2=bye
// 第二次运行
请输入第1个字符串 >:goodbye
请输入第2个字符串 >:hello
str1=goodbye
str2=hello
str1=hello
str2=hello
实例97
01-cbase\97-mystrcmp.c
#include <stdio.h> #include <string.h> // s1 = str1 , s2 = str2 // 返回值: // str1 < str2 : 返回负数 // str1 > str2 : 返回正数 // str1 = str2 : 返回 0 int my1strcmp(const char *s1, const char *s2) { int ret, i = 0; while (1) { ret = s1[i] - s2[i]; if (ret < 0) // str1 < str2 { return ret; } else if (ret > 0) // str1 > str2 { return ret; } else // ret == 0 , str1[i] == str2[i] { if (s1[i] == '\0') // 表示 str1[i] == str2[i] == '\0' , 两个字符串已经相等 { return ret ; } i++ ; // 往后移动 } } } int my2strcmp(const char *str1, const char *str2) { int ret = 0; while (!(ret = *(unsigned char *)str1 - *(unsigned char *)str2) && *str1) { str1++; str2++; } if (ret < 0) { return -1; } else if (ret > 0) { return 1; } return 0; } int main(int argc, char const *argv[]) { char str1[100] = {0}, str2[50] = {0}; printf("请输入第1个字符串 >:"); scanf("%s", str1); printf("请输入第2个字符串 >:"); scanf("%s", str2); printf("str1=%s\n", str1); printf("str2=%s\n", str2); // int ret = strcmp(str1,str2) ; // 比较str1 和str2 的大小关系 int ret = my1strcmp(str1,str2) ; // 比较str1 和str2 的大小关系 if(ret < 0) { printf("str1 < str2\n"); } else if(ret > 0) { printf("str1 > str2\n"); } else { printf("str1 = str2\n"); } return 0; }
// 第一次 请输入第1个字符串 >:goodbye 请输入第2个字符串 >:goodbye str1=goodbye str2=goodbye str1 = str2 // 第二次 请输入第1个字符串 >:goodbyea 请输入第2个字符串 >:goodbyeb str1=goodbyea str2=goodbyeb str1 < str2 // 第三次 请输入第1个字符串 >:goodbye 请输入第2个字符串 >:good str1=goodbye str2=good str1 > str2
实例98
// pa 用来保存数组名
// n 用来保存数组元素个数
int bubble_sort(int *pa,int n)
{
}
01-cbase\98-maopao.c
#include <stdio.h> #define N 7 // 冒泡排序 // pa : 排序数组的地址 // n : 参与排序的元素个数 int bubble_sort(int *pa,int n) { for (int i = 0; i < n - 1; i++) // 外层循环控制排序的次数 , { for (int j = 0, t = 0; j < n - 1 - i; j++) // 内层循环控制每一次排序需要比较的次数 { if (pa[j] > pa[j + 1]) { t = pa[j]; pa[j] = pa[j + 1]; pa[j + 1] = t; } } } } // 显示数组内容 // pa : 数组的地址 // n : 数组元素个数 int display_array(int *pa,int n ) { printf("数组的内容为 >:"); for(int i=0;i<n;i++) { printf("%d ",pa[i]); } printf("\n"); return 0; } int input_array(int *pa,int n) { for(int i=0;i<n;i++) { printf("请输入第%d个数>:",i+1); scanf("%d",pa+i); } } int main(int argc, char const *argv[]) { int a[N]={0}; input_array(a,N); display_array(a,N); // pa = a , n = N bubble_sort(a,N); display_array(a,N); return 0; }
请输入第1个数>:12
请输入第2个数>:7
请输入第3个数>:23
请输入第4个数>:345
请输入第5个数>:98
请输入第6个数>:83
请输入第7个数>:70
数组的内容为 >:12 7 23 345 98 83 70
数组的内容为 >:7 12 23 70 83 98 345
实例99
// pa 用来保存数组名
// n 用来保存数组元素个数
int selection_sort(int *pa,int n)
{
}
01-cbase\99-selection.c
#include <stdio.h> #define N 7 int input_array(int *pa,int n) { for(int i=0;i<n;i++) { printf("请输入第%d个数>:",i+1); scanf("%d",pa+i); } return 0 ; } int display_array(int *pa,int n) { printf("数组的内容为 >:"); for(int i=0;i<n;i++) { printf("%d ",pa[i]); } printf("\n"); return 0 ; } int selection_sort(int *pa,int n) { for(int i=0,k,t;i<n-1;i++) // 外层循环控制排序的次数 , { k = 0 ; // k是记录最大数的下表, 从0开始 for(int j=0;j<n-1-i;j++) // 内层循环控制每一次排序需要比较的次数 { if(pa[k] < pa[j+1]) // 是使用a[k]和a[j+1]进行比较, 保存最大数的下标 { k = j+1 ; // k 记录最大数的下标 } } // 把记录的最大数和最后一个元素进行交换 // 如果k的值等于最后一个元素的下标, 则不用交换 // 如果k的值不等于最后一个元素的下标, 则交换 if(k != n-1-i) { t = pa[k]; pa[k] = pa[N-1-i]; pa[n-1-i] = t; } } return 0 ; } int main(int argc, char const *argv[]) { int a[N]={0}; input_array(a,N); display_array(a,N); selection_sort(a,N); display_array(a,N); return 0; }
请输入第1个数>:12
请输入第2个数>:7
请输入第3个数>:23
请输入第4个数>:345
请输入第5个数>:98
请输入第6个数>:83
请输入第7个数>:70
数组的内容为 >:12 7 23 345 98 83 70
数组的内容为 >:7 12 23 70 83 98 345
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。