Софтуерно Инженерство
Loading...
+ Нов въпрос
dimitarnik avatar dimitarnik 93 Точки

[Homework] C# Basics - Primitive Data Types and Variables - Problem {10} Employee Data

Здравейте,

реших малко да си поиграя с тази задача и да направя нещо като програмка за въвеждане на данни. Ако някой има идеи за оптимизация или други по-интересни функции, ще съм му благодарен да ги сподели. Дано съм помогнал на някого поне малко.

 

Problem10.EmployeeData

 

 


СофтУни Онлайн Студенти

5
Основи на програмирането 02/02/2015 15:10:39
GoShow avatar GoShow 595 Точки

Готино си го измислил с всички try catch блокове.Аз бих те посъветвал да извадиш Systen.Threading - в началото на програмата, вместо да го пишеш на всеки ред и вместо толкова редове ConsoleWrite(".") можеш да им врътнеш един for цикъл и ще стане на 3 реда.На пръв поглед е това :)

2
ViValDam avatar ViValDam 23 Точки

На това ниво няма нужда от толкова сложни неща , но за теб е отлично упражнение , браво !

1
RoYaL avatar RoYaL SoftUni Team Trainer 6820 Точки

Ами моите съвети за оптимизация биха били:

- Вместо лист - дикшънъри (или дикшънъри от дикшънърита, ако ще нест-ваш). За да имаш и асоциативни ключове. Да, в твоят случай можеш с цикъл да извъртиш целия лист и да изпринтиш всичко, но освен технически по-лесно, не е никак по-лесно по друг начин (например myEmployee[4] не значи нищо за програмиста, докато myEmployee["IDNumber"] значи)

- Да изнесеш операциите за всичко това в методи т.е. методи които проверят дали всичко е в рамки, и методи, които инициализират листа/хештейбъла/дикшънърито

- За да е валиден обджект наистина, не прави всичките операции в Main-а, а във валидни non-static методи извън него, изкарай myEmployee като пропърти на класа. Направи си един self object, от който можеш да аксесваш non static fields/methods (понеже в Main-а по друг начин ще ти е трудно да извикаш метод, който не е статичен, или пропърти, което не е статично)

така примерно ако имаш

public void setIDnum(int id)

{

    this.myEmployee.Add("ID", id);

}

 

ще можеш инициализирайки обекта (примерно от друг клас) да викаш setIDnum() което в стейта на обджекта ще промени (в случая добави) ключ ID на пропъртито myEmployee със съответното ИД.

Това, което ще постигнеш, естествено е само упражнение и за такава задача, няма нужда да се прави, но практически е следното:

Обекта ти емплойи си има свое API, което позволява на външни хора да добавят ид, пол и т.н., но не позволява да променят ключовете на пропъртито.

така при (class Employee с public конструктор Employee()):

private Dictionary<string, int> _myEmployee = new Dictionary<string, int>();

public void setId(int id)

{

    this._myEmployee.Add("ID", id);

}

 

ако отвън направиш

Employee myEmployeeObject = new Employee();

myEmployeeObject.setId(5);

 

ще добави ID => 5, но няма да позволи да направиш:

myEmployeeObject._myEmployee.Add("sex", 1);

 

заради достъпността на полето

1
vvulevv avatar vvulevv 51 Точки

А дали може да дадете някакво по-елементарно решение на задачата?

0
TsvetinaKoleva avatar TsvetinaKoleva 99 Точки

Браво, че сте задълбочили в задачата, въпреки че не е задължително. И благодаря за варианта, беше ми полезен.

vvulevv, Ето вариант за решение на задачата по най-опростения начин :)

 


Console.Write("Enter First name: ");
string firstName=Console.ReadLine();

Console.Write("Enter Last name: ");
string lastName = Console.ReadLine();

Console.Write("Enter Age: ");
byte age = byte.Parse(Console.ReadLine());

Console.Write("Enter Gender (m or f): ");
string gender = Console.ReadLine();

Console.Write("Enter Personal ID number: ");
string personalID = Console.ReadLine();

Console.Write("Enter Employee Unique number (2756****): ");
uint uniqueNumber = uint.Parse(Console.ReadLine());

 

Console.WriteLine("\n \nEmployee Data: \n"
+ "First name: {0} \n"
+ "Last name: {1} \n"
+ "Age: {2} \n"
+ "Gender: {3} \n"
+ "Personal ID number: {4} \n"
+ "Unique Enmployee number: {5}",
firstName, lastName, age, gender, personalID, uniqueNumber);

