C语言程序设计实验课参考答案(实验九:数组程序设计2)

实验九 数组程序设计2

1. 自动应答器

说明

每当你跟智能机器人打招呼并报上自己的名字 xxx,机器人的输入设备就会录入你的名字,然后就会回复你 Hi xxx. What’s the matter?。这其实是机器人的自动应答器,请你根据机器人的自动应答器功能,设计一个程序,输出机器人的回答。

输入输出格式及样例

输入数据:输入包含 1 行,包含一个字符串 S,其中串长 len(1≤len≤100),表明自动应答器读入的名字。题目保证字符串中字符只包含大小写字母和数字。

suantou

输出数据:输出包含 1 行,包含一个字符串,表明机器人回答的内容。

Hi, suantou. What's the matter?

参考答案

1
2
3
4
5
6
7
#include<stdio.h>
int main(){
char s[100];
scanf("%s", s);
printf("Hi, %s. What's the matter?", s);
return 0;
}

2.忽略大小写的字符串比较

说明

在有些时候,我们比较字符串的大小时,希望忽略字母的大小,例如”Hello”和”hello”在忽略字母大小写时是相等的。请写一个程序,实现对两个字符串进行忽略字母大小写的大小比较。

输入输出格式及样例

输入数据:输入为两行,每行一个字符串,共两个字符串。(每个字符串长度都小于 80 且只包含大小写字母)。

Hellohowareyou

helloHowareyou

输出数据:

如果第一个字符串比第二个字符串小,输出一个字符”<”;

如果第一个字符串比第二个字符串大,输出一个字符”>”;

如果两个字符串相等,输出一个字符”=”。

=

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<string.h>
//将小写字母转换成大写字母
char charupr(char x){
if(x >= 'a' && x<='z'){
return x - 32;
}
return x;
}
int main(){
char a[80], b[80];
int i, l;
scanf("%s", a);
scanf("%s", b);
l = strlen(a);
for(i=0; i < l; i++){
if(charupr(a[i]) < charupr(b[i])){
printf("<");
break;
}else if(charupr(a[i]) > charupr(b[i])){
printf(">");
break;
}
}
if(i>=l){
printf("=");
}
return 0;
}

3. 输出亲朋字符串

说明

编写程序,求给定字符串 s 的亲朋字符串s1亲朋字符串 s1定义如下:给定字符串s的第一个字符的ASCII 值加第二个字符的 ASCII 值,得到第一个亲朋字符;给定字符串s的第二个字符的 ASCII 值加第三个字符的ASCII 值,得到第二个亲朋字符;依此类推,直到给定字符串 s 的倒数第二个字符。亲朋字符串的最后一个字符由给定字符串 s 的最后一个字符ASCII 值加 s 的第一个字符的ASCII 值。

输入输出格式及样例

输入数据:输入一行,一个长度大于等于 2,小于等于 100 的字符串。字符串中每个字符的ASCII 值不大于 63。

1234

输出数据:输出一行,为变换后的亲朋字符串。输入保证变换后的字符串只有一行。

cege

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#include<string.h>
int main(){
char s[100];
int len;
scanf("%s", s);
len = strlen(s);
for(int i=0; i<len-1; i++){
printf("%c", s[i] + s[i+1]);
}
printf("%c", s[len-1] + s[0]);
return 0;
}

4. 字符串判等

说明

判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等。

输入输出格式及样例

输入数据:两行,每行包含一个字符串;字符串长度不超过 100。

a A bb BB ccc CCC

Aa BBbb CCCccc

输出数据:若两个字符串相等,输出”YES”,否则输出”NO”。

