C语言字符,数组,算数类算法

C语言算法

字符类算法

—判断回文字符串

int fun(char *str)
{
	char *p=str;
	int n,i;
	while(*p){              //判断到'\0'等效于0 结束循环 
		n++;                //统计字符串个数 
		p++;                //指针后移 
	}
	for(i=0;i<n/2;i++)     //若n=5,i<2;若n=6,i<3;
	if(str[i]==str[n-i-1]);//前后元素依次对比(a[元素个数-i-1] i递增时,数组指针前移)
	else return 0;         //不符合返回0 
	return 1;              //比较完成返回1 
}

—实现字符串逆置

void fun(char *s)
{
	char ch;
	int i,m,n;
	i=0;
	m=n=strlen(s)-1;//求出字符串长度
	while(i<n/2)    //折中从两边开始交换值
	{
		ch=s[i];
		s[i]=s[m];
		s[m]=ch;
		i++;       //i先后移
		m--;       //m先前移
	}
}

—统计字符串单词个数

int fun(char *str)
{
	int n;
	char *p=str;
	while(*p){
	//当前字符不为空格且后一个字符为空格或结束符'\0'时, 记为一个单词
		if (*p!=' '&&(*(p+1)==' '||*(p+1)=='\0'))n++; 
		p++;
	}
	return n;
}

—输出较长的字符串

char  *fun ( char *s,  char *t)
{
	int i,j;
	for(i=0;s[i]!='\0';i++);//统计字符个数
	for(j=0;t[j]!='\0';j++);//统计字符个数
	if (i>j)return s;
	else return t; 
}

—找出二维数组中的最长字符串

char *fun(char (*s)[81],int num)
{
	int i;
	char *max;
	max=s[0];                   //认为第一行字符串最长
	for(i=1;i<num;i++)          //遍历各行字符串
	{
	    //比较字符串长度,将最长字符串地址给max
		if(strlen(max)<strlen(s[i]))max=s[i];
	}
	return max;                 //返回最长字符串的地址
}
int main(){
	int num=3;
	char a[3][81]={"dafaf","dawfawfaf","dawfawfawf"};
	printf("%s",fun(a,3));
}

—将字符型数字转换为整型

方法一
long fun(char *s)
{
	char *p=s;
	long sum=0;
	while(*p){
		sum=sum*10+*p-'0';//字符串数字转换为整型公式 sum=sum*10+ch-'0'
		p++;
	}
	return sum;
}
方法二
#include<string.h>
long fun(char *s)
{
	long sum;
	int i,len;
	len=strlen(s);
	for(i=0;i<len;i++)
	sum=sum*10+*(s+i)-'0';//字符串数字转换为整型公式 sum=sum*10+ch-'0'
	return sum;
}

—将字符型数字转换为整型(带正负)

long  fun(char *p)
{
	int flag=0;
	long sum=0;
	if(*p=='+')     //开头为“+”号 flag赋值为1
	{
		p++;
		flag=1;
	}
	else if(*p=='-')//开头为“-”号 flag赋值为-1
	{
		p++;
		flag=-1;
	}
	while(*p){
		sum=sum*10+*p-'0';//字符转换为整型
		p++;              //指针后移
	}
	return flag*sum;
}

—字符串逐个前移

在这里插入图片描述

void fun(char *str,int m)
{
   char c;
   int i,j;
   for(i=1;i<=m;i++)           //从下标为1的元素开始取值,到第m个为止
   {
   t=str[0];                   //取出第一个元素
   for(j=1;str[j]!='\0';j++)   //遍历数组,元素逐个前移
   str[j-1]=str[j];            //将后一个元素复制给前一个元素
   str[j-1]=t;                 //元素前移结束,将取出的元素放入'\0'前面
   }
}

—实现复制字符串

void fun(char *s,char *a)
{
	int i;
	for(i=0;i<N;i++,a++)       //N为数组s中元素容纳数
	s[i]=*a;                   //依次赋值给数组s
}

—统计数字字符个数

int fun(char  *s)
{
	int digit;
	char *p=s;
	while(*p)
	{
		if(*p<'9'&&*p>'0')digit++;//统计数字个数
		p++;                      //不管是否存在数字,指针后移
	}
	return digit;
}

—统计字母字符个数

int fun(char  *s)
{
	int ch;
	char *p=s;
	while(*p)
	{
		if(*p<'z'&&*p>'a'||*p<'Z'&&*p>'A')ch++;//统计数字个数
		p++;                       //不管是否存在字母,指针后移
	}
	return ch;
}

—实现删除字符串中的指定字符

#数组类型
void fun(char a[],char b[],int n)
{
	int i,k=0;              //初始化变量
	for(i=0;a[i]!='\0';i++) //遍历数组a
	if(i!=n)b[k++]=a[i];    //将下标不为n的元素依次存入b中
	b[k]='\0';              //末尾添加字符串结束符'\0'
}
#指针类型
void fun(char s[],int c)
{
	int i=0;
	 char *p;
	 p=s;
	 while(*p)
	 {
	 	if(*p!=c)s[i++]=*p;
	 	p++;
	 }
	 s[i]='\0';
}

—找出ASCII码为偶数的字符

void  fun(char *s, char t[])
{
	int k=0;
	char *p=s;               //指针p指向s的地址
	while(*p){
		if(*p%2==0)t[k++]=*p;//直接用字符取余2为偶数时将字符保存在数组t中
		p++;                 //指针后移
	}
	t[k]='\0';               //字符串结束符'\0'
}

—去掉字符串前面的"*"

void  fun( char *a )
{
	int k=0;
	char *p=a;
	while(*p=='*')p++;
	while(*p!='\0')a[k++]=*p,p++;
}

—去掉字符串中间的"*"

在这里插入图片描述

