第三十六课 用循环处理文字
项目一【M$pszi$y是嘛意思?】
小明让同学传纸条给小丽,纸条上写着M$pszi$y。小丽接到会心一笑,大家却不知所云。
他们俩的花招瞒不过老师,给你一个程序,输入M$pszi$y,输出的,就是小明的真实意思!
老师真坏!下面,该你运行程序了,明白这样的处理方式后,扩展完成后面的两项工作:
代码:
#include<stdio.h>
int main()
{
char ch;
int n;
printf("请输入口令:\n");
scanf("%d",&n);
if(n==4)
{
printf("口令正确,请继续:\n");
getchar();
while ((ch=getchar())!='\n')
putchar(ch-n);
}
else
printf("口令错误!请重试。\n");
printf("\n");
return 0;
}
运行结果:
项目二【转着圈加密】
为使电文保密,往往按一定规律将电文转换成密码,收报人再按约定的规律将其译回原文。
加密办法,如图所示,每一个字母的密文是其后第4个字母,若超出了字母的范围,将A看作为Z的下一个字母,将a看作是z的下一个字线,依次顺延。
如″Wonderful!″转换为″Asrhivjyp!″。
输入一行字符,要求输出其相应的密码。
加密办法,如图所示,每一个字母的密文是其后第4个字母,若超出了字母的范围,将A看作为Z的下一个字母,将a看作是z的下一个字线,依次顺延。
如″Wonderful!″转换为″Asrhivjyp!″。
输入一行字符,要求输出其相应的密码。
代码:
(1)全字符加密型:
利用switch语句
#include<stdio.h>
int main()
{
char ch;
printf("请输入电文:\n");
while ((ch=getchar())!='\n')
{
switch(ch)
{
case 87:
case 88:
case 89:
case 90:
putchar(ch-22);
break;
case 119:
case 120:
case 121:
case 122:
putchar(ch-22);
break;
default:
putchar(ch+4);
}
}
printf("\n");
return 0;
}
运行结果:
(2)只加密字母型:
利用条件语句
#include<stdio.h>
int main()
{
char ch;
printf("请输入电文:\n");
while ((ch=getchar())!='\n')
{
if ((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))
{
if ((ch>='W'&&ch<='Z')||(ch>='w'&&ch<='z'))
ch-=22;
else
ch+=4;
}
putchar(ch);
}
printf("\n");
return 0;
}
运行结果:
======================================================================================================================
项目三 【消除多余的空格】
从键盘上的输入一句话,直到按回车键为止,这些字符被原样输出,但若有连续的一个以上的空格时只输出一个空格。例如,输入:I am a teacher.,输出I am a teacher.
代码:
#include<stdio.h>
int main()
{
char c;
int i=1;
while ((c=getchar())!='\n')
{
if(c!=' ')
{
putchar(c);
i=1;
}
else
{
if (i<2)
{
putchar(c);
i++;
}
}
}
printf("\n");
return 0;
}
运行结果:
======================================================================================================================
项目四 【血型统计】
黑猫警长在犯罪现场发现了一些血迹,现已经委托检验机构确定了血型,需要统计各种血型的样本数目。
输入:血型序列(A/B/O/C,C代表AB型血,输入以X结束)
输出:各种血型的数量
输入样例:ABCAOCOAOOBX
输出样例:A:3 B:2 O:4 AB:2
输入:血型序列(A/B/O/C,C代表AB型血,输入以X结束)
输出:各种血型的数量
输入样例:ABCAOCOAOOBX
输出样例:A:3 B:2 O:4 AB:2
代码:
#include<stdio.h>
int main()
{
int a=0,b=0,ab=0,o=0;
char c;
while((c=getchar())!='X')
{
if(c=='A')
a++;
else if(c=='B')
b++;
else if(c=='C')
ab++;
else if(c=='O')
o++;
}
printf("A血型为:%d\nB血型为:%d\nAB血型为:%d\nO血型为:%d\n",a,b,ab,o);
return 0;
}
运行结果:
======================================================================================================================
项目五 【有多少符号】
输入一行文字,以回车结束,统计并输出其中数字、空格、字母出现的次数,以及输入的字符总数。
代码:
#include<stdio.h>
int main()
{
char c;
int n=0,w=0,s=0,sum=0;
while((c=getchar())!='\n')
{
if ((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
w++;
else if(c>='0'&&c<='9')
n++;
else if(c==' ')
s++;
sum++;
}
printf("数字个数:%d\n字母个数:%d\n空格数:%d\n共%d个字符\n",n,w,s,sum);
return 0;
}
运行结果:
======================================================================================================================
知识点与总结:
- 循环中加入条件语句或者switch语句可以实现不同的运算,统计字符个数、筛选某种特殊字符等,应该灵活运用这一点。
- 有时候运用ask||码值求解也是一种好的办法。
138