行编辑程序

一直 熬夜熬到 凌晨 3点 , 头昏昏沉沉  , 起身想把昨夜没有写完的一点 代码写了 ,  写完之后 ,  寝室还没有来电 , 舍友也还在睡觉 , 可是天真的很亮很亮了.

这个行编辑程序是这样的 , 把控制台(键盘)上的每一个输入的 字符都 入栈 ,  以0位 文件结束符,@表示整个一行都输错了,要重新输入. #表示刚才的一个字符输错了,撤销掉它 . 按下 回车之后 ,  会把之前输的所有合法的字符输出到控制台上.

这个行编辑程序是基于栈的. #要撤销一个字符 , 对应的操作就是退栈 . 而@要撤销掉刚输入的所有字符 , 对应的操作就是清空 栈.

按下回车之后会把输入的合法字符都输出到控制台上 , 对应的操作就是依次输出栈元素.

下面是代码:(用c++写的)

#include<iostream>
#include<stdlib.h>
using namespace std;

#define   STACK_INIT_SIZE 100       //存储空间初始分配量 
#define   STACKINCREMENT   10       //存储空间增量 

typedef  struct 
{
	char *base;     //栈构造之前和销毁之后,base为null
	char *top ;     //栈顶指针
	int  stacksize; 
}SqStack;


int main()
{
	//申明 
	void LineEdit();
	LineEdit();
}


bool  InitStack(SqStack &s)   //构造一个空栈 
{
	s.base = (char*) malloc(STACK_INIT_SIZE * sizeof(char) );
	if(!s.base) 
	{
		cout<<"空间分配失败!"<<endl;
		return false; 
	}
	s.top = s.base;
	s.stacksize = STACK_INIT_SIZE;
	return true;
}

bool    Push(SqStack &s , char &e)     //插入元素e为新的栈顶元素 
{
	if(s.top - s.base >= s.stacksize)  //栈满,追加存储空间 
	{
		s.base = (char*) realloc(s.base , (s.stacksize + STACKINCREMENT) * sizeof(char) );
		if(!s.base)   
		{
			cout<<"空间分配失败!"<<endl;
			return false;
		}
		s.top = s.base+ s.stacksize;
		s.stacksize += STACKINCREMENT;
	}
	
	*s.top++ =e;
	return true;
}

bool ClearStack(SqStack &s)   //把s置为空栈 
{
	if(s.base == NULL)  return false;
	else
	{
		s.top = s.base;
		return true;
	}
}

bool  Pop(SqStack &s , char &e)    //出栈 , 出栈元素赋给e 
{
	if(s.top == s.base)  return false;
	e = *--s.top;
	return true;
}

void  DestroyStack(SqStack  &s)
{
	free(s.base);
	free(s.top);
	free(&s);
}

void  LineEdit()
{
	//申明
	bool InitStack(SqStack &s) ;
	bool Pop(SqStack &s , char &e);
	bool ClearStack(SqStack &s);
	void DestroyStack(SqStack &s);
	bool Push(SqStack &s , char &e);
	void vist(SqStack s);
	
	SqStack s;
	char c;   //接收退栈后的元素 
	InitStack(s);
	cout<<"请输入:"<<endl; 
	char ch = getchar();   //从终端接收一个字符 
	while(ch != 0)  //设定0为全文结束符 
	{
		while(ch!= 0  && ch!='\n')
		{
			switch(ch)
			{
				case '#' : Pop(s , c);     break;
				case '@' : ClearStack(s);  break;
				default: Push(s ,ch);      break;
			}
			ch = getchar();   //从终端接收下一个字符 
		}
		
		vist(s);
		ClearStack(s);
		cout<<endl;
		if(ch  != 0)  ch = getchar();
	}
	
	DestroyStack(s);
}

void  vist(SqStack s)
{
	if(s.base == s.top)
	{
		cout<<"行输入为空"<<endl; 
	}
	else
	{
		cout<<"行编辑的结果:"; 
		do
		{
			cout<<*s.base;
			s.base ++;
		}while(s.base  != s.top);
	}
}
下面是运行结果图:

4点了,就写到这里. 最后多谢严蔚敏的支持.


  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
[ 问题描述 ] 文本编缉程序是计算机文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以为单位进编辑程序称为编辑程序。被编缉的文本文件可能很大,,全部读入编缉程序的数据空间( 内存 )的作法既不经济, 也不总能实现。一种解决方法是逐段地编缉。任何时刻只把待编缉文件的一段放在内存, 称为活区。试按照这种方法实现一个简单的编辑程序。设文件每不超过 320 字符, 很少超过 80 字符。 [ 基本要求 ] 实现以下 4 条基本编缉命令: (1) 插入。格式:i. 将插入活区中第之后。 (2) 删除。格式:d[ ] 删除活区中第(到第)。两种格式的例子是: "d10" 和 "d10 14"。 (3) 活区切换。格式:n 将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。 (4) 活区显示。格式:p 逐页地(每页 20 )显示活区内容, 每显示一页内容之后请用户决定是否继续显示以后各页( 如果存在 ), 印出的每一要前置以号和一个空格符, 号固定占四位,增量为一.各条命令中的号均需在活区中各号范围之内, 只有插入命令的号可以等于活区第一号减一, 表示插入当前屏幕中第一之前,否则命令参数非法。 [ 测试数据 ] 此略。 [ 实现提示 ] (1) 设活区的大小用数 activemaxlen(可设为 100) 来描述。考虑到文本文长通常为正态分布, 且峰值在 60 到 70 之间, 320×activemaxlen 大小的字符数组实现存储将造成极大浪费。可以以标准块为单位为各分配存储, 每个标准块可含 81 个字符。这些块可以组成一个数组, 也可以利用动态链表连接起来。一文字可能占多个块。尾可用一个特殊的 ASCII 字符[如(012) ]标识。此外, 还应该记住活区起始号。插入将引起随后各号的顺序下推。 (2) 初始化过程包括: 请用户提供输入文件名(空串表示无输入文件)和输出文件名,两者不能相同。然后尽可能多地从输入文件中读入各, 但不超过activemaxlen-x.x 的值可以自定, 例如 20。 (3) 在执插入命令的过程中 ,每接收到一时都要检查活区大小是否已达activemaxlen, 应将插入点之前的活区部分中第一输出到输出文件中; 若插入点为第一之前, 则只得将新插入的这一输出。 (4) 若输入文件尚未读完, 活区切换命令可将原活区中最后几留在活区顶部,以保持阅读连续性; 否则, 它意味着结束编缉或开始编缉另一个文件。 (5) 可令前三条命令执后自动调用活区显式。 [选作内容] (1) 对于命令格式非法等一切错误作严格检查和适当处理。 (2) 加入更复杂的编缉操作, 如对某串替换; 在活区内进模式匹配等,格式可以为:S@@和 m。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值