本文结合PTA专项练习带领读者掌握数组,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。

目录

7-1 字符串逆序7-2 字符串替换7-3 统计字符出现次数7-4 IP地址转换7-1 删除重复字符7-2 说反话-加强版7-3 数组-回文串7-4 数组-无聊的菇菇一族7-5 数组-文本加密7-6 数组-动车上

7-1 字符串逆序

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。 输入格式:

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。 输出格式:

在一行中输出逆序后的字符串。 输入样例:

Hello World!

输出样例:

!dlroW olleH

方法一:数组实现

#include

int main()

{

char c,a[80];

int i=0;

while((c=getchar())!='\n')

{

a[i]=c;

i++;

}

for(int j=i-1;j>=0;j--)

{

printf("%c",a[j]);

}

}

方法二:引入gets及strlen

#include

#include

int main()

{

char a[80];

gets(a);

for(int i=strlen(a)-1;i>=0;i--)

printf("%c",a[i]);

}

7-2 字符串替换

本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:

原字母 对应字母

A Z

B Y

C X

D W

… …

X C

Y B

Z A

输入格式:

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。 输出格式:

输出在一行中给出替换完成后的字符串。 输入样例:

Only the 11 CAPItaL LeTtERS are replaced.

输出样例:

Lnly the 11 XZKRtaO OeGtVIH are replaced.

#include

int main()

{

char c,a[80],b[80];

int i=0;

while((c=getchar())!='\n')

{

a[i]=c;

i++;

}

for(int j=0;j<=i-1;j++)

{

if(a[j]>='A'&&a[j]<='Z')

{

b[j]='A'+'Z'-a[j];

}

else

b[j]=a[j];

printf("%c",b[j]);

}

}

7-3 统计字符出现次数

本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。 输入格式:

输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。 输出格式:

在一行中输出给定字符在给定字符串中出现的次数。 输入样例:

programming is More fun! m

输出样例:

2

方法一:数组实现

#include

int main()

{

char a[80],c,d;

int i=0,count=0;

while((c=getchar())!='\n')

{

a[i]=c;

i++;

}

d=getchar();

for(int j=i-1;j>=0;j--)

{

if(d==a[j])

count++;

}

printf("%d",count);

}

方法二:引入gets及strlen

#include

#include

int main()