YES

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<stdio.h>
#include<string.h>
//将小写字母转换成大写字母
char charupr(char x){
if(x >= 'a' && x<='z'){
return x - 32;
}
return x;
}
int main(){
char a[100], b[100],ch;
int i=0, len=0;
while(1){
ch=getchar();
if(ch == EOF || ch == '\n'){
break;
}
if(ch != ' '){
a[len] = ch;
len++;
}
}
a[len] = '\0';
len=0;
while(1){
ch=getchar();
if(ch == EOF || ch == '\n'){
break;
}
if(ch != ' '){
b[len] = ch;
len++;
}
}
b[len] = '\0';
for(i=0; i < len; i++){
if(charupr(a[i]) != charupr(b[i])){
printf("NO");
return 0;
}
}
if(i>=len){
printf("YES");
}
return 0;
}

5. 过滤多余的空格

说明

一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。

输入输出格式及样例

输入数据:一行,一个字符串(长度不超过 200),句子的头和尾都没有空格。

Hello world.This is c language.

输出数据:过滤之后的句子。

Hello world.This is c language.

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
int main () {
int flag = 0;
char ch;
while(ch = getchar()){
if(ch == '\n' || ch == EOF){
break;
}
if(ch == 32 && flag == 1){
printf(" ");
flag = 0;
}
if(ch != 32){
printf("%c", ch);
flag = 1;
}
}

return 0;
}

6. 恺撒加密术

说明

加密术最早应用于古代战争。古罗马时期,凯撒大帝曾是使用密码来传递信息,它是一种替代密码,对于信中的每个字母,会用它后面第i给字母代替。试编一个程序,将输入的一段英文字符加密后输出,只加密字母,加密的规则是用字母后来的第1个字母代替用来的字母,即用’b’代替’a’,用’c’代替’b’,······,用’a’代替’z’。

输入输出格式及样例

输入数据:一行字符串,不超过2000个字符。

Nike is excellent!

输出数据:加密后的字符串。

Ojlf jt fydfmmfou!

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
int main(){
char ch;
while(ch=getchar()){
if(ch=='\n'|| ch ==EOF){
break;
}
if(ch== 'z'){
ch = 'a';
}else if(ch == 'Z'){
ch = 'A';
}else if((ch >= 'a' && ch < 'z')||(ch >= 'A' && ch < 'Z')){
ch++;
}else{

}
printf("%c", ch);
}
return 0;
}

7. 单词翻转

说明

输入一个句子(一行),将句子中的每一个单词翻转后输出。

输入输出格式及样例

输入数据:只有一行,为一个字符串,不超过 500个字符。单词之间以空格隔开。注意字符串开头和结尾可能有空格。

hello world

输出数据:翻转每一个单词后的字符串,单词之间的空格需与原文一致。

olleh dlrow

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
int main(){
char a[500];//字符串数组
int b[500]; //记录空格下标数组
char ch;
int i=0, j=0;
while(ch = getchar()){
if(ch == '\n' || ch == EOF){
break;
}
if(ch == ' '){
b[j] = i; //记录空格符的下标
j++;
}
a[i] = ch;
i++;
}
b[j] = i;//字符串结束时也记录一个
//循环每个单词,从第一个空格前一位开始到下标0开始到,再从第二个空格前一位到第一个空格后一位···
int start = 0;
for(int i=0; i<=j; i++){
for(int end=b[i]-1; end>=start; end--){
printf("%c", a[end]);
}
printf(" ");
start = b[i]+1;
}
return 0;
}

8. 判断字符串是否为回文

说明

输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。

输入输出格式及样例

输入数据:输入为一行字符串(字符串中没有空白字符,字符串长度不超过 100)。

abcdedcba

输出数据:如果字符串是回文,输出”yes”;否则,输出”no”。

yes

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<string.h>
int main(){
char str[100];
int len;
scanf("%s", str);
len = strlen(str);
for(int i=0, j=len-1; i<j; i++, j--){
if(str[i]!=str[j]){
printf("no");
return 0;
}
}
printf("yes");
return 0;
}

9. 删除单词后缀

说明

给定一个单词,如果该单词以er、ly或者ing后缀结尾, 则删除该后缀(题目保证删除后缀后的单词长度不为 0),否则不进行任何操作。

