Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 输入超出数组设置范围的数字,索引超出范围错误_C#_Arrays_Runtime Error - Fatal编程技术网

C# 输入超出数组设置范围的数字,索引超出范围错误

C# 输入超出数组设置范围的数字,索引超出范围错误,c#,arrays,runtime-error,C#,Arrays,Runtime Error,我想制作一个程序,其中一个用户输入一个数字,在这个例子中是一个项目的数量。 然后将项目数与数组中的值进行比较,并显示相应的折扣 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication11 { class Program { const int SIZE = 4; static

我想制作一个程序,其中一个用户输入一个数字,在这个例子中是一个项目的数量。 然后将项目数与数组中的值进行比较,并显示相应的折扣

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

namespace ConsoleApplication11
{
    class Program
    {
        const int SIZE = 4;
        static void Main(string[] args)
        {
            int itemsbought = 0;
            int discountItem = 0;
            int[] items = new int[SIZE] { 0, 10, 26, 61 };
            int[] discount = new int[SIZE] { 0, 5, 10,15 };

            InputItems(ref itemsbought);
            getDiscount(items, discount, ref itemsbought, ref discountItem);

            Console.WriteLine("Your discount is {0}", discountItem);

        }

        private static void getDiscount(int[] items, int[] discount, ref int itemsbought, ref int discountItem)
        {
            int idx = 0;
            for (idx = 0; itemsbought > items[idx] || idx > items.Length; idx++)
            {

                    discountItem = discount[idx];
            }
            }

        private static void InputItems(ref int itemsbought)
        {
            Console.WriteLine("Enter the amount of items you bought");
            while (!int.TryParse(Console.ReadLine(), out itemsbought))
                if (itemsbought < 0) 
            {
                    Console.WriteLine("Error, whole numbers over 0 only");
            }
                Console.WriteLine("Error, whole numbers over 0 only");
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序11
{
班级计划
{
常数int SIZE=4;
静态void Main(字符串[]参数)
{
int itemsbunk=0;
int折扣项目=0;
int[]items=新的int[SIZE]{0,10,26,61};
int[]折扣=新的int[SIZE]{0,5,10,15};
输入项目(参考项目采购);
获取折扣(项目、折扣、参考项目采购、参考折扣项目);
WriteLine(“您的折扣为{0}”,折扣项);
}
私有静态void get折扣(int[]项,int[]折扣,ref int itemsbund,ref int折扣项)
{
int-idx=0;
对于(idx=0;itemsbunk>items[idx]| | idx>items.Length;idx++)
{
折扣项目=折扣[idx];
}
}
私有静态void输入项(ref int itemsbund)
{
Console.WriteLine(“输入您购买的物品数量”);
而(!int.TryParse(Console.ReadLine(),out itemsbound))
如果(项目应<0)
{
Console.WriteLine(“错误,仅限大于0的整数”);
}
Console.WriteLine(“错误,仅限大于0的整数”);
}
}
}
当输入大于61的数字时,我会出现“索引超出范围”错误。如何使输入的数字大于61时显示15?还有,我怎样才能使这个边界包含61和61以上,而不是61给出10的输出


此外,每次输入某个信息时,仅当数字小于0或双精度时才会显示错误消息。

要显示您所犯的小错误,请参阅此更正版本:

for (idx = 0; idx < items.Length && itemsbought > items[idx]; idx++)
for(idx=0;idxitems[idx];idx++)
有三个重要的变化:

  • idx>项。长度始终为false。和idx=项目。长度超出范围
  • 使用&&而不是| |记住,如果此条件为真,循环将继续执行,一旦为假,执行将停止
  • 交换了订单。在访问项目[idx]之前,必须先检查idx。短路&&从左向右求值,如果结果确定,则停止
  • 因此,更正后的代码如下所示:

    private static void getDiscount(int[] items, int[] discount, int itemsbought, ref int discountItem)
    {
        int idx = 0;
        for (idx = 0; idx < items.Length && itemsbought > items[idx]; idx++)
            discountItem = discount[idx];
    }
    
    private static void get折扣(int[]项、int[]折扣、int itemsbund、ref int折扣项)
    {
    int-idx=0;
    对于(idx=0;idxitems[idx];idx++)
    折扣项目=折扣[idx];
    }
    
    但我更愿意将条件放入循环中,以使其更具可读性:

    private static void getDiscount(int[] items, int[] discount, int itemsbought, ref int discountItem)
    {
        for (int i = 0; i < items.Length; i++)
        {
            if(itemsbought > items[i])
                discountItem = discount[i];
            else
                break;
        }
    }
    
    private static void get折扣(int[]项、int[]折扣、int itemsbund、ref int折扣项)
    {
    对于(int i=0;i项目[i])
    折扣项目=折扣[i];
    其他的
    打破
    }
    }
    

