第八周项目4-字符串加密_strassign的头文件函数是-程序员宅基地

<span style="font-size:14px;">2015,烟台大学计算机与控制工程学院            
文件名称:第8周项目4-字符串加密      
作    者:杨惠娟      
完成日期:2015年10月30日      
版 本 号:v1.0           
问题描述:一个文本串可用事先编制好的字符映射表进行加密。例如,设字符映射表为:
		  abcdefghijklmnopqrstuvwxyz
		  ngzqtcobmuhelkpdawxfyivrsj
输入描述:串的输入。
程序输出:加密后的输出。</span>

1.头文件:

#define MaxSize 100             //最多的字符个数
typedef struct
{   char data[MaxSize];         //定义可容纳MaxSize个字符的空间
    int length;                 //标记当前实际串长
} SqString;

void StrAssign(SqString &s,char cstr[]);    //字符串常量cstr赋给串s
void StrCopy(SqString &s,SqString t);   //串t复制给串s
bool StrEqual(SqString s,SqString t); //判串相等
int StrLength(SqString s);  //求串长
SqString Concat(SqString s,SqString t);  //串连接
SqString SubStr(SqString s,int i,int j); //求子串
SqString InsStr(SqString s1,int i,SqString s2); //串插入
SqString DelStr(SqString s,int i,int j) ;   //串删去
SqString RepStr(SqString s,int i,int j,SqString t);     //串替换
void DispStr(SqString s);   //输出串

2.源文件:

#include <stdio.h>
#include <malloc.h>
#include "SqString.h"

void StrAssign(SqString &s,char cstr[]) //s为引用型参数
{   int i;
    for (i=0;cstr[i]!='\0';i++)
        s.data[i]=cstr[i];
    s.length=i;
}
void StrCopy(SqString &s,SqString t)    //s为引用型参数
{   int i;
    for (i=0;i<t.length;i++)
        s.data[i]=t.data[i];
    s.length=t.length;
}
bool StrEqual(SqString s,SqString t)
{   bool same=true;
    int i;
    if (s.length!=t.length)             //长度不相等时返回0
        same=false;
    else
        for (i=0;i<s.length;i++)
            if (s.data[i]!=t.data[i])   //有一个对应字符不相同时返回0
            {   same=false;
                break;
            }
    return same;
}
int StrLength(SqString s)
{
    return s.length;
}
SqString Concat(SqString s,SqString t)
{   SqString str;
    int i;
    str.length=s.length+t.length;
    for (i=0;i<s.length;i++)    //将s.data[0..s.length-1]复制到str
        str.data[i]=s.data[i];
    for (i=0;i<t.length;i++)    //将t.data[0..t.length-1]复制到str
        str.data[s.length+i]=t.data[i];
    return str;
}
SqString SubStr(SqString s,int i,int j)
{   SqString str;
    int k;
    str.length=0;
    if (i<=0 || i>s.length || j<0 || i+j-1>s.length)
        return str;                 //参数不正确时返回空串
    for (k=i-1;k<i+j-1;k++)         //将s.data[i..i+j]复制到str
        str.data[k-i+1]=s.data[k];
    str.length=j;
    return str;
}
SqString InsStr(SqString s1,int i,SqString s2)
{   int j;
    SqString str;
    str.length=0;
    if (i<=0 || i>s1.length+1)  //参数不正确时返回空串
        return str;
    for (j=0;j<i-1;j++)             //将s1.data[0..i-2]复制到str
        str.data[j]=s1.data[j];
    for (j=0;j<s2.length;j++)       //将s2.data[0..s2.length-1]复制到str
        str.data[i+j-1]=s2.data[j];
    for (j=i-1;j<s1.length;j++)     //将s1.data[i-1..s1.length-1]复制到str
        str.data[s2.length+j]=s1.data[j];
    str.length=s1.length+s2.length;
    return str;
}
SqString DelStr(SqString s,int i,int j)
{   int k;
    SqString str;
    str.length=0;
    if (i<=0 || i>s.length || i+j>s.length+1) //参数不正确时返回空串
        return str;
    for (k=0;k<i-1;k++)             //将s.data[0..i-2]复制到str
        str.data[k]=s.data[k];
    for (k=i+j-1;k<s.length;k++)    //将s.data[i+j-1..s.length-1]复制到str
        str.data[k-j]=s.data[k];
    str.length=s.length-j;
    return str;
}
SqString RepStr(SqString s,int i,int j,SqString t)
{   int k;
    SqString str;
    str.length=0;
    if (i<=0 || i>s.length || i+j-1>s.length) //参数不正确时返回空串
        return str;
    for (k=0;k<i-1;k++)             //将s.data[0..i-2]复制到str
        str.data[k]=s.data[k];
    for (k=0;k<t.length;k++)        //将t.data[0..t.length-1]复制到str
        str.data[i+k-1]=t.data[k];
    for (k=i+j-1;k<s.length;k++)    //将s.data[i+j-1..s.length-1]复制到str
        str.data[t.length+k-j]=s.data[k];
    str.length=s.length-j+t.length;
    return str;
}
void DispStr(SqString s)
{   int i;
    if (s.length>0)
    {   for (i=0;i<s.length;i++)
            printf("%c",s.data[i]);
        printf("\n");
    }
}