输入输出格式及样例

输入数据:输入一行,包含一个单词(单词中间没有空格,每个单词最大长度为 32)。

referer

输出数据:输出按照题目要求处理后的单词。

refer

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#include<string.h>
int main(){
char a[32];
int len;
scanf("%s", a);
len = strlen(a);
if(a[len-1] == 'r' && a[len-2] == 'e'){
a[len-2] = '\0';
}
if(a[len-1] == 'y' && a[len-2] == 'l'){
a[len-2] = '\0';
}
if(a[len-1] == 'g' && a[len-2] == 'n' && a[len-3] == 'i'){
a[len-3] = '\0';
}
printf("%s", a);
return 0;
}

10.字符替换

说明

把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串。

输入输出格式及样例

输入数据:只有一行,由一个字符串和两个字符组成,中间用单个空格隔开。字符串是待替换的字符串,字符串长度小于等于30个字符,且不含空格等空白符;
接下来一个字符为需要被替换的特定字符;
接下来一个字符为用于替换的给定字符。

hello-how-are-you o O

输出数据:一行,即替换后的字符串。

hellO-hOw-are-yOu

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
#include<string.h>
int main(){
char str[30];
int len;
char a, b;
scanf("%s %c %c", str, &a, &b);
len = strlen(str);
for(int i=0; i<len; i++){
if(str[i] == a){
printf("%c", b);
}else{
printf("%c", str[i]);
}
}
return 0;
}

11. 单词替换

说明

输入一个字符串,以回车结束(字符串长度≤200)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。

输入输出格式及样例

输入数据:输入包括 3 行,
第 1 行是包含多个单词的字符串 s;
第 2 行是待替换的单词a(长度≤100);
第 3 行是a将被替换的单词b(长度≤200)。 
s,a,b最前面和最后面都没有空格。

You want someone to help you
You
I

输出数据:输出只有 1 行,将s中所有单词a替换成b之后的字符串。

I want someone to help you

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<stdio.h>
#include<string.h>
int main(){
char s[200], a[100], b[200];
char ch;
int i = 0, j = 0, n,m;
while((ch = getchar()) != '\n'){
s[i] = ch;
i++;
}
scanf("%s", a);
j = strlen(a);
scanf("%s", b);
for(m=0; m<i; m++){
//题目没有测试单词前面不同,后面相同的情况
if(m==0 || s[m-1] == ' '){//通过判断前一个字母是不是空格
//判断当前字符和后面的字符是否和单词a相同!
for(n=0; n<j; n++){//根据a的长度,使用循环
if(s[m + n] != a[n]){
break;
}
}
//如果全部相同,就执行替换(输出时替换,不改变数组)
if(n>=j && (s[m+n] == ' ' || m+n == i)){//判断匹配的是否是单词(后面是不是空格,或最后一个单词)
printf("%s", b);
m = m + n-1;//替换后,考虑到ab长度不同,确定下次执行m的位置
continue; //执行替换后,直接进行下一次循环,不用执行最后的输出当前字符
}
}
printf("%c", s[m]);//不同就输出当前字符
}
return 0;
}

12. 简单密码

说明

Julius Caesar 曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后第 5 位对应的字符来代替,这样就得到了密文。比如字符’A’用’F’来代替。

如下是密文和明文中字符的对应关系。
密文A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
明文V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
你的任务是对给定的密文进行解密得到明文。
你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。

输入输出格式及样例

输入数据:一行,给出密文,密文不为空,而且其中的字符数不超过 200。

NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX

输出数据:输出一行,即密文对应的明文。

IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(){
char ch;
while(ch = getchar()){
if(ch == '\n' || ch == EOF){
break;
}
if(ch>= 'A' && ch <= 'Z'){
ch = ch - 5 < 65 ? ch + 26 - 5 : ch - 5;
}
printf("%c", ch);
}
return 0;
}