void  fun( char *a, char *h,char *p )
//指针h指向第一个字符 A  指针p指向最后一个字符 G
{
	int k=0;
	char *s=a;
	while(s<h)//将字符A之前的字符保存到数组a
	{           
		a[k++]=*s;
		s++;
	}
	while(s<=p)//遍历[A,G]之间的字符 并保存不含'*'的字符
	{
		if(*s!='*')a[k++]=*s;
		s++;
	}
	while(*s)//遍历G之后的字符 依次保存
	{     
		a[k++]=*s;
		s++;
	}
	a[k]='\0';//字符串结束符'\0'
}

—保留字符串前面的指定位数的"*"

在这里插入图片描述

void  fun( char *a, int  n )
{
	int k=0,i=0;
	char *p,*t;   //定义两个指针一个用来遍历统计个数 一个用来遍历赋值
	p=t=a;
	while(*t=='*')//遍历统计字符串前面的'*'个数
	{
		k++;
		t++;
	}
	
	if(k>n)
	while(*p)
	{
		a[i++]=*(p+k-n);//跳过前n个'*'字符 再开始依次赋值
		p++;
	}	
}

—去掉字符串后面的"*"

在这里插入图片描述

void  fun( char *a )
{
	while(*a)a++;      //指向'\0'
	a--;               //指向最后一个字符'*'
	while(*a=='*')a--; //移动至指向最后一个非"*"字符
	*(a+1)='\0';       //在最后一个非"*"字符后面使用字符串结束符'\0'
}

—消除字符串两边的"*"

在这里插入图片描述

void  fun( char *a, int n,int h,int e )
{
	int i,j=0;
	 for(i=h;i<n-e;i++)//只保留"*"中间的字符串
	 a[j++]=a[i];
	 a[j]='\0';
}

—消除字符串前面和中间的"*"

在这里插入图片描述

void  fun( char *a, char *p )
{
	int k=0;
	char *h=a;
	while(h<p)
	{
		if(*h!='*')a[k++]=*h;
		h++;	
	}
	while(*h!='\0')
	{
		a[k++]=*h;
		h++;
	}
	a[k]='\0';
}

—对字符串按ASCII码降序排列

在这里插入图片描述

void fun(char *s,int num)
{
	char ch;
	int i,j;
	for(i=1;i<6;i++)           //两层循环的排序算法
	for(j=i+1;j<6;j++)
	{
		if(*(s+i)<*(s+j))
		{
			ch=*(s+j);
			*(s+j)=*(s+i);
			*(s+i)=ch;
		}
	}
}

—统计字符串中单词的个数

在这里插入图片描述

void fun(char *tt, int pp[])
{
	int i;
	for(i=0;i<26;i++)
	pp[i]=0;              //将数组所有的值赋值为0
	for(;*tt!='\0';tt++)
	if(*tt>='a'&&*tt<='z')
	pp[*tt-'a']++;        //按顺序统计单词个数
}

—结构体中字符串的比较与赋值

typedef  struct
{  char  num[10];
   int   s;
} STREC;
STREC fun(STREC  *a, char *b )
{
	int i;
	STREC str={"\0",-1};
	for(i=0;i<N;i++)
	if(strcmp(a[i].num,b)==0)
	str=a[i];    //将地址赋值给str
	return str;  //返回目标地址
}

数组类算法

—外层元素累加

#define M 3
#define N 3
int fun(int a[M][N])
{
	int i,j,sum=0;
	for(i=0;i<M;i++)
	for(j=0;j<N;j++)
	//第0行 第M-1行 第0列 第N-1列为外围元素
	if(i==0||i==M-1||j==0||j==N-1)sum+=a[i][j];
	return sum;
}

—行列互换(适用于行等于列)

在这里插入图片描述

void fun (int a[3][3])
{
	int i,j,t;
	for(i=0;i<3;i++)
	for(j=i+1;j<3;j++)//a[i][i]为对角线 a[i][i+1]为右上角元素
	{
		t=a[i][j];
		a[i][j]=a[j][i];
		a[j][i]=t;
	}
}

—取左下角,右上角,对称轴元素

#include<stdio.h>
#define M 3
#define N 3
int fun(int a[M][N])
{
	int i,j;
	printf("数组元素:");
	for(i=0;i<M;i++)
	for(j=0;j<N;j++)
	{
	if(j%M==0)printf("\n");
	printf("%3d",a[i][j]);
		
	}
	
	printf("\n左下角元素:");
	for(i=0;i<M;i++)
	for(j=i+1;j<N;j++)
	printf("%3d",a[j][i]);

	printf("\n右上角元素:");
	for(i=0;i<M;i++)
	for(j=i+1;j<N;j++)
	printf("%3d",a[i][j]);
	
	printf("\n对称轴:");
	for(i=0;i<M;i++)
	for(j=0;j<N;j++)
	if(i==j)
	printf("%3d",a[i][j]);

}
int main(){
	int i,j;
	int a[M][N]={1,2,3,4,5,6,7,8,9};
	fun(a);
}
输出:
>>数组元素:
>>  1  2  3
>>  4  5  6
>>  7  8  9
>>左下角元素:  4  7  8
>>右上角元素:  2  3  6
>>对称轴:  1  5  9

—数值数组二维转一维

int fun(int a[M][N],int b[M*N])
{
	int i,j,k=0;
	for(i=0;i<M;i++)
	for(j=0;j<N;j++)
	b[k++]=a[i][j];
}

—字符数组二维转一维

int fun(char a[M][N],char b[M*N])
{
	int i,j,k=0;
	for(i=0;i<M;i++)
	for(j=0;a[i][j]!='\0';j++)
	b[k++]=a[i][j];
}
发布了82 篇原创文章 · 获赞 468 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/qq_44647926/article/details/100559488