3.main函数:

#include <stdio.h>
#include "sqString.h"

SqString A,B; //用于存储字符映射表

SqString EnCrypt(SqString p)
{
    int i=0,j;
    SqString q;
    while (i<p.length)
    {
        for (j=0; p.data[i]!=A.data[j]; j++);
        if (j>=p.length)            //在A串中未找到p.data[i]字母
            q.data[i]=p.data[i];
        else                        //在A串中找到p.data[i]字母
            q.data[i]=B.data[j];
        i++;
    }
    q.length=p.length;
    return q;
}

SqString UnEncrypt(SqString q)
{
    int i=0,j;
    SqString p;
    while (i<q.length)
    {
        for (j=0; q.data[i]!=B.data[j]; j++);
        if (j>=q.length)            //在B串中未找到q.data[i]字母
            p.data[i]=q.data[i];
        else                    //在B串中找到q.data[i]字母
            p.data[i]=A.data[j];
        i++;
    }
    p.length=q.length;
    return p;
}

int main()
{
    SqString p,q;
    StrAssign(A,"abcdefghijklmnopqrstuvwxyz");  //建立A串
    StrAssign(B,"ngzqtcobmuhelkpdawxfyivrsj");  //建立B串
    char str[MaxSize];
    printf("\n");
    printf("输入原文串:");
    gets(str);                                  //获取用户输入的原文串
    StrAssign(p,str);                           //建立p串
    printf("加密解密如下:\n");
    printf("  原文串:");
    DispStr(p);
    q=EnCrypt(p);                               //p串加密产生q串
    printf("  加密串:");
    DispStr(q);
    p=UnEncrypt(q);                         //q串解密产生p串
    printf("  解密串:");
    DispStr(p);
    printf("\n");
    return 0;
}


运行结果:



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yanghuijuan12138/article/details/49505717

智能推荐

Unity关于对象池的使用_unity find prefab名字有个(clone)-程序员宅基地

文章浏览阅读801次。在游戏中大量的出现的,比如敌人,子弹,都可以用到对象池,为什么要用的对象池呢?其实是因为系统在创建,销毁对象是非常消耗内存的,这样对优化内存会有很大的帮助。回头再总结一下优化方面的注意方面。那么,如何使用,或者说如何创建对象池呢?首先我们Assets 下创建一个Resources文件夹。里面放上需要重复创建的预制体。(注意给这个预制体加上刚体),创建脚本using UnityEngin_unity find prefab名字有个(clone)

Linux 指令lsblk 作用,以及查看cpu使用情况和磁盘IO iostat指令详解

(列表块设备)命令是一个非常实用的工具,用于显示所有可用的块设备信息,如硬盘、USB驱动器、SD卡以及它们的分区。这个命令以易于理解的树状结构展示这些信息,清晰地表明了设备间的层次关系和依赖性。是一个用于监控Linux系统中CPU使用情况和磁盘I/O统计信息的命令行工具,它是sysstat包的一部分。行中的数据,你可以大致了解系统的CPU资源是如何被分配和使用的,进而判断是否存在CPU瓶颈或者I/O等待等问题。可以帮助识别系统中的I/O瓶颈,监控磁盘活动,并据此进行性能调优或问题诊断。在Linux系统中,

第六天----数据结构笔记_路径点和边重复-程序员宅基地

文章浏览阅读495次。笔记参考文章1、1.图根据边是否有方向,将图可以划分为:无向图和有向图。2.一条边上的两个顶点叫做邻接点。3.在无向图中,某个顶点的度是邻接到该顶点的边(或弧)的数目。4.在有向图中,顶点的度=入度+出度。–顶点的入边,是指以该顶点为终点的边。而顶点的出边,则是指以该顶点为起点的边。–某个顶点的入度,是指以该顶点为终点的边的数目。而顶点的出度,则是指以该顶点为起点的边的数目。5.路径:如果顶点(Vm)到顶点(Vn)之间存在一个顶点序列。则表示Vm到Vn是一条路径。–路径长度:路径中"_路径点和边重复

