PROGRAMOWANIE C# - Zadanie: Stwórz funkcję: bool CzyWKolejnosci(char a, char b, char c) Funkcja zwraca true, jeśli wszystkie znaki przesłane jako argumenty funkcji są literami (z ograniczeniem do liter alfabetu łacińskiego) uporządkowanymi w kolejności rosnącej (np.: aBc; DeF). W innym przypadku funkcja zwraca false.
Funkcja z przykładowym programem ilustrującym działanie oraz wyniki w załącznikach 1. oraz 2.
Wprawdzie uważam, że zadanie wyraźnie zakłada, iż parametry będą znakami ASCII, ale rzeczywiście funkcja ma sprawdzić czy są literami, a tego mój pierwszy program nie obejmował. Napisałam funkcję
public static bool CzyLiteraZnakówASCII(char a)
sprawdzającą czy znak jest literą i czy jest to litera ASCII.
Załączniki 3. oraz 4.
Wyjaśnienie
W postaci, którą podałam działa wszędzie z wyjątkiem Roslyn w dotnetfiddle, gdzie potrzebna jest trywialna zmiana.
C# już w wersji podstawowej zawiera Char.IsLetter(char a) funkcję sprawdzającą czy znak jest literą. Są również funkcje sprawdzające czy znak jest cyfrą, znakiem przestankowym itd.
Wprawdzie C# nie ma funkcji bezpośrednio sprawdzającej czy znak jest ASCII, ale ma takie sprawdzenie dla zmiennych łańcuchowych. Tak więc wystarczy zamienić znak przy pomocy .ToString(). Takie sprawdzenie czy ASCII polega na sprawdzeniu wartości logicznej wyrażenia
O ile w przypadku pojedynczego znaku można się bawić w inne rozwiązania, to w przypadkach bardziej skomplikowanych jest to jedyne rozsądne rozwiązanie.
Wielka szkoda, że program nauczania przewiduje posiadanie praktycznie nieprzydatnej wiedzy o o różnych systemach zapisu liczb (m.in. ZM, ZU1, ZU2), a tak mało poświęca uwagi objaśnieniu istotnych wiadomości o UTF-8 oraz ASCII. Wiedza o nich jest bardzo przydatna nie tylko w programowaniu, ale i przy tworzeniu (zapisywaniu) dokumentów oraz stron internetowych.
static bool CzyWKolejnosci(char a, char b, char c)
{
// w czasie porównywania kolejności nie bierzemy pod uwagi wielkości liter, dlatego zamieniamy je na wielką literę
// zmienne przechowujące wartości numeryczne danych liter (na podstawie ASCII) - potrzebne do sprawdzenia czy znak jest literą oraz do sprawdzenia kolejności
int aN = (int)(char.ToUpper(a));
int bN = (int)(char.ToUpper(b));
int cN = (int)(char.ToUpper(c));
// sprawdzenie czy znak jest literą wg. ASCII ('A' = 65, 'Z' = 90), jeżeli nie jest, to zwróć fałsz
if (
aN < 65 || aN > 90
|| bN < 65 || bN > 90
|| cN < 65 || cN > 90
)
{
return false;
}
// sprawdzanie, czy kolejność jest rosnąca:
// jeżeli pierwsza litera jest "większa" od drugiej, to zwróć fałsz (skoro 'A' = 65 a 'B' = 66, to 'B' > 'A')
if ( aN > bN ) return false;
// jeżeli druga litera jest "większa" od trzeciej, to zwróć fałsz
if ( bN > cN ) return false;
// jeżeli wcześniej został zwrócony fałsz, to ten fragment kodu się nie wykona, jeżeli nie, to znaczy, że kolejność jest rosnąca i należy zwrócić prawdę
return true;
}
static void Main(string[] args)
{
char a, b, c;
Console.WriteLine("Podaj 3 znaki aby sprawdzić, czy kolejność jest rosnąca:");
a = Console.ReadKey().KeyChar;
b = Console.ReadKey().KeyChar;
c = Console.ReadKey().KeyChar;
if( CzyWKolejnosci(a,b,c) )
Console.WriteLine("Znaki zostały podane w kolejności rosnącej");
else
Console.WriteLine("Znaki nie zostały podane w kolejności rosnącej bądź nie są literami z alfabetu łacińskiego");
Odpowiedź
Funkcja z przykładowym programem ilustrującym działanie oraz wyniki w załącznikach 1. oraz 2.
Wprawdzie uważam, że zadanie wyraźnie zakłada, iż parametry będą znakami ASCII, ale rzeczywiście funkcja ma sprawdzić czy są literami, a tego mój pierwszy program nie obejmował. Napisałam funkcję
public static bool CzyLiteraZnakówASCII(char a)
sprawdzającą czy znak jest literą i czy jest to litera ASCII.
Załączniki 3. oraz 4.
Wyjaśnienie
W postaci, którą podałam działa wszędzie z wyjątkiem Roslyn w dotnetfiddle, gdzie potrzebna jest trywialna zmiana.
C# już w wersji podstawowej zawiera Char.IsLetter(char a) funkcję sprawdzającą czy znak jest literą. Są również funkcje sprawdzające czy znak jest cyfrą, znakiem przestankowym itd.
Wprawdzie C# nie ma funkcji bezpośrednio sprawdzającej czy znak jest ASCII, ale ma takie sprawdzenie dla zmiennych łańcuchowych. Tak więc wystarczy zamienić znak przy pomocy .ToString(). Takie sprawdzenie czy ASCII polega na sprawdzeniu wartości logicznej wyrażenia
System.Text.Encoding.UTF8.GetByteCount(String) == 1
O ile w przypadku pojedynczego znaku można się bawić w inne rozwiązania, to w przypadkach bardziej skomplikowanych jest to jedyne rozsądne rozwiązanie.
Wielka szkoda, że program nauczania przewiduje posiadanie praktycznie nieprzydatnej wiedzy o o różnych systemach zapisu liczb (m.in. ZM, ZU1, ZU2), a tak mało poświęca uwagi objaśnieniu istotnych wiadomości o UTF-8 oraz ASCII. Wiedza o nich jest bardzo przydatna nie tylko w programowaniu, ale i przy tworzeniu (zapisywaniu) dokumentów oraz stron internetowych.
using System;
namespace brainly
{
class Program
{
static bool CzyWKolejnosci(char a, char b, char c)
{
// w czasie porównywania kolejności nie bierzemy pod uwagi wielkości liter, dlatego zamieniamy je na wielką literę
// zmienne przechowujące wartości numeryczne danych liter (na podstawie ASCII) - potrzebne do sprawdzenia czy znak jest literą oraz do sprawdzenia kolejności
int aN = (int)(char.ToUpper(a));
int bN = (int)(char.ToUpper(b));
int cN = (int)(char.ToUpper(c));
// sprawdzenie czy znak jest literą wg. ASCII ('A' = 65, 'Z' = 90), jeżeli nie jest, to zwróć fałsz
if (
aN < 65 || aN > 90
|| bN < 65 || bN > 90
|| cN < 65 || cN > 90
)
{
return false;
}
// sprawdzanie, czy kolejność jest rosnąca:
// jeżeli pierwsza litera jest "większa" od drugiej, to zwróć fałsz (skoro 'A' = 65 a 'B' = 66, to 'B' > 'A')
if ( aN > bN ) return false;
// jeżeli druga litera jest "większa" od trzeciej, to zwróć fałsz
if ( bN > cN ) return false;
// jeżeli wcześniej został zwrócony fałsz, to ten fragment kodu się nie wykona, jeżeli nie, to znaczy, że kolejność jest rosnąca i należy zwrócić prawdę
return true;
}
static void Main(string[] args)
{
char a, b, c;
Console.WriteLine("Podaj 3 znaki aby sprawdzić, czy kolejność jest rosnąca:");
a = Console.ReadKey().KeyChar;
b = Console.ReadKey().KeyChar;
c = Console.ReadKey().KeyChar;
if( CzyWKolejnosci(a,b,c) )
Console.WriteLine("Znaki zostały podane w kolejności rosnącej");
else
Console.WriteLine("Znaki nie zostały podane w kolejności rosnącej bądź nie są literami z alfabetu łacińskiego");
}
}
}