博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeDom系列二---程序基本结构--符号三角形问题
阅读量:5963 次
发布时间:2019-06-19

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

    昨天一个同学叫我帮编写一个符号三角形的c代码,今天就把它改写成用CodeDom生成的c#代码。

    符号三角形:在一组字符串里(只有用空格分割的+或者-组成的字符串),在每次的相邻的两个符号比较,如果相同就在中间空格插入+,否则就插入-。一直运行到字符串里只有一个+或者-时停止,输出的字符串为符号三角形。

由于是CodeDom些列,所以先介绍几个CodeDom表达式:

1:CodeConditionStatement:判断语句即是if(condition){} else{},看最全的那个构造函数:

public CodeConditionStatement( condition,//条件[] trueStatements,//为true的语句体[] falseStatements//为false语句体)
2:CodeIterationStatement():表示 for 语句或语句块内的循环(使用测试表达式作为继续循环的条件):
在codedom中没有提高while和dowhile但是For已经够用的
public CodeIterationStatement( initStatement,//for初始化 testExpression,//条件表达式 incrementStatement,//for变化体,增或减[] statements//循环体)
3::表示一个表达式,该表达式包含在两个表达式间进行的二进制运算,
public CodeBinaryOperatorExpression( left,//表达式左边 op,//操作符 right//表达式右边)
4::表示对数组的索引的引用:
public CodeArrayIndexerExpression( targetObject,//数组对象[] indices//下标)
其他参见CodeDOM 快速参考:
code:
 
 
  1. public CodeNamespace CreateNameSpace() { public CodeNamespace CreateNameSpace() { //Test CodeMemberMethod test = new CodeMemberMethod(); test.Name = "Test"; test.Attributes = MemberAttributes.Public | MemberAttributes.Final; test.Statements.Add(new CodeVariableDeclarationStatement(typeof(char[]), "ch",   
 
 
  1. new CodeMethodInvokeExpression(new CodePrimitiveExpression("+ - + - + + - -"), "ToCharArray",   
 
 
  1. new CodeExpression[] { }))); test.Statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression   
 
 
  1. (new CodeThisReferenceExpression(), "FuHaoSanJiao"), new CodeExpression[] { new CodeVariableReferenceExpression("ch"),   
 
 
  1. new CodePrimitiveExpression(0) })); test.Statements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"), "Read")); //FuHaoSanJiao CodeMemberMethod fuHaoSanJiao = new CodeMemberMethod(); fuHaoSanJiao.Name = "FuHaoSanJiao"; fuHaoSanJiao.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(char[])),   
 
 
  1. "ch")); fuHaoSanJiao.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "start")); fuHaoSanJiao.Statements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"),   
 
 
  1. new CodeArgumentReferenceExpression("start"), CodeBinaryOperatorType.GreaterThanOrEqual, (new CodeBinaryOperatorExpression(new CodePropertyReferenceExpression(   

 

 
  1. new CodeArgumentReferenceExpression("ch"),"Length"), CodeBinaryOperatorType.Divide ,new CodePrimitiveExpression(2)))), new CodeMethodReturnStatement())); CodeBinaryOperatorExpression condition=new CodeBinaryOperatorExpression(   
 
 
 
  1. new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.LessThan, new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("ch"),"Length"), CodeBinaryOperatorType.Subtract ,new CodeArgumentReferenceExpression("start")), CodeBinaryOperatorType.Subtract, new CodePrimitiveExpression(1)));//for 条件 CodeConditionStatement iterationBody=new CodeConditionStatement(new CodeBinaryOperatorExpression( new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),   
 
 
  1. new CodeVariableReferenceExpression("i")), CodeBinaryOperatorType.IdentityEquality, new CodeArrayIndexerExpression(   
 
 
  1. new CodeArgumentReferenceExpression("ch"), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),   
 
 
  1. CodeBinaryOperatorType.Add,new CodePrimitiveExpression(2)))), new CodeAssignStatement( new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),   
 
 
  1. new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,   
 
 
  1. new CodePrimitiveExpression(1))), new CodePrimitiveExpression('+'))); iterationBody.FalseStatements.Add(new CodeAssignStatement( new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),   
 
 
  1. new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,   
 
 
  1. new CodePrimitiveExpression(1))), new CodePrimitiveExpression('-'))); CodeAssignStatement iteerationbody2 = new CodeAssignStatement(new CodeArrayIndexerExpression(   
 
 
  1. new CodeArgumentReferenceExpression("ch"), new CodeVariableReferenceExpression("i")), new CodePrimitiveExpression(' ')); fuHaoSanJiao.Statements.Add(new CodeIterationStatement(new CodeVariableDeclarationStatement(typeof(int),   
 
 
  1. "i", new CodeArgumentReferenceExpression("start")), condition, new CodeAssignStatement(new CodeVariableReferenceExpression("i"),new CodeBinaryOperatorExpression(   
 
 
  1. new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression(2))), new CodeStatement[] { iterationBody, iteerationbody2 })); // ch[ch.Length - start - 1] = ' '; fuHaoSanJiao.Statements.Add(new CodeAssignStatement( new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),   
 
 
  1. new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(   
 
 
  1. new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("ch"), "Length"), CodeBinaryOperatorType.Subtract ,new CodeArgumentReferenceExpression("start")),   
 
 
  1. CodeBinaryOperatorType.Subtract, new CodePrimitiveExpression(1))),new CodePrimitiveExpression(' '))); //  FuHaoSanJiao(ch, start + 1); fuHaoSanJiao.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(),   
 
 
  1. "FuHaoSanJiao",new CodeArgumentReferenceExpression("ch")        , new CodeBinaryOperatorExpression(new CodeArgumentReferenceExpression("start"),   
 
 
  1. CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1)))); CodeTypeDeclaration codeDomDemo2 = new CodeTypeDeclaration("CodeDomDemo2"); codeDomDemo2.Members.Add(test); codeDomDemo2.Members.Add(fuHaoSanJiao); codeDomDemo2.Attributes = MemberAttributes.Public; codeDomDemo2.Comments.Add(new CodeCommentStatement("this code is from CodeDom!")); //codeDomDemo2.Members.AddRange(); CodeNamespace nspace = new CodeNamespace("CodeDomDemo2"); nspace.Imports.Add(new CodeNamespaceImport("System")); nspace.Types.Add(codeDomDemo2); return nspace; } } }   

