兰州理工大学技术工程学院课程设计名称:文章编辑(单项链表的应用)
专业班级:计算机科学与技术2班
学生姓名:刘超
学号: 09730209
指导教师:贵向泉
目录
摘要 (3)
前言 .................................................................................... 错误!未定义书签。正文 . (4)
1.需求分析 .................................................................... 错误!未定义书签。
2.概要设计 .................................................................... 错误!未定义书签。
3.详细设计 .................................................................... 错误!未定义书签。
4.调试分析 .................................................................... 错误!未定义书签。
5.测试结果 .................................................................... 错误!未定义书签。总结 .................................................................................... 错误!未定义书签。参考文献 ................................................................................ 错误!未定义书签。致谢 .................................................................................... 错误!未定义书签。附件Ⅰ部分源程序代码...................................................... 错误!未定义书签。
摘要
算法类课程设计课程的指导思想:使学生通过学习高级编程语言的知识、编程技术和基本算法,掌握课程设计的思想和方法,具备利用计算机求解实际问题的能力,能灵活运用高级语言进行程序设计。
现实学习生活中,常会遇到一些数目较大数据繁杂的数学运算,徒手运算起来很困难,这时候我们就必须用到计算器。人们对计算的要求不断提高,普通的功能简单的仅能进行四则运算的计算工具已经不能满足需要,需要一种能进行多种计算。现在已经有一些功能较为强大、涵盖面较广的计算软件,而且各种平台的小工具仍不断出现。这些大大方便了我们的生活给我们更多的选择和实现方式。本程序的编写基础是VC6.0汉化版,它在工程Win32 Application上完成简单计算。生成的程序可移植性强兼容性好稳定!本程序实现了加、减、乘、除、括号于一身的表达式运算,可以通过直接输入数学表达式,不需要任何转换,就可以直接输出数学表达式的运算的结果。但是,每次只能运算一个表达式,根据提示按下’Y’键之后再按enter键即可进行下一次计算。本程序可以进行较为准确的计算。
正文
一、需求分析
功能:输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;
要求:(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章;
二、概要设计
1、定义结构体 struct line,文本行采用顺序存储,行与行之间采用链式存储
2、主要函数:
int FindString(LINE * &head,char *str) /*统计str在文章中出现的次数*/
求在一行中Str出现的次数的流程图:
①.查找第一个字符,如果有第一个字符即p->data[i]==str[0],设计数器k=0
②.查找这个字符后面的字符与要查找的字符串是否匹配即p->data[i+j]==str[j],如果匹配k++
③.重复第二步,如果k=len2,则查找到,count++;如果没查找到,重新进行第一步
void delstringword(char *s,char *str) /*删除字符串*s中的字符串*str*/
tmp
实现思想:
①.从字符串s中寻找str第一次出现的位置 *p=strstr(s,str);
②.len=strlen(s);i=len-strlen(p)即前i项恰好不含要删除的字符串,将前i 项复制到tmp中
③.j=i+strlen(str) 即要删除的字符串在i+1和j之间,将j之后的字符串复制到tmp中
④.将tmp赋给串s,返回s
三、详细设计:
3.1 详细设计思想:
(1)定义结构体:typedef struct line
{
char *data;
struct line *next;
}LINE;
(2)输出函数void OutPut(LINE * &head)
将头指针赋值为p;
通过do-while语句遍历链表;
(3)字符串的创建函数:void Create(LINE * &head)
用printf语句输出一句提醒语句,请用户输入要编辑的文章
为链表建立一个附加表头结点,将p付给表头指针;
输入字符串,同时判断输入的字符串是否满足条件;
用if语句判断文章是否输入完成。
(4)统计文章中英文字母数:void countLetter(LINE * &head)
将p付给表头指针;
初始化count为0;
用do-while语句遍历链表,同时统计字符串中英文字母数
用printf语句输出文章中英文字母数,调用子函数menu(). (5)统计文章中数字个数:void countNumber(LINE * &head)
将p付给表头指针;
初始化count为0;
用do-while语句遍历链表,同时统计字符串中数字个数;
用printf语句输出文章中数字个数,调用子函数menu().统计字符个数算法流程图
(6)统计文章中的空格数:void countSpace(LINE * &head)
将p付给表头指针;
初始化count为0;
用do-while语句遍历链表,同时统计字符串中空格数;
用printf语句输出文章中空格数,调用子函数menu(). (7)统计文章总字数:void countAll(LINE * &head)
将p付给表头指针;
初始化count为0;
用do-while语句遍历链表,同时统计字符串中总字数;
用printf语句输出文章中总字数,调用子函数menu(). (8)查找字符串的函数:void FindString(LINE * &head)
将p付给表头指针;
初始化count为0;
初始化len1,用来保存当前行的总字符数;
定义整型变量len2表示待统计字符串的长度;
用printf语句提醒用户输入要统计的字符串;
用do-while语句遍历链表,同时用for循环和if语句找出指定字符串在文章中出现的次数;
用printf语句输出指定字符串在文章中出现的总次数,调用子函数menu()查找某一字符串出现的次数算法流程图
.
(9)删除字符串的函数:void DelString(LINE * &head)
先创建一个delstringword,其中包含两个字符串char *s和char *str,用*s表示输入的字符串,*str表示要删除的字符。这个函数的功能是找到字符串s在字符串中出现的位置并删除该字符串。
定义字符串的删除函数DelString(),用do-while语句遍历链表,语句中再套用if语句,并调用delstringword()进行删除.
删除某一字符串算法流程图
(10)主函数:void main()
用switch语句实现功能的调用。一个数字对应一个操作。
3.2 核心代码:
#include
#include
typedef struct line
{
char *data;
struct line *next;
}LINE; /*创建一链表,同时向里面输入文本数据*/
/*向屏幕输出文章*/
void OutPut(LINE * &head)
{
LINE *p=head;
printf("输入的文章为:\n");
do
{
printf("%s\n",p->data);
}
while((p=p->next)!=NULL);/*遍历链表*/
printf("\n");
}
void menu()
{
printf("*********************文章编辑
**********************\n");
printf("***************************************************\n") ;
printf("1.统计文章中全部英文字母数
\n");
printf("2.统计文章中空格个数
\n");
printf("3 .统计文章中数字个数 \n");
printf("4.统计文章总字数
\n");
printf("5.统计指定字符串在文中出现的次数
\n");
printf("6.删除指定字符串
\n");
printf("***************************************************\n")
;
}
void Create(LINE * &head)
{
printf ("请输入一页文章,以Ctrl+E(^E)为结尾(每行最多输入字
符!):\n");
LINE *p=new LINE; /*首先为链表建立一个附加表头结
点*/
head=p; /*将p付给表头指针*/
char tmp[100];
while(1)
{
gets(tmp); /*输入字符串!*/
if(strlen(tmp)>80)
{
printf("每行最多输入字符");
break;
}
if(tmp[0]==5)break; /*如果发现输入^E,则退出输入*/ p=p->next=new LINE;
p->data=new char[strlen(tmp)+1]; /*为结点分配空间*/ strcpy(p->data,tmp);
if(tmp[strlen(tmp)-1]==5) /*除去最后一个控制符^E */
{
p->data[strlen(tmp)-1]='\0';
break;
}
}
p->next=NULL; /*最后的一个指针为空*/
head=head->next;
OutPut(head);
printf("\n");
menu();
}
/*统计英文字母数*/
void CountLetter(LINE * &head)
{
LINE *p=head;
int count=0;
do
{
int Len=strlen(p->data); /*计算当前data 里的数据元素的个数*/
for(int i=0;i if((p->data[i]>='a'&&p->data[i]<='z')||(p->data[i]>='A'&&p->data[i ]<='Z')) /*计算字母数*/ count++; } while((p=p->next)!=NULL); /*遍历链表*/ printf("全部英文字母数:%d \n", count);/*返回文章的字母总数*/ printf("\n"); menu(); } /*统计数字数*/ void CountNumber(LINE * &head) { LINE *p=head; int count=0; do { int Len=strlen(p->data); /*计算当前data 里的数据元素的个数*/ for(int i=0;i if(p->data[i]>=48 && p->data[i]<=57)count++; /*计算数字数,ASCII码*/ } while((p=p->next)!=NULL); /*遍历链表*/ printf("文章中数字个数: %d \n",count); printf("\n"); menu(); } /*统计空格数*/ void CountSpace(LINE * &head) { LINE *p=head; int count=0; do { int Len=strlen(p->data); /*计算当前data 里的数据元素的个数*/ for(int i=0;i if(p->data[i]==32)count++; /*计算空格数,空格ASCII码为*/ } while((p=p->next)!=NULL); /*遍历链表*/ printf("空格个数: %d \n", count); printf("\n"); menu(); } /*统计文章的总字数*/ void CountAll(LINE * &head) { LINE *p=head; /*保存链表的首地址*/ int count=0; do /*计算总字符数*/ { count+=strlen(p->data); } while((p=p->next)!=NULL); /*遍历链表*/ printf("文章总字数: %d \n",count); printf("\n"); menu(); } /*统计str在文章中出现的次数*/ void FindString(LINE * &head) { LINE *p=head; int count=0; int len1=0; /*保存当前行的总字符数*/ int len2; /*待统计字符串的长度*/ int i,j,k; char str1[20]; printf("\n"); printf("请输入要统计的字符串:"); scanf("%s",str1); len2=strlen(str1); do { len1=strlen(p->data); /*当前行的字符数*/ for(i=0;i { if(p->data[i]==str1[0]) { k=0; for(j=0;j if(p->data[i+j]==str1[j]) k++; if(k==len2) {count++;i=i+k-1;} } } } while((p=p->next)!=NULL); /*遍历链表*/ printf("该字符串在文中出现的次数: %d \n",count); printf("\n"); menu(); } /*删除指定的字符串*/ void delstringword(char *s,char *str) /* *s为输入的字符串,*str为将要删除的字符*/ { char *p=strstr(s,str); /*从字符串s中寻找str第一次出现的位置*/ char tmp[80]; int len=strlen(s); int i=len-strlen(p); int j=i+strlen(str); int count=0; for(int m=0;m for(int n=j;n tmp[count]='\0'; strcpy(s,tmp); /*返回新的字符串*/ } void DelString(LINE * &head) { LINE *p=head; char str[20]; printf("请输入要删除的某一字符串:"); scanf("%s",str); do { if(strstr(p->data,str)!=NULL)delstringword(p->data,str); } while((p=p->next)!=NULL); /*遍历链表*/ printf("删除指定字符串后的文章为: \n"); OutPut(head); printf("\n"); menu(); } void main() { LINE *head; int i; Create(head); for(;;) { printf("请输入到中任意一个数字:\n"); scanf("%d",&i); switch(i) { case 1:CountLetter(head);break; case 2:CountSpace(head);break; case 3:CountAll(head);break; case 4:CountNumber(head);break; case 5:FindString(head);break; case 6:DelString(head);break; default:printf("您输入的数字错误\n"); } } } 四、调试分析: 1. 测试数据及结果