【id:479】【16分】D. 字符串操作(数组)

题目描述

初始一空串,给定以下操作(下述描述中,下标均从1开始)
INSERT_STR index substr: 在下标为index的位置插入字符串substr,操作结束后输出字符串,保证操作合法
DELETE_CHAR character: 删除字符串中所有的character字符,操作结束后输出字符串
DELETE_RANGE left right: 删除下标为[left, right]的子串,操作结束后输出字符串,保证操作合法
INSERT_REVERSE_STR: 将字符串自身反转后的串接在自身后,操作结束后输出字符串
REVERSE_STR: 将字符串反转,操作结束后输出字符串
COUNT_VOWEL: 统计元音数量之和(即aeiou的数量之和,注意包含大小写),操作结束后输出统计值

输入

测试数据只有一组
每行输入一个操作
操作以 OVER 结束
输入数据保证不超过1000行,字符串的长度保证始终不超过10000,字符串始终不存在空白字符

输出

具体输出见样例

输入输出样例

输入样例1 <-复制
INSERT_STR 1 aeiou
INSERT_REVERSE_STR
DELETE_CHAR i
REVERSE_STR
COUNT_VOWEL
DELETE_RANGE 1 2
INSERT_STR 3 zzzzz
COUNT_VOWEL
OVER

输出样例1
aeiou
aeiouuoiea
aeouuoea
aeouuoea
8
ouuoea
ouzzzzzuoea
6

AC代码

c语言版

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

void charu(char a[1000], int n, char s[]);
void INSERT_REVERSE_STR(char a[1000]);
void DELETE_CHAR(char a[1000], char s[]);
void REVERSE_STR(char a[1000]);
void COUNT_VOWEL(char a[1000]);
void DELETE_RANGE(char a[1000], int n, int m);

int main()
{
	int n, m;
	char ch[1000], s[50];
	ch[0] = '\0'; // 初始化字符串为空
	while (scanf("%s", s) != EOF)
	{
		if (strcmp(s, "INSERT_STR") == 0)
		{
			scanf("%d%s", &n, s);
			charu(ch, n, s);
		}
		else if (strcmp(s, "INSERT_REVERSE_STR") == 0)
			INSERT_REVERSE_STR(ch);
		else if (strcmp(s, "DELETE_CHAR") == 0)
		{
			scanf("%s", s);
			DELETE_CHAR(ch, s);
		}
		else if (strcmp(s, "REVERSE_STR") == 0)
			REVERSE_STR(ch);
		else if (strcmp(s, "COUNT_VOWEL") == 0)
			COUNT_VOWEL(ch);
		else if (strcmp(s, "DELETE_RANGE") == 0)
		{
			scanf("%d%d", &n, &m);
			DELETE_RANGE(ch, n, m);
		}
		else if (strcmp(s, "OVER") == 0)
			break;
	}
}

void charu(char a[1000], int n, char s[])
{
	int i, j, k1, k2;
	k1 = strlen(a);
	k2 = strlen(s);
	for (i = k1; i >= n - 1; i--)
	{
		a[i + k2] = a[i];
	}
	for (i = n - 1, j = 0; j < k2; i++, j++)
	{
		a[i] = s[j];
	}
	printf("%s\n", a);
}

void INSERT_REVERSE_STR(char a[1000])
{
	int i, k1;
	k1 = strlen(a);
	for (i = k1; i < k1 * 2; i++)
	{
		a[i] = a[k1 * 2 - i - 1];
	}
	a[k1 * 2] = '\0';
	printf("%s\n", a);
}

void DELETE_CHAR(char a[1000], char s[])
{
	int i, j, flag, k1, k2;
	k1 = strlen(a);
	k2 = strlen(s);
	for (i = 0; i < k1; i++)
	{
		flag = 0;
		if (a[i] == s[0])
		{
			for (j = 2; j < k2; j++)
			{
				if (a[i + j] != s[j])
				{
					flag = 1;
					break;
				}
			}
			if (flag == 0)
			{
				for (j = i; j < k1; j++)
				{
					a[j] = a[j + k2];
				}
			}
			k1--;
			i--;
		}
	}
	printf("%s\n", a);
}

void REVERSE_STR(char a[1000])
{
	int i, k1;
	char c[1000];
	k1 = strlen(a);
	for (i = 0; i < k1; i++)
	{
		c[i] = a[k1 - i - 1];
	}
	c[k1] = '\0';
	strcpy(a, c);
	printf("%s\n", a);
}

