所以我和我的朋友收到了实现此功能的编程任务:
所以你必须输入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); }
}
}
}
答案 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())
的每个实例。