You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#控制台程序材料类型输入失效及数组赋值问题求助

问题排查与修复方案

核心问题分析

  1. 未读取材料类型输入:代码仅输出了"Enter Material Type of bar {0}:"提示,但未调用Console.ReadLine()获取用户输入,直接复用了之前输入棒材数量的inputstring变量,导致跳过输入环节。
  2. 材料判断逻辑错误:当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:40:59