1

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

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");
        }
    }
}

当输入超过 61 的数字时,我得到“索引超出范围”错误。我怎样才能使如果输入超过 61 的数字,它显示 15?另外我该怎么做才能使这个边界包括 61 及以上而不是 61 给出 10 的输出?

此外,每次我输入内容时,它都会显示错误消息,仅当数字小于 0 或双倍时才会显示。

4

3 回答 3

1

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

for (idx = 0; idx < items.Length && itemsbought > items[idx]; idx++)

有三个重要的变化:

  1. idx > items.Length 始终为假。并且 idx= items.Length 超出范围。
  2. 使用 && 代替 || 请记住,如果此条件为真,则循环继续执行,一旦为假,则停止执行。
  3. 交换了订单。在访问 items[idx]之前,您必须检查 idx < items.Length 。短路 && 从左到右计算,如果结果确定则停止。

因此,您更正后的代码将如下所示:

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 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;
    }
}

解决您的其他问题

此外,每次我输入内容时,它都会显示错误消息,仅当数字小于 0 或双倍时才会显示。

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

于 2013-04-05T11:55:54.130 回答
1

我会重写你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;
    }
}

您收到错误的原因是因为大于 61 的数字不包含在您的 items 数组中,因此 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");
    }
}

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

于 2013-04-05T12:00:32.217 回答
0

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

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();
        }
于 2013-04-05T13:34:36.710 回答