文档库 最新最全的文档下载
当前位置:文档库 › 计算机(2)班-刘超--09730209--阅读编辑

计算机(2)班-刘超--09730209--阅读编辑

计算机(2)班-刘超--09730209--阅读编辑
计算机(2)班-刘超--09730209--阅读编辑

兰州理工大学技术工程学院课程设计名称:文章编辑(单项链表的应用)

专业班级:计算机科学与技术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. 测试数据及结果

相关文档