zoukankan      html  css  js  c++  java
  • UVA327

    模拟

    这个问题的任务是求解一组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<stdio.h>
    #include<iostream>
    #include <strstream>
    #include<memory.h>
    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';
    }
    

      

  • 相关阅读:
    powerpc调试工具的使用
    微软的开发工具是我见过比较难用的
    Spring之jdbcTemplate:查询的三种方式(单个值、单个对象、对象集合)
    静态工厂方法和实例工厂方法
    理解.NET Framework
    .NET相关的概念简介
    二、文档工具 swagger
    Java Web学习(二)数据加密
    Java Web学习(一)Web基础
    Oracle学习(十二)标量函数
  • 原文地址:https://www.cnblogs.com/shuiyonglewodezzzzz/p/6830829.html
Copyright © 2011-2022 走看看