输出代码为 :

 
 
  1. namespace CodeDomDemo2 { using System; // this code is from CodeDom! public class CodeDomDemo2 { public void Test() { char[] ch = "+ - + - + + - -".ToCharArray(); this.FuHaoSanJiao(ch, 0); System.Console.Read(); } private void FuHaoSanJiao(char[] ch, int start) { System.Console.WriteLine(new string(ch)); if ((start >= (ch.Length / 2))) { return; } for (int i = start; (i < ((ch.Length - start) - 1)); i = (i + 2)) { if ((ch[i] == ch[(i + 2)])) { ch[(i + 1)] = '+'; } else { ch[(i + 1)] = '-'; } ch[i] = ' '; } ch[((ch.Length - start) - 1)] = ' '; this.FuHaoSanJiao(ch, (start + 1)); } } }   

代码下载)

 
 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/834290,如需转载请自行联系原作者
你可能感兴趣的文章
java io
查看>>
Java内存模型之重排序
查看>>
CLH锁 、MCS锁
查看>>
内存四区
查看>>
Melody Love Story
查看>>
centos7安装与配置ansible
查看>>
Istio Service Mesh中的授权与鉴权概念详解
查看>>
构建Class
查看>>
ESXI5 中添加共享存储,安装Oracle Rac
查看>>
动态规划之背包问题
查看>>
ASP.NET中的{0:g}
查看>>
L2TP工作过程
查看>>
hbase伪集群搭建
查看>>
Properties
查看>>
parasoft Jtest 使用教程:修改规则与运行简单的用户自定义测试配置
查看>>
使用RPM包离线安装MariaDB 10.0.20 , 基于CentOS 6.6-x86-64
查看>>
MySQL Study之--Index的强制使用和忽略
查看>>
very good
查看>>
手机web——自适应网页设计(html/css控制)
查看>>
VS2010编译错:WIN32_WINNT to be #defined at least to 0x0403...的解决方法
查看>>