C#控制台程序材料类型输入失效及数组赋值问题求助
问题排查与修复方案
核心问题分析
- 未读取材料类型输入:代码仅输出了"Enter Material Type of bar {0}:"提示,但未调用
Console.ReadLine()获取用户输入,直接复用了之前输入棒材数量的inputstring变量,导致跳过输入环节。 - 材料判断逻辑错误:当前
Int32.TryParse的判断逻辑完全错误——Int32.TryParse(inputstring, out S)是尝试把输入转成整数存入S,而非判断输入是否等于S的初始值(0),无法实现根据输入选择材料的需求。
修复后的完整代码
using System; namespace ConsoleApp3 { // 材料对应热传导系数:银=1,铝=0.5f,玻璃纤维=0.045f,玻璃=0.002f class Program { static void Main() { do { try { int NumberofUserInputs; string UserInputPrompt = "How many bars to consider? "; Console.Write(UserInputPrompt); string inputstring = Console.ReadLine(); NumberofUserInputs = int.Parse(inputstring); float[][] barSpecs = new float[NumberofUserInputs][]; for (int i = 0; i < NumberofUserInputs; i++) { const float PI = (float)Math.PI; barSpecs[i] = new float[11]; Console.WriteLine("Enter Material Type of bar {0}:", i + 1); Console.WriteLine("1 = 银, 2 = 铝, 3 = 玻璃纤维, 4 = 玻璃"); // 读取用户输入的材料选项 string materialInput = Console.ReadLine(); if (int.TryParse(materialInput, out int materialChoice)) { // 根据选项赋值热传导系数 switch (materialChoice) { case 1: barSpecs[i][1] = 1f; break; case 2: barSpecs[i][1] = 0.5f; break; case 3: barSpecs[i][1] = 0.045f; break; case 4: barSpecs[i][1] = 0.002f; break; default: Console.WriteLine("无效输入,请输入1-4的数字,程序将退出当前棒材录入"); continue; } } else { Console.WriteLine("无效输入,请输入数字,程序将退出当前棒材录入"); continue; } Console.WriteLine("Enter bar radius {0}:", i + 1); barSpecs[i][0] = float.Parse(Console.ReadLine()); barSpecs[i][2] = PI * barSpecs[i][0] * barSpecs[i][0]; // 计算横截面积 Console.WriteLine("Enter bar length {0}:", i + 1); // 长度 barSpecs[i][3] = float.Parse(Console.ReadLine()); Console.WriteLine("Enter bar change in time {0}:", i + 1); // Delta t barSpecs[i][4] = float.Parse(Console.ReadLine()); Console.WriteLine("Enter bar cold temp {0}:", i + 1); // T2 barSpecs[i][5] = float.Parse(Console.ReadLine()); Console.WriteLine("Enter bar hot temp {0}:", i + 1); // T1 barSpecs[i][6] = float.Parse(Console.ReadLine()); // 计算热传导相关值 barSpecs[i][7] = -((barSpecs[i][1] * barSpecs[i][2]) / barSpecs[i][3]) * (barSpecs[i][5] - barSpecs[i][6]) * barSpecs[i][4]; barSpecs[i][8] = barSpecs[i][7] / barSpecs[i][4]; Console.Clear(); } // 结构化输出结果 Console.WriteLine("Material Lamda T2 T1 Delta T Length Area Delta Q/Delta t "); Console.WriteLine(" (cal/sec)/(C cm) (C) (C) (Sec) (cm) (sq cm) (cal/sec) "); for (int i = 0; i < NumberofUserInputs; i++) { // 补充材料名称显示 string materialName = ""; switch (barSpecs[i][1]) { case 1f: materialName = "银"; break; case 0.5f: materialName = "铝"; break; case 0.045f: materialName = "玻璃纤维"; break; case 0.002f: materialName = "玻璃"; break; } Console.WriteLine("{0,-15} {1:F2} {2:F2} {3:F2} {4:F2} {5:F2} {6:F2} {7:F2}", materialName, barSpecs[i][1], barSpecs[i][5], barSpecs[i][6], barSpecs[i][4], barSpecs[i][3], barSpecs[i][2], barSpecs[i][8]); } } catch (FormatException) { Console.WriteLine("请仅输入数字"); } Console.WriteLine("是否继续?(Y = 是, N = 否)"); } while (Console.ReadLine().ToUpper() == "Y"); Console.ReadKey(); } } }
关键修复点说明
- 添加材料输入读取:在材料提示后新增
string materialInput = Console.ReadLine();,获取用户的材料选择输入,解决跳过输入环节的问题。 - 重构材料判断逻辑:用
switch语句替代错误的if-else结构,清晰对应1-4的选项与材料热传导系数,逻辑更直观且不易出错。 - 补充错误处理:若用户输入非数字或超出1-4范围,给出明确提示并跳过当前棒材的后续录入,避免程序因无效输入崩溃。
- 优化输出显示:添加材料名称列,让最终输出结果更易读,便于对应棒材的材料类型。
内容的提问来源于stack exchange,提问作者Matthew Lizyness
相关产品推荐
相关产品推荐

