CodeDom系列二---程序基本结构--符号三角形问题

简介:

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

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

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

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

public CodeConditionStatement(
CodeExpression condition,//条件
CodeStatement[] trueStatements,//为true的语句体
CodeStatement[] falseStatements//为false语句体
)
2:CodeIterationStatement():表示 for 语句或语句块内的循环(使用测试表达式作为继续循环的条件):
在codedom中没有提高while和dowhile但是For已经够用的
public CodeIterationStatement(
CodeStatement initStatement,//for初始化
CodeExpression testExpression,//条件表达式
CodeStatement incrementStatement,//for变化体,增或减
CodeStatement[] statements//循环体
)
3:CodeBinaryOperatorExpression:表示一个表达式,该表达式包含在两个表达式间进行的二进制运算,
public CodeBinaryOperatorExpression(
CodeExpression left,//表达式左边
CodeBinaryOperatorType op,//操作符
CodeExpression right//表达式右边
)
4:CodeArrayIndexerExpression:表示对数组的索引的引用:
public CodeArrayIndexerExpression(
CodeExpression targetObject,//数组对象
CodeExpression[] indices//下标
)
其他参见CodeDOM 快速参考:msdn.microsoft.com/zh-cn/library/f1dfsbhc(VS.80).aspx
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)); } } }   

代码下载Demo1,Demo2( http://files.cnblogs.com/whitewolf/CodeDomDemo1.rar

 




 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/834290,如需转载请自行联系原作者

相关文章
|
5月前
|
C语言
C语言---函数---知识总结(四)---函数的参数
C语言---函数---知识总结(四)---函数的参数
|
2月前
|
5G
MFC编程 -- 浮点数与字符串之间转换
MFC编程 -- 浮点数与字符串之间转换
26 1
|
2月前
MFC编程 -- 获取鼠标坐标位置
MFC编程 -- 获取鼠标坐标位置
19 0
|
6月前
下列给定程序中,函数fun的功能是:根据形参m的值(2≤m≤9),在m行m列的二维数组中存放一组有规律的数据如下图所示,由main函数输出。
下列给定程序中,函数fun的功能是:根据形参m的值(2≤m≤9),在m行m列的二维数组中存放一组有规律的数据如下图所示,由main函数输出。
198 0
|
8月前
|
C语言
用c语言输出有颜色的字体 printf输出 控制台程序修改文本位置 设置控制台程序窗口标题
用c语言输出有颜色的字体 printf输出 控制台程序修改文本位置 设置控制台程序窗口标题
|
3月前
|
存储 C语言
学习总结(位操作符;循环输入的三种方式;交换两个变量值的三种方法;打印数字对应的二进制;unsigned int 与int 的区别;改变特定位数0/1;&&和||的连续操作(与前置,后置结合))
学习总结(位操作符;循环输入的三种方式;交换两个变量值的三种方法;打印数字对应的二进制;unsigned int 与int 的区别;改变特定位数0/1;&&和||的连续操作(与前置,后置结合))
32 0
|
8月前
|
Java 数据安全/隐私保护
java实现请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,使c1、c2、c3、c4、c5变为’G’、’l’、’m’、’r’、’e
java实现请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,使c1、c2、c3、c4、c5变为’G’、’l’、’m’、’r’、’e
|
9月前
|
C语言 Python
ENVI_IDL基础:常用数据类型_创建数组_类型转换_print输出_基本运算_关系运算
ENVI_IDL基础:常用数据类型_创建数组_类型转换_print输出_基本运算_关系运算
301 0
|
开发者 Python
嵌套打印三角形 | 学习笔记
快速学习 嵌套打印三角形
56 0