0109|c基础day13(多文件编辑)

目录

一、思维导图

二、作业

2.1 字符串逆置、通过递归实现逆置、字符串连接、字符串比较函数、字符串拷贝、字符串长度

2.2 实现字符串移动

2.3 判断二维字符数组是否存在“回文字符串”

2.4 斐波那契数列


一、思维导图

 

二、作业

通过“多文件编辑”实现

三个文件: main.c head.h test.c

2.1 字符串逆置、通过递归实现逆置、字符串连接、字符串比较函数、字符串拷贝、字符串长度

代码:

main.c

#include "head.h"
#include <stdio.h>
int main(int argc, const char *argv[])
{
	char a[20]={"asdfghjk"};
	char b[30]={"hello"};
	char c[]={"12345"};
	char d[20]={"yuio"};
	char e[]={"98765"};
	MyStrRev(a);

	StrRevRec(b,strlen(b));
	printf("\n");

	char *num=MyStrcat(b,c);
	printf("%s\n",num);

	MyStrcmp(a,b);

	char *num1=MyStrcpy(d,e);
	printf("%s\n",num1);

	int num2=Mystrlen(a);
	printf("%d\n",num2);
	
	return 0;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <string.h>
void MyStrRev(char *p);
void StrRevRec(char a[],int len);
char *MyStrcat(char *dest,const char *src);
int MyStrcmp(const char *s1,const char *s2);
char *MyStrcpy(char *dest,const char *sec);
long Mystrlen(const char *s1);
#endif

test.c

#include "head.h"
//1>通过指针指向字符串,实现字符串逆置
void MyStrRev(char *p)
{
	char t=0;
	int i=0,j=Mystrlen(p)-1;
	while((p+i)<(p+j))
	{
		t=*(p+i);
		*(p+i)=*(p+j);
		*(p+j)=t;
		i++;j--;
	}
	puts(p);
}
//2>通过递归实现字符串逆置
void StrRevRec(char a[],int len)
{
	if(len==1)
	{
		printf("%c",a[len-1]);
	}
	else
	{
		printf("%c",a[len-1]);
		StrRevRec(a,len-1);
	}
}
//3>字符串连接
char *MyStrcat(char *dest,const char *src)
{
	char *p=dest;
	while(*dest)
	{
		dest++;
	}
	while(*src)
	{
		*dest = *src;
		dest++;src++;
	}
	*dest='\0';
	return p;
}
//4>字符串比较函数
int MyStrcmp(const char *s1,const char *s2)
{
	int i=0,cha;
	while(*(s1+i)==*(s2+i))
	{
		if(*(s1+i)=='\0'&&*(s2+i)=='\0')
		{
			break;
		}
		else
		{
			i++;
		}
	}
	cha=*(s1+i)-*(s2+i);
	if(cha>0)
		printf("字符串1>字符串2\n");
	else if(cha=0)
		printf("两个字符串长度相等\n");
	else
		printf("字符串1<字符串2\n");
}
//5>字符串拷贝
char *MyStrcpy(char *n1,const char *n2)
{
	char *p=n1;
	while(*n2)
	{
		*n1=*n2;
		n1++;n2++;
	}
	*n1='\0';
	return p;
}
//6>字符串长度
long Mystrlen(const char *s1)
{
	long count=0;
	while(*s1)
	{	
		count++;
		s1++;
	}
	return count;
}

输出:

	char a[20]={"asdfghjk"};
	char b[30]={"hello"};
	char c[]={"12345"};
	char d[20]={"yuio"};
	char e[]={"98765"};
	
1、调用函数:MyStrRev(a);
       输出:kjhgfdsa

2、调用函数:StrRevRec(b,strlen(b));
        printf("\n");
       输出:olleh

3、调用函数:char *num=MyStrcat(b,c);
	     printf("%s\n",num);
       输出:12345

4、调用函数:MyStrcmp(a,b);
       输出:字符串1>字符串2

5、调用函数:char *num1=MyStrcpy(d,e);
	       printf("%s\n",num1);
       输出:98765

6、调用函数:int num2=Mystrlen(a);
	       printf("%d\n",num2);
       输出:8

	return 0;
}

2.2 实现字符串移动

 head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <string.h>
 
void Sort(char *p,int n);
char *DaXie(char *p,int n);
char *ShuZi(char *p,int n);
char *XiaoXie(char *p,int n);
char *TeShu(char *p,int n);
#endif

main.c

#include "head.h"
int main(int argc, const char *argv[])
{
	char str[]="AGAB%Sr67gs5ffwt+%";
	int n=strlen(str);
	Sort(str,n);
	printf("%s\n",str);
	char *p[4]={DaXie(str,n),ShuZi(str,n),XiaoXie(str,n),TeShu(str,n)};
	char t[100];
	for(int i=0;i<4;i++)
	{
		strcat(t,p[i]);
	}
	puts(t);
	return 0;
}

test.c

#include "head.h"
//1.1 先对字符串实现升序排序  
void Sort(char *p,int n)
{
	int i,j;
	char t;
	for(i=1;i<n;i++)
	{
		for(j=0;j<n-i;j++)
		{
			if(*(p+j)>*(p+j+1))
			{
				t=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=t;
			}
		}
	}
}

//1.2 从字符串中挑出大写   
char *DaXie(char *p,int n)
{
	static char px[20]="";
	static char *q=px;
	int i=0,j=0;
	while(*(p+i))
	{
		if(*(p+i)>='A'&&*(p+i)<='Z')
		{
			*(q+j)=*(p+i);
			j++;
		}
		i++;
	}
	*(q+j)='\0';
	return q;
}

//1.3 从字符串中挑出数字   
char *ShuZi(char *p,int n)
{
	static char px[20]="";
	static char *q=px;
	int i=0,j=0;
	while(*(p+i))
	{
		if(*(p+i)>='0'&&*(p+i)<='9')
		{
			*(q+j)=*(p+i);
			j++;
		}
		i++;
	}
	*(q+j)='\0';
	return q;
}


//1.4 从字符串中挑出小写   
char *XiaoXie(char *p,int n)
{
	static char px[20]="";
	static char *q=px;
	int i=0,j=0;
	while(*(p+i))
	{
		if(*(p+i)>='a'&&*(p+i)<='z')
		{
			*(q+j)=*(p+i);
			j++;
		}
		i++;
	}
	*(q+j)='\0';
	return q;
}

//1.5 从字符串中挑出特殊字符   
char *TeShu(char *p,int n)
{
	static char px[20]="";
	static char *q=px;
	int i=0,j=0;
	while(*(p+i))
	{
		if(!((*(p+i)>='A'&&*(p+i)<='Z')||(*(p+i)>='0'&&*(p+i)<='9')||(*(p+i)>='a'&&*(p+i)<='z')))	
		{
			*(q+j)=*(p+i);
			j++;
		}
		i++;
	}
	*(q+j)='\0';
	return q;
}

//1.7 按照顺序,实现字符串连接【使用strcat就行,或者调用自己封装的函数】

输出:

2.3 判断二维字符数组是否存在“回文字符串”

 head.h

#ifndef __HEAD_H__
#define __HEAD_H__

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

int LoopStr(char str[] [10],int n);
int HuiWen(char *p);
#endif

main.c

#include "head.h"
int main(int argc, const char *argv[])
{
	char a[][10]={"asd","asa","werew","yuyu"};	
	int n=sizeof(a)/sizeof(a[0]);
	int num=LoopStr(a,n);
	if(num==1)
		printf("是回文字符串\n");
	else
		printf("不是回文字符串\n");
	return 0;
}

test.c

#include "head.h"
//2.1 循环二维数组,存在回文返回1,否则返回0
int LoopStr(char str[] [10],int n)
{
    int i;
    for (i=0;i<n;i++)
    {
        int num=HuiWen(str[i]);
        if(num==1)
            return 1;
    }
    return 0;
}
//2.2 回文字符串函数,是回文返回1,否则返回0
int HuiWen(char *p)
{
	char *q=p;
	int i=0,j=strlen(p-1);
	char t;
	while(i<j)
	{
		if(*(q+i)!=*(p+i))
			return 0;
		else
		{
			i++;
			j--;
		}
	}
	return 1;
}

输出:

2.4 斐波那契数列

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>

void Fibonacii();
void FibonaciiArr();
int FibonaciiRec(int n);
#endif

main.c

#include "head.h"
int main(int argc, const char *argv[])
{
	Fibonacii();
	printf("\n");
	FibonaciiArr();
	printf("\n");
	int num;
	for(int i=1;i<=10;i++)
 	{
  		num=FibonaciiRec(i);
  		printf("%d\t",num);
 	}
	printf("\n");
	
	return 0;
}

test.c

#include "head.h"
void Fibonacii()
{
	int i,a=1,b=1,c,n=10;
	printf("%d\t%d\t",a,b);
	for(i=3;i<=n;i++)
	{
		c=a+b;
		a=b;
		b=c;
		printf("%d\t",c);
	}
	printf("\n");
}

void FibonaciiArr()
{
	int n=10,i;
	int a[20]={1,1};
	printf("%d\t%d\t",a[0],a[1]);
	for(i=2;i<n;i++)
	{
		a[i]=a[i-1]+a[i-2];
		printf("%d\t",a[i]);
	}
	printf("\n");
}

int FibonaciiRec(int n)
{
	if(n==1||n==2)
	{return 1;}
	else
	{
		return FibonaciiRec(n-1)+FibonaciiRec(n-2);
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值