这篇题解里,由于我想学习一下class的用法,所以某些题显得“小题大做”了
1.恺撒加密(20分)
题目内容:
恺撒加密法加密规则是:将原来的小写字母用字母表中其后面的第3个字母的大写形式来替换,大写字母按同样规则用小写字母替换,对于字母表中最后的三个字母,可将字母表看成是首未衔接的。如字母c就用F来替换,字母y用B来替换,而字母Z用c代替。编程实现以下功能:输入一个字符串,将其加密后输出。
程序运行结果如下:
AMDxyzXYZ
dpgABCabc
输入格式:
一个字符串(不会超过20个字符,由26个英文字母构成)
输出格式:
一个字符串
输入样例:
AMDxyzXYZ
输出样例:
dpgABCabc
时间限制:2000ms内存限制:32000kb
#include <iostream>
#include <cstring>
using namespace std;
class CH{
char c;
public:
void set(char b);
void change();
void print();
};//自己定义的一个字符类型,和char有点像
int main()
{
CH c[20];
char b[20];
cin>>b;
int len = strlen(b);
for(int i=0; i<len; i++)
{
c[i].set(b[i]);
c[i].change();
c[i].print();
}
cout<<endl;
return 0;
}
void CH::change()
{
if(c=='x')
c = 'A';
else if(c=='y')
c = 'B';
else if(c=='z')
c = 'C';
else if(c=='X')
c = 'a';
else if(c=='Y')
c = 'b';
else if(c=='Z')
c = 'c';
else if(c>='A'&&c<='Z')
c = c-'A'+'a'+3;
else if(c>='a'&&c<='z')
c = c-'a'+'A'+3;
}
void CH::set(char b)
{
c = b;
}
void CH::print()
{
cout<<c;
}
2.矩阵转置(20分)
题目内容:
用户输入矩阵阶数,然后按行输入所有矩阵元素(整数),将该矩阵转置输出。阶数应是[1,5]之间的整数,不在该区间时,显示“matrix order error”。
输入格式:
第1行,一个整数,表示阶数n。
以后是n行数据,每行n个整数,是按行输入的矩阵元素。
输出格式:
n行转置的数据,数据间以一个空格分隔,行末没有空格。
输入输出样例1
输入:
4
4 6 8 9
2 7 4 5
3 8 16 15
1 5 7 11
输出:
4 2 3 1
6 7 8 5
8 4 16 7
9 5 15 11
输入输出样例2
输入:
0
输出:
matrix order error
注意:转置应该是存储矩阵的数组中的元素实现了转置运算,而不仅是显示效果。
时间限制:2000ms内存限制:32000kb
#include <iostream>
using namespace std;
class matrix{
int a[6][6];
int order;
public:
void setOrder(int n);//设置矩阵阶数
void set(int b[6][6]);//设置矩阵具体的值
void transpose();//矩阵转置
void print();//打印
};//自己定义的矩阵类
int main()
{
matrix m;
int n;
int b[6][6];
cin>>n;
if(n>=1&&n<=5)
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>b[i][j];
m.setOrder(n);
m.set(b);
m.transpose();
m.print();
}else{
cout<<"matrix order error"<<endl;
}
return 0;
}
void matrix::setOrder(int n)
{
order = n;
}
void matrix::set(int b[6][6])
{
for(int i=0; i<order; i++)
for(int j=0; j<order; j++)
a[i][j] = b[i][j];
}
void matrix::transpose()
{
for(int i=0; i<order; i++)
for(int j=0; j<i; j++)
{
int t = a[i][j];
a[i][j]=a[j][i];
a[j][i] = t;
}
}
void matrix::print()
{
for(int i=0; i<order; i++)
{
cout<<a[i][0];
for(int j=1; j<order; j++)
{
cout<<" "<<a[i][j];
}
cout<<endl;
}
}
3.按点击率显示歌曲(20分)
题目内容:
连续录入5首歌的歌名、歌手和点击率清单并按照点击率由高到低的顺序显示歌曲清单的信息。如果点击率相同,则按照录入的顺序显示。
歌曲清单格式如下:
曲名 演唱者 点击率
输入格式:
5个歌曲的清单,其中曲名(不会超过50个字符)、演唱者为字符串(不会超过20个字符),点击率为整型数
输出格式:
5个歌曲的清单(曲名、演唱者,点击率之间用一个英文空格隔开,末尾没有空格)
输入样例:
匆匆那年 王菲 90
小苹果 筷子兄弟 100
当你老了 莫文蔚 80
最炫民族风 凤凰传奇 85
平凡之路 朴树 95
输出样例:
小苹果 筷子兄弟 100
平凡之路 朴树 95
匆匆那年 王菲 90
最炫民族风 凤凰传奇 85
当你老了 莫文蔚 80
时间限制:2000ms内存限制:32000kb
#include <iostream>
using namespace std;
struct song{
string name;//用string来代替字符数组
string singer;
int rate;
};//定义一个歌曲结构
int main()
{
struct song s[5];
for(int i=0; i<5; i++)
{
cin>>s[i].name>>s[i].singer>>s[i].rate;
}
for(int i=0; i<4; i++)
{
for(int j=i+1; j<5; j++)
{
if(s[i].rate<s[j].rate)
{
struct song t = s[i];
s[i] = s[j];
s[j] = t;
}
}
}
for(int i=0; i<5; i++)
{
cout<<s[i].name<<" "<<s[i].singer<<" "<<s[i].rate<<endl;
}
return 0;
}
4.星期转换(20分)
题目内容:
将用户输入的阿拉伯数字转换成对应星期几的英文单词(monday,tuesday,wednesday,thursday,friday,saturday,sunday)。输入1显示"monday",输入7显示“sunday”,如果用户输入的数字不在1~7之间,显示信息:invalid
输入格式:
整数
输出格式:
星期几的英文单词或者“invalid”
输入样例1:
1
输出样例1:
monday
输入样例2:
8
输出样例2:
invalid
时间限制:2000ms内存限制:32000kb
#include <iostream>
using namespace std;
int main()
{
string s[8]={"invalid","monday","tuesday","wednesday","thursday","friday","saturday","sunday"};
//应该用二维字符数组的,偷懒用了string数组
int n;
cin>>n;
if(n>=1&&n<=7)
cout<<s[n]<<endl;
else
cout<<"invalid"<<endl;
return 0;
}
5.插入加密(20分)
题目内容:
插入式加密是在明文字母中按照指定间隔插入另一些字母以形成密文。例如对明文china,在间隔为1的位置插入其它字母序列中的字母a,b,c,d,e,就变成密文cahbicndae;间隔为2时的密文为chainbac,要求输入明文和间隔,从存放其它字母的序列(仅包含a,b,c,d,e)中依次取出对应字母插入到明文中,如果其它字母序列的字母取完,则从头再取,要求密文中最后一个字母一定是其它字母序列中的字母。
输入格式:
一个是明文字符串,一个是表示间隔的正整数。明文(不超过30个字符),间隔的取值范围是(1~5)。
输出格式:
密文(不超过60个字符)
输入样例:
china
1
输出样例:
cahbicndae
时间限制:2000ms内存限制:32000kb
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[100];
char s2[200];
char s3[100];
for(int i=0; i<100; )
{
s3[i]='a';
s3[i+1]='b';
s3[i+2]='c';
s3[i+3]='d';
s3[i+4]='e';
i+=5;
}//用来构造一个不断循环的数组
int n;
cin>>s;
cin>>n;
int len = strlen(s);
for(int i=0; i<len; i++)
{
s2[i+i/n] = s[i];
}//将字符串复制一份,并且相邻字符中间留出空格
int j=0;
int i=0;
for( i=0; i<len/n;i++ )
{
s2[i+i*n+n]=s3[j++];
}
s2[len+len/n]=s3[j];
s2[len+len/n+1]=0;//把空格填上
if(n==1)//处理特殊情况
s2[len+len]=0;
cout<<s2<<endl;
return 0;
}
//这个代码有点凌乱,勉强AC,期望大佬来改正