文章编辑程序
1)设计目的:
(1)从数据的逻辑结构、存储结构和运算三个方面识记并理解线性表、栈、队列、串、数组、树和图等常用的数据结构;
(2)理解在各种常用的数据结构上实现的排序和查找运算;
(3)对算法的时间和空间复杂性有一定的分析能力;
(4)针对常见的应用问题,能选择合适的数据结构及设计有效的算法解决之;
2)基本要求:
(1)按照课程设计的具体要求建立功能模块,其中包括:
a)需求分析:在该部分中叙述每个模块的功能要求。
b)详细设计:在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。
c)代码与结果:各个算法实现的核心代码,要结构清晰,同时附上调试结果。
(2)文章的小结部分可以包括:
收获、遇到问题解决问题过程的思考、程序调试能力的思考、对数据结构的思考等内容。
(3)编程简练,可用,尽可能的使系统的功能更加完善和全面;
(4)如果可能,给出说明书或流程图;
3)需求分析:
功能:输入一页西文文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;
存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
(1)分行输出用户输入的各行字符;
(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数";
(3)输出删除某一字符串后的文章;
4)详细设计:
1.模块分析
(1)结构体
定义结构体link,用顺序存储。行与行间链式存储。
(2)函数
函数article负责显示文章
函数init负责初始化文章。
当输入@@时,结束输入,生成文章。
函数letter统计字母个数
遍历每一个结构体link,并计算其中遇到的字母个数
函数number统计数字个数
遍历每一个结构体link,并计算其中遇到的数字个数
函数blank统计空格个数
遍历每一个结构体link,并计算其中遇到的空格个数
函数sum统计总字符数
遍历每一个结构体link,并计算其中遇到的字符个数
函数del用来删除一行的第一个子字符串
参数为一个字符串和需要检索的字串。从字符串中删除第一个字串。
函数deletestr删除文中的指定子字符串
参数为一个字符串和需要检索的字串。该函数将循环使用sel函数,来删除指定字符串的所有字串。
2.流程图

5)代码与结果:
主要代码:
article函数接受一个参数link * &head,打印head及其所有next的所有data,即整篇文章。
init函数接受一个参数link * &head,对其进行初始化,文章由用户键入,如果遇到@@,则停止接受字符,并将文章保存在线性表中。
Letter、number、blank、sum函数都接受一个参数link * &head,分别统计线性表data中的总英文字符、数字、空格、字符数,并打印。
del函数接受一个char *类型的参数s和str,其中str为需要查找的字符串子串。该函数将删除s中的第一个str字串。
deletestr函数接受一个参数link * &head,并由用户键入一个字符串str。该函数循环遍历head及其next的所有data,并对这所有data执行del函数,来删除head所指文章内出现的所有str子串。
main函数初始化一个线性表link,并对其分别执行letter、number、blank、sum函数。之后,再执行deletestr函数。
测试数据及结果:

6)小结:
本次课程设计主要依靠线性表做了文章编辑程序。用户可以通过键盘来输入文章,并得到文章相关信息的反馈。此次课程设计了解了线性表的存储机制和使用方式,加深了我对指针和地址操作的理解,对于以后的研究和学习起到了热身作用。打好基本功。
7)附录:
完整代码:
1 #include<iostream>
2 using namespace std;
3
4 typedef struct link{
5 char *data;
6 struct link *next;
7 }LINK;
8
9 void article(link * &head){
10 LINK *p=head;
11 cout<<"文章如下:"<<endl;
12 do{
13 cout<<p->data<<endl;
14 p=p->next;
15 }while(p!=NULL);
16 cout<<endl;
17 }
18
19 void init(link * &head){
20 cout<<"输入文章(每行不超过80字)(输入@@结束):"<<endl;
21 link *p=new link;
22 head=p;
23 char line[100];
24 //当输入不是@@时
25 while(1){
26 gets(line);
27 if (strlen(line)>80){
28 cout<<"字数过多"<<endl;
29 break;
30 }
31 if(line[0]==64&&line[1]==64)break;
32 p=p->next=new LINK;
33 p->data=new char[strlen(line)+1];
34 //给结构体指针指向的地址赋值
35 strcpy(p->data, line);
36 int j=1;
37 for(int i=0;i<strlen(line)-1;i++){
38 if(line[i]==64&&line[i+1]==64){
39 p->data[i]='\0';
40 j=0;
41 goto A;
42 }
43
44 }
45
46 }
47 A:
48 p->next=NULL;
49 head=head->next;
50 article(head);
51 cout<<endl;
52
53 }
54
55 void letter(link * &head){
56 link *p=head;
57 int letter=0;
58 do{
59 //元素个数
60 int len=strlen(p->data);
61 for(int i=0;i<len;i++)
62 //如果是字母
63 if((p->data[i]>='a'&&p->data[i]<='z')||(p->data[i]<='Z'&&p->data[i]>='A'))letter++;
64 }while ((p=p->next)!=NULL);
65 cout<<"全部字母数:"<<letter<<endl;
66
67 }
68
69 void number(link * &head){
70 link *p=head;
71 int number=0;
72 do{
73 //元素个数
74 int len=strlen(p->data);
75 for(int i=0;i<len;i++)
76 //如果是数字
77 if((p->data[i]>='0'&&p->data[i]<='9'))number++;
78 }while ((p=p->next)!=NULL);
79 cout<<"数字个数:"<<number<<endl;
80
81 }
82
83 void blank(link * &head){
84 link *p=head;
85 int blank=0;
86 do{
87 //元素个数
88 int len=strlen(p->data);
89 for(int i=0;i<len;i++)
90 //如果是空格
91 if(p->data[i]==' ')blank++;
92 }while ((p=p->next)!=NULL);
93 cout<<"空格个数:"<<blank<<endl;
94
95 }
96
97 void sum(link * &head){
98 link *p=head;
99 int words=0;
100 do{
101 words+=strlen(p->data);
102 }while ((p=p->next)!=NULL);
103 cout<<"文章总字数:"<<words<<endl;
104
105 }
106
107
108 void del(char *s,char *str){
109 //str为子串
110 char *p=strstr(s,str); //寻找str第一次出现的位置
111 char ch[80];
112 int len=strlen(s);
113 int i=len-strlen(p);
114 int j=i+strlen(str);
115 int number=0;
116 for(int m=0;m<i;m++)ch[number++]=s[m];
117 for(int n=j;n<len;n++)ch[number++]=s[n];
118 ch[number]='\0';
119 //把ch所指向的字符串复制到s
120 strcpy(s, ch);
121
122 }
123
124 void deletestr(link * &head){
125 link *p=head;
126 char str[20];
127 cout<<"请输入要删除的字符串:";
128 cin>>str;
129 int i=0,j=0;
130 //循环使用del()函数
131 while(p!=NULL)
132 {
133 if(strstr(p->data,str)!=NULL){
134 del(p->data,str);
135 i++;
136 cout<<p->data<<endl;
137 }else j++;
138 if(i==j){
139 p=p->next;
140 break;
141 }
142
143 }
144 cout<<"字符串已删除!"<<endl;
145 article(head);
146 cout<<endl;
147 }
148
149 int main(){
150 link* link;
151 //初始化
152 init(link);
153
154 letter(link);
155 number(link);
156 blank(link);
157 sum(link);
158
159 //删除
160 deletestr(link);
161
162 return 0;
163 };

浙公网安备 33010602011771号