UVA 327simple expressions有漏洞主要自己训练

来源:互联网 发布:c语言逻辑条件表达式 编辑:程序博客网 时间:2024/04/29 21:37
/* coder:commence
data:2014.3.1;
result:unknown

这里的程序输出为全部要求按格式输出,但通过字符串转换,多种方式计算终于成功本来以为是一道简单题,(其实就是简单题),调试过程中还是出现很多问题。下面是代码*/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>//这里应当用到结构体一级排序
#include<ctype.h>
#define MAXN 80
typedef struct node
{
char a;
int is_preadd;
int is_postadd;
int is_preminus;
int is_postminus;
}Node;
Node * quene[MAXN];
int front,rear_n,cas,rear_in;
char input[MAXN];
int map[MAXN];
int judge(char *s)
{
int i;
for (i=0;s[i]!='\0';i++)
if (s[i]==s[i+1]) return 0;
return 1;
}
int cmp(const void*a,const void *b)
{
char *p=(char*)a;
char *q=(char*)b;
return *p-*q;
}
void removes(int start,int length)//其实位置开始删除长度为length的字符
{
int i,len=strlen(input),j;
for (i=1;i<=length;i++)
{
for (j=start;j<len-1;j++)
input[j]=input[j+1];
}
input[len-length]='\0';
printf("%s\n",input);
}
int main()
{
while (gets(input)!=NULL)
{ cas=0;
int len=strlen(input),i=2,j=0,ans=0,front=0;//注意这的cas
printf("Expressions:%s\n",input);
while (1)
{
if (judge(input)) break;
//思路是取出所有连加连减符号,然后用结构体标记对应的规则。最后取出的数组就是最简单的直接A+B+C+D形式直接计算就可以
if (isalpha(input[i]))
{
if (input[i-1]==input[i-2])
{
quene[cas]=(Node*)malloc(sizeof(Node));
if (input[i-1]=='+') {quene[cas]->is_preadd=1;quene[cas]->is_postadd=0;quene[cas]->is_postminus=0;quene[cas]->is_postminus=0;}
if (input[i-1]=='-') {quene[cas]->is_preminus=1;quene[cas]->is_preadd=0;quene[cas]->is_postadd=0;quene[cas]->is_postminus=0;}
quene[cas++]->a=input[i];
removes(i-2,2);//剔除字符串中自增自减符号,剔除之后还要添加,这里步剔除字母符号,防止重新出现相应的自增错误,并用映射函数处理
}
else if (input[i+1]==input[i+2])
{
quene[cas]=(Node*)malloc(sizeof(Node));
if (input[i+1]=='+') {quene[cas]->is_preadd=0;quene[cas]->is_postadd=1;quene[cas]->is_preminus=0;quene[cas]->is_postminus=0;}
if (input[i+1]=='-') {quene[cas]->is_preminus=0;quene[cas]->is_preadd=0;quene[cas]->is_postadd=0;quene[cas]->is_postminus=1;}
quene[cas++]->a=input[i];
removes(i+1,2);//剔除字符串中自增自减符号及相应的字符
}
else
{
quene[cas]=(Node*)malloc(sizeof(Node));
quene[cas]->a=input[i];
quene[cas]->is_postadd=0;quene[cas]->is_postminus=0;quene[cas]->is_preadd=0;quene[cas]->is_preminus=0;
cas++;
map[j++]=cas-1;
}
}
//编写一个函数当当前字串中没有任何自增自减符号时跳出循环
i++;
} //break处理完后的数组就是无自增自减符号的式子,但是只有存在自增自减符号的字母存进了结构体。
//接下来计算表达式值
ans=input[0]-'a'+1;
//printf("%d#",ans);
//printf("%d~\n",strlen(input));
while (front<strlen(input)-1)
{
for (i=front+1;i<strlen(input);i++)
{
if (input[i]=='+')
{
ans=ans+input[i+1]-'a'+1;
front=i+1;
printf("%d!\n",ans);
break;
}
else if (input[i]=='-')
{
ans=ans-(input[i+1]-'a'+1);
front=i+1;
printf("%d~\n",ans);
break;
}
}
}//这里ans初步计算完成,还需要自增自减符号顺序判断value值,循环死了。
for (i=0;i<cas;i++)
{
if (quene[i]->is_preadd==1)ans+=1;
if (quene[i]->is_preminus==1) ans-=1;
}
printf("\t value=%d\n",ans);
int leap=0;
for (i=0;i<len;i++)
if (isalpha(input[i])) input[leap++]=input[i];
input[leap++]='\0';
printf("~%s\n",input);
qsort(input,leap-1,sizeof(input[0]),cmp);
printf("~%s\n",input);
for (i=0;input[i]!='\0';i++)
{
int flag=0;
for (j=0;j<cas;j++)
{
if (quene[j]->a==input[i])
{
if (quene[j]->is_preadd==1 || quene[j]->is_postadd==1) flag=1;
if (quene[j]->is_preminus==1 || quene[j]->is_postminus==1) flag=-1;
break;
}
}
printf("%c=%d\n",input[i],flag+input[i]-'a'+1);
}
}
return 0;
}

0 0