C语言常见例题2

1.有一组均由字符A~Z和a~z组成的字符串,其中要求将字符串中各字符按如下要求进行转换: Az、By、Cx、...... 、Xc、Yb、Za

输入: 第一行输入字符串(长度<=10000)
输出: 输出转换之后的字符串。

输入样例1:

输出样例2:

输入样例2:

输出样例2:

代码如下

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[]) {
	char *a = (char*)malloc(10000);/*定义字符串*/
	scanf("%s", &*a);    /*输入字符串*/
	for (int i = 0; a[i] != '\0'; i++) {
		if (a[i] >= 'A' && a[i] <= 'Z') /*如果是大写字母,先转成对于小写字母,再根据转换规则转换*/
			a[i] = a[i] + 32 + 25 - (a[i] - 'A') * 2; /*例如'B','B'+32变成'b',加25变成'z'+2,再减去('B'-'A')*2就变成'Y'*/
		else if (a[i] >= 'a' && a[i] <= 'z') /*小写字母转大写字母方式同上*/
			a[i] = a[i] - 32 + 25 - (a[i] - 'a') * 2; /*例如'b','b'-32变成'B',加25变成'Z'+2,再减去('b'-'a')*2就变成'y'*/
	}
	for (int i = 0; a[i] != '\0'; i++) { /*打印输出*/
		printf("%c", a[i]);
	}
}


2.现要对一个由字符a-z和A-Z组成的字符串进行解密,已知加密规则是: 字符串中所有字符分别在大写或小写的字母表中被循环左移5位(fGh-->aBc)

输入: 一个加密过的字符串(( 长度大于1 且小于50 且只包含大小写字母)。 )
输出: 输出解密后的字符串

样例输入:

样例输出:

代码如下:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[]) {
	char *a = (char*)malloc(50);/*定义字符串*/
	scanf("%s", &*a);    /*输入字符串*/
	for (int i = 0; a[i] != '\0'; i++) {
		if(a[i]<'A'||(a[i]>'Z'&&a[i]<'a')||a[i]>'z'){/*判断字符串是否有无*/
			printf("输入字符有误:应输入只包含大、小写英文字符的字符串!");
			break;
		}	
		if((a[i]-'A'>=5&&a[i]>='A'&&a[i]<='Z')||(a[i]-'a'>=5&&a[i]>='a'&&a[i]<='z'))/*判断字符串变换是否进入变换循环*/
			a[i]-=5;/*若不进入变换循环则直接变换5次*/
		else if(a[i]>='A'&&a[i]<='Z')/*若大写英文字符进入变换循环则变换成'A'*/
			a[i]='Z'-(4-(a[i]-'A'));/*再变换成'Z',从'Z'变换,变换4-(变换成'A'所用次数)次*/
		else if(a[i]>='a'&&a[i]<='z')/*小写英文字符变换同上*/
			a[i]='z'-(4-(a[i]-'a'));	
	}
	for (int i = 0; a[i] != '\0'; i++) { /*打印输出*/
		printf("%c", a[i]);
	}
}


3.输入一行由字符a~z和A~Z组成的字符串,字符串长度<=10000,求其中任意两个字符大小写一共出现的次数的差值的绝对值

输入:第一行输入字符串
           第二行输入两个字符。
输出:输出这两个字符出现次数的差值的绝对值

样例输入:

样例输出:

代码如下:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[]) {
	char *a = (char*)malloc(10000);/*定义字符串*/
	char b,c;
	int n=0,m=0;
	scanf("%s", &*a);    /*输入字符串*/
	scanf("%c %c", &b,&c);
	for (int i = 0; a[i] != '\0'; i++) {
			if(a[i]==b||a[i]+32==b||a[i]-32==b)n++;/*统计输入字符的大小写一共出现的次数*/
			if(a[i]==c||a[i]+32==c||a[i]-32==c)m++;
	}
	printf("%d",abs(n-m));/*输出出现次数的差值的绝对值*/
}


4.输入正整数A、B、C(0<=A,B,C<=10000),若用'+'、'-'、'*'、'/'、'%'之一组成等式(即A@B=C,@是上述运算符之一,),则输出“YES”,否则输出“NO”;

输入:
第一行输入正整数N(1<=N<=1000)表示有N组数据,
其后有N行非零整数A、B、C。
输出:
对于每行整数A、B、C,其计算结果各占一行。

输入样例:

输出样例:

(说明:输入样例中2*3=6,5/3=1,1%4=1)

代码如下:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[]) {
	int N,a,b,c,k=0;
	char *m = (char*)malloc(1000);/*定义一个字符串用来存放输出结果*/
	scanf("%d", &N);
	for (int i = 0; i<N; i++) {
		scanf("%d %d %d", &a,&b,&c);/*输入三个数*/
		if(a+b==c||a-b==c||a*b==c||a/b==c||a%b==c){/*判断四则运算是否符合*/
			m[k]='Y';k++;m[k]='E';k++;m[k]='S';k++;
		}
		else {
			m[k]='N';k++;m[k]='O';k++;
		}
	}
	for(int i=0;m[i]!='\0';i++){/*按位输出*/
		printf("%c",m[i]);
		if(m[i]=='S'||m[i]=='O')
			printf("\n");
	}	
}


5.Excel表列名称由字母A~Z组成,列字母的规律如下:
A、B、C.....Z、AA、AB......AZ、BA、BB.......ZZZZY、ZZZZZ.......

输入:输入包含两个列名称字符串,长度均小于等于5。
输出:输出两个列名称之间共有多少列

输入样例:

输出样例:

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, const char *argv[]) {
	char *a = (char*)malloc(1000);
	char *b = (char*)malloc(1000);/*定义两个字符串用来存放列数*/
	int n = 0, m = 0, x = 0, y = 0; /*n,m分别存放输入的列有几层,x用来统计列数*/
	scanf("%s", &*a);
	scanf("%s", &*b);
	for (int i = 0; a[i] != '\0'; i++) {
		n++;		/*例如输入”AA“,即n=2*/
	}
	for (int i = 0; b[i] != '\0'; i++) {
		m++;
	}
	for (int i = n - 2, j = 1; i >= 0; i--, j++) {
		x += (a[i] - 'A' + 1) * pow(26, j);
	}/*计算每个字符串的总列数,因为c语言中一个数0次方为0故不计算最后一层,即“DA”只计算“(A-D)A”*/
	x += a[n - 1] - 'A' + 1; /*单独计算最后一层即"AZ"只计算"A-Z"*/
	for (int i = m - 2, j = 1; i >= 0; i--, j++) { /*同上*/
		y += (b[i] - 'A' + 1) * pow(26, j);
	}
	y += b[m - 1] - 'A' + 1;
	printf("%d", abs(x - y) - 1); /*打印输出*/
}


总结

C语言中字符串的操作可以使用指针进行编写,相比于字符数组更为方便简洁。

在进行英文字符转换时,要注意字符的大小写,对照ASCII表进行有规律的转换

C语言中的次方函数POW,一个数的0次方,在程序中为0,应注意

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值