void COUNT_VOWEL(char a[1000])
{
	int i, n;
	n = 0;
	for (i = 0; i < strlen(a); i++)
	{
		if (a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u')
			n++;
		else if (a[i] == 'A' || a[i] == 'E' || a[i] == 'I' || a[i] == 'O' || a[i] == 'U')
			n++;
	}
	printf("%d\n", n);
}

void DELETE_RANGE(char a[1000], int n, int m)
{
	int i;
	for (i = n - 1; i < strlen(a); i++)
	{
		a[i] = a[i + m - n + 1];
	}
	printf("%s\n", a);
}

c++版

#include<bits/stdc++.h>
using namespace std;

void charu(char a[1000],int n,char s[]);
void INSERT_REVERSE_STR(char a[1000]);
void DELETE_CHAR(char a[1000],char s[]);
void REVERSE_STR(char a[1000]);
void COUNT_VOWEL(char a[1000]);
void DELETE_RANGE(char a[1000],int n,int m);


int main()
{
	int n,m;
	char ch[1000],s[50];
	ch[0]='\0';
	while(cin>>s)
	{
		if(strcmp(s,"INSERT_STR")==0)
		{
			cin>>n>>s;
			charu(ch,n,s);//
		}
		else if(strcmp(s,"INSERT_REVERSE_STR")==0)
			INSERT_REVERSE_STR(ch);
		else if(strcmp(s,"DELETE_CHAR")==0)
		{
			cin>>s;
			DELETE_CHAR(ch,s);
		}
		else if(strcmp(s,"REVERSE_STR")==0)
			REVERSE_STR(ch);
		else if(strcmp(s,"COUNT_VOWEL")==0)
			COUNT_VOWEL(ch);
		else if(strcmp(s,"DELETE_RANGE")==0)
		{
			cin>>n>>m;
			DELETE_RANGE(ch,n,m);
		}
		else if(strcmp(s,"OVER")==0)
			break;
	}
}

void charu(char a[1000],int n,char s[])
//INSERT_STR index substr: 在下标为index的位置插入字符串substr,操作结束后输出字符串,保证操作合法
{
	int i,j,k1,k2;
	k1=strlen(a);
	k2=strlen(s);
	for(i=k1;i>=n-1;i--)
	{
		a[i+k2]=a[i];
	}
	for(i=n-1,j=0;j<k2;i++,j++)
	{
		a[i]=s[j];
	}
	cout<<a<<"\n";
}
void INSERT_REVERSE_STR(char a[1000])
//INSERT_REVERSE_STR: 将字符串自身反转后的串接在自身后,操作结束后输出字符串
{
	int i,k1;
	k1=strlen(a);
	for(i=k1;i<k1*2;i++)
	{
		a[i]=a[k1*2-i-1];
	}
	a[k1*2]='\0';
	cout<<a<<"\n";
}
void DELETE_CHAR(char a[1000],char s[])
//DELETE_CHAR character: 删除字符串中所有的character字符,操作结束后输出字符串
{
	int i,j,flag,k1,k2;
	k1=strlen(a);
	k2=strlen(s);
	for(i=0;i<k1;i++)
	{
		flag=0;
		if(a[i]==s[0])
		{
			for(j=2;j<k2;j++)
			{
				if(a[i+j]!=s[j])
				{
					flag=1;
					break;
				}	
			}
			if(flag==0)
			{
				for(j=i;j<k1;j++)
				{
					a[j]=a[j+k2];
				}
			}
			k1--;
			i--;
		}
	}
	cout<<a<<"\n";
}
void REVERSE_STR(char a[1000])
//REVERSE_STR: 将字符串反转,操作结束后输出字符串
{
	int i,k1;
	char c[1000];
	k1=strlen(a);
	for(i=0;i<k1;i++)
	{
		c[i]=a[k1-i-1];
	}
	c[k1]='\0';
	strcpy(a,c);
	cout<<a<<"\n";
}
void COUNT_VOWEL(char a[1000])
//COUNT_VOWEL: 统计元音数量之和(即aeiou的数量之和,注意包含大小写),操作结束后输出统计值
{
	int i,n;
	n=0;
	for(i=0;i<strlen(a);i++)
	{
		if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')
			n++;
		else if(a[i]=='A'||a[i]=='E'||a[i]=='I'||a[i]=='O'||a[i]=='U')
			n++;
	}
	cout<<n<<"\n";
}
void DELETE_RANGE(char a[1000],int n,int m)
//DELETE_RANGE left right: 删除下标为[left, right]的子串,操作结束后输出字符串,保证操作合法
{
	int i;
	for(i=n-1;i<strlen(a);i++)
	{
		a[i]=a[i+m-n+1];
	}
	cout<<a<<"\n";
}

函数charu实现在指定位置插入字符串,并输出结果。

函数INSERT_REVERSE_STR实现将字符串自身反转后拼接在后面,并输出结果。

函数DELETE_CHAR实现删除字符串中所有指定的字符,并输出结果。

函数REVERSE_STR实现将字符串反转,并输出结果。

函数COUNT_VOWEL实现统计字符串中元音字母的数量,并输出结果。

函数DELETE_RANGE实现删除字符串中指定范围的子串,并输出结果。

main函数中,根据输入的操作类型调用相应的函数,并不断进行操作,直到输入OVER结束。

(by 归忆) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归忆_AC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值