exercise kristof: Bardzo prosze pomoc The task is to create a command line application using C# that: o Accepts input parameters o Prints date range in console Example usage with expected results printed in console are presented below: 1) program.exe 01.01.2017 05.01.2017 01 − 05.01.2017 1) program.exe 01.01.2017 05.02.2017 01.01 – 05.02.2017 1) program.exe 01.01.2016 05.01.2017 01.01.2016 – 05.01.2017 o Your code should be of production quality o Your code should be tested appropriately (e.g. unit−tested) o Please mind validation and culture specific handling o We strongly prefer that you will share the code with us using any type of private repository. However, other ways are also acceptable. I want to know if the task is done in the good way, meeting expectations of the question above. I wrote this code. enter code here https://pastebin.com/gUYnMkrb Is the complexity the best quality?
6 lip 20:12
Jerzy: I would sugest to write your problem in Polish, it will be easier to answer your question.
6 lip 22:02
wredulus_pospolitus: 1) what if your input will be: 00−01−2018? Where do you check if it's a date is correct? 2) what if your input will be: 30−02−2017? Where do you check if in this month we have so many days? 3) what if your input will be: 01−01−2017 and second 01−01−2016? Where do you check which one is later? Or if first one is sooner than second?
6 lip 23:46
wredulus_pospolitus: 4) And also input A1−01−2016 shouldn't give you a syntax error? When you wanna convert 'A1' to int32 ?
6 lip 23:49
wredulus_pospolitus: 5) What if your input is 01−01−19 (not 01−01−2019) ? You don't check if year is full four digits? 6) And if you will have 'four digits check' what is you wanna make input 01−01−999? (at least show them have to make input or make a notice that you cannot make input before 01−01−1000) 7) What if you will have input: 1−1−2019 ? Is it correct or not? Program will take it but shouldn't cause it's invalid input.
6 lip 23:56
wredulus_pospolitus: 8) And first of all −−− your input should be 01.01.2016 not 01012016
6 lip 23:59
wredulus_pospolitus: As for the first look it should be enough emotka
7 lip 00:01
kristof: convert to int 32 nie wydaje sie dobrą opcją, mógłbyś pomoc
7 lip 11:49
wredulus_pospolitus: Możesz konwertować od int'a, ale najpierw musisz się upewnić, że wprowadzana będzie poprawna data. Intem na razie sobie nie zawracaj głowy − najpierw popatrz na pozostałe punkty pokazujące 'błędnie' wprowadzone daty
7 lip 12:01
kristof: wyjątki tez trzeba obsluzyc>
7 lip 23:02
wredulus_pospolitus: Of course −−− what if someone will make input: I.love.Joanna (or I−love−Joanna) As a future programmer you should always ask yourself − how stupied input can a person make. As the problem of "no−date" input I would suggest someting like this: string input; int result; int.TryParse(input, out result); this should return 0 for any (as a string) 'no−number' input (if you had an object, not a string, you should also convert to string first. Basically converting string/object to int and avoiding exceptions is something you should already had on your lectures because programmers do it every day.
8 lip 08:13
kristof: moge kontakt do cb FB: Jan Sopata
8 lip 10:48
kristof: jak moge obsluzyc System.IndexOutOfRangeException: „Index was outside the bounds of the array.”
8 lip 11:58
wredulus_pospolitus: widać odwołujesz się do elementu w tablicy o indeksie którego nie ma w tablicy. Przy jakich danych Ci to wyskoczyło?
8 lip 12:04
wredulus_pospolitus: Co zmieniłeś w kodzie?
8 lip 12:05
kristof: mozemy priv gdzie indziej
8 lip 12:06
kristof: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Excercise { class Program { public string[] CorrectnessOfDate(string word) { Console.WriteLine("Enter a date of {0} (DD.MM.YYYY):", word); var date = Console.ReadLine(); string[] dateArray = date.Split('.'); int check = 0; if ((Convert.ToInt32(dateArray[1]) == 1) || (Convert.ToInt32(dateArray[1]) == 3) || (Convert.ToInt32(dateArray[1]) == 5) || (Convert.ToInt32(dateArray[1]) == 7) || (Convert.ToInt32(dateArray[1]) == 8) || (Convert.ToInt32(dateArray[1]) == 10) || (Convert.ToInt32(dateArray[1]) == 12)) if (Convert.ToInt32(dateArray[0]) <= 31 && Convert.ToInt32(dateArray[0]) > 0) check++; else if ((Convert.ToInt32(dateArray[1]) == 4) || (Convert.ToInt32(dateArray[1]) == 6) || (Convert.ToInt32(dateArray[1]) == 9) || (Convert.ToInt32(dateArray[1]) == 11)) if (Convert.ToInt32(dateArray[0]) <= 30 && Convert.ToInt32(dateArray[0]) > 0) check++; else if (Convert.ToInt32(dateArray[1]) == 2) if ((Convert.ToInt32(dateArray[2]) % 4 == 0) && (Convert.ToInt32(dateArray[2]) % 100 != 0) || (Convert.ToInt32(dateArray[2]) % 400 == 0)) if (Convert.ToInt32(dateArray[0]) <= 29 && Convert.ToInt32(dateArray[0]) > 0) check++; else if (Convert.ToInt32(dateArray[0]) <= 28 && Convert.ToInt32(dateArray[0]) > 0) check++; if (check != 1) { Console.Clear(); Console.WriteLine("A Date is invalid! Try again."); CorrectnessOfDate(word); } return dateArray; } public void DateRange() { string[] start = CorrectnessOfDate("start"); string[] end = CorrectnessOfDate("end"); int dayStart = Convert.ToInt32(start[0]); int monthStart = Convert.ToInt32(start[1]); int yearStart = Convert.ToInt32(start[2]); int dayEnd = Convert.ToInt32(end[0]); int monthEnd = Convert.ToInt32(end[1]); int yearEnd = Convert.ToInt32(end[2]); Console.Clear(); Console.WriteLine("The date of start: {0}.{1}.{2}", dayStart, monthStart, yearStart); Console.WriteLine("The date of end: {0}.{1}.{2}", dayEnd, monthEnd, yearEnd); Console.WriteLine("Data range:"); if (dayStart == dayEnd && monthStart == monthEnd && yearStart == yearEnd) Console.WriteLine("There is only one day"); else if (yearStart < yearEnd) Console.WriteLine("0{0}.0{1}.0{2} − 0{3}.0{4}.0{5}", dayStart, monthStart, yearStart, dayEnd, monthEnd, yearEnd); else if (monthStart < monthEnd) Console.WriteLine("0{0}.0{1} − 0{2}.0{3}.0{4}", dayStart, monthStart, dayEnd, monthEnd, yearEnd); else if (dayStart < dayEnd) Console.WriteLine("0{0} − 0{1}.0{2}.0{3}", dayStart, dayEnd, monthEnd, yearEnd); else Console.WriteLine("the end date can not be before the start date."); } static void Main(string[] args) { var program = new Program(); program.DateRange(); Console.ReadKey(); } } }
8 lip 16:21
wredulus_pospolitus: a) Czy Convert.ToInt32(dateArray[1]) nie tworzy Ci erroru gdy nie masz tam liczby? b) nie prościej po prostu stworzyć dodatkowe zmienne: int dzien; int miesiac; c) To całe: (Convert.ToInt32(dateArray[1]) == 1) || (Convert.ToInt32(dateArray[1]) == 3) || (Convert.ToInt32(dateArray[1]) == 5) || (Convert.ToInt32(dateArray[1]) == 7) || (Convert.ToInt32(dateArray[1]) == 8) || (Convert.ToInt32(dateArray[1]) == 10) || (Convert.ToInt32(dateArray[1]) == 12)) Można jak skrócić do: (Convert.ToInt32(dateArray[1]) % 2 == 1 && Convert.ToInt32(dateArray[1]) < 8) || (Convert.ToInt32(dateArray[1]) % 2 == 0 && Convert.ToInt32(dateArray[1]) > 7) d) wtedy w else po prostu wrzucasz warunek co jeżeli (Convert.ToInt32(dateArray[1]) == 2) No i nadal, co jeżeli będzie input postaci: (4), (5), (6) czy też (7) Dodatkowo: " else Console.WriteLine("the end date can not be before the start date."); " To nieprawda −−− jeżeli wpiszesz dwie identyczne daty, to też wywali ten komunikat. Dodatkowo, jeżeli wpiszesz 01.01.19 oraz 02.01.2016 to nie wywali komunikatu. I na dokładkę: co się stanie jeżeli input będzie 01.01. (Pytam, bo szczerze − nie wiem) Jak wtedy wygląda dateArray[2] I jak będzie wyglądała kwestia konwertowania do int'a w tym momencie?
8 lip 16:55
Bleee: Dobra... Dałem ciała, bo przy takim rozwiązaniu nie sprawdzamy czy miesiące są w przedziale
8 lip 17:04
Bleee: A co jeżeli (i pewnie wtedy miałeś ten komunikat) Input będzie 01.02? Wtedy odwolujesz się do elementu tablicy którego nie utworzyłes.
8 lip 17:11
kristof: poprawione, jakie wyjątki oblsuzyc i w ktorym miejscu
8 lip 17:16
wredulus_pospolitus: To może tak, ja bym do tego podszedł w ten sposób 1) Sprawdzamy czy mamy dokładnie dwie 'kropy' 2) Przerabiamy na int'y (ale nie poprzez Convert.ToInt32 bo będą errory) 3) Musisz zdecydować co robisz z rokiem − czy wymagasz czterech cyfr czy nie. Czy pozwalasz na dowolną datę, czy na przykład jedynie z obecnego wieku. W zależności od podjętej decyzji konieczny będzie ewentualnie jakiś warunek co do roku. IF'ujemy sobie 4) Jeżeli liczba dni <1,28> to supcio, else: 5) Jeżeli miesiąc to 2 to: 6) Jeżeli dzień to 29 to warunek na rok przestępny; else 'papa' 7) else Jeżeli liczba dni to 30 to supcio 8) else Jeżeli liczba dni to 31 to sprawdzasz jaki miesiąc 9) W inny przypadku 'papa' UWAGA! Jeżeli zdecydujesz się, że wprowadzona musi być data w postaci czterech symboli (dokładnie czterech symboli) to należy sprawdzić czy faktycznie są te cztery symbole (aby odrzucić jako błędny input postaci 01.01.19 i dopuszczać jedynie 01.01.0019 jeśli ktoś faktycznie myśli o 19 roku) I właśnie na to bym polecał się zdecydować.
8 lip 17:49
wigle: Teraz mam taki problem ze jak wpirwadzam zla date poczatkowaa to Ok wyskakuje ze blad i pnowonjw prosi k poczatkowa ale po wporawdzeniubu koncowej i poczatkowej dobrej mamy taki problem ze ze zapisuje tej dobrej poczatkowej tylko tej pierwszej wprowadzonej
8 lip 18:56
wredulus_pospolitus: Dlaczego nie możesz w osobnych stringach zapisać: Data początkowa (sprawdzenie danych), Data końcowa (sprawdzenie danych) Ewentualnie − nie zapamiętuje która daną trzeba zmienić i ją podmienia natomiast dobrą datę kopiuje (jeśli musi coś zrobić). Pokaż kod
8 lip 19:35
Bleee: niech zapamietuje*
8 lip 20:31
11 lip 18:37