字符串和多维数组实验【计算单词个数+幻方+凯撒密码应用】

来源:互联网 发布:矩形螺纹编程样板 编辑:程序博客网 时间:2024/05/16 14:25


《数据结构》实验四:    字符串和多维数组 实验


关键字:字符串二维数组 计算单词个数(奇数)魔幻方 凯撒密码加密

一.实验目的

     巩固字符串和多维数组相关知识,学会运用灵活应用。

    1.回顾字符串和多维数组的逻辑结构和存储操作特点,字符和数组的物理存储结构和常见操作。

    2.学习运用字符串和和数组的知识来解决实际问题。

    3.进一步巩固程序调试方法。

    4.进一步巩固模板程序设计。

二、实验内容

   1.从键盘输入一些文本,统计文本单词的个数。

   2.写程序输出一个5阶幻方:每一行每一列每一个对角线和均相等。

   3.  自己设计一个字符加密算法,并设计程序验证:输入文本,解后加密并输出。在些基础上设计一个你算法的解密程序。

三、代码操作

(1)计算句子中单词的个数:

#include<iostream>
using namespace std;

char a[50];

void sentence(){                         //计算单词的个数,state=1为空格状态,state=0为读取单词中状态;
int state=1,count=0;
cin.get(a,50);
for(int i=0;i<50;i++)
{
if(a[i]==' ')   {  
        state=1;  
    }  
    if(state==1)   {  
              state=0;  
        count++;  
     }
if(a[i]=='\0') {
cout<<"\n输出最后一个字符为"<<a[i-1]<<",位于数组第"<<i<<"个位置"<<endl;
break;
         }
}
cout<<"\n单词个数为:"<<count<<endl;
}

int main(){
cout<<"请输入英文:";
sentence();
cout<<endl;
return 0;
}

其调试结果为:



(2)数组的应用举例------幻方

        幻方又称魔方阵、幻方阵,游戏规则是在一个n*n的矩阵中填入1~n^2的数字,使得每一行、每一列、每条对角线的累加和都相同。这里只讨论适用于任意技术阶幻方,采用的是“左上斜行法”,也可以用右上斜行法、左下、右下法。算法如下:

A 由1开始填数,讲1放在第0行的中间的位置;

B 将幻方想象成上下、左右链接,每次都往左上角走一步,会有下列情况。

   a.  左上角超出上边界,则在最下边相对应的位置填入下一个数;

   b.  左上角超出左边界,则在最右边相对应的位置填入下一个数;

   c.  按上述方法找到的位置已填数,则在原位置的同一列下一行填入下一个数。

代码:

#include<iostream>
using namespace std;

int Magic_Square(int n,int **a) {         //魔方阵的初始化,**a是指针的指针
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
a[i][j]=0;
}
}
return 0;
}

void Square(int m,int **a)
{
int i=0,j=m/2;              //i,j表示二维数组的行列下标
int **r = a;
a[i][j]=1;
for(int k=2;k<=m*m;k++) {
int  iTemp = i;
int  jTemp = j;
i = (i-1+m)%m;
j = (j-1+m)%m;
if( r[i][j] > 0)  {
i = (iTemp+1)%m;
j = jTemp;
}
r[i][j]=k;
}
for (i=0; i<m; i++)               //输出格式
{
for (j=0; j<m; j++)
{
cout<<r[i][j]<<"\t";
}
cout<<"\n";

}

void main() {
int m, i;
cout<<"请输入多少阶的奇数方阶的幻方:"<<endl;
cin>>m;

if(m%2==0){                                                                   //判断是否计数方阶
int n;
cout<<"这不是奇数方阶,请输入奇数:"<<endl;
cin>>n;
m=n;
}
int **a;
a=new int*[m];
for (i=0; i<m; ++i)
{
a[i] = (int *) new int[m];
}
Magic_Square(m,a);          //初始化
Square(m,a);
}

调试时结果为:




(3)字符串的应用举例------凯撒密码

        凯撒密码是一种简单的信息加密方法,通过将信息中的每个字母在字母表中向后移移动原字母与大小写第一个字母的位移量,以实现加密。

ab c d e fg h i

jk l m n op q r

st u v w xy z

例如:对字符串 luckystar 加密,l 相对 a 的位移量为12-1=11,则 l 向后移动 11位,则加密后的对应的是12+11=23,即是w。这里将对大小写字母进行加密。

代码:

#include<iostream>
using namespace std;

void KaiSa(char s[],char t[]) {
cout<<"已加密的密码为:";
for(int i=0;s[i]!='\0';i++) {
if(s[i]>=97){
int ch=s[i]-'a';
t[i]='a'+(ch+ch)%26;
cout<<t[i];
} else {
int ch=s[i]-'A';
t[i]='A'+(ch+ch)%26;
cout<<t[i];
}
}
cout<<endl;
}

void main() {
char s[20];
cout<<"\nplease input your password:"<<endl;
cin>>s;
char t[20];
KaiSa(s,t);
}

其调试结果为:


















0 0