3
RoYaL avatar RoYaL SoftUni Team Trainer 6820 Точки

Ами най-елементарното, което е максимално straightforward, би трябвало да е:

- Промпт за въвеждане преди всяка променлива (Console.WriteLine("Write name/number/etc...");

- Присвояване на стойност към написания ред от конзолата към променлива (пр. String firstName = Console.ReadLine();)

- В края на изпълнението се извеждат всички инпути (Console.WriteLine(firstName);)

 

Това разбира се изключва всички варианти за хващане на неправилен вход, и неговото handle-ване (например въведен стринг в int поле ще прекрати зипълнението на програмата)

0
GogoK avatar GogoK 80 Точки

Здравейте,
Има ли някакъв семпъл начин, с който при въвеждането, например: "Enther first name: ", ако не отговаря на проверка да се връща пак, докато издържи проверката. Ето ми го кода, не съм вкарвал проверки, заради това което питам. Благодаря!

2
Filkolev avatar Filkolev 4428 Точки

За числа или други типове (например дати), прочети за метода TryParse(). Може да го ползваш в комбинация с цикъл и да искаш вход от потребителя докато парсването не е успешно, като може да добавиш и други условия, примерно числото да е между 0 и 100.

За по-сложни проверки, например дали даден стринг отговаря на някакви условия, трябва в общия случай да се ползват регулярни изрази, за които е малко рано в подготвителното ниво.

2
GogoK avatar GogoK 80 Точки

Ето тук се пробвах с проверки и може би ще ги направя подобни, защото нямам много опит. Но май не съм се изразил правилно... искам преди да вкарам проверките в кода, да разбера дали има някакъв простичък начин с който, след като се въведат грешни данни да се повтори същият ред. Ако не може и трябват някакви сложни методи здраве да е, но ако има метод с 1-2 реда код да се опитам да го импортна в кода.

 

пп. ахааа, чак от 3-то четене те разбрах, какво ми казваш. Грашката е моя сори :)

Благодаря ще се пробвам.

0
29/01/2015 00:49:12
Filkolev avatar Filkolev 4428 Точки

TryParse е метод, който връща булева стойност - дали парсването е успешно или не, едновременно с това записва резултата от парсването в посочената променлива след ключовата дума out.

Може да го използваш като в while цикъл кажеш "докато парсването не е успешно" и да искаш наново вход. Ползвал съм го доста пъти и съм чел коментари, че е удачен, т.е. работи бързо.

Виждам, че бързо се ориентираш, така че няма да ти поствам готов код, ако имаш затруднения питай. 

Но пак уточнение - това ще сработи за проверки на типове, които се парсват - числа, дати. Ако искаш да провериш дали даден стринг започва с главна буква, след това има само малки букви и е с  обща дължина между 2 и 20 символа да речем - има начин, но с техники за малко по-напреднали.

0
AntonPortenov avatar AntonPortenov 77 Точки

Здравейте,

имам питане относно Threading.Thread.Sleep метода.

Има ли подобна алтернатива при принтирането на конзолата?

Не искам да забавя самото стартиране на кода а начина на изписване на конзолата.

 

мерси

 

0
AntonPortenov avatar AntonPortenov 77 Точки

Намерих това, което исках.

Предлагам решението си. Ще се радвам да чуя вашите коментари по кода.

Поздрави

http://pastebin.com/nD4U835E

 

1
alex.mitev avatar alex.mitev 20 Точки

Не го пробвах, но не следва ли stringa da go napravish na string array i товава да изреждаш елементите?

 

 

0
AntonPortenov avatar AntonPortenov 77 Точки

Не съм се замислял. Може би това, което казваш е правилния начин, но не съм запознат с placeholders в array и затова го оставих така.

0
ioanna.konova avatar ioanna.konova 31 Точки

Ето и моето извратено решение на задача 10 с бегли опити за проверки - http://pastebin.com/tF74XCXw laugh

Благодарна съм на всякакви критики, мнения и т.н.smiley

0
raging avatar raging 92 Точки

Никъде не брейкваш while циклите :)

1
ioanna.konova avatar ioanna.konova 31 Точки

А какво означава това и защо трябва да се използва, ако ти се обяснява, де?smiley

0
raging avatar raging 92 Точки

С две думи - програмата ти няма да има край , ще се изпълнява до безкрая  + че тия 3 вложени цикъла няма смисъл от тях :)
http://www.dotnetperls.com/while прочети това и ще ти стане по - ясно

1
02/11/2015 21:58:49