C语言【指针实战练习】(XDOJ)

C语言【指针实战练习】(XDOJ)

补充知识

  • getchar和putchar
    字符专用输入函数:getchar
char c;
c=getchar();//tips:一次只能输入一个字符
putchar(c);//tips:一次只能输出一个字符
/*先scanf后getchar
getchar读取scanf未读完的字符
tips:scanf键入回车才能执行
为防止getchar将这个回车读取为一个字符
需在使用getchar前清除缓存*/
fflush(stdin);//清除缓存区
/*有些编译器不支持,另一种方法*/
char c_tmp;
while ((c_tmp= getchar() != '\n') && c_tmp != EOF);
  • 输入任意长度整数数列(数字间以空格隔开,以回车结束)
int arr[30],i=0;
	do
	{
		scanf("%d",&a[i]);
		i++;
	}while(getchar()==' ');//读到回车,即停止进入循环

或以字符形式输入
一种简单的方法?

  • sort快排
    升序
#include 
#include //算法
using namespace std;//必写
int main()
{
	int n,i;
	int a[20];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	sort(a,a+n);//sort快排(输入排序起止)
	for(i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
}

降序

#include 
#include 
using namespace std;
bool compare(int a,int b)
{
	if(a>b)
	return true;
	else
	return false;
}//compare函数
int main()
{
	int n,i;
	int a[20];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	sort(a,a+n,compare);//这里修改
	for(i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
}

删除特定值

C语言【指针实战练习】(XDOJ)_第1张图片

#include 

void del_n(int *a,int *l,int m)
{
	int i,j=0;//j置0 
	int b[30]={0};//数组置0 
	for(i=0;i<*l;i++)//*l在这里指i的值 
	{
		if(a[i]!=m)
		{
			b[j]=a[i];
			j++;
		}//删除特定值,用新数组记录 
	}
	*l=j;//指针返回新的数组长度 
	for(i=0;i<j;i++)
	a[i]=b[i];//返回新数组 
}
int main()
{
	int a[30],l,m,i,count;
	do
	{
		scanf("%d",&a[i]);
		i++;
	}while(getchar()==' ');//输入数列 
	scanf("%d",&m);
	count=i;//数输入几个数 
	del_n(a,&count,m);//传参 
	for(i=0;i<count;i++)
	printf("%d ",a[i]);
}

求和与定位

对于一个整数数列(包含 n 个杂乱无章的整数),编写子函数程序完成各个元素求和,
以及最大值位置查询任务,位置编码与数组下标一致。
要求与说明:
1.)int addor(int *p,int n),参数依次为指向数组的指针、元素个数,用于求和。
2.)void place(int *,int ,int *,int *),参数依次为指向数组的指针、元素个数、指向最大值
(初值为-100)的指针、指向最大值位置的指针。
3.)主函数完成输入、和数的输出,place 函数完成最大值及其位置信息输出。

#include  

int addor(int *p,int n)
{
	int *i,sum=0;
	for(i=p;i<p+n;i++)
	sum+=*i;
	return sum;
}
void place(int *p,int n,int *max,int *MAX)
{
	int i;
	*max=p[0];//最大值置0 
	*MAX=0;//最大值所在位置置0 
	for(i=0;i<n;i++)
	{
		if(p[i]>*max)
		{
			*max=p[i];
			*MAX=i;
		}
	}
	printf("%d %d",*max,*MAX);
}
int main()
{
	int n,i,sum=0,max,MAX;
	scanf("%d",&n);
	int m[20];
	for(i=0;i<n;i++)
	scanf("%d",&m[i]);
	printf("%d ",addor(m,n));
	place(m,n,&max,&MAX);//传参 
}

字母排序

编写子函数程序完成一个字符串中位于奇数位置的字符的转换和排序任务。
要求与说明:
1.)对于处于奇数位置(编号与数组下标一致)的小写字母,转换为大写字母,其它字
符不变。
2.)仅对处于奇数位置的大写字母升序排序,其它字符不变。
3.)主函数内完成输入、输出,子函数 void sort(char *p),参数为指向字符串的指针。

#include 
#include 

 void sort(char *p)
 {
 	int i,j,l;
 	l=strlen(p);
 	for(i=0;i<l;i++)
 	{
 		if(i%2!=0)
 		{
 			if(p[i]>='a'&&p[i]<='z')
 			{
 				p[i]='A'+p[i]-'a';
			}
		}
	}//转为大写字母 
	for(i=0;i<l-1;i++)
	{
		for(j=i+1;j<l;j++)
		{
			if(p[i]>p[j]&&p[i]>='A'&&p[i]<='Z'&&p[j]>='A'&&p[j]<='Z'&&(i%2)!=0&&(j%2)!=0)
			{
				int t;
				t=p[i];
				p[i]=p[j];
				p[j]=t;
			}
		}
	}//奇数位置的 大写字母 升序排序
	for(i=0;i<l;i++)
	printf("%c",p[i]);
 }
int main()
{
	int n;
	scanf("%d",&n);
	getchar();
	char m[100];
	gets(m);
	sort(m);
}

相似度

编写子函数程序完成两个字符串相似度的计算任务。
相似度:对于两个字符串,相同字符串的最大长度 L(忽略大小写),len1、len2 分别
为两个字符串的长度,相似度 LCS=2*L/(len1+len2)。
要求与说明:
1.)字符串长度均小于 100,由大小写字母构成。
2.)子函数 void upstr(char a[],char b[]),参数依次为字符串 A 和字符串 B,统一转换为
大写字母。
3.)子函数 void calculate(char *a,char *b),参数依次为指向字符串 A、B 的指针,忽略
大小写,用于计算相似度。
4.)主函数输入,子函数输出。

#include  
#include 

void upstr(char a[],char b[])
{
    int i,l1,l2;
    l1=strlen(a);
    l2=strlen(b);
	for(i=0;i<l1;i++)
	{
		if(a[i]>='a'&&a[i]<='z') 
		a[i]='A'+a[i]-'a';
	}	
	for(i=0;i<l2;i++)
	{
		if(b[i]>='a'&&b[i]<='z') 
		b[i]='A'+b[i]-'a';
	}
}
void calculate(char *a,char *b)
{
	int l1,l2,i,j,k=0,L,max=0;
	float LCS;
	l1=strlen(a);
    l2=strlen(b);
    	for(i=0;i<l1;i++)
    	{
			for(j=0;j<l2;j++)//后一数组递增 
			{
				if(a[i]==b[j])//若有相同 
				{
					L=0;//L置0 
					k=0;//k置0 
					while(k<l2&&a[i+k]!='\0'&&b[j+k]!='\0')//注意这里:防止a,b同时结束时相等 
					{
						if(a[i+k]==b[j+k])//继续数后面个数 
						L++;
						else
						break;
						k++;
					}
				}
				if(L>max)
	    	    max=L;//保留最大相同字段
			}
		}
	LCS=(float)2*max/(l1+l2);//注意计算结果为小数时 后面不加括号!!! 
	printf("%.3f",LCS);
}
int main()
{
	char a[100],b[100];
	gets(a);
	gets(b);
	upstr(a,b);
	calculate(a,b);
}

你可能感兴趣的:(【XDOJ】C语言,c语言,开发语言,算法)