Console.WriteLine("Hello, World")
zamiast widocznej na filmach klasy Program
z metodą Main
.
using System
, zamiast class
jest internal class
.
internal class
a class
nie będzie ważna w opisywanych projektach (znaczenie modyfikatorów zakresu dostępu zostanie wyjaśniona w dalszej części kursu). Modyfikator internal
można po prostu usunąć lub zmienić na public
. Natomiast brak polecenia using
związany jest z tym, że Visual Studio 2022 przejmuje na siebie część obowiązków związanych z zarządzaniem dostępem do przestrzeni nazw. Można się brakiem tej linii po prostu nie przejmować, ale można ją również po prostu samodzielnie dopisać.
double
można dzielić przez zero - wynikiem jest Infinity
), jednak wyświetlane wyniki nie są poprawne (zamiast liczby pojawia się znak zapytania lub NaN). Błąd więc jest. Krótko mówiąc, Pana kod działa tak, jak należy się spodziewać tj. w sytuacji, gdy a = 0 nie oblicza poprawnych wyników.
double
liczbę typu int
oraz czy zmienna ta zmieni
wówczas swój typ. Odpowiadając na pierwszą część pytania wytłumaczył
Pan, że jest możliwe takie przypisanie dzięki rzutowaniu niejawnemu. W
drugiej zaś części podane jest, iż w przypadku int
na double
, choć w filmie nie było to jasno powiedziane - dop. JM):
double d = 2.0; int i = (int)d;zmienna
d
nie zmieni swojego typu, jednak wartość tej zmiennej jest
rzutowana na typ całkowity i przypisywana do zmiennej i
. Podkreślił
Pan również, że takie przypisanie jest możliwe tylko w przypadku
rzutowania jawnego. Bardzo długo zastanawiałam się nad tym
wyjaśnieniem i nie jestem pewna czy rozumiem dlaczego w pierwszej
części pytania mówimy o rzutowaniu niejawnym, a w drugim o rzutowaniu
jawnym. Oczywiście wiem, w jaki sposób obie konwersje wyglądają i
kiedy należy je zastosować, jednak tutaj naszły mnie wątpliwości. Czy
biorąc pod uwagę (zgodnie z pierwszą częścią odpowiedzi), iż do
zmiennej typu double można przypisać liczbę typu int w sposób
niejawny, czyli np.:
double x = 5;
to czy nie oznacza to, że zmienna ta nie zmienia swojego typu przez
wzgląd na to, iż jest rzutowana? Mam tu na myśli, czy rzutowanie
niejawne sprawia, że typ zmiennej zostaje zachowany, a jedynie jej
wartość jest konwertowana na typ całkowity i przypisana do zmiennej
int? Gdyby tak było, to skąd wynika pojawienie się konwersji jawnej w
drugiej części Pana odpowiedzi na pytanie w wykładzie?
double->int
i int->double
. Pierwsze rzutowanie musi być jawne, podczas gdy drugie może być niejawne. Ponieważ te typy są strukturami, przy przypisaniu zawsze następuje klonowanie - tylko wartość jest kopiowana z oryginalnej zmiennej do zmiennej, do której przypisujemy tę wartość. A tu dodatkowo następuje zmiana typu kopiowanej wartości. Oryginalna zmienna w żaden sposób się nie zmienia, w szczególności nie zmienia się także jej typ, bez względu na to, czy rzutowanie jest jawne, czy nie.
Nieco inna sytuacja jest w przypadku typów referencyjnych (klas), bo w ich przypadku nie ma klonowania, ale o tym będzie na kolejnych filmach.
for (int j = 5; j <= 8; j++)
{
for (int i = j; i > j-5; i--)
{
Console.Write(i);
}
Console.WriteLine();
}
static int[] histogram(double[] wartości, int liczbaPrzedziałów)
), której należy użyć w tym zadaniu, zwraca tablicę o liczbie elementów równej liczbie przedziałów zadeklarowanych w drugim argumencie. Ten wynik należy zapisać do zmiennej typu int[]
(tablica).
static void ciągFibonacciego(int[] wartości);
, czyli żeby przyjmowała jako argument tablicę liczb całkowitych i obliczała tylko tyle wyrazów ciągu Fibonacciego, ile potrzeba do zapełnienia przesłanej tablicy. Ponieważ tablica int[]
jest typu referencyjnego, zmienione elementy będą widoczne także po zakończeniu metody, w miejscu jej wywołania.
histogram
z góry przyjmuje wartość 11. Odnosi się ona do ilości przedziałów w histogramie. Jednak biorąc pod uwagę, że wartości w tablicy, z której sporządzamy histogram są generowane losowo, nie zawsze liczba przedziałów będzie tyle wynosić.
Widać to dobrze gdy generujemy mniejszą liczbę wartości. W środku histogramu pojawiają się zera, tam gdzie ich być nie powinno.
Main
z instrukcją int[] histogram = Program.histogram(tablica, 11);
? Wartość 11 została tu użyta w wywołaniu metody histogram
, a nie w jej definicji. Tym samym, ogólność tej metody nie została ograniczona. Liczba przedziałów w tym miejscu dopasowana jest do problemu dwóch kostek. Możliwe wartości w tym problemie są z zakresu od 2 do 12. To oznacza, że jest 11 a priori możliwych wartości. Jeżeli rzutów jest niewiele, niektóre wartości (szczególnie te mniej prawdopodobne na skrajach przedziału) mogą się nie pojawiać. Zera w histogramie są jak najbardziej akceptowalnymi wartościami - mówią o tym, że pewne wartości nie zostały ani razu wylosowane.
zakres
i użyć uzyskanej z niej wartości, uruchamiając metodę histogram
:
int liczbaWartości = (int)zakres(tablica) + 1; int[] histogram = Program.histogram(tablica, liczbaWartości);
Pyt.: (kontynuacja) Wpisanie wartości 11 w wywołaniu metody, w przypadku gdy ani razu nie wylosuje się liczba 2, powoduje, że wartość
0 w histogramie nie pojawia się na pierwszym miejscu tylko gdzieś w środku. Utrudnia to odczytanie histogramu. Nie wiadomo wtedy, która wartość odpowiada danej liczbie. Czy można temu zapobiec zmieniając coś w metodzie histogram, czy to kwestia tylko podania odpowiedniej liczby w wywołaniu metody?
Odp.: Sprawdziłem metodę histogram
m.in. na zbiorze int[] wartości = new int[]{ 3, 6, 6, 6, 4, 8, 8 };
.
Metoda histogram
sprawdza sama zakres danych (wywołuje metodę zakres) i dlatego w przypadku braku wartości 2, zero na początku będzie pominięte (a nie wstawione w środek). Metoda histogram
przygotowana jest dla danych ciągłych (liczb typu double
) - my używamy jej z danymi dyskretnymi (liczby typu int
). Dlatego, jeżeli zakres jest mniejszy od liczby przedziałów, to przedziały nie będą pokrywały się z liczbami całkowitymi i "w środku" mogą pojawić się dodatkowe zera. Histogram dla liczb całkowitych powinien być inaczej napisany: powinien przyjmować tablicę liczb int[]
oraz opcjonalnie zakres histogramu zamiast liczby przedziałów (zakres pozwoli na uwzględnienie zer na skrajach przedziału możliwych wartości).
Ulamek
omawianą na ćwiczeniach..."
DateTime
) można zgłosić wyjątek i wówczas test powinien sprawdzać, czy wyjątek się pojawia (atrybut ExpectedException
).