{

char a[80],c;

int count=0;

gets(a);

c=getchar();

for(int i=0;i

{

if(a[i]==c)

{

count++;

}

}

printf("%d",count);

}

7-4 IP地址转换

一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。 输入格式:

输入在一行中给出32位二进制字符串。 输出格式:

在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。 输入样例:

11001100100101000001010101110010

输出样例:

204.148.21.114

#include

#include

int main()

{

char a[33];

int t=7;//当前处理的二进制位在8位中的位置

int sum=0;//当前部分的十进制结果

gets(a);

for(int i=0;i<32;i++)

{

a[i]=a[i]-48;//将字符型的'0'~'1'转换成对应的整型数0~1

sum+=a[i]*pow(2,t);

if(t==0)//如果是8位中的最后一位

{

printf("%d",sum);

t=7;

sum=0;

if(i!=31)

printf(".");

}

else

t--;

}

}

7-1 删除重复字符

本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。 输入格式:

输入是一个以回车结束的非空字符串(少于80个字符)。 输出格式:

输出去重排序后的结果字符串。 输入样例:

ad2f3adjfeainzzzv

输出样例:

23adefijnvz

#include

#include

int main()

{

char a[80];

gets(a);

for(int i=0;i

{

for(int j=0;j

{

if(a[j]>a[j+1])

{

char t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

}

}//冒泡排序得到abccc

//如果前后不一致就打印出来 所以得到abc

for(int i=0;i

{

if(a[i]!=a[i+1])

printf("%c",a[i]);

}

}

7-2 说反话-加强版

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。 输出格式:

每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。 输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

#include

#include

int main()

{

char a[500001],b[500001];

gets(a); // 输入字符串

int i,c,j;

int count=0;

for(i=0;a[i]==' ';i++) // 计算开头的连续空格数

{

count++;

}

for(i=strlen(a)-1;i>=0;)

{

if(a[i]!=' ')

{

c=0;

b[0]='\0';

while(a[i]!=' '&&i>=0) // 提取单词

{

b[c++]=a[i--];

}

//类似于把come中e、m、o、c分别放入b数组

//此时b数组为emoc,将其逆序输出即可

for(j=c-1;j>=0;j--) // 逆序输出单词

{

printf("%c",b[j]);

}

if(count==i+1) ; // 如果开头有空格则不输出

else printf(" "); // 输出单词之间的空格

}

else i--;

}

}

7-3 数组-回文串

回文串是正着读和反着读都一样的字符串,例如“level”“noon”这些都是回文串, 现在希望你能找出输入的所有字符串中的回文串。 输入格式:

第一行为一个正整数N(0 < N <= 1000),表示有N个字符串,

接下来N行每行都是一个字符串(每个字符串长度不超过1000)。 输出格式:

输出所有是回文串的字符串,每输出一个字符串输出一个回车,包括最后一个字符串。

输入样例1: 3 abcabc AbbbbA cccc

输出样例1: AbbbbA cccc

#include

#include

int main()

{

int n;scanf("%d",&n);

getchar();//读取数字到字符串的换行符 避免回车的影响

for(int i=0;i

{

char a[1001];

gets(a);

int len=strlen(a);

if(a[len-1]=='\n')//将字符串到字符串的换行符去掉

{

a[len-1]='\0';

len--;

}

int flag=0;

for(int i=0;i

{

if(a[i]!=a[len-i-1])

{

flag=1;

break;

}

}

if(flag==0)

printf("%s\n",a);

}

}

7-4 数组-无聊的菇菇一族

戈壁上只居住着菇菇一族们,于是菇菇们实在太无聊了,除了吃饭,睡觉,菇菇们天天都无所事事。于是菇菇们想出了一个方法来消磨时间。菇菇们分成几组,每组按一定顺序排列,按从最后一个到第一个的顺序报出菇菇们的名字。报错的一组菇菇将要接受打理节操田地一周的惩罚(太可怕了>.<)。你能帮帮他们么? 输入格式:

第一行包括一个正整数N,表示有N组菇菇。

接下来N行每行包含一个字符串(长度小于100,仅包含小写字母),每个字母表示一个菇菇的名字。 输出格式:

输出N行,每行为该组菇菇报名字的顺序。 输入样例:

2 abcd sama

输出样例:

dcba amas

#include

#include

int main()

{

int n;scanf("%d",&n);

getchar();

for(int i=1;i<=n;i++)

{

char a[100];

gets(a);

for(int i=strlen(a)-1;i>=0;i--)

{

printf("%c",a[i]);

}

printf("\n");

}

}

7-5 数组-文本加密

某特工提供了一段文本,按照以下规则对逐个字符进行加密(称为密文):首先将大小写进行切换(大写转换成小写、小写转换成大写),之后再将字母替换成字母表中两位之前的字母,如‘c’替换成‘a’,‘b’替换成‘z’,‘A’替换成‘Y’。同时,该特工也提供了该密文的解析,请判断该解析是否正确。 输入格式:

输入仅一行,包含两个字符串,中间以一个逗号“,”隔开。每个字符串的长度分别不超过10000个字符,仅包含26个字母(含大小写字母‘a’-‘z’和大写字母‘A’-‘Z’),且保证两个字符的长度相等。 输出格式:

判断密文解析是否正确,正确则输出“Yes”,错误则输出“No”。 输入样例:

ccAAbB,AAyyZz

输出样例:

Yes

#include

#include

#include

int main()

{

char a[10001], b[10001], c[10001];

scanf("%[^,],%s",a,b);

int len=strlen(a);

for (int i=0;i

{

// 切换大小写

if (isupper(a[i]))

c[i]=tolower(a[i]);

else

c[i]=toupper(a[i]);

// 字母替换

if(isalpha(a[i]))

if(c[i]=='A'||c[i]=='B'||c[i]=='a'||c[i]=='b')

c[i]=c[i]+24;

else if((c[i]>='C'&&c[i]<='Z')||(c[i]>='c'&&c[i]<='z'))

c[i]=c[i]-2;

}

c[len] = '\0';

if(strcmp(b,c)==0)

{

printf("Yes");

}

else

{

printf("No");

}

}

7-6 数组-动车上

就这样,阿翔和阿花分手了,阿翔独自一人登上了开往福大的动车……

阿翔刚在自己的座位上坐下,便听到一声问候:“同学,你好。”阿翔扭过头一看,见身旁是一美女,内心暗喜,吞吞吐吐地说:“你……你好……请问有什么事么?”女生说:“能不能麻烦你和我的朋友换个位置?”阿翔一愣,顺着她所指方向望去,见一帅哥。阿翔强装笑颜,答道:“好的。”

阿翔坐在帅哥的座位上,耳边萦绕着那对情侣的欢声笑语。他默默地从书包里掏出那叠英语卷。这一次,为了证明自己的帅气,阿翔要更华丽地调教这些考卷——

对于一个字符串S,设其第i个字符为Si,将每k个连续字符划分为一组,则{S0,S1,…,S(k-1)}为第0组,{Sk,S(k+1),…,S(2k-1)}为第1组,以此类推。阿翔要做的就是将第i组(i从0开始)字符逆置i次(逆置即倒序,如将abc置为cba)。若字符串剩下的字符不够凑成一组,则不对这些字符进行操作。

输入格式: 第一行为一个正整数k(大小不限,可能超过字符串长度); 第二行为一个字符串(长度不超过100,不含空格)。

输出格式: 输出仅一行,即完成操作后所得的字符串。

输入样例: 5 qwertyuiopasdfghjkl

输出样例: 在这里给出相应的输出。例如: qwertpoiuyasdfghjkl

#include

#include

int main()

{

int k;char c[101];scanf("%d",&k);scanf("%s",c);

int len=strlen(c);

int a[101]={0};//用于记录字符是否被输出过

int groupcount=len/k-1;//计算分组数量

int j,i;

for(j=0;j<=groupcount;j+=2)

{

//输出每组的前k个字符

for(i=j*k;i<(j+1)*k;i++)

{

if(i>=len)

break;

printf("%c",c[i]);

a[i]++;

}

//逆序输出每组的后k个字符

for(i=(j+2)*k-1;i>=(j+1)*k;i--)

{

if(i>=len)

break;

printf("%c",c[i]);

a[i]++;

}

}

for(i=0;i

{

if(a[i]==0)

printf("%c",c[i]);//输出没有被标记的字符

}

}

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。