如果您想了解计算字符串得出结果的相关知识,那么本文是一篇不可错过的文章,我们将对计算字符串得出结果的方法进行全面详尽的解释,并且为您提供关于c#–如何计算字符串中的唯一字符、C#中另类自定义公式计算字
如果您想了解计算字符串得出结果的相关知识,那么本文是一篇不可错过的文章,我们将对计算字符串得出结果的方法进行全面详尽的解释,并且为您提供关于c# – 如何计算字符串中的唯一字符、C#中另类自定义公式计算 字符串转换为计算公式,并得出计算结果、c++输入数据后怎么得出结果、C语言中计算字符串长度与分割字符串的方法的有价值的信息。
本文目录一览:- 计算字符串得出结果(计算字符串得出结果的方法)
- c# – 如何计算字符串中的唯一字符
- C#中另类自定义公式计算 字符串转换为计算公式,并得出计算结果
- c++输入数据后怎么得出结果
- C语言中计算字符串长度与分割字符串的方法
计算字符串得出结果(计算字符串得出结果的方法)
需求:
在C#中对一个字符串进行计算得出结果。
例如:“1+2+66+33”
字符串中的数字可以变化,累加(这里偷懒了限定成累加)的次数可以变化。
思路/解决方案:
1. 用JavaScript中的Eval把字符串转成对象进行计算
用Com控件计算方法,引入MSScriptControl.ScriptControlClass
2.用DataTable().Compute计算方法
3.把字符串表达式作为一个sql发到数据库计算后结果再回传到程序
4.分解字符串用 lambda表达式树动态创建一个(累加)表达式
说明:
我做了一个随机数,然后将每次随机出来的数字拼接成一个字符串展示出来。
再来解析这个字符串得出计算结果。
需要注意表达式树的方式,你的参数列表paramslist必须是 object[] 这个类型,我之前用的int[] 也可以编译但是在运行的时候会报错,你的paramenterArray应当就是构成binaryexpression的那些ParameterExpression。
如果你的业务里面要用到更加复杂运算,你需要亲自来尝试。
欢迎吐槽。
代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq.Expressions;
using System.Reflection;
namespace guess
{
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine(SetRandomVariable(GetTemplate()));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
#if DEBUG
Console.Read();
#endif
}
private static string GetTemplate()
{
StringBuilder stb = new StringBuilder();
stb.AppendLine("Bangladesh - OneERP {0}hr");
stb.AppendLine("CN - OneERP {1}hr");
stb.AppendLine("Global - OneERP {2}hr");
stb.AppendLine("FE - OneERP {3}hr");
stb.AppendLine("UK - OneERP {4}hr");
stb.AppendLine("Turkey - OneERP {5}hr");
stb.AppendLine("Vietnam – OneERP {6}hr");
stb.AppendLine("Singapore - OneERP {7}hr");
stb.AppendLine("CN - HZ {8}hr");
stb.AppendLine("Romania - OneERP {9}hr");
stb.AppendLine("Thailand - OneERP {10}hr");
stb.AppendLine("ZheJiang - OneERP {11}hr");
stb.AppendLine("Global - OneERP SSO {12}hr");
return stb.ToString();
}
private static string SetRandomVariable(string getTemplate)
{
int count = getTemplate.Split(''\n'').Length - 1;
Random randomVariable = new Random(DateTime.Now.Millisecond);
int max = 40;
StringBuilder formula = new StringBuilder();
object[] paramslist = new object[count];
for (int i = 0; i < paramslist.Length; i++)
{
if (i == paramslist.Length - 1)
{
paramslist[i] = max;
formula.Append(max);
}
else
{
paramslist[i] = available(ref max, ref formula);
}
}
//Com控件计算方法 需要目标平台X86 D找到引用的dll——属性——嵌入互操作类型——false
MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControlClass();
sc.Language = "JavaScript";
Console.WriteLine("{0}={1}", formula.ToString(), sc.Eval(formula.ToString()).ToString());
//DataTable().Compute计算方法
Console.WriteLine("{0}={1}", formula.ToString(), new System.Data.DataTable().Compute(formula.ToString(), "").ToString());
//另外有一种思路,把表达式作为一个sql发到数据库计算后结果再回传到程序。
//lambda表达式树动态创建一个累加的表达式 需要.net FrameWork 4.5
BinaryExpression binaryexpression = addExpression(count,null);
Console.WriteLine(binaryexpression);
LambdaExpression lambdaExpr = Expression.Lambda(binaryexpression, paramenterArray);
Delegate de = lambdaExpr.Compile();
// MethodInfo method = de.Method;
Console.WriteLine(de.DynamicInvoke(paramslist));
return string.Format(getTemplate, paramslist);
}
private static int available(ref int max, ref StringBuilder formula)
{
int temp = 0;
if (max > 0)
{
Random randomVariable = new Random();
if (max == 1)
{
temp = randomVariable.Next(0, max + 1);
}
else
{
temp = randomVariable.Next(0, max);
}
max = max - temp;
}
formula.AppendFormat("{0}+", temp);
return temp;
}
static List<ParameterExpression> paramenterArray=new List<ParameterExpression>() ;
/// <summary>
///
/// </summary>
/// <param name="lenght">累加次数</param>
/// <param name="resultLeft">默认累加表达式</param>
/// <returns></returns>
private static BinaryExpression addExpression(int lenght, BinaryExpression resultLeft)
{
try
{
ParameterExpression left, right;
left = Expression.Parameter(typeof(int), string.Format("left{0}", lenght) );
right = Expression.Parameter(typeof(int), string.Format("right{0}", (lenght - 1)) );
BinaryExpression result = Expression.Add(left, right);
if (lenght > 2)
{
paramenterArray.Add(left);
paramenterArray.Add(right);
if (resultLeft != null)
result = Expression.Add(resultLeft, addExpression(lenght - 2, result));
else
result = addExpression(lenght - 2, result);
}
if (lenght == 2)
{
paramenterArray.Add(left);
paramenterArray.Add(right);
if (resultLeft != null)
result = Expression.Add(resultLeft, result);
else
{
//ignore;
}
}
if (lenght == 1)
{
if (resultLeft != null)
{
ParameterExpression rExpression = Expression.Parameter(typeof(int), string.Format("right{0}", lenght ));
paramenterArray.Add(rExpression);
result = Expression.Add(resultLeft, rExpression);
}
else
{
throw (new Exception("当lenght等于1时,resultLeft参数不能为空"));
}
}
return result;
}
catch ( Exception ex)
{
#if DEBUG
Console.WriteLine(ex.StackTrace.ToString());
#endif
throw (ex);
}
}
}
}
收录羽铉君的四则混合运算写法。Pop(), Push(opt) ,Peek()的范例。
public class Calculator
{
public Calculator()
{
_OptStack = new Stack<char>();
_SuffixStack = new Stack<float>();
}
private Stack<char> _OptStack;
private Stack<float> _SuffixStack;
public float Calculate(string expression)
{
string lastNum = string.Empty;
for (int i = 0; i < expression.Length; i++)
{
if (char.IsNumber(expression[i]) || expression[i].Equals(''.''))
{
lastNum += expression[i];
}
else
{
if (lastNum != string.Empty)
{
Merger(float.Parse(lastNum));
lastNum = string.Empty;
}
AddOpt(expression[i]);
}
}
if (lastNum != string.Empty)
{
Merger(float.Parse(lastNum));
}
while (_OptStack.Count > 0)
{
Merger(_OptStack.Pop());
}
return _SuffixStack.Pop();
}
private void AddOpt(char opt)
{
if (_OptStack.Count == 0)
{
_OptStack.Push(opt);
return;
}
if (opt.Equals('')''))
{
while (!_OptStack.Peek().Equals(''(''))
{
Merger(_OptStack.Pop());
}
_OptStack.Pop();
return;
}
char tempOpt = _OptStack.Peek();
if ((opt.Equals(''-'') || opt.Equals(''+'')) &&
(tempOpt.Equals(''*'') || tempOpt.Equals(''/'')))
{
while (_OptStack.Count > 0)
{
Merger(_OptStack.Pop());
}
}
_OptStack.Push(opt);
}
private void Merger(float exp)
{
_SuffixStack.Push(exp);
}
private void Merger(char exp)
{
float num1 = _SuffixStack.Pop();
float num2 = _SuffixStack.Pop();
float result = 0;
switch (exp)
{
case ''+'':
result = num2 + num1;
break;
case ''-'':
result = num2 - num1;
break;
case ''*'':
result = num2 * num1;
break;
case ''/'':
result = num2 / num1;
break;
}
_SuffixStack.Push(result);
}
}
//调用写法
//string calc = "89+(126/2)*3-6/3+(96+3-8/2)";// 随便写四则运算
//Calculator calculator = new Calculator();
//MessageBox.Show(calculator.Calculate(calc).ToString()); // 结果
c# – 如何计算字符串中的唯一字符
假设我们有变量myString =“blabla”或mystring = 998769
myString.Length; //will get you your result myString.Count(char.IsLetter); //if you only want the count of letters:
如何获得,独特的字符数?我的意思是“blabla”结果必须是3,doe“998769”它将是4.是否准备好了功能?有什么建议?
解决方法
var count = myString.distinct().Count();
它使用一个事实,该字符串实现IEnumerable< char>.
如果没有LINQ,你可以在内部做与distinct相同的东西并使用HashSet< char>:
var count = (new HashSet<char>(myString)).Count;
C#中另类自定义公式计算 字符串转换为计算公式,并得出计算结果
//方法一 利用DataTable中的Compute方法 例如:1*2-(4/1)+2*4=6
string formulate = string.Format("{0}*{1} - {2}/{3} +{1}*{2}", 1, 2, 4, 1);
DataTable dt = new DataTable();
Response.Write(dt.Compute(formulate, "").ToString());
Response.Write("<br/>");
//方法二 利用JS中强大的Eval函数 可以带if-else判断 添加COM引用:Microsoft Sctipt Control 1.0
MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControlClass();
sc.Language = "JavaScript";
string formulate1 = string.Format("if({0}==2)((({0}*{1})-{3}+({1}*{2}))+{4}/{0});else(1+2*3)", 2, 3, 4, 5,6);
object objResult = sc.Eval(formulate1);
if (objResult != null)
{
Response.Write(objResult.ToString());//1+12+3
}
/* 方法三 需将Microsoft.JScript 和Microsoft.Vsa加入参考并引用Microsoft.JScript */
public object EvalExpress(string sExpression)
{
Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
return Microsoft.JScript.Eval.JScriptEvaluate(sExpression, ve);
}
c++输入数据后怎么得出结果
从 c++ 程序中输入数据并得到结果需要以下步骤:1. 定义变量;2. 使用 cin 获取用户输入;3. 处理输入数据;4. 使用 cout 显示结果。例如,计算矩形面积时,需要定义 length 和 width 变量,用 cin 获取输入,用 length * width 计算面积,再用 cout 显示结果。
如何从 C++ 程序输入数据并得出结果
在 C++ 程序中,输入数据并得出结果的过程包含以下步骤:
1. 定义变量
首先,您需要定义变量来存储用户输入的数据。变量的类型应与用户要输入的数据类型相匹配。
立即学习“C++免费学习笔记(深入)”;
2. 获取用户输入
使用 cin 流来从用户获取输入。语法如下:
cin >> variable_name;
其中 variable_name 是要存储输入数据的变量。
3. 处理输入数据
一旦您收集了用户输入,就可以处理这些数据以得出结果。这可能涉及执行计算、比较数据或执行其他操作。
4. 显示结果
处理完数据后,您可以使用 cout 流将结果显示给用户。语法如下:
cout <p>其中 result 是要显示的结果。</p><p><strong>示例:</strong></p><p>假设您要编写一个程序来计算矩形面积。以下代码演示如何输入矩形的长和宽并计算其面积:</p><pre>#include <iostream> int main() { int length, width; // 获取用户输入 cout > length; cout > width; // 计算面积 int area = length * width; // 显示结果 cout </iostream>
以上就是
C语言中计算字符串长度与分割字符串的方法
C语言strlen()函数:返回字符串的长度
头文件:
#include <string.h>
strlen()函数用来计算字符串的长度,其原型为:
unsigned int strlen (char *s);
【参数说明】s为指定的字符串。
strlen()用来计算指定的字符串s 的长度,不包括结束字符"\0"。
【返回值】返回字符串s 的字符数。
注意一下字符数组,例如
char str[100] = "http://see.xidian.edu.cn/cpp/u/biaozhunku/";
定义了一个大小为100的字符数组,但是仅有开始的11个字符被初始化了,剩下的都是0,所以 sizeof(str) 等于100,strlen(str) 等于11。
如果字符的个数等于字符数组的大小,那么strlen()的返回值就无法确定了,例如
char str[6] = "abcxyz";
strlen(str)的返回值将是不确定的。因为str的结尾不是0,strlen()会继续向后检索,直到遇到'\0',而这些区域的内容是不确定的。
注意:strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束。如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止。而sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数。
【函数示例】取得字符串 的长度。
#include<stdio.h> #include<string.h> int main() { char *str1 = "http://see.xidian.edu.cn/cpp/u/shipin/"; char str2[100] = "http://see.xidian.edu.cn/cpp/u/shipin_liming/"; char str3[5] = "12345"; printf("strlen(str1)=%d,sizeof(str1)=%d\n",strlen(str1),sizeof(str1)); printf("strlen(str2)=%d,sizeof(str2)=%d\n",strlen(str2),sizeof(str2)); printf("strlen(str3)=%d,sizeof(str3)=%d\n",strlen(str3),sizeof(str3)); return 0; }
运行结果:
strlen(str1)=38,sizeof(str1)=4 strlen(str1)=45,sizeof(str1)=100 strlen(str1)=53,sizeof(str1)=5
上面的运行结果,strlen(str1)=53显然不对,53是没有意义的。
C语言strtok()函数:字符串分割
头文件:
#include <string.h>
定义函数:
char * strtok(char *s,const char *delim);
函数说明:strtok()用来将字符串分割成一个个片段。参数s 指向欲分割的字符串,参数delim 则为分割字符串,当strtok()在参数s 的字符串中发现到参数delim 的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s 字符串,往后的调用则将参数s 设置成NULL。每次调用成功则返回下一个分割后的字符串指针。
返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL。
范例
#include <string.h> main(){ char s[] = "ab-cd : ef;gh :i-jkl;mnop;qrs-tu: vwx-y;z"; char *delim = "-: "; char *p; printf("%s ",strtok(s,delim)); while((p = strtok(NULL,delim))) printf("%s ",p); printf("\n"); }
执行结果:
ab cd ef;gh i jkl;mnop;qrs tu vwx y;z //-与:字符已经被\0 字符取代
我们今天的关于计算字符串得出结果和计算字符串得出结果的方法的分享就到这里,谢谢您的阅读,如果想了解更多关于c# – 如何计算字符串中的唯一字符、C#中另类自定义公式计算 字符串转换为计算公式,并得出计算结果、c++输入数据后怎么得出结果、C语言中计算字符串长度与分割字符串的方法的相关信息,可以在本站进行搜索。
本文标签: