本文是以学校数据结构与算法课程设计要求为背景,利用了C语言、数据结构知识和VC++6.0开发平台,开发了文章编辑器,写这篇是为了记录学习过程,也为后来者提供一些参考和思路。
在实际应用中往往需要在编辑不同的文本信息时可完成文字信息录入、统计出文字、数字、空格等字符个数等使用功能。因此,本程序也需要完成类似的功能,通过依据现有知识对软件所需的功能进行评估分析,编写算法最终完成该程序设计。
1.巩固和加深对C语言课程基本知识的理解和掌握;
2.掌握C语言编程和调试的基本技能;
3.掌握文件的操作;
4.掌握结构体数组的表示和存储;
5.掌握线性表的存储和操作。
该课程设计是要求编写一个文章编辑器,在输入一页文字后,程序可以统计出文字、数字、空格的个数。具体功能:
1.静态存储一页文章,每行最多不超过80个字符,共N行;
2.读取磁盘文件并显示文件内的文字内容;
3.分别统计出其中英文字母数和空格数及整篇文章总字数;
4.统计某一字符串在文章中出现的次数,并输出该次数;
5.删除特定字符串,并将后面的字符前移;
6.删除一行字符串,并将文章的总行数减一;
7.添加特定字符串,可以添加到文章的任意行、任意列;
8.添加一行字符串,可以添加到文章的任意行;
9.退出系统。
说明:
1.存储结构使用线性表,分别用几个子函数实现相应的功能;
2.输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号;
3.输出形式:
(1)分行输出用户输入的各行字符;
(2)分4行输出"全部字母数"、“数字个数”、“空格个数”、“文章总字数”;
(3)输出删除某一字符串后的文章。
本程序主要分为八大模块(功能模块图见图1):输入文章、输出文章、删除字符、添加字符、存储文章、打开文章、统计数目和退出系统。
#include
#include
#include
#include
#define N 80//文章行数
在使用函数库中的输入输出函数时,编译系统要求程序提供有关此函数的信息(例如对这些输入输出函数的声明和宏定义、全局量的定义等),程序的第一行“#include
在程序中用到了系统提供的标准函数库中的输入输出函数时,要在程序开头写上一行:#include
stdlib.h是个头文件,里面定义了五种类型、一些宏和通用工具函数。具体的可以在编译器的include目录里面的stdlib.h头文件中查看。文中利用的malloc()、system()函数的声明都在stdlib.h头文件中。[2]
string.h是一个头文件,里面写的是关于字符串操作的一些基本函数。当程序中涉及对字符串的操作时,会用到这个头文件中的函数。
windows.h是Windows程序最基本的头文件,它包含在SDK中。该头文件定义了Windows的所有函数原型、消息、多种数据类型、数据结构及符号常量等。
N代表str字符数组的长度,用于存放该行的内容,最大长度为80。
typedef struct line
{
char str[N]; //存储该行的内容
int num; //用来记录行号
struct line *prior; //用来指向前一行
struct line *next; //用来指向下一行
}LINE;
声明一个结构体类型struct line,包括str[N]字符型数组(存放文字一行内容)、num整型常量(记录行号)、LINE类型指针变量prior(用于指向前一行)、LINE类型指针变量prior(用于指向前一行)。
在C语言中允许用户自己建立由不同类型数据组成的组合型的数据结构,这就被称为结构体。str[N]为字符型数组、num为整型常量。定义了结构体变量后,系统会自动为之分配内存单元。
struct Student *next; :next是指针变量,指向结构体变量。其成员是用来存放节点中的有用数据,next是指针类型的成员,它指向struct line类型数据(就是next所在的结构体类型)。一个指针类型的成员既可以指向其他类型的结构体数据,也可以指向自己所在的结构体类型数据。现在,next是struct line类型中的一员,它又指向struct line类型数据。用这种方式建立链表。
LINE *start;
LINE *p;
定义指向LINE类型数据的指针变量start、last。用于指向线性表的第一行和最后一行。
void Title()//标题显示函数
int menu()//菜单函数
int Choice();//菜单栏选择函数
void Input()//文章输入函数
void Output()//文章内容输出函数
int CountAll()//统计所有字符串数目函数
int CountString()//统计特定字符串数目函数
int Count()//统计功能菜单函数
int Del_1()//删除一行字符串函数
int Del_2()//删除特定字符串函数
int Delete()//删除功能菜单函数
int Add_1()//添加一行文本函数
int Add_2()//添加特定字串函数
int Add()//添加功能菜单函数
int Save()//保存文本函数
int Open()//打开文本函数
int main();//主函数
将整个程序划分为十七个函数部分,每个函数完成一个或多个功能,各司其职,通过函数划分不仅使复杂的文章编辑器简单化,在后期编译运行时较为容易的发现问题,同时函数模块可随时调用,使用方便。
void Title()
{
printf(" ______________________________________________\n\n");
printf(" **** 欢迎使用文章编辑系统 **** \n");
printf(" **** 作者:*** 学号:******* **** \n");
printf(" ______________________________________________ \n");
}
本部分用的是格式输出函数printf(格式控制,输出表列);运用此函数将双引号里的内容按原格式输出在屏幕上,这样一个简单的文章编辑系统的标题栏就完成了。
int menu()
{
Title();
printf("| 【 功能菜单 】 |\n");
printf("| 0.退出系统 |\n");
printf("| 1.输入文章 |\n");
printf("| 2.输出文章 |\n");
printf("| 3.删除字符 |\n");
printf("| 4.添加字符 |\n");
printf("| 5.统计数目 |\n");
printf("| 6.存储文章 |\n");
printf("| 7.打开文章 |\n");
printf("---------------------------------------------------\n");
printf(" 请输入一个数<0-7>:");
}
本部分同样使用的是格式输出函数printf(格式控制,输出表列);运用此函数将双引号里的内容按原格式输出在屏幕上,这样一个简单的文章编辑系统的标题栏就完成了。
int Choice()
{
scanf("%d",&ch);//判断输入的字符是什么字符
switch (ch)
{
case 0:
printf("\n|》》》 退出成功! 《《《|\n\n");
exit(0);
break;
case 1:
system("cls");
Title();
printf("\n|>>> 【 输入文章 】 <<<|\n\n");
getchar();
Input();
break;
case 2:
system("cls");
Title();
printf("\n|>>> 【 输出文章 】 <<<|\n\n");
Output();
break;
case 3:
system("cls");
Title();
printf("\n|>>> 【 删除字符 】 <<<|\n\n");
Delete();
break;
case 4:
system("cls");
Title();
printf("\n|>>> 【 添加字符 】 <<<|\n\n");
Add();
break;
case 5:
Count();
break;
case 6:
system("cls");
Title();
printf("\n|>>> 【 存储文章 】 <<<|\n\n");
Save();
break;
case 7:
system("cls");
Title();
printf("\n|>>> 【 打开文章 】 <<<|\n\n");
Open();
break;
default:
printf("选择错误,重新输入\n");
Sleep(1000);
system("cls");
menu();
Choice();
break;
}
}
本部分使用的switch语句是多分支选择结构,根据表达式的值使流程跳转到不同的语句,使用了break语句是使流程跳出switch结构即终止switch语句的执行。根据输入的值(0-7)进行相关函数的调用,从而完成不同的功能。
通过上述代码的编写,该文章编辑器的界面就完成了,效果图如下
由于代码较长,具体功能实现程序代码请点击下方链接查阅:
https://download.csdn.net/download/qq_45556665/12595181
需要课程设计论文和源代码的请关注收藏点赞私聊哦!