博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA327
阅读量:6638 次
发布时间:2019-06-25

本文共 3354 字,大约阅读时间需要 11 分钟。

模拟

这个问题的任务是求解一组c语言里的表达式,但是你不需要知道c语言是怎么解决这个问题!

每一行一个表达式,每个表达式的组成不会超过110个字符.
待求解的表达式只包含一个int类型变量和一个组有限的操作;
表达式内不包含常量.
在我们简单的表达内将可能出现26个变量,变量名从‘a’到‘z’(小写字母形式).
在每个表达式开始前,这26个变量的值从1到26,(a=1,b=2.......z=26),
每个变量在一个表达式里面只出现一次,可能有许多变量没有被使用.

二元操作符+和-号可能在表达式内出现,计算法则根据通常的理解.

因此这个表达式a+c-d+b的值等于2(计算方式,1+3-4+2=2).
表达式内还可能出现++,--操作符.
++和--是一元操作符(只要一个操作数),++和--出现的任意变量的前面和后面.
当++操作符在变量前面时,将变量的值加1在变量拿来决定整个表达值前(使用前+1).
因此,表达式++ c - b 的值等于2,c的值加到4在计算整个表达期间(c=3,++c=4).
当++操作符出现在表达后面时,在变量拿来决定整个表达的值后加1(使用后再+1).
因此表达式 c ++ - b的值是1,但是c在计算完整个表达式后将会增加,它的值是4.
--操作符的和++操作符一样,同样能出现在变量的前面或者后面,用于将一个变量减1,
--操作放在变量的前面或后面的意义和++操作符一样,
因此表达式 --c + b--的值等于4,
计算完表达式后,c的值等于2,b的值等于1.

下面是其他算法规则用于解释++和--操作,我们只解释++(--的意义一样):

1.标识前面有++操作符的变量,写一个简单的赋值语句用于增加每个变量的值,然后在表达式使用前移除++操作符.

2.同样的方式,标识后面有++操作符的变量,写一个简单的赋值语句用于增加每个变量的值,然后在表达式使用后移除++操作符.

3.现在没有任何++操作符在每个变量前面和后面,写一个语句对剩余的表达式求解,先写入步骤1,然后写入步骤2.

Write the statement that evaluates the remaining expression after those statements written in step 1, and before those written in step 2.

4.执行顺序,执行第一步产生的语句,然后执行第三步产生的语句,最后执行第二步产生的语句

适用说明,求解表达式 ++ a + b ++等于计算 a=a+1(第一步算法),表达式=a+b(来自第三步算法),b=b+1(第二步算法),表达最后的值等于=a+b(4),

输入:

你的程序读取表达式,一个表达式一行,直到文件结束.

输出:

打印每个你读取的完整表达式,在不同的行中打印表达式的值,在表达式求解后每个变量的值,没有使用过的变量不用展示,
下面是期望输出的输出样例格式

每个表达式内的空格在求解时应该被忽略,不清楚的表达式不会出现在输入文件内,

比如表达式a+++b是不清楚的(原因:表达式可以当成a++ +b 或者 a + ++b).
同样,++和--操作符不会同时出现在同一个变量的前面和后面.因此类似表达式++a++的表达式不会出现在输入数据内.

 

#include
#include
#include
#include
using namespace std;struct Node{ int index; char op;};void init(int* const a);bool isLetter(char a);int s1(string str, int used[], int a[]){ int sum = 0; int length = str.length(); char op = ' '; for (int i = 0; i < length; i++) { char c = str.at(i); if (c == ' ') continue; if (isLetter(c)) { used[c - 'a'] = 1; if (op == '-') sum -= a[c - 'a']; else if (op == '+') sum += a[c - 'a']; else if (op == ' ') sum += a[c - 'a']; op = ' '; } else { if (c == '-') { char aop = str.at(i + 1); if (aop == c) { if (i > 0 && isLetter(str.at(i - 1))) { //a++ a[str.at(i - 1) - 'a']--; } else { //++a a[str.at(i + 2) - 'a']--; } i++; } else op = c; } else if (c == '+') { char aop = str.at(i + 1); if (aop == c) { if (i > 0 && isLetter(str.at(i - 1))) { //a++ a[str.at(i - 1) - 'a']++; } else { //++a a[str.at(i + 2) - 'a']++; } i++; } else op = c; } } } return sum;}int main(){ //freopen("d:\\1.txt", "r", stdin); string str; while (getline(cin, str)) { string str2 = ""; int length = str.length(); for (int i = 0; i < length; i++) { if (str.at(i) == ' ') continue; str2 = str2 + str.at(i); } int a[27]; int used[27]; memset(used, 0, sizeof(int) * 27); init(a); int sum = 0; sum = s1(str2, used, a); cout << "Expression: " << str << endl; cout << " value = " << sum << endl; for (int i = 0; i < 26; i++) { if (used[i] == 1) cout << " " << (char) ('a' + i) << " = " << a[i] << endl; } }}void init(int* const a){ for (int i = 0; i < 26; i++) { a[i] = i + 1; }}bool isLetter(char a){ return a >= 'a' && a <= 'z';}

  

posted on
2017-05-09 15:33 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/6830829.html

你可能感兴趣的文章
vsphere6.0故障:关于linux版本的vcenter6.0磁盘爆满问题和503错误问题[下]
查看>>
Android Metro风格的Launcher开发系列第一篇
查看>>
实战体验-天津ITAA实验室-每周末
查看>>
redis群集节点删除和添加
查看>>
Quartz Core 图层编程
查看>>
一课OO设计模式:抽象工厂
查看>>
Stackoverflow热门问题
查看>>
Code::Blocks导出MakeFile文件工具
查看>>
HTML 5 的自定义 data-* 属性和jquery的data()方法的使用
查看>>
胖子哥的大数据之路(三)- 大数据仓库的需求分析该怎么做
查看>>
tensorflowDetectionAPI
查看>>
多种网站模板演示
查看>>
JDBC事务处理和保存点
查看>>
前言 -- 数据库准备、一些名词准备
查看>>
JBoss 5.1虚拟目录的配置
查看>>
Cannot find module '@babel/core'
查看>>
书(一)
查看>>
ssh安全设置
查看>>
C语言:编写折半查找函数
查看>>
2.1Python变量、编码、注释
查看>>