C语言编程-数据结构课程设计-文本编辑器,已经提供代码,若干问题

C语言编程-数据结构课程设计-文本编辑器,已经提供代码,若干问题
题目: 文本编辑器
功能:实现基本的文本输入功能:查找,替换,插入,删除,正确显示行数,可正确存盘,读盘。
要求:1)界面友好,函数功能要划分好
2)总体设计应画一流程图
3)程序要加必要的注释
4)要提供程序测试方案
5)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
代码:(可以运行,无错误,无警告)
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -1
//#define EOF -1
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 1000
#define MAXQSIZE 10

static int i=0;
typedef char ElemType;
typedef struct StackNode//构造栈
{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;

ElemType InitStack(SqStack *S)//初始化栈
{
S->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!S->base)
{
exit(OVERFLOW);
}
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
return OK;
}

ElemType StackEmpty(SqStack *S)//判断栈是否为空
{
if(S->top==S->base)
return OK;
else
return ERROR;
}

ElemType Push(SqStack *S,ElemType e)//进栈操作
{
if(S->top-S->base>=S->stacksize)
{
S->base = (ElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!S->base)
{
exit(OVERFLOW);
}
S->top = S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*S->top++=e;
return OK;
}

ElemType Pop(SqStack *S,ElemType *e)//出栈操作
{

if(S->top==S->base)
{
return ERROR;
}
*e=*--S->top;
//printf("%d\n",e);
// return e;
return 0;
}

void ClearStack(SqStack *S)//清空栈
{
S->top=S->base;
}

ElemType LineEdit(SqStack *S )//文本编译
{
char ch, e, a[30];
int i ;
ch = getchar();

while(1)
{
while (ch!='\n')
{
switch(ch)
{
case '#':
Pop(S,&e);
break;
case '@':
ClearStack(S);
break;
default:
Push(S,ch);
break;
}
ch = getchar();
}
i = 0;
while (!StackEmpty(S))
{
Pop(S,&e);
a[i++]=e;
}
for(--i; i>= 0; i--)
{
printf("%c",a[i]);
}
printf("\n");
ClearStack(S);
ch = getchar();
}

return 0;
}

int main(void)
{

SqStack S;

InitStack(&S);
LineEdit(&S);

system("pause");
return 0;
}
我用visual c++6.0 编译后,弹出来运行窗口,可是我不知道该输入什么数据。。。
哪位编成高手能帮我解答一下,或加我好友,要多少分都行啊,这个号1000多分呢,只要能指导我一下就行。
题目要求的界面友好,可是怎么这个代码没有界面,怎么才有界面?

我那课程没学好....一楼的我看不懂,好像弄得更复杂了...

周五要交,怎么办?

#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -1
//#define EOF -1
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 1000
#define MAXQSIZE 10

static int i=0;
typedef char ElemType;
typedef struct StackNode//构造栈
{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;

ElemType InitStack(SqStack *S)//初始化栈
{
S->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!S->base)
{
exit(OVERFLOW);
}
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
return OK;
}

ElemType StackEmpty(SqStack *S)//判断栈是否为空
{
if(S->top==S->base)
return OK;
else
return ERROR;
}

ElemType Push(SqStack *S,ElemType e)//进栈操作
{
if(S->top-S->base>=S->stacksize)
{
S->base = (ElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!S->base)
{
exit(OVERFLOW);
}
S->top = S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*S->top++=e;
return OK;
}

ElemType Pop(SqStack *S,ElemType *e)//出栈操作
{

if(S->top==S->base)
{
return ERROR;
}
*e=*--S->top;
//printf("%d\n",e);
// return e;
return 0;
}

void ClearStack(SqStack *S)//清空栈
{
S->top=S->base;
}

ElemType LineEdit(SqStack *S )//文本编译
{
char ch, e, a[30];
int i ;
ch = getchar();

while(1)
{
while (ch!='\n')
{
switch(ch)
{
case '#': Pop(S,&e); break; //遇到'#',前面个字符出栈
case '@': ClearStack(S); break; //遇到'@',前面的所以字符出栈
default: Push(S,ch); break; //其他字符进栈
}
ch = getchar();
}
i = 0;
while (!StackEmpty(S))
{
Pop(S,&e);
a[i++]=e;
}
printf("循环输出结果为:");
for(--i; i>= 0; i--)
{
printf("%c",a[i]);
}

printf("\n请再输入几个字符吧:");
ClearStack(S);
ch = getchar();

}

return 0;
}

int main(void)
{

SqStack S;
printf("\n\t\t\t本程序是用C语言演示数据结构中的栈\n\n");
printf("\t说明:首先连续输入几个字符初始化栈,以换行结束.\n");
printf("\t如果输入字符中包含'#',那么它前面的一个字符就会出栈,\n");
printf("\t如果输入的字符中包括'@',那么它前面的所有字符全部出栈(清空)!\n");
printf("\t程序本身就这么简单,唯一不足的一点就是无限循环输入,没有结束语句!\n");
printf("\t程序重要其价值,这一点可以说是程序不足的不足吧!\n");
printf("\t祝你早日成功哈!\n\n");

printf("请连续输入几个字符初始化栈(eg:abc):");
InitStack(&S);
LineEdit(&S);

system("pause");
return 0;
}

这一下差不多行了。。

所谓的界面友好就是要提示用户输入什么。。。

要不然的话用户都不知道怎么输入那怎么能行呢。。

关键还是提示语句。。。

都说我暂时退出江湖了。。

最近一段时间忙着找工作呢。。

可是友人找到我了。。

即使是搞JAVA了也得帮友人一把。。。

数据结构虽说学得不怎么好。。。

但还没全忘。。嘿嘿。。。

祝朋友早日成功啦!!!

bye-bye!

对了,还有件事忘了讲了。。。

就是分嘛。。。千万别动不动全部都给别人。。

你又不是问了这次就不问下次了。。

留着以后还用的着呢。。

随便一点意思意思就很OK了。。。

兄弟还在乎那几个分。。

嘿嘿。。。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-04
这是tongji university online judge的一道题,现在这个题库已经没有了,我把原题贴出来,你就知道这个程序什么意思了
Problem
一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。

由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的。较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符"#",以表示前一个字符无效;

如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符"@",以表示当前行中的字符均无效。

如果已经在行首继续输入'#'符号无效。

Input
输入一个多行的字符序列。但行字符总数(包含退格符和退行符)不大于250。

Output
按照上述说明得到的输出。

Sample Input

whli##ilr#e(s#*s)

outcha@putchar(*s=#++);

Sample Output

while(*s)

putchar(*s++);
第2个回答  2009-05-04
呵呵,骗老师的吧,自己不会编写抄到答案可惜不知道怎么用。。。笨蛋你不会看源代码啊??getchar()什么意思你不会不知道吧???
相似回答