- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有下面的代码可以使用。我在这里遇到的问题是代码在 while 循环中运行而不等待 String temp = Console.ReadLine() 行上的输入。请帮助理解为什么以及如何修复。提前致谢!
/*Banker's algorithm Implementation*/
class Program
{
static void Main(string[] args)
{
int n = 0;//number of resources we will be dealing with
int proc_num = 0;//Total number of processes to share available resources
IDictionary<String, SysProcess> processes = new Dictionary<String, SysProcess>();
IDictionary<String, int> MaxR = new Dictionary<String, int>();// maximum available resources
IDictionary<String, int> avail = new Dictionary<String, int>();// Available resources after first allocation
Dictionary<String, int> availsum = new Dictionary<string, int>();
//Start
while (true)
{
Console.WriteLine(" What is number of resources to be shared? : ");
if (!int.TryParse(Console.ReadLine(), out n))
{
Console.WriteLine(" Error Please provide valid number --- {0}!", n);
}
else
{
break;
}
}
//get the maximum number of each Resources Ie Total Resources Available
while (true && n>0)
{
Console.WriteLine("Using a comma delimited list(e.g. 0, 0, 0, 0) list maximum of each of the {0} resources : ", n);
String temp;
temp = Console.ReadLine();
if (!String.IsNullOrEmpty(temp))
{
String[] maxR = temp.Split(',');
for (int a = 1; a <= n; a++)
{
MaxR.Add("Resource#" + a.ToString(), Convert.ToInt32(maxR[a]));
}
break;
}
}
while (true && n>0)
{
Console.Write("Enter total number of processes to share the available resources :");
if (!int.TryParse(Console.Read().ToString(), out proc_num))
{
Console.WriteLine(" Error Please provide valid number --- {0}!", proc_num);
}
else
{ break; }
}
if(proc_num > 0)
{
//Request Process Max and allocated resources data
for (int i = 1; i <= proc_num; i++)
{
Console.Write("Using a comma delimited list, Enter total number of Resources 1 through {0} are needed by PROCESS#{1} ?", n, i);
String[] temps = Console.ReadLine().Split(',');
SysProcess tempproc = new SysProcess("Process#" + i.ToString());
for (int a = 0; a < temps.Length; a++)
{
tempproc.Add_max_resource("Resource#" + (a + 1).ToString(), Convert.ToInt32(temps[a]));
}
//How many resources have already been allocated to each resource
temps = null;
Console.Write("Using a comma delimited list,Enter number of resources 1 through {0} already allocated to PROCESS#{1} ? ", n, i);
temps = Console.ReadLine().Split(',');
for (int a = 0; a < temps.Length; a++)
{
tempproc.add_alloc_resource("Resource#" + (a + 1).ToString(), Convert.ToInt32(temps[a]));
}
processes.Add("Process#" + i.ToString(), tempproc);
}
Console.WriteLine("Processing . . . ");
Console.WriteLine();
Console.WriteLine("Available resources ");
//Compute Available Resources
for (int i = 0; i < n; i++)
{
if (!availsum.ContainsKey("Resource#" + (i + 1).ToString()))
availsum.Add("Resource#" + (i + 1).ToString(), 0);
foreach (SysProcess sp in processes.Values)
{ //add sum up the available
availsum["Resource#" + (i + 1).ToString()] += sp.alloc_resources["Resource#" + (i + 1).ToString()];
}
}
//print out the availables we computed
Console.Write(" avail< ");
for (int j = 0; j < n; j++)
{
Console.Write(availsum["Resource#" + (j + 1).ToString()] + ",");
if (j + 1 == n)//if this is the last one, go ahead and output the rest
Console.Write("{0} > ", availsum["Resource#" + (j + 1).ToString()]);
}
// Printing resources still needed
Console.WriteLine();
foreach (SysProcess p in processes.Values)
{
p.print_needed();
}
//a) Find a row in the Need matrix which is less than the Available vector.
//If such a row exists, then the process represented by that row may complete
//with those additional resources. If no such row exists, eventual deadlock is possible.
Dictionary<String, int> _currentavailsum;
foreach (SysProcess p in processes.Values)
{
int TotalSproccounter = 0;
String safelead;
if (isprocessSafe(n, p, availsum))
{
TotalSproccounter++;
safelead = p.id;
_currentavailsum = new Dictionary<String, int>();
_currentavailsum = availsum;//get a copy of the original data to begin with
foreach (SysProcess q in processes.Values)
{
if (q != p)//we only want to compare with the others from here
{
if (isprocessSafe(n, p, _currentavailsum))
{
update_availsum(n, q, ref _currentavailsum);//update the currentavail count
TotalSproccounter++;
//update print
safelead += ", " + q.id;
}
}
}
if (TotalSproccounter == proc_num)
{
Console.WriteLine("Safe allocation < {0} >", safelead);
}
else
{
Console.WriteLine("Deadlock reached/unsafe allocation : < {0} >", safelead);
}
}
}
}
Console.ReadLine();
}
//compares the number of resources needed against the number of resources available
public static Boolean isprocessSafe(int n, SysProcess p, IDictionary<String, int> avail)
{
int safecount = 0;
foreach (String resourcekey in avail.Keys)
{
if (p.need_resources.ContainsKey(resourcekey) && p.need_resources[resourcekey] <= avail[resourcekey])
{
safecount++;
}
}
if (safecount == n)
{
return true;
}
return false;
}
//compares the number of resources needed against the number of resources available
public static void update_availsum(int n, SysProcess p, ref Dictionary<String, int> _currentavailsum)
{
foreach (String resourcekey in _currentavailsum.Keys)
{
if (p.need_resources.ContainsKey(resourcekey))
{
_currentavailsum[resourcekey] += p.need_resources[resourcekey];
}
}
}
}
//container class for processes
public class SysProcess
{
public String id { get; set; }
Dictionary<String, int> _max_resources = null; // will hold the Resource name and the the number of resources
Dictionary<String, int> _alloc_resources = null;//allocated resources
Dictionary<String, int> _need_resources = null;//allocated resources
public Dictionary<String, int> max_resources
{
get
{ return _max_resources; }
}
public Dictionary<String, int> alloc_resources
{
get
{
return _alloc_resources;
}
}
public Dictionary<String, int> need_resources
{
get
{
return _need_resources;
}
}
public SysProcess(String procID)
{
_max_resources = new Dictionary<String, int>();
_alloc_resources = new Dictionary<String, int>();
id = procID;
}
public void Add_max_resource(String resource, int count)
{
_max_resources.Add(resource, count);
}
public void add_alloc_resource(String resource, int count)
{
_alloc_resources.Add(resource, count);
_need_resources.Add(resource, _max_resources[resource] - alloc_resources[resource]);
}
public void print_needed()
{
Console.Write(id);
foreach (int s in _need_resources.Values)
{
Console.Write(" {0}", s);
}
}
}
在此处添加整个代码可能是个好主意,因为我仍然无法弄清楚这一点。请帮忙
最佳答案
问题是使用有问题的方法 Console.Read()
。此方法将阻塞,直到输入一整行文本,但它只返回第一个字符,将剩余的文本留在输入缓冲区中。当执行 Console.ReadLine()
操作时,用于输入第一个值和取消阻止读取操作的回车符仍位于输入缓冲区中。因此,返回一个空行。
我建议您将 Console.Read().ToString()
替换为 Console.ReadLine()
以解决此问题。
这个问题可以用这段代码来证明:
static void Main(string[] args)
{
string value = Console.Read().ToString();
Console.WriteLine("You entered: {0}", value);
Console.WriteLine("Press ENTER to continue...");
Console.ReadLine(); // Returns immediately.
Console.WriteLine("Continuing....");
}
然后像这样修复:
string value = Console.ReadLine();
关于c# - 为什么 Console.Readline 没有按预期执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6048467/
我对java有点陌生,所以如果我犯了一个简单的错误,请原谅我,但我不确定我哪里出错了,我收到的错误是“预期的.class,预期的标识符,而不是声明, ';'预期的。”我尝试了不同的方法,并从这些方法中
This question already has answers here: chai test array equality doesn't work as expected (3个答案) 3年前
我正在学习 Java(对不起,我的英语很差,这不是我的母语),当我在 Eclipse (JavaSE-1.7) 中在我输入的每个“try”中执行“try-finally” block 时,会出现以下消
我收到两个错误,指出 token 上的语法错误,ConstructorHeaderName expected instead & token “(”上的语法错误,< expected 在线: mTM.
我找不到错误。 Eclipse 给我这个错误。每个 { } 都是匹配的。请帮忙。 Multiple markers at this line - Syntax error on token “)”,
代码: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class DoubleIt extends
我正在用 python(Vs 代码)编写代码,但出现此错误: Expected ")" Pylance 错误发生在:def main() 我试着运行我的 main 并将它打印到我的屏幕上。我用谷歌搜
我正在尝试按照 documentation 中的建议使用异步函数。但我收到此错误 意外的 token ,预期 ( async function getMoviesFromApi() { try
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
第一行包含一个表示数组长度的整数p。第二行包含用空格分隔的整数,这些整数描述数组中的每个元素。第三行打印一个整数,指示负数组的数量。 package asgn3; import java.util.*
好的,我是初学者,我必须修复此 java 表达式语言代码才能在我的系统 (Windchill) 中工作,但看起来我在语法中遗漏了一些内容: LWCNormalizedObject lwc =
我无法编译我的程序! 我想我缺少一个花括号,但我怎么也看不出在哪里! import javax.swing.*; import java.awt.*;
我的 jQuery 代码有问题,我的 Firebug 向我发出警告:需要选择器。 这是代码: $("img[id$='_tick']").each(function() { $(this).c
我的新类(class) Fountainofyouth 遇到了问题。尝试构建整个项目后,调试器显示 warning: extended initializer lists only available
我已经从 Java 转向 CPP,并且正在努力围绕构造构造函数链进行思考,我认为这是我的问题的根源。 我的头文件如下: public: GuidedTour(); GuidedTour(string
鉴于以下 for(var i=0; i< data.cats.length; i++) list += buildCategories(data.cats[i]); jsLint 告诉我 Expect
我有这个 json,但 Visual Studio Code 在标题中给了我警告。 [ { "title": "Book A", "imageUrl": "https:
我正在尝试编写一个有条件地禁用四个特殊成员函数(复制构造、移动构造、复制赋值和移动赋值)的包装类,下面是我用于测试目的的快速草稿: enum class special_member : uint8_
所以我用 F# 编写了一个非常简单的程序,它应该对 1000 以下的所有 3 和 5 的倍数求和: [1..999] |> List.filter (fun x -> x % 3 = 0 || x %
我是一名优秀的程序员,十分优秀!