2016-11-21 4 views
-1

Вот описание того, что мне нужно сделать:C#, Обширный расчет заработной платы с массивами

Напишите программу, которая первый инициализирует массив с помощью пользовательского ввода с именами и заработной платы всех сотрудников, а затем предлагает пользователю часов работал на каждого сотрудника и рассчитывал их регулярную оплату, оплату сверхурочных, валовой доход, федеральный налоговый вычет (10% от валового), государственный налоговый вычет (5% от брутто) и чистую прибыль. После обработки последнего сотрудника программа отображает итоговые суммы для регулярной оплаты и выплаты сверхурочных, а также имена и валовые доходы для сотрудников, которые получили наибольшую и наименьшую сумму.

Я застрял в инструкции if-else, я довольно новичок в C# и все еще не знаю многого, в основном я застрял, и я спешу, чтобы это сделать, я был бы признателен за любую помощь в этом.

using System; 
using static System.Console; 

namespace Exercise3 
{ 
    class ArrayCalculations 
    { 
     static void Main(string[] args) 
     { 
      double hours, 
        regularPay, 
        overtimePay, 
        grossPay, 
        netPay, 
        stateTax, 
        fedTax; 

      const double FED_TAX = .10; 
      const double STATE_TAX = .05; 
      const double REG_HOURS = 40.0; 
      const double OVERTIME = 1.5; 

      string[] name = new string[5]; 
      double[] wage = new double[5]; 

      for (int i = 0; i < name.Length; i++) 
      { 
       Write("Please enter name: ", (i + 1)); 
       name[i] = ReadLine(); 

       Write("Please enter your hourly wage: ", (i + 1)); 
       wage[i] = Convert.ToDouble(ReadLine()); 

       Write("Please enter hours worked this week", (i + 1)); 
       hours = Convert.ToDouble(ReadLine()); 
      } 

      WriteLine(); 
      for (int i = 0; i < name.Length; i++) 
      { 
       WriteLine("Name: " + name[i] + " Wage: " + wage[i]); 
      } 

      if (hours <= 40) 
      { 
       regularPay = hours * wage; 
       overtimePay = 0; 
      } 
      else 
      { 
       // ?? 
      } 
     } 
    } 
} 
+0

Разложите свое решение! * Извлеките методы *! * Извлечь классы *, например. 'Payment' с конструктором' Payment (десятичный брутто) 'и свойствами' Gross', 'Net',' StateTax', 'FederalTax' ... –

+2

' hours = Convert.ToDouble (ReadLine()); 'вам НУЖНО' try - catch' здесь или 'Double.TryParse()'. Другое, когда я вставляю «тест», ваша программа провалится. –

+0

извините, если мне неприятно, но как именно я напишу это, или, вернее, где бы он работал лучше –

ответ

1

1.) Попробуйте разделить код на логические куски:

private double CalculateWage(double hours, double wage) 
{ 
    return (hours * wage); 
} 

Или так:

private string GetUserInput_String(string message, int index) 
{ 
    Write(message, index);  
    return ReadLine(); 
} 

Теперь вы можете называть это так:

name[i] = GetUserInput_String("Please enter name: ", (i + 1)) 

То же самое для парных.

private string GetUserInput_Double(string message, int index) 
{ 
    try 
    { 
     Write("Please enter wage: ", (i + 1));    
     return Convert.ToDouble(ReadLine()); 
     //OR 
     double result; 
     double.TryParse(ReadLine(),out result); 
     if(result != 0) 
     { 
      return result; 
     } 
     return null; 
    } 
    catch(Exception ex) //Catch all thrown Exception 
    { 
     Write(ex.Message);//Handle Exceptions (log, retry,..) 
     return null; //When retunring null check for null when working with the returned value !!! 
    } 
} 

2.) Используйте Try {} catch {}

перехватывать и обрабатывать исключения ВСЕГДА при забросе, преобразования и т.д.

ЗАКАНЧИВАТЬ Linq:

private void PrintWages(string[] names, double[] wages) 
{ 
    names.ToList().ForEach(x => Console.WriteLine($"Name: {x} Wage: {wages[names.ToList().IndexOf(x)]}")); 
} 

Это делает следующее:

string[] names = {"Anna", "Peter", "Marc"}; 
string[] wages = { "1500", "2000", "3500" }; 
names.ToList().ForEach(x => Console.WriteLine($"Name: {x} Wage: {wages[names.ToList().IndexOf(x)]}")); 

Output: 
Name: Anna Wage: 1500 
Name: Peter Wage: 2000 
Name: Marc Wage: 3500 

Так что я сделал здесь:

using System.Linq; - Adds the "Foreach" and other extension methods to Collections 

array.ToList() => array converted to list 

Foreach element in names I called WriteLine(); 
names.ToList().IndexOf(x) gives me the index of the current element to use in wages[index] 

Я condesed выход Так более или менее полный результат будет СТГ через Interplated Strings

. например

//Care of naming ! 
      // string[] names - its a sort of collection of names so dont call it name. 
      // name would be ONE item of that array 

      //I recommend using List<sting>/List<double> here ! 
      List<string> employees = new List<string>(); 
      List<double> wages = new List<double>(); 

      //Or way better => Dictionairy<string, double>(), 

      //A Dictionairy has a Key (unique) and a correlating value 
      Dictionary<string, double> EmployeeWages = new Dictionary<string, double>(); 

      int employeesToAdd = 0; 
      try 
      { 
       Console.Write("How many employees would you like to add ?"); 
       employeesToAdd = int.Parse(Console.ReadLine()); 
      } 
      catch (Exception ex) 
      { 
       Console.Write($"Error: {ex.Message}"); 
       return; 
      } 

      //We reach this line only if employeesToAdd has a value ! 
      for (int i = 0; i < employeesToAdd; i++) 
      { 
       EmployeeWages.Add(GetUserInput_String("Please enter name: "), GetUserInput_Double("Please enter your wage: ")); 
      } 


      PrintResult(EmployeeWages); 
+0

Еще раз спасибо за помощь, я понял это немного, мне определенно нужно больше практики, но серьезно спасибо. Это очень помогло. –

Смежные вопросы