• Mono 之 HelloWorld


    前言

      使用Mono可以让程序员在Linux上使用C#语言。

    第一个程序

      尊早约定,让我们使用C#实现Hello World的输出吧——可以参照:http://mono-project.com/Mono_Basics

    进入Linux系统,输入 

    vi HelloWorld.cs

    在Vim 里敲入以下代码:

    using System;
    public class HelloWorld
    {
      public static void Main()
        {
            Console.WriteLine("Hello Mono World");
        }
    }

    利用:qw保存后退出

    这样我们就有了C#的源文件了,接下来需要将源文件编译一下。

    利用Gmcs可以将源文件直接编程成 .exe 文件

     gmcs HelloWorld

    输入 命令 

    ll Hello*

    可以看到以下结果:

    -rw-r--r-- 1 root     root      115  5月 29 09:24 HelloWorld
    -rwxrwxr-x 1 root    root 3072  5月 29 11:07 HelloWorld.exe*

    最后输入

    ./HelloWorld.exe
    
    Hello Mono World

    以上就是HelloWorld的简单例子。

     素数输出

      接下来我们写一个较为复杂一点的程序,该程序根据输入的一个最大值输出素数(使用的是打表法)。这次我们利用Vs2010编写程序。

    PrimeGenerator
      1 using System;
      2 using System.Diagnostics;
      3 
      4 namespace GeneratePrimes
      5 {
      6     /// <summary>
      7     /// 使用Eratosthenes的筛选发 技术按素数
      8     /// 
      9     /// 算法概要:对于一个开始与2的整数,划掉2的倍数,找到下一个未被划掉的整数,划掉它所有的倍数,如此反复,知道找到传入最大值的平方根为止。
     10     /// </summary>
     11     /// <param name="p"></param>
     12     /// <returns></returns>
     13     public class PrimeGenerator
     14     {
     15 
     16 
     17         private static bool[] crossedOut;
     18         private static int[] result;
     19         private static Stopwatch timeCalculation=new Stopwatch();
     20 
     21         public static int[] GeneratePrimeNumbers(int maxValue)
     22         {
     23             if (maxValue < 2)
     24             {
     25                 return new int[0];
     26             }
     27             else
     28             {
     29                 StartTiming();
     30                 UncrossIntegersUpTo(maxValue);
     31                 CrossOutMultiples();
     32                 PutUncrossedIntegersIntoResult();
     33                 EndTiming();
     34                 return result;
     35             }
     36         }
     37 
     38         private static void StartTiming()
     39         {
     40             timeCalculation.Reset();
     41             timeCalculation.Start();
     42         }
     43 
     44         private static void EndTiming()
     45         {
     46             timeCalculation.Stop();
     47             CalElapse = timeCalculation.ElapsedMilliseconds; 
     48         }
     49 
     50         private static void PutUncrossedIntegersIntoResult()
     51         {
     52 
     53             result = new int[NumberOfUncrossedIntegers()];
     54 
     55             for (int i = 2, j = 0; i < crossedOut.Length; i++)
     56             {
     57                 if (NotCrossed(i))
     58                     result[j++] = i;
     59             }
     60         }
     61 
     62 
     63         private static int NumberOfUncrossedIntegers()
     64         {
     65             int count = 0;
     66             for (int i = 2; i < crossedOut.Length; i++)
     67             {
     68                 if (NotCrossed(i))
     69                     count++;
     70             }
     71             return count;
     72         }
     73 
     74 
     75         private static void CrossOutMultiples()
     76         {
     77 
     78             int maxPrimeFactor = DetermineIterationLimit();
     79             for (int i = 2; i < maxPrimeFactor + 1; i++)
     80             {
     81                 if (NotCrossed(i))
     82                 {
     83                     CrossOutputMultiplesOf(i);
     84                 }
     85             }
     86         }
     87 
     88 
     89         private static void CrossOutputMultiplesOf(int i)
     90         {
     91             for (int multiple = 2 * i;
     92                 multiple < crossedOut.Length;
     93                 multiple += i)
     94                 crossedOut[multiple] = true;
     95         }
     96 
     97         private static bool NotCrossed(int i)
     98         {
     99             return crossedOut[i] == false;
    100         }
    101 
    102         private static int DetermineIterationLimit()
    103         {
    104             double iterationLimit = Math.Sqrt(crossedOut.Length) ;
    105             return (int)iterationLimit;
    106         }
    107 
    108         private static void UncrossIntegersUpTo(int maxValue)
    109         {
    110 
    111             crossedOut = new bool[maxValue + 1];
    112             for (int i = 2; i < crossedOut.Length; i++)
    113             {
    114                 crossedOut[i] = false;
    115             }
    116         }
    117 
    118         public static long CalElapse { get; private set; }
    119 
    120     }
    121 }

    PrimeGenerator 类来至于:Robert C. Martin & Micah Martin 的 《Aglie Principles,Patterns,and Practices in C#》 P30 ,我在两位大牛的基础上加上了一点运行时间的计算。

     class Program
        {
            static void Main(string[] args)
            {
                int max = getMaxNumbersFromArgs(args);
               
                PrimeGenerator pg = new PrimeGenerator();
                int[] text = PrimeGenerator.GeneratePrimeNumbers(max);
    
                Console.WriteLine("Elapsse:{0}ms", PrimeGenerator.CalElapse);
                
                for (int i = 0; i < text.Length; i++)
                {
                    Console.Write("{0},", text[i]);
                }
                Console.Read();
            }
    
    
            private static int getMaxNumbersFromArgs(string[] args)
            {
                int maxNumbers = 3000;
                if (args != null && args.Length > 0)
                {
                    int parseResult;
                    if (int.TryParse(args[0], out parseResult))
                    {
                        maxNumbers = parseResult;
                    }
                }
                return maxNumbers;
            }
        }

    主函数用于接收最大输入值和打印素数。

    以上代码全部在Vs2010 上编写并编译生成.exe 文件

    MoMA

       MoMA 是一个在.net 平台下开发的应用程序迁移到Mono平台时,进行兼容性检查的工具。这是个非常有用的工具,使用它检查.dll或.exe 的代码是否符合 ECMA CLI标准。

    工具使用起来很简单选择好要分析的程序集文件,点击next即可。如果结果全部为绿色的勾,那么恭喜你全部通过了!

       将程序拷贝到 Linux 里 然后 输入 ./GeneratePrimes.exe  30000   就可以看到素数不断的打印出来了。如果您感兴趣可以试试:多次在Windows 和Linux 运行该程序,对比一下每次计算的耗时。

  • 相关阅读:
    POJ 1269 Intersecting Lines
    POJ 3304 Segments
    BZOJ 4591 超能粒子炮·改
    POJ 2318 TOYS/POJ 2398 Toy Storage
    BZOJ 1044 木棍分割
    BZOJ 2836 魔法树
    BZOJ 3176 Sort
    BZOJ 1668 馅饼里的财富
    Flood-it!
    Eight
  • 原文地址:https://www.cnblogs.com/keyindex/p/2523686.html
Copyright © 2020-2023  润新知