20##年 12 月
1. 程序功能介绍:
通过多种成员函数的定义和运算符的重载,实现字符串的各种直接操作,如:去掉串首、串尾与子串相同的字符,子串在主串中的定位,用新子串更换主串中的指定子串,比较字符串的大小,字符串连接等,所有功能已经通过验证。
2. 课程设计要求
(1)将主程序main()中的输出语句printf()改为VC++里的输出语句。
(2)程序中对字符串的处理函数均使用了字符数组sAns,它占用了大量存储空间,试使用动态分配存储空间的方法改写所有的函数,是之避免使用预先定义的长度很大的数组;并增加类的析构函数,删除动态分配存储空间。
(3)新增运算符重载函数,重载—,—=运算符,实现字符串的删除操作,并根据返回值判断操作是否成功。
(4)新增成员函数void DelRepeat(),实现在原字符串中删除相邻的重复字符的功能。
(5)新增成员函数 int AddStart(FString str ,int start),实现将字串str插入到原字符串中从第start字符开始位置上,操作正返回1。
(6)改写main函数的结构,界面为菜单形式,根据菜单选项来验证类中所定义的各种成员函数及操作符重载函数的正确性。
3.对课程题目的分析与注释
字符串或串(String)是由零个或多个字符组成的有限序列。一般记为 s='a1a2···an'(n>=0)。它是编程语言中表示文本的数据类型。
一个简单的字符串操作是“连接”:也就是说先写一个字符串S,随后在后面再写一个T得到ST这样一个过程。 其它的常见操作包括在一个长字符串中搜索一个子串,排列一组字符串以及分析一个字符串。因为存在如此多的字符串应用方式,所以相应地有许多权衡了不同应用的相关算法。 高级的字符串算法通常使用包括后向树和有限状态机在内的复杂机制和数据结构。
4.程序设计和说明(说明算法思想、设计思路,给出重要的、关键的代码)
(1) 类的数据结构
原程序定义了大量的成员函数和运算符重载函数,但这些函数都是在固定空间的字符数组上网前提下实现的,课程设计要求所有的函数要利用动态分配存储空间的方法存储字符串对象,所以基本上类中所有函数都要重新写,类中的数据成员增加一项字符串的长度int nLength,这样,动态分配存储空间的操作就可以简单一些char *p=char[nLength+1]。
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdarg.h> //定义参数个数可变的函数时用到
#define MAX_FSTRING_LENGTH 250000 //用作数组长度
class FString { // 字符 串类定义
private:
char *sString;
int nlength;
public:
FString(); //缺省构造函数
FString(char *str);//新增构造函数,用字符串常量初始化字符串对象
FString(FString &);//新增拷贝构造函数,用类的对象初始化
~FString(){} //新增析构函数,释放字符串对象所占用的空间
void DelRepeat();
FString AddStart(FString str,int start);
inline FString operator-(const char *sAppend);//新增函数,重载减法运算符
inline FString operator-(const FString sAppend); //新增函数,重载减法运算符
inline FString operator-=(char *val); //新增函数,重载减法运算符
inline FString operator-=(FString val); //新增函数,重载减法运算符
(2) main函数结构
main函数采用菜单选项的形式来实现类中的各个功能,显示菜单如下:
1、 字符串加法
void F1(FString s){ //字符串加法
FString s2,s3("good!");
cout<<"请输入要操作的字符串"<<endl;
char *p=new char[100];
cin.getline(p,100);
cout<<endl;
char *p1=new char[100];
cin.getline(p1,100);
s+=p1; //1
s2=s+p1; //2
cout<<"结果为:"<<"'"<<s<<"'"<<endl;
cout<<" "<<endl;
delete []p;
delete []p1;
}
2、 字符串减法
void F2(FString s){ //字符串减法
FString sk;
cout<<"请输入要操作的字符串"<<endl;
char *p=new char[100];
cin.getline(p,100);
char *p1=new char[100];
cin.getline(p1,100);
sk=s-p1;
cout<<"结果为:"<<sk<<endl;
delete []p;
delete []p1;
}
3、 字符串比较大小
void F3(FString s){ //字符串比较大小
cout<<"请输入要操作的字符串"<<endl;
char *p=new char[100];
cin.getline(p,100);
cout<<endl;
char *p1=new char[100];
cin.getline(p1,100);
if(s<p1)
cout<<"结果为:"<<"'"<<s<<"'"<<"<"<<"'"<<p1<<"'"<<endl;
else if(s>p1)
cout<<"结果为:"<<"'"<<s<<"'"<<">"<<"'"<<p1<<"'"<<endl;
else if(s==p1)
cout<<"结果为:"<<"'"<<s<<"'"<<"=="<<"'"<<p1<<"'"<<endl;
delete []p;
delete []p1;
}
4、 对字符串的具体操作
1) 删除字符串首部相同字符
void F4a(FString s3){ //删除字符串首部相同字符
FString s1=s3;
for(int i=1;i<=s3.Length()&&s3[i]==s3[i+1];i++){
s1=s3.LTrim(s3[i]);
}
cout<<"result:"<<s1<<endl;
}
2) 删除字符串尾部相同字符
void F4b(FString s3){ //删除字符串尾部相同字符
FString s1=s3;
for(int l=s1.Length()-1;l>=1&&s3[l]==s3[l-1];l--){
s1=s3.RTrim(s3[l]);
}
cout<<"result:"<<s1<<endl;
}
3) 删除字符串的所有重复字符
void F4c(FString s3){ //删除字符串的所有重复字符
FString s4(s3);
cout<<"s:"<<s4<<endl;
cout<<"result:";
s4.DelRepeat();
cout<<s4<<'\n';
}
4) 字符串的插入操作
void F4d(FString s3){ //字符串的插入操作
int m;
cout<<"输入字符串插入位置:";
cin>>m;
char *p=new char[100];
cin.getline(p,100);
char *p1=new char[100];
cout<<"输入插入字符串:";
cin.getline(p1,100);
cout<<"result:"<<s3.AddStart(p1,m)<<endl;
delete []p;
delete []p1;
}
5) 字符串的替换操作
void F4e(FString s3){ //字符串的替换操作
char *p1=new char[100];
cin.getline(p1,100);
cout<<p1<<endl;
char *p2=new char[100];
cout<<"格式:用什么替换什么"<<endl;
cout<<"用:";
cin.getline(p2,100);
char *p3=new char[100];
cout<<"替换:"<<endl;
cin.getline(p3,100);
cout<<"Replace : "<<"'"<<s3.Replace(p3,p2)<<"'"<<endl;
delete []p1;
delete []p2;
delete []p3;
}
6) 字符串的倒置替换操作(首先寻找倒置的子串,再用一个新的字符串替换该子串)
7) 退出
5、 退出
可循环运行
3. 课程设计中遇到的问题及解决方法
(1)给的源代码中的operater+的功能和+=的重合。
解决办法:增加了一段,
FString FString:: operator+(const char *sAppend)
{
char sAns[MAX_FSTRING_LENGTH]=" ";
strcpy(sAns,sString);
strcat(sAns,sAppend);
sString=_strdup(sAns);
return(*this);
}
(2)若执行菜单选择时,若输入字符会出现死循环。
解决办法:将整型输入变量改为字符型。
(3)在参数输入完后,结果不在本界面输出,而在下一界面
解决办法:在输出项的最后增加一句“cout<<endl;”
(4)再输入完选择操作时,本来有两句操作语句,结果界面上只出现了一句
解决办法:因为输入选择项后后输入了一个回车键,第一个语句把它当做要输入的字符了,在选择语句的后面增加字符串的输入语句。
4. 课程设计中所增加的功能模块(选做)
5. 课程设计结果
(1)字符串的加法
(2)字符串的减法
(3)字符串的比较
(4)删除删除字符串首部相同字符
(5)删除字符串尾部相同字符
(6)删除字符串的所有重复字符和插入操作
(7)字符串的替换
(7)退出
6. 还存在的不足之处
9. 对课程设计的感想和心得体会
在题目刚发下来时,我觉得题目很难,自己绝对不会做的,可是后来在书上找了对应的内容看了看,发现程序这座堡垒其实不是多么的不可攻破,只要愿意花时间,这些都不是问题。还有一点,一个好的编程习惯会对你的改错和检查有很大的帮助,比如在某些行后面加上注释,这样有利于自己一一对应的找。
做数学题目时是一环一环相扣的,其逻辑性就是一条线,而编c++时,其逻辑就像一个神经细胞,而每一个细胞有好多主突触(函数)和细胞(主函数)相连,每一个主突触又可以连很多其他突触,形成一个大枝节,而每个大支节又可以连接很多突触。所以每个程序就是通过主函数连接在一起的整体。程序就是有函数构成的。
10.分工情况(选做)
西安科技大学
C语言课程设计报告
题目: 学生成绩管理系统
班级: 测控技术与仪器1102班 学号:
姓名:
20xx年6月
C语言课程设计实验报告
-------------------------------------------------------------------------------------------
C语言课程设计说明书
一、课程设计的目的和要求
1.熟练掌握模块化程序设计的方法和过程。
2.熟练掌握文件和指针的使用方法。
3.熟练掌握链表的使用方法。
4.培养解决综合性实际问题的能力。
二、课程设计任务
1.基本要求
设计一个学生成绩管理系统,能够实现以下功能:
(1) 系统以菜单(字符界面菜单即可)方式工作;
(2) 学生信息录入功能(学生信息要求用文件保存);
(3) 学生信息浏览功能;
(4) 学生信息查询功能(至少一种查询方式,如:按学号、按姓名等);
(5) 学生信息删除功能;
(6) 学生信息修改功能;
(7) 学生成绩总分统计功能;
(8) 学生成绩总分排序功能。
2.创新要求
在达到基本要求的基础上,可以进行创新设计,例如对菜单进行美化。
3.信息描述
学生信息包括学号、姓名、性别、若干门课程(课程名可以自定义,至少3门)、出生年月等。
4.功能描述
(1) 录入学生信息并保存;
(2) 显示所有学生信息(以一定的格式);
(3) 查询学生信息(以一种或多种方式);
(4) 修改学生信息并保存;
(5) 删除学生信息。
三、课程设计要求:查阅资料,完成程序设计,提交一份课程设计报告。
四、时间安排:2周
- 1 -
C语言课程设计实验报告
-------------------------------------------------------------------------------------------
题目 学生成绩管理系统
一、设计目的
二、总体设计(程序设计组成框图、程序流程图)
三、详细设计(模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等))
四、调试与测试(调试方法,测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施)
五、执行结果和源程序清单(程序清单中应有足够的注释)
六、总结
- 2 -
课程设计报告20xx20xx年度第一学期名称题目院系班级学号学生姓名指导教师设计周数成绩日期软件设计与实践课程设计计算机系软件设计…
《课程设计报告》的格式要求撰写课程设计报告参考格式:题目(居中,小三号黑体字)学生姓名(学号)(学生姓名之间两格)(一律采用五号宋…
成都理工大学课程设计实验报告课程名称程序设计院系信科院数字媒体技术系班级所属小组姓名学号指导教师何建军20xx年月日课程设计要求课…
四川大学操作系统课程设计报告学院专业年级组编号组成员软件学院第X组乔心轲姓名0743111340学号张雯姓名XXXXXXXX学号康…
《课程设计报告》的格式要求撰写课程设计报告参考格式:题目(居中,小三号黑体字)学生姓名(学号)(学生姓名之间两格)(一律采用五号宋…
C语言程序设计实验报告1实验目的(1)掌握函数的定义方法、调用方法、参数说明以及返回值;(2)掌握实参与形参的对应关系,以及参数之…
信息科学与工程学院高级语言程序设计课程设计报告学生成绩管理系统学科专业计算机科学与技术班级1301学号指导教师唐郑熠讲师学生二零年…
课程设计报告C课程设计简单计算器学院专业名称班级学号学生姓名指导教师计算机与通信工程物联网工程敬茂华20xx年月日东北大学秦皇岛分…
苏州科技学院天平学院模拟电子技术课程设计报告课设名称正弦波方波三角波信号发生器设计专业班级电子信息工程物联网1221学号姓名张琪梁…