Kamirez7
Rozwiązane

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.



Odpowiedź :

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.

Zobacz obrazek 0AB
Zobacz obrazek 0AB
Zobacz obrazek 0AB
Zobacz obrazek 0AB

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");

       }

   }

}