java 星期顺序_第8周 【项目3-顺序串算法】

/*

*Copyright  (c)2017,烟台大学计算机与控制工程学院

*All rights reservrd.

*作者:李欣豪

*完成时间:2017年12月14日

*版本号:v1.0

*问题描述:采用顺序存储方式存储串,实现下列算法并测试:

(1)试编写算法实现将字符串S中所有值为c1的字符换成值为c2的字符:

void Trans(SqString *&s, char c1, char c2);

(2)试编写算法,实现将已知字符串所有字符倒过来重新排列。如ABCDEF改为FEDCBA。

void Invert(SqString &s)

一、以顺序串算法库为基础,建立头文件sqString.h

#ifndef SqString_H_INCLUDED

#define SqString_H_INCLUDED

#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); //输出串

#endif // SqString_H_INCLUDED

建立源文件sqString.cpp

#include

#include

#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

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

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

str.data[i]=s.data[i];

for (i=0;i

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

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

str.data[j]=s1.data[j];

for (j=0;j

str.data[i+j-1]=s2.data[j];

for (j=i-1;j

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

str.data[k]=s.data[k];

for (k=i+j-1;k

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

str.data[k]=s.data[k];

for (k=0;k

str.data[i+k-1]=t.data[k];

for (k=i+j-1;k

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

printf("%c",s.data[i]);

printf("\n");

}

}

二、对问题(1)的解决:

在头文件中添加一个函数声明:void Trans(SqString &s, char c1, char c2);

并在源文件中定义这个函数:

void Trans(SqString &s, char c1, char c2)

{

int i;

for (i=0; i

if (s.data[i]==c1)

s.data[i]=c2;

}

编辑main.cpp文件,实现功能:

#include

#include "sqString.h"

int main()

{

SqString s;

StrAssign(s, "messages");

Trans(s, 'e', 'a');

DispStr(s);

return 0;

}

三、对问题(2)的解决:

在头文件中加入加入新的函数声明:void Invert(SqString &s);

在源文件中定义这个函数:

void Invert(SqString &s)

{

int i;

char temp;

for (i=0; i

{

temp = s.data[i];

s.data[i]=s.data[s.length-i-1];

s.data[s.length-i-1] = temp;

}

}

编辑main函数:

int main()

{

SqString s;

StrAssign(s, "abcdefg");

Invert(s);

DispStr(s);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值