文章编辑程序

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 };

 

 

 

 

 

posted @ 2021-12-04 20:45  是逸仙呀  阅读(260)  评论(0)    收藏  举报