    来解决你的另一个问题

    此外,每次我输入一些内容时,仅当数字小于0或双精度时,才会显示错误消息


    正确地重新格式化您的代码,一条消息输出在正确的位置,另一条消息总是被执行。

    我将重写您的
    getDiscount
    ,如下所示:

    private static void getDiscount(int[] items, int[] discount, ref int itemsbought, ref int discountItem)
    {
        for (int i = 0; itemsbought > items[i];)
        {
            discountItem = discount[i];
            i++;
            if (i >= items.Length)//will return the last element in the discount array(15)
                break;
        }
    }
    
    出现错误的原因是items数组中不包含大于61的数字,因此for循环将继续,您可以中断它以返回折扣数组中的最后一个元素(15)

    然后重写
    InputItems
    方法,如下所示:

    private static void InputItems(int itemsbought)
    {
        Console.WriteLine("Enter the amount of items you bought");
        if (!int.TryParse(Console.ReadLine(), out itemsbought) || itemsbought < 0)
        {
            Console.WriteLine("Error, whole numbers over 0 only");
        }
    }
    
    私有静态void InputItems(int itemsbund)
    {
    Console.WriteLine(“输入您购买的物品数量”);
    如果(!int.TryParse(Console.ReadLine(),out itemsbunk)| | itemsbunk<0)
    {
    Console.WriteLine(“错误,仅限大于0的整数”);
    }
    }
    

    无论tryparse/if语句是否成功,都将返回相同的错误消息。您还需要更新对
    InputItems(itemsbound)的调用

    看待问题的不同方式,但您可以选择使用它

    public class Item
        {
            public Item(string name, int qty)
            {
                ItemName = name;
                Qty = qty;
            }
    
            public enum DiscountRate
            {
                ZeroPercent = 0,
                FivePercent = 10,
                TenPercent = 26,
                FifteenPercent = 61
    
            }
    
            public override string ToString()
            {
                return string.Format("Items Name: {0} | Units: {1} | Discount Rate: {2}", this.ItemName, this.Qty, this.Rate.ToString() );
            }
    
            public string CalculateDiscount()
            {
                if (this.Qty >= (int)DiscountRate.FifteenPercent)
                {
                    this.Rate = DiscountRate.FifteenPercent;
                    return this.ToString();
                }
                else if (this.Qty >= (int)DiscountRate.TenPercent && this.Qty < (int)DiscountRate.FifteenPercent)
                {
                    this.Rate = DiscountRate.TenPercent;
                    return this.ToString();
                }
                else if (this.Qty < (int)DiscountRate.TenPercent && this.Qty > 9)
                {
                    this.Rate = DiscountRate.FivePercent;
                    return this.ToString();
                }
                else
                {
                    this.Rate = DiscountRate.ZeroPercent;
                    return this.ToString();
                }
            }
    
            public string ItemName { get; set; }
            public int Qty { get; set; }
            public DiscountRate Rate {get; set;}
        }
    
    class Program
        {
            static void Main(string[] args)
            {
                Item a = new Item("Tennis Ball", 100);
                Item b = new Item("Spoon", 10);
                Item c = new Item("Candles", 27);
                Item d = new Item("Battery's", 2);
                Item e = new Item("Nails", 10);
                Item f = new Item("Marbles", 0);
    
                Console.WriteLine(a.CalculateDiscount());
                Console.WriteLine();
                Console.WriteLine(b.CalculateDiscount());
                Console.WriteLine();
                Console.WriteLine(c.CalculateDiscount());
                Console.WriteLine();
                Console.WriteLine(d.CalculateDiscount());
                Console.WriteLine();
                Console.WriteLine(e.CalculateDiscount());
                Console.WriteLine();
                Console.WriteLine(f.CalculateDiscount());
                Console.WriteLine();
                Console.ReadLine();
            }