[word技巧]把标题、图表题注编号由“一.1”改为"1.1"_word 图一.1-程序员宅基地

文章浏览阅读4.1w次,点赞6次,收藏31次。[word技巧]把标题、图表题注编号由“一.1”改为"1.1"_word 图一.1

python编程语言的缺点-常见的AI编程语言优缺点比较,程序员千万不要入错行!...-程序员宅基地

文章浏览阅读228次。原标题:常见的AI编程语言优缺点比较,程序员千万不要入错行!人工智能编程是一种技术的提升,为不同公司的运营和人们的生活带来了极高的效率和最佳效益。 人工智能为不同的行业带来了另一种智能技术,其潜力的前景仍在增长,期望它能够达到人类的智慧。 这是因为开发人员愿意探索,试验和实施其能力,以满足更多的人力和组织需求。 毕竟,需求是发明之母。 就像在大多数软件应用程序的开发中一样,开发人员可以使用各种语言..._ai python 跟语言无关

产品经理功法修炼(2)之专业技能-程序员宅基地

文章浏览阅读1.2k次,点赞23次,收藏30次。产品经理的能力修炼并非局限于某一技能的速成,而是需要全面参与到产品的整个生命周期中,通过不断的实践来逐步提升自己的各项能力。尽管在企业的日常运作中,我们不可能身兼数职去扮演每一个角色,但作为产品的核心负责人,我们必须进行系统性的学习,以深化对产品管理的理解和认知。作为产品管理的组织者、策划者和实施者,产品经理需紧密围绕目标市场,深入开展市场调研、市场定位和市场细分工作。同时,还需全面考虑产品策略、价格策略、渠道策略、促销策略、公关策略以及服务策略等多个方面,以确保营销工作的全面性和有效性。

随便推点

Java 高级面试问题及答案(一)

多线程是指在程序中同时运行多个线程,而并发是指在多线程环境下,多个线程在同一个时间点上执行不同的任务。Java中的多线程可以通过继承Thread类或者实现Runnable接口来实现。并发编程需要考虑线程安全,避免竞态条件和死锁等问题。我在一个高并发的Web服务项目中使用了多线程。服务需要处理大量的请求,并且每个请求都需要执行时间密集型的任务。为了提高性能和响应速度,我将任务分配到不同的线程上,这样CPU可以并行处理这些任务,而不是在单个线程上顺序执行。

flutter开发实战-混淆minifyEnabled及shrinkResources

flutter开发实战-混淆minifyEnabled及shrinkResources,这里不需要混淆,暂时关闭。学习记录,每天不停进步。

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

复制进芯电子国产DSP官网提供的配置文件。

2024五一数学建模竞赛(五一赛)选题建议+初步分析

提示:DS C君认为的难度:B>A>C,开放度:A=B

AI大模型探索之路-训练篇6:大语言模型预训练数据准备-预处理

随着人工智能技术的不断发展,大语言模型在自然语言处理、机器翻译、文本生成等领域取得了显著的成果。然而,训练一个高性能的大语言模型需要大量的高质量预训练数据。本文将详细介绍大语言模型预训练数据准备的各个环节,包括数据来源、质量过滤、去重过滤、敏感过滤以及数据影响分析等。希望通过本文的介绍,能够帮助读者更好地理解和应用大语言模型预训练数据的准备过程。大语言模型预训练数据准备是实现高性能模型的关键步骤。本文从数据来源、质量过滤、去重过滤、敏感过滤以及数据影响分析等多个方面进行了详细的介绍。

最新版两款不同版SEO超级外链工具PHP源码-程序员宅基地

文章浏览阅读674次。外链工具只是网站推广的辅助工具,一般适用于短时间内无法建设大量外链的新站,新站应坚持每天做一到两次为宜,大约一周左右能看到效果。老站不建议使用此类工具,老站应以优质内容建设为主,辅以交换优质的友情链接和高权重站点发布软文来建立外链方为上策。#已更新增加大量高质量外链(若需要增加修改其他外链请打开txt文件)可根据个人感觉喜好自行任意选择不同版本使用(版V1或版V2)请将zip文件全部解压缩即可访问!源码全部开源,支持上传二级目录访问。源码为自适应端,手机和电脑端都适配。抄笔记 (chaobiji.cn)