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 01−01−2016
6 lip 23:59
wredulus_pospolitus:
As for the first look it should be enough
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