Dada una string de operaciones que contiene tres operandos para cada operación » tipo de comando «, » primer operando » y » segundo operando «. Calcula todos los comandos dados en este formato de string.
En otras palabras, se le dará una string pura que le pedirá que realice una operación y debe realizarla e imprimir el resultado en el orden de los comandos dados.
- add – Para la suma ( + ) acepta dos argumentos num1 y num2 . (similar a restar (-), multiplicar (x), dividir (/)).
- porcentaje – Para porcentaje ( % ) con 100 acepta un argumento num1 y num2 como ‘-1’ siempre.
- log : para el logaritmo de num1 con base num2 acepta dos argumentos. (similar con exp (^) ).
- sqrt : para la raíz cuadrada de num1 , acepte un argumento num1 y num2 como ‘-1’ siempre.
- cbrt : para la raíz cúbica de num1 , acepta un argumento num1 y num2 como ‘-1’ siempre.
- Todas las funciones trigonométricas: acepta un argumento num1 y num2 como ‘-1’ siempre.
Nota: Imprima «inf» en caso de cualquier excepción como dividir por cero (0) y para funciones que ingresan un argumento, agregue ‘-1’ como segundo.
Ejemplos:
Input: "add 4 5" Output: 9 Explanation: 4+5=9 which is to be printed.
Input: "subtract 7 6" Output: 1 Explanation: 7-6=1 which is to be printed.
Input: "divide 2 0 multiply 6 6" Output: inf 36 // in this case it will only print 36 Explanation: 2/0=infinity and 6*6=36 which is to be printed.
Input: "percent 50 -1" Output: 0.5 Explanation: 50/100=0.5 which is to be printed.
Enfoque: es un caso simple de manejo de strings en el que necesitamos extraer cada palabra y luego calcular la salida de los operandos en función del ‘tipo de operación’ . Se puede hacer creando una serie de funciones de escalera if-else o usando cajas de cambio. Si alguna función no es válida o no se encuentra en la función returnOP , devuelva ‘-1’ .
Por ejemplo: «sumar 5 6» se puede dividir en tres strings utilizando stringstream «sumar» , «5» y «6». Compararemos add con nuestra biblioteca de funciones y realizaremos 5+6 después de convertirlas en flotantes. Entonces, si «agregar» está en la posición i , entonces 5 y 6 estarían en las posiciones i+1 e i+2 .
Siga los pasos a continuación para implementar el enfoque anterior:
- Pase la string a la función processOperations .
- Extrae cada palabra de la string usando la clase stringstream y almacena todas estas palabras en un vector strarr .
- Luego verifique cada tercera palabra (3*k) para ver el ‘tipo de operación’ que se está realizando y compárelo con la biblioteca de operaciones disponible en la función returnOP .
- Si se encuentra esa operación returnOP , devuelva su respuesta flotante después del cálculo; de lo contrario, devuelve ‘-1’.
- Calcule los valores de salida en función de la operación y devuélvalos a la función original processOperations .
Todos estos resultados de operaciones que obtenemos de returnOP se insertarán en un vector de resultados de tipo float. El vector de resultado será nuestra respuesta final que se devolverá después de realizar todas las operaciones.
C++14
#include <bits/stdc++.h> using namespace std; // MACROS for performing commands #define e 2.718281828459045 #define pi 3.141592653589793 // function for comparing the type of operation double returnOP(string& word,vector<string>&strarr,int& i) { double num1,num2; // using MACROS if required if(strarr[i+1].compare("e")==0) num1=e; if(strarr[i+1].compare("pi")==0) num1=pi; else num1=stof(strarr[i+1]); if(strarr[i+2].compare("e")==0) num2=e; if(strarr[i+2].compare("pi")==0) num2=pi; else num2=stof(strarr[i+2]); double degree=pi*num1/180; // library of functions to calculate result // after finding the 'type of operation' if(word.compare("add")==0) return num1+num2; else if(word.compare("subtract")==0) return num1-num2; else if(word.compare("multiply")==0) return num1*num2; else if(word.compare("divide")==0) return num1/num2; else if(word.compare("percent")==0) return (num2/num1)*100; else if(word.compare("log")==0) return log(num1)/log(num2); else if(word.compare("exp")==0) return pow(num1,num2); else if(word.compare("sqrt")==0) return sqrt(num1); else if(word.compare("cbrt")==0) return cbrt(num1); else if(word.compare("sin")==0) return sin(num1); else if(word.compare("cos")==0) return cos(num1); else if(word.compare("tan")==0) return tan(num1); else if(word.compare("sec")==0) return 1/cos(num1); else if(word.compare("cosec")==0) return 1/sin(num1); else if(word.compare("cot")==0) return 1/tan(num1); else if(word.compare("sindeg")==0) return sin(degree); else if(word.compare("cosdeg")==0) return cos(degree); else if(word.compare("tandeg")==0) return tan(degree); else if(word.compare("secdeg")==0) return 1/cos(degree); else if(word.compare("cosecdeg")==0) return 1/sin(degree); else if(word.compare("cotdeg")==0) return 1/tan(degree); else if(word.compare("sininv")==0) return asin(num1); else if(word.compare("cosinv")==0) return acos(num1); else if(word.compare("taninv")==0) return atan(num1); else if(word.compare("secinv")==0) return acos(1/num1); else if(word.compare("cosecinv")==0) return asin(1/num1); else if(word.compare("cotinv")==0) return atan(1/num1); else if(word.compare("sininvdeg")==0) return 180*asin(num1)/pi; else if(word.compare("cosinvdeg")==0) return 180*acos(num1)/pi; else if(word.compare("taninvdeg")==0) return 180*atan(num1)/pi; else if(word.compare("secinvdeg")==0) return 180*acos(1/num1)/pi; else if(word.compare("cosecinvdeg")==0) return 180*asin(1/num1)/pi; else if(word.compare("cotinvdeg")==0) return 180*atan(1/num1)/pi; return -1; } // function for fetching each word from a string array of operations // and pushing them into result after performing required operation vector<double>processOperations(string& operations) { string word; vector<string>strarr; vector<double>result; // stringtream class to extract // word from string stringstream ss(operations); while(ss>>word) strarr.push_back(word); // passing each third word to returnOP // to calculate final result of that query for(int i=0;i<strarr.size();i+=3) result.push_back(returnOP(strarr[i],strarr,i)); return result; } // driver's code int main() { string operations="add 1 1 multiply -2 -1 cosecinvdeg 1.4142135624 -1 percent 100 20"; vector<double>ans=processOperations(operations); for(auto& x:ans) cout<<x<<endl; return 0; }
Producción:
2 // adding of 1 and 1 2 // multiplying of -2 and -1 45 // cosecinvdeg 1.4142135624 and -1 20 // percentage of 100 and 20
Complejidad de tiempo: O(N)
Espacio auxiliar: O(N), donde N es el número de caracteres en las operaciones de string.
Publicación traducida automáticamente
Artículo escrito por prophet1999 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA