是否有可能在C#中编写没有变量的程序?

时间:2015-12-03 20:46:54

标签: c# variables

所以我和我的朋友收到了实现此功能的编程任务:

function image

所以你必须输入x和输出y。 原样,这很简单,但事情就是这样:我们可以在没有变量的情况下,只使用一个Console.ReadLine()实例(并将其解析为double),然后将结果传递给多个“if”检查吗?使用新的类和方法也是作弊:我们必须在main()中做所有事情。

这是带有一个变量的程序示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication4 {
    class Program {
        static void Main(string[] args) {
            double x;
            x = double.Parse(Console.ReadLine());
            if (x < -2.0) { Console.Write(2.0); }
            if ((x < -1.0)&&(x>=-2.0)) { Console.Write(1.0); }
            if ((x < 0.0)&&(x>=-1)) { Console.Write(0.0); }
            if ((x>=0.0)&&(x<1.0)) { Console.Write(x); }
            if (x >= 1.0) { Console.Write(1.0); }
        }
    }
}

6 个答案:

答案 0 :(得分:10)

首先,您首先要确定变量args。你不需要这样做,因为你不能声明变量。将Main的声明更改为:

static void Main()
{
     //...
} 

您可以使用某种形式的外部状态来存储通常存储在变量中的任何值,例如,始终将值读取/写入文件:

File.WriteAllText("line.txt", Console.ReadLine());

if (double.Parse(File.ReadAllText("line.txt")) < -2.0)
    Console.Write(2.0);
if ((double.Parse(File.ReadAllText("line.txt")) < -1.0)
    && (double.Parse(File.ReadAllText("line.txt")) >= -2.0))
    Console.Write(1.0);
if ((double.Parse(File.ReadAllText("line.txt")) < 0.0)
    && (double.Parse(File.ReadAllText("line.txt")) >= -1))
    Console.Write(0.0);
if ((double.Parse(File.ReadAllText("line.txt")) >= 0.0)
    && (double.Parse(File.ReadAllText("line.txt")) < 1.0))
    Console.Write(double.Parse(File.ReadAllText("line.txt")));
if (double.Parse(File.ReadAllText("line.txt")) >= 1.0)
    Console.Write(1.0);
File.Delete("line.txt");

您可以使用注册表值,获取/发布值到Web服务等来执行相同的操作。当然,这些都是非常低效的,但它是一个玩具示例。

当然,除了效率超低之外,这看起来也很混乱。通过使用方法,我们实际上可以使这个看起来更好看。我们的方法不能有任何参数,因为参数是变量,但是返回解析行的无参数方法在这里确实具有可读性的奇迹:

public static void Main()
{
    File.WriteAllText("line.txt", Console.ReadLine());

    if (GetValue() < -2.0)
        Console.Write(2.0);
    if (GetValue() < -1.0 && GetValue() >= -2.0)
        Console.Write(1.0);
    if (GetValue() < 0.0 && GetValue() >= -1)
        Console.Write(0.0);
    if (GetValue() >= 0.0 && GetValue() < 1.0)
        Console.Write(GetValue());
    if (GetValue() >= 1.0)
        Console.Write(1.0);
    File.Delete("line.txt");
}
public static double GetValue()
{
    return double.Parse(File.ReadAllText("line.txt"));
}

答案 1 :(得分:0)

取决于您如何定义“变量”☺

Environment.SetEnvironmentVariable("line", Console.ReadLine());
switch((int)Math.Floor(Double.Parse(Environment.GetEnvironmentVariable("line"))))
{
    case -2:
        Console.Write("1.0");
        break;
    case -1:
        Console.Write("0.0");
        break;
    case 0:
        Console.Write(Environment.GetEnvironmentVariable("line"));
        break;
    default:
        if(Double.Parse(Environment.GetEnvironmentVariable("line")) > 0)
        {
            Console.Write("1.0");
        }else{
            Console.Write("2.0");
        }
        break;
}

没有使用本地,参数,字段或属性。

答案 2 :(得分:0)

这不会让你获得0个变量,但它确实只有1个。

修改

至于注释中提出的@Servy,下面的初始答案仍然使用变量(args),但这不计入OP,所以我觉得这是一个合理的答案。

如果你想要一个有0个变量但不依赖于可能失败的存储的解决方案(例如没有文件系统访问权限,没有注册表访问权等),那么就可以做到这一点。

using System;

class Program {
    static void Main()
    {
        Console.Title = Console.ReadLine();
        if (double.Parse(Console.Title) < -2.0) { Console.Write(2.0); }
        if ((double.Parse(Console.Title) < -1.0) && (double.Parse(Console.Title) >= -2.0)) { Console.Write(1.0); }
        if ((double.Parse(Console.Title) < 0.0) && (double.Parse(Console.Title) >= -1)) { Console.Write(0.0); }
        if ((double.Parse(Console.Title) >= 0.0) && (double.Parse(Console.Title) < 1.0)) { Console.Write(double.Parse(Console.Title)); }
        if (double.Parse(Console.Title) >= 1.0) { Console.Write(1.0); }
    }
}

下面的原始答案

using System;

class Program {
    static void Main(string[] args)
    {
        if (args.Length == 0)
        {
            Main(new string[] { Console.ReadLine() });
        }
        else
        {
            if (double.Parse(args[0]) < -2.0) { Console.Write(2.0); }
            if ((double.Parse(args[0]) < -1.0) && (double.Parse(args[0]) >= -2.0)) { Console.Write(1.0); }
            if ((double.Parse(args[0]) < 0.0) && (double.Parse(args[0]) >= -1)) { Console.Write(0.0); }
            if ((double.Parse(args[0]) >= 0.0) && (double.Parse(args[0]) < 1.0)) { Console.Write(double.Parse(args[0])); }
            if (double.Parse(args[0]) >= 1.0) { Console.Write(1.0); }
        }
    }
}

答案 3 :(得分:0)

它可以用正则表达式完成,但它相当难看。值-1和-2必须单独处理,并且数字表示中存在E的巨大问题。我把解决方案包装进了测试循环。

//test loop
for (double x = -4; x < 4; x += 0.2d)
{
    Console.Write(x.ToString().PadRight(20, ' ') + " => ");
    string readLine = x.ToString();

    //original main
    Console.WriteLine(Math.Abs(Math.Max(-2, Math.Min(1, double.Parse(
        Regex.Replace(Regex.Replace(Regex.Replace(Regex.Replace(
            Math.Max(-3, double.Parse(readLine)).ToString()//format normalization
            , "-1$", "0") // -1 -> 0
            , "-2$", "-1") // -2 -> -1
            , @"^-.*E-.*", @"0") // -5E-5 -> 0
            , @"^(-\d+)\D.*", @"$1")))))); // -2.22 -> -2
    //end of main
}

结果是

-4                   => 2
-3,8                 => 2
-3,6                 => 2
-3,4                 => 2
-3,2                 => 2
-3                   => 2
-2,8                 => 2
-2,6                 => 2
-2,4                 => 2
-2,2                 => 2
-2                   => 1
-1,8                 => 1
-1,6                 => 1
-1,4                 => 1
-1,2                 => 1
-0,999999999999999   => 0
-0,799999999999999   => 0
-0,599999999999999   => 0
-0,399999999999999   => 0
-0,199999999999999   => 0
1,27675647831893E-15 => 1,27675647831893E-15
0,200000000000001    => 0,200000000000001
0,400000000000001    => 0,400000000000001
0,600000000000001    => 0,600000000000001
0,800000000000001    => 0,800000000000001
1                    => 1
1,2                  => 1
1,4                  => 1
1,6                  => 1
1,8                  => 1
2                    => 1
2,2                  => 1
2,4                  => 1
2,6                  => 1
2,8                  => 1
3                    => 1
3,2                  => 1
3,4                  => 1
3,6                  => 1
3,8                  => 1

答案 4 :(得分:-2)

这样做,没有变量声明:

static void Main()
{
    (new Action<double>(x =>
    {
        if (x < -2.0) { Console.Write(2.0); }
        if ((x < -1.0) && (x >= -2.0)) { Console.Write(1.0); }
        if ((x < 0.0) && (x >= -1)) { Console.Write(0.0); }
        if ((x >= 0.0) && (x < 1.0)) { Console.Write(x); }
        if (x >= 1.0) { Console.Write(1.0); }
    }))(double.Parse(Console.ReadLine()));

    Console.ReadKey();
}

答案 5 :(得分:-4)

回答这个问题。是。使用x简单替换double.Parse(Console.ReadLine())的每个实例。