2020秋季C语言练习题(10)

A. 按要求输出

题目描述
首先请实现如下两个函数(要自己写代码完成,不允许直接调用库函数):
int myStrLen(char *s);
该函数功能为求字符串s的长度。
void myStrConcat(char *string1, char *string2);
该函数的功能为将字符串string2拼接至字符串string1后边。
注意:该函数的两个参数,在调用时有可能会指向同一个字符串,函数需要在这种情况下能正确完成指定的功能。
主函数要求使用以上两个函数实现如下功能:
输入:
第一行为三个整数n(0<n<10),a,b, 第二行为n个整数,后边为n行字符串,每个字符串长度不超过20。
输出:
要求首先将第b行字符串拼接至第a行的字符串后再输出。
第一行为n个用单个空格分隔的整数(最后一个数后无空格),为按各字符串的输入次序输出的各字符串的长度。
后边n行为将输入的字符串按输入的第2行给出的顺序依次输出。
输入保证合法且字符串中不包含空格。

输入样例

2 0 1
1 0
Hello
World

输出样例

10 5
World
HelloWorld
#include <stdio.h>
int myStrLen(char *s){
	int ret;
	for(ret=0;s[ret]!='\0';ret++);
	return ret;
}
void myStrConcat(char *dst, char *src){
	int start=myStrLen(dst);
	int len=myStrLen(src); 
	for(int i=0;i<len;i++)
		dst[i+start]=src[i];
}
int main(){
	char str[10][50]={{0}};
	int order[10]={0};
	int n,a,b;
	scanf("%d%d%d",&n,&a,&b);
	for(int i=0;i<n;i++)
		scanf("%d",&order[i]);
	for(int i=0;i<n;i++)
		scanf("%s",str[i]);
	myStrConcat(str[a],str[b]);
	for(int i=0;i<n;i++)
		printf("%d ",myStrLen(str[i]));
	printf("\n");
	for(int i=0;i<n;i++)
		printf("%s\n",str[order[i]]);
} 

B. 在指定位置插入字符串

题目描述
输入两个字符串s1,s2和任意字符k,在s1中的指定字符k第一次出现的位置处插入字符s2,构成新的字符串s3,并将s3输出。
(经某同学的举报,补充一句:如果s1中没有k会默认将s2插在s1结尾)
输入格式:
输入有三行,第一行用gets()输入s1串,第二行用gets()输入s2串,第三行用%c格式输入任意字符k。
输出格式:
用puts输出s3字符串。

输入样例

abcd
12
b

输出样例

a12bcd
#include <stdio.h>
#include <string.h>
#define MAX_s1 200
#define MAX_s2 100
void strInsert(char *dst,char*src,char key);
int main(){
	char s1[MAX_s1]={0};
	char s2[MAX_s2]={0};
	char k;
	gets(s1);
	gets(s2);
	scanf("%c",&k);
	strInsert(s1,s2,k);
	puts(s1);
} 
void strInsert(char *dst,char*src,char key){
	char *p=NULL;
	int dstLen=strlen(dst);
	int srcLen=strlen(src);
	int keyIndex=strlen(dst);
	if(p=strchr(dst,key))
		keyIndex=p-dst;
	for(int i=dstLen+srcLen;i>=keyIndex;i--)
		dst[i]=dst[i-srcLen];
	for(int i=0;i<srcLen;i++)
		dst[i+keyIndex]=src[i];
}
//小清新版
#include <stdio.h>
#include <string.h> 
#define LEN 100
int main(){
	char s1[LEN],s2[LEN],k;
	gets(s1);gets(s2);
	scanf("%c",&k);
	char *p=NULL;
	if(p=strchr(s1,k)){
		*p=0;
		printf("%s%s",s1,s2);
		*p=k;
		puts(p);		
	}else printf("%s%s",s1,s2);
} 

C. 括号匹配

题目描述
C语言马上就要期末考试了,小明每天都在紧张地复习着。一天他突然想到一个问题,就是C语言的语法规定括号是要匹配的。那么什么叫括号匹配呢?这个问题似乎小学生都懂,可我们的教材上好像没有明确的说明,老师上课也没讲过。上网一搜,满屏都是括号匹配算法,就是没有人说什么是括号匹配。于是小明就来问教C语言的250老师。250老师说:“这么简单的问题也要来问,括号匹配就是左右括号要成对出现,不能只有一个。”小明于是在纸上写了两个表达式,3)+(2和(5+[3+6)*7],问这两个表达式的括号算匹配吗?250老师“……”。
这两个表达式的括号显然是不匹配的。括号不匹配通常有3种情况:
1、左右括号次序不正确,如小明写的第一个表达式;
2、左括号多于右括号;
3、右括号多于左括号。现在就请聪明的你帮帮小明写一段用于判断括号是否匹配的C程序。
输入格式:
输入的第一行是一个整数t(0<t<20),表示有t组测试用例。后面是t行字符串(为了简化程序,字符串中只包含’{‘和’}'两种字符),每个字符串长度不超过30。
输出格式:
t行,每行对应一行输入的字符串,如果该行字符串括号是匹配的则输出yes,否则输出no。

输入样例

2
{}
}{

输出样例

yes
no
#include <stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		char str[35]={0};
		scanf("%s",str);
		int l=0,r=0;
		for(int i=0;str[i]!='\0';i++){
			l+=str[i]=='{';
			r+=str[i]=='}';
			if(l<r)break;
		}
		printf(l==r?"yes\n":"no\n");
	}
	return 0;
} 

D. 26进制

题目描述
Saerdna最近在研究数值计算,其中有一个项目涉及了进制转换。已知A对应0,B对应1,Z对应25,BB对应27。你能写一个程序来转换这些数值么?
输入:
一串字符,保证输入的字符串只含大写字母,且字符串长度不大于5.
输出:
对应的值。

输入样例

BB

输出样例

27
#include <stdio.h>
int main(){
	char letter[6];
	scanf("%s",letter);
	int dec=0;
	for(int i=0;letter[i]!='\0';i++)
		dec=dec*26+letter[i]-'A';
	printf("%d",dec);
	return 0;
} 

E. 明文密码加密

题目描述
2014年4月8日,openSSL漏洞如一颗核弹在互联网引爆。存储在服务器内存中的明文密码被黑客疯狂下载,再复杂的密码也逃不过明文存储的管理漏洞。你开发了一种简单的加密方法,首先将字符串倒置,再向右循环移动1位(最右侧的字符移动到最左侧)。
输入:
一行待加密的字符串,包含大小写字母和数字。字符串长度<=50.
输出:
按照规则加密后的字符串。

输入样例

123456789XYZ

输出样例

1ZYX98765432
//通用版:
#include <stdio.h>
#include <string.h> 
void encrypt(char *plainText,char *cipherText,int shift);
int main(){
	char in[55]={0};
	char out[55]={0};
	scanf("%s",in);
	encrypt(in,out,1);//shift就是偏移量,本题是1.
	puts(out);
	return 0;
} 
void encrypt(char *plainText,char *cipherText,int shift){
	int len=strlen(plainText);
	for(int i=0;i<len;i++){
		int idx=len-i-1+shift;
		while(idx<0)idx+=len;
		cipherText[i]=plainText[idx%len];
	}
} 
//简略版
#include <stdio.h>
#include <string.h> 
int main(){
	char in[55]={0};
	char out[55]={0};
	scanf("%s",in);
	out[0]=in[0];
	int len=strlen(in);
	for(int i=1;i<len;i++)
		out[len-i]=in[i];
	puts(out);
	return 0;
} 
  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值