高分悬赏,一道很简单的C++编程题。

用户首先输入一句英文诗,最长100个单词,每个单词最多100个字母,均为小写字母,中间不包含标点符号,以英文句号'.'结尾。接着用户输入两个数字n和k。

把该英文句子中的第n个单词采用上题中的加密方法(就是按照字母表向后数第k个字母,到结尾循环到开头)加密输出。

输入:

every time when you pass by

you take my breath away.

10

2

输出:

dtgcvj

提示:

1.输入的英文句子可以考虑用指针数组存储,动态申请内存(实在没掌握开大二维数组也行!)。

2.可以用上题的程序做一个函数本题使用。

3.注意英文诗句的最后一个单词不包含句号'.',句号只是作为提示诗句结束使用。

可能用到的函数:

strlen 求字符串长度

strcpy 拷贝字符串

以上是原题,加密的函数我已编出,我刚刚学c++,学到函数与指针,答案中不希望出现较高级的语法

C++程序:

#include<iostream.h>

#define MAX 101

void encrypt(char *source, int n, int k, char *dest);

void main()

{

char source[MAX]; //英文诗句

int n, k;

char dest[MAX]; //加密后内容

gets(source);

cin>>n>>k;

encrypt(source, n, k, dest);

cout<<"before encrypt : "<<source<<endl;

cout<<"after encrypt  : "<<dest<<endl;

return 0;

}

void encrypt(char *source, int n, int k, char *dest)

{

int i, j;

int count;

i = 0;

count = 0;

while(count<n-1)

{

for(;*(source+i)!=' ' && *(source+i)!='.'; i++);

if(*(source+i)!='.')

count++;

for(;*(source+i)==' ' && *(source+i)!='.'; i++);

}

for(j=0; *(source+i)!=' ' && *(source+i)!='.'; j++,i++)

{

*(dest+j) = *(source+i);

if(*(dest+j)>='a' && *(dest+j)<='z')

{

*(dest+j) = (*(dest+j) - 97 + k ) % 26 + 97;

}

else if(*(dest+j)>='A' && *(dest+j)<='Z')

{

*(dest+j) = (*(dest+j) - 65 + k ) % 26 + 65;

}

else

{

*(dest+j) += k;

}

}

*(dest+j) = '\0';

}

运行测试:

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-24
#include<iostream.h>
#include<string.h>
/*
需求1:字符窜输入,输入完整,分段输入
定义两个字符串数组a b;
a用来接收输入的字符串(子函数变量),b用来整合输入的字符串(主函数变量)
对字符串进行检索,若有非小写字母则重新输入字符串,则重新输入。
没有则将字符串复制到b中。 检索b中得倒数第二的字符是否为'.'
若不为'.'则继续输入
若为'.'则进行以下操作
作为主函数变量:定义int型数intt【100】
检测字符串数组将每个单词的首字母位置下标赋值给mark【100】;
需求2:字符串的检索
定义数组c[100]
输入n找到第n个单词,将字符输出到c中,在对c进行加密输出

*/
void StringCin(char *bp/*接收char型字符串数组首地址*/,int *inttp/*接收一个iint型数组首地址,放入每个单词首字母对应的下标*/)
{
//完成对字符串的检测,完成了字符串的输入
char a[10100];//考虑到每个单词之间有一个间隔指定一个空格共有100个所以定义为1000个
int i=0/*用来对a中得字符串进行检索*/,j=0/*用来指向第一个没有被赋值的*bp[]*/,end=0/*用来判断输入是否结束*/;
do{
cin>>a;
for(i=0;a[i]!='\0';i++)
{
if(a[i]不为小写字母且'.')
{ cout<<"输入错误"<<endl;break;}//这里有break减少了递归操作
if(a[i]=='.'&&a[i+1]=='\0')
end=1;

}
if(end==0)
{
// 将字符串复制到*bp中(从bp[j]开始),最后一个'\0'换成空格
strcpy(&bp[j],a);
j=strlen(a)+j;
bp[j++]=' ';
}
}
while(end==0);
//对每个单词建立检索
//把单词的第一个字母对应的下标添入inttp
int intttp=0; //inttp[]的下标
inttp[intttp++]=0;
for(int k=0;k!='.';k++)
{
if(bp[k]==' '&&bp[k+1]!=' ')
inttp[intttp++]=k+1;
}
}

char* return_string(int n/*返回第n个字符串*/,char *bp,char *inttp)
{
n=n-1; //转换成下标值
int bip=inttp[n]; //找到对应的单词下标
char word[100];
for(;bp[bip]!='\0';bip++)
word[bip-inttp[n]]=bp[bip];
word[bip-inttp[n]]=bp[bip];
return word;

}
void main()
{
char b[10100];
int intt[100],n;
char word[100];
StrintCin(b,intt);
cout<<"输入字符串完毕,请输入编码的是第几个单词:";
cin>>n;
strcpy(word,return_string(n,b,intt));
/*至此在word[100]中有多得字符串*/

}
/*代码并为经过调试,把我这个代码看懂对你也是一种提高,好好学习吧!孩子*/
第2个回答  2012-03-23
首先接收字符串用string :string str; cin>>str;用string的好处就是可以不用你管理内存分配
将分开的单词储存用vector<T>:vector<string> strVec;
储存单词:strVec.push("单词")或者strVec.push(string对象)。
分离单词可以利用string中的find函数,找到空格然后跳过以此分离单词

至于你说的strlen什么的字符串操作那都是C中用的,过时了本回答被网友采纳
第3个回答  2012-03-27
#include"stdio.h"
#define N 10000
void jami(char str2[],int n,int k)
{
int i,j,num;
num=1;
if(n==1)
{
for(i=0;str[i]!=32;i++)
printf("%c",str[i]);
}
else
{
for(i=0;str2[i]!='\0';i++)
{
if(str2[i]==32)
num++;
if(num==n)
break;
}
//printf("%d",num);
for(j=i+1;str2[j]!=32;j++)
{
if(str2[j]-'a'+k>25)
{
str2[j]=str2[j]+k-25;
printf("%c",str2[j]);
}
else
{
str2[j]=str2[j]+k;
printf("%c",str2[j]);
}
}
}
printf("\n");
}写的简单,没用二维数组
void main()
{
char str[N];
int n,k,i=0;
printf("请输入一句英文诗,最长100个单词,每个单词最多100个字母,均为小写字母,中间不包含标点符号,以英文句号'.'结尾")
for(i=0;i<N;i++)
{
scanf("%c",&str[i]);
if(str[i]=='.')
{
str[i]='\0';
break;
}
}

printf("%s\n",str),
scanf("%d%d",&n,&k);
jami(str,n,k);
}
第4个回答  2012-03-24
加密算法 你还没说呢 按照字母表向后数第k个字母,到结尾循环到开头,然后呢?与原字母相与?
相似回答