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:
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", 
new CodeMethodInvokeExpression(new CodePrimitiveExpression("+ - + - + + - -"), "ToCharArray", 
new CodeExpression[] { })));
test.Statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression
(new CodeThisReferenceExpression(), "FuHaoSanJiao"), new CodeExpression[] { new CodeVariableReferenceExpression("ch"),
 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[])), 
"ch"));
fuHaoSanJiao.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "start"));
fuHaoSanJiao.Statements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"), 
"WriteLine", new CodeExpression[] { new CodeObjectCreateExpression(typeof(string), new CodeArgumentReferenceExpression("ch")) }));
fuHaoSanJiao.Statements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(
new CodeArgumentReferenceExpression("start"), CodeBinaryOperatorType.GreaterThanOrEqual,
(new CodeBinaryOperatorExpression(new CodePropertyReferenceExpression(
new CodeArgumentReferenceExpression("ch"),"Length"),
CodeBinaryOperatorType.Divide ,new CodePrimitiveExpression(2)))),
new CodeMethodReturnStatement()));
CodeBinaryOperatorExpression condition=new CodeBinaryOperatorExpression(
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"),
new CodeVariableReferenceExpression("i")),
CodeBinaryOperatorType.IdentityEquality, new CodeArrayIndexerExpression(
new CodeArgumentReferenceExpression("ch"),
new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
 CodeBinaryOperatorType.Add,new CodePrimitiveExpression(2)))),
new CodeAssignStatement(
new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),
new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
new CodePrimitiveExpression(1))),
new CodePrimitiveExpression('+')));
iterationBody.FalseStatements.Add(new CodeAssignStatement(
new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),
new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
new CodePrimitiveExpression(1))),
new CodePrimitiveExpression('-')));
CodeAssignStatement iteerationbody2 = new CodeAssignStatement(new CodeArrayIndexerExpression(
new CodeArgumentReferenceExpression("ch"), new CodeVariableReferenceExpression("i")),
new CodePrimitiveExpression(' '));
fuHaoSanJiao.Statements.Add(new CodeIterationStatement(new CodeVariableDeclarationStatement(typeof(int), 
"i", new CodeArgumentReferenceExpression("start")), condition,
new CodeAssignStatement(new CodeVariableReferenceExpression("i"),new CodeBinaryOperatorExpression(
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"), 
new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(
new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("ch"), "Length"),
CodeBinaryOperatorType.Subtract ,new CodeArgumentReferenceExpression("start")),
 CodeBinaryOperatorType.Subtract,
new CodePrimitiveExpression(1))),new CodePrimitiveExpression(' ')));
//  FuHaoSanJiao(ch, start + 1);
fuHaoSanJiao.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(),
"FuHaoSanJiao",new CodeArgumentReferenceExpression("ch")        ,
new CodeBinaryOperatorExpression(new CodeArgumentReferenceExpression("start"),
 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;
}
}
}

输出代码为 :

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://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2010/06/20/1761367.html


相关文章
|
5月前
|
C语言
C语言---函数---知识总结(四)---函数的参数
C语言---函数---知识总结(四)---函数的参数
|
5月前
|
编译器 C语言
C语言---函数---知识点总结(二)---定义函数
C语言---函数---知识点总结(二)---定义函数
|
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输出 控制台程序修改文本位置 设置控制台程序窗口标题
|
5月前
|
存储 Cloud Native Linux
CMake学习之变量让message输出不同颜色
CMake学习之变量让message输出不同颜色
|
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
|
Java C++
ZZULIOJ-1108: 打印数字图形(函数专题)(Java)
ZZULIOJ-1108: 打印数字图形(函数专题)(Java)
|
缓存 移动开发 编译器
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
|
Java
Java输入三条边判断是否能组成三角形,若能构成则输出什么三角形
Java输入三条边判断是否能组成三角形,若能构成则输出什么三角形
288 0
Java输入三条边判断是否能组成三角形,若能构成则输出什么三角形
|
Java
编写Java程序,判断输入的三条长度的边,是否能构成三角形
编写Java程序,判断输入的三条长度的边,是否能构成三角形
236 0
编写Java程序,判断输入的三条长度的边,是否能构成三角形