对于‘用C#编写一个员工工资计算’问题的代码编写风格和结构设计考虑的比较【发现自己还是太弱,大家可以在评论区中提出我代码中的不足】
目錄
1、‘用C#編寫一個員工工資計算’問題描述
2、個人思考和實現
?2.1代碼實現:
2.2調試結果及保存txt內容:
3、他人的實現
3.1代碼實現:
3.2保存的txt內容:
1、‘用C#編寫一個員工工資計算’問題描述
請用C#編寫一個工資計算Console App:需要讀取一個.txt文件里的員工信息然后計算出相關實付工資(扣除個人所得稅和養老金)。這是根據國外一個公司的需要,員工是年薪制,但是工資是按每兩周發放一次。
1.txt文件里的員工信息如下:
| 員工編號 | 員工姓 | 員工名 | 年薪 | 扣除養老金比例 |
3 , Zhang , San , 60000 , 4%
4 , Li , Si ,45000 , 0%
5 , Wang , Fei , 55000 , 3%
(個人所得稅比例:年收入48000 以內:17.5%;年收入48000至70000: 30%;年收入70000以上:33%)
2.要求:讀取.txt文字信息,然后在屏幕顯示計算結果
(1)計算出員工時薪 (公式:年薪 / 52周每年 / 40小時每周 ) :
(2)實付工資(公式:工資 - 養老金 - 稅):
3.要求:程序需要有的幾個功能:
1.能根據員工 ID 顯示所有員工實付工資
2.保存計算后的每兩周實付工資信息為.txt格式文件
3.輸入員工 ID 能查找員工個人信息和工資信息
4.運行程序時屏幕顯示如下操作選項供用戶選擇:
(1)計算每兩周工資
(2) 顯示員工信息
(3)輸入一個員工編號能查找員工信息
(4)保存信息到.txt文檔
(5) 退出
5.要求每次用戶選擇以上一個功能時顯示結果,并再次顯示操作選項讓客戶選擇,只有客戶退出功能程序才會關閉。
2、個人思考和實現
? ? ? ? 針對上面的問題,我自己考慮實現一下該app。這里我主要來考慮的點是:讀取txt文件,保存txt文件,txt內容解析數組存放,然后就是通過序號作為主鍵對各個數組關聯,再就是各自的計算顯示啦。如此,我進行了以下的實現。
原始txt數據內容:
?2.1代碼實現:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Text.RegularExpressions;namespace EmployeeSalary_calc {class EmployeeSalary{private int[] ID;private string[] name;private double[] salary;private double[] pensionRatio;private double[] hourSalary;private double[] realMoney;private double[] twoweekSalary;private int Count; public List<string> readTxt(string filePath){int count = 0;List<String> list = new List<string>();StreamReader sR = File.OpenText(filePath);string nextLine;while ((nextLine = sR.ReadLine()) != null){Console.WriteLine(nextLine);if(count > 0)//第一行表頭不解析{list.Add(nextLine);} count++;}Count = count-1;sR.Close();return list;}public void initAndgetInfo(List<String>list){ID = new int[Count];name = new string[Count];salary = new double[Count];pensionRatio = new double[Count];hourSalary = new double[Count];realMoney = new double[Count];twoweekSalary = new double[Count];string[] information = list.ToArray();int size = information.Length;for (int i = 0; i < size; i++){string[] info = Regex.Split(information[i], @",", RegexOptions.IgnoreCase);//正則分割int len = info.Length;if (len < 5){Console.WriteLine("Warning:" + info + "數據信息不全");return;}else if (len > 5){Console.WriteLine("Warning:" + info + "數據信息過多");return;}else{ID[i] = int.Parse(info[0]);name[i] = info[1] + info[2];salary[i] = double.Parse(info[3]);pensionRatio[i] = int.Parse(info[4].Substring(0, info[4].IndexOf("%"))) / 100.0;hourSalary[i] = salary[i] / 52 / 40.0;if (salary[i] <= 48000){realMoney[i] = salary[i] * (1 - pensionRatio[i] - 0.175);}else if (salary[i] > 48000 && salary[i] <= 70000){realMoney[i] = salary[i] * (1 - pensionRatio[i]) - 48000 * 0.175 - (salary[i] - 48000) * 0.3;}else if (salary[i] > 70000){realMoney[i] = salary[i] * (1 - pensionRatio[i]) - 48000 * 0.175 - (70000 - 48000) * 0.3 - (salary[i] - 70000) * 0.33;}else{}}Console.WriteLine(information[i] + ",時薪:" + hourSalary[i] + ",實付工資:" + realMoney[i]);}calcTwoWeekSalary();}//顯示所有員工實付工資public void showAllRealMoneyByID(){for (int i = 0; i < Count; i++){Console.WriteLine(ID[i] + ":實付工資" + realMoney[i]);}}//輸入員工 ID 能查找員工個人信息和工資信息public void searchInfoByID(int id){for (int i = 0; i < ID.Length; i++){if (id == ID[i]){Console.WriteLine("個人信息:"+ID[i]+","+name[i]);Console.WriteLine("工資信息:年薪:" + salary[i] + ",時薪:" + hourSalary[i] + ",實付工資:" + realMoney[i]);break;}}}//顯示員工個人信息和工資信息public void showAllinfo(){for (int i = 0; i < Count; i++){Console.WriteLine("個人信息:" + ID[i] + "," + name[i]);Console.WriteLine("工資信息:年薪:" + salary[i] + ",時薪:" + hourSalary[i] + ",實付工資:" + realMoney[i] + ",兩周實付工資:" + twoweekSalary[i]);}}//計算每兩周工資public void calcTwoWeekSalary(){ for (int i = 0; i < Count; i++){twoweekSalary[i] = hourSalary[i] * 40 * 2;}}//保存計算的每兩周工資為txtpublic void saveTwoWeekSalary(String filePath){calcTwoWeekSalary();FileInfo myFile = new FileInfo(filePath); StreamWriter sW = myFile.CreateText();string[] str = new String[Count];for (int i = 0; i < Count; i++){str[i] = ID[i] + "," + name[i]+","+twoweekSalary[i];} foreach (var s in str) { sW.WriteLine(s); }Console.WriteLine("保存完成!");sW.Close();}}class Program{static void Main(string[] args){string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;string filepath = path + "EmployeeInformation.txt";Console.WriteLine("txt文件存放位置:"+filepath); //這里的path可以直接寫成絕對路徑EmployeeSalary Employeeinfo = new EmployeeSalary();List<String> info = Employeeinfo.readTxt(filepath);Employeeinfo.initAndgetInfo(info);string savepath = path+"savefile.txt";Console.WriteLine("txt文件保存位置:" + savepath);bool control = true;while (control){Console.WriteLine("-------------------請輸入以下選項代表的數字----------------------------");Console.WriteLine("(1) 計算每兩周工資");Console.WriteLine("(2) 顯示員工信息");Console.WriteLine("(3) 輸入一個員工編號能查找員工信息");Console.WriteLine("(4) 保存信息到.txt文檔");Console.WriteLine("(5) 退出");int flag = int.Parse(Console.ReadLine());switch (flag){case 1:Employeeinfo.calcTwoWeekSalary();Console.WriteLine("計算完成!");break;case 2:Employeeinfo.showAllinfo();break;case 3:int id = int.Parse(Console.ReadLine());Employeeinfo.searchInfoByID(id);break;case 4:Employeeinfo.saveTwoWeekSalary(savepath);break;case 5:Console.Write("退出程序了");control = false;break;default:break;}}}} }2.2調試結果及保存txt內容:
?
?這個可以看出,對于問題中的相關功能均得到了實現,細枝末節處可能有些需要調整,主要需要根據問題的具體描述和理解進行操作。
大家看到這里是不是有什么意見嗎?我自己也自我感覺良好,畢竟解決的問題呀。然而看了別人的代碼和設計思路,不得不佩服一下。我代碼中存在的不足大家也可以再評論區里說出來,大家一起討論呀。下面就貼上別人實現的代碼了。
3、他人的實現
? ? ? ? 以下是引用其他作者的內容,這部分實現的作者是真的小白啊
????????該作者的主要思路則是,將所有的元素作為一個結構體,然后統一存儲在list內,并且通過多接口的方式實現各個功能模塊。代碼風格和思路結構就比我強很多。我貼上來也是為了做個比較,然后讓自己和大家都可以學習學習。
3.1代碼實現:
namespace ConsoleApp1 {internal class Program{static List<Staff> StaffList = new List<Staff>();static void Main(string[] args){ImportStaffs();while (true){switch (MainMenu()){case 1:CalculateSalary();break;case 2:DisplayStaffInformation();break;case 3:FindStaff();break;case 4:SaveToFile();break;case 5:{Console.Clear();Console.WriteLine("(5) 退出");Console.ReadKey();return;}default:break;}}}private static void FindStaff(){Console.Clear();Console.WriteLine("(3) 輸入一個員工編號能查找員工信息");Console.Write("輸入一個員工編號:");if (int.TryParse(Console.ReadLine(), out var staffID)){Console.WriteLine(StaffList.Find(s => s.ID == staffID));}Console.ReadKey();}private static void DisplayStaffInformation(){Console.Clear();Console.WriteLine("(2) 顯示員工信息");foreach (var staff in StaffList){Console.WriteLine(staff);}Console.ReadKey();}private static void SaveToFile(){Console.Clear();Console.WriteLine("(4) 保存信息到.txt文檔");var staffInfoFileNew = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "StaffInfoNew.txt");if (File.Exists(staffInfoFileNew)){File.Delete(staffInfoFileNew);}using var stream = new StreamWriter(staffInfoFileNew, true);foreach (var staff in StaffList){stream.Write(staff);stream.Write(Environment.NewLine);}Console.WriteLine("保存成功");Console.ReadKey();}private static void ImportStaffs(){var staffInfoFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "StaffInfo.txt");if (File.Exists(staffInfoFile)){foreach (var staffLine in File.ReadAllLines(staffInfoFile).Skip(1)){var staffInfo = staffLine.Split(',');var id = int.Parse(staffInfo[0]);var firstName = staffInfo[1];var lastName = staffInfo[2];var annualSalary = double.Parse(staffInfo[3].Trim('%'));var pensionRatio = double.Parse(staffInfo[4].Trim('%')) / 100;StaffList.Add(Staff.EnrollNew(id, firstName, lastName, annualSalary, pensionRatio));}}}private static void CalculateSalary(){Console.Clear();Console.WriteLine("(1) 計算每兩周工資");Console.WriteLine("每兩周工資計算完成");Console.ReadKey();}private static int MainMenu(){Console.Title = "員工工資計算";while (true){Console.Clear();Console.WriteLine("(1) 計算每兩周工資");Console.WriteLine("(2) 顯示員工信息");Console.WriteLine("(3) 輸入一個員工編號能查找員工信息");Console.WriteLine("(4) 保存信息到.txt文檔");Console.WriteLine("(5) 退出");Console.WriteLine();if (int.TryParse(Console.ReadLine(), out var functionID)){if (functionID >= 1 && functionID <= 5){return functionID;}}}}} } namespace ConsoleApp1 {internal class Staff{private double PersonalIncomeTax{get{double personalIncomeTax = default;if (AnnualSalary < 48000){personalIncomeTax = TwoWeeksSalary * 17.5 / 100;}else if (AnnualSalary >= 48000 && AnnualSalary < 70000){personalIncomeTax = TwoWeeksSalary * 30 / 100;}else if (AnnualSalary >= 70000){personalIncomeTax = TwoWeeksSalary * 33 / 100;}return personalIncomeTax;}}private double Pension => TwoWeeksSalary * PensionRatio;public int ID { get; set; }public string FirstName { get; set; }public string LastName { get; set; }public double AnnualSalary { get; set; }public double HourlySalary => AnnualSalary / 52 / 40;public double PaidSalary => TwoWeeksSalary - Pension - PersonalIncomeTax;public double PensionRatio { get; set; }public double TwoWeeksSalary => HourlySalary * 40 * 2;private Staff() { }public static Staff EnrollNew(int id, string firstName, string lastName, double annualSalary, double pensionRatio){var newStaff = new Staff{ID = id,FirstName = firstName,LastName = lastName,AnnualSalary = annualSalary,PensionRatio = pensionRatio};return newStaff;}public override string ToString(){return $"ID: {ID}{Environment.NewLine}" +$"FirstName: {FirstName}{Environment.NewLine}" +$"LastName: {LastName}{Environment.NewLine}" +$"AnnualSalary: {AnnualSalary}{Environment.NewLine}" +$"HourlySalary: {HourlySalary}{Environment.NewLine}" +$"PaidSalary: {PaidSalary}{Environment.NewLine}" +$"PensionRatio: {PensionRatio}{Environment.NewLine}" +$"TwoWeeksSalary: {TwoWeeksSalary}{Environment.NewLine}" +$"PersonalIncomeTax: {PersonalIncomeTax}{Environment.NewLine}" +$"Pension: {Pension}{Environment.NewLine}";}} }3.2保存的txt內容:
?
最后,通過比較只能說自己代碼的擴展性,結構性都比較差。自己還是太弱,大家可以在評論區中提出我代碼中的不足。
總結
以上是生活随笔為你收集整理的对于‘用C#编写一个员工工资计算’问题的代码编写风格和结构设计考虑的比较【发现自己还是太弱,大家可以在评论区中提出我代码中的不足】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端JavaScript自学复盘梳理D2
- 下一篇: matlab 斜坡响应,二阶系统的斜坡响