[PASCAL] Program wyboru koloru

Dopiero się uczę. Czy mógłby ktoś mi to poprawić, bo nie potrafię. Chodzi o wypisanie koloru i ma się wyświetlić tekst czy to kolor podstawowy czy nie. Musi być funkcja “case”.

Program Kolory_podstawowe;


type

     kolory=(niebieski,czerwony,zielony);

var

     k:kolory;


begin

     writeln ('Podaj kolor');


     readln (k);

case k of

     czerwony:writeln ('Kolor podstawowy');

     niebieski:writeln ('Kolor podstawowy');

     zielony:writeln ('Kolor podstawowy');

else writeln ('Kolor dodatkowy lub blad nazwy');

readln;

end

end.
  1. Ten readln; ma być raczej po całej klauzuli case, teraz jest w środku bez podpiętego warunku.

  2. Ne da się wczytać z klawiatury wartość typu enum.

  3. Możesz wczytać napis a potem sprawdzać czy odpowiada jednemu z kolorów, a to oznacza że musisz trzymać tablicę z nazwami tych kolorów, po wprowadzeniu napisu przeszukać tą tablicę za pomocą pętli oraz porównywania, więc wniosek jest taki że case do tego zadania jest bezużyteczny.

Jedyne sensowne rozwiązanie (bez tablic) może być następujące:

program Kolory_podstawowe;uses typinfo;type kolory=(niebieski,czerwony,zielony);s:String;ok:Boolean;k:kolory;

Ah nie kompiluje mi tego.

Używam Turbo Pascal 7.0.

Zadanie brzmi: Użytkownik podaje kolor. Program wskazuje czy należy do kolorów podstawowych. Użyta MUSI być funkcja case.

Miło by było jak bym sam doszedł ale mi nie kompiluje coś hm. Chodzi o to, żeby to było zrobione jak najprościej, bo mam dopiero 3 lekcje z tego na uczelni :smiley: w niedziele i tak się dowiem jak to się piszę.

Turbo pascal nie ma typeinfo, więc tylko za pomocą tablicy, użyj FreePascal.

Może nie dobrze zrozumiałeś podanie koloru, kolor można podać np liczbowo.

Ok zmieniam na FreePascal. Też tak sądziłem, że słownie nie bardzo to się uda, jednak i tak dziękuje za pomoc :slight_smile:

Mógłbyś zamienić kolejno litery na kody ascii, potem je połączyć w ciąg. Sprawdzić casem czy dane ciągi odpowiadają sobie :smiley:

Heh dobry sposób, ale trzeba mieć na to trochę doświadczenia w pisaniu programu :slight_smile:

Tylko jaka biblioteka mogła by zamieniać kod ASCII na znaki?

Ord zamienia znak na kod ascii a chr zwraca kod ascii znaku. Można robić w obie strony ;]

drobok , powiedz mi poco zmieniać kolejne litery na kod ascii, potem je łączyć w ciąg zamiast od razu wczytać ciąg znaków?

Bo ciąg znaków nie działa w case :smiley:

//miałem na myśli liczbę połączoną czyt x:=x*100+ord(sting_);, lub coś podobnego ;]_

Nie da rady kolor:

jasnoniebieski

ma 14 znaków, nawet jak użyjemy 64 bitowego int’a to na znak przypada:

4.6 bitów

czyli musiałbyś umieć zakodować znak w 4 bitach, nawet jak weźmiesz tylko małe litery to i tak nie starczy.

Poza tym chyba są kolory o nazwach dłuższych niż 14 znaków.

No tak nie wziąłem pod uwagę ograniczenia typu ;/

Można by pobierać pierwsze 9 (max niebieski) bo przecież sensem programu jest wyświetlenie wyniku tylko dla 3 kolorów :smiley: , przy 64bitowym incie dałoby 7bitów czyli max 127, akurat tyle ile mają podstawowe znaki ascii ;]

Sądzę że podstawowych jest znacznie więcej, to tylko na wstępie autor tematu zrobił trzy kolory.

Zapomniałeś też o kolorze żółtym w którym jest trzy polskie litery, który owszem się mieszczą w podstawowych 127 znaków ale pod warunkiem odpowiedniego kodowania i tu zaczynają się schody :smiley:

Jak by się uprzeć można by zrobić tablicę z 40? elementami w niej zapisać na sztywno znaki i przy podmianie nie zmieniać na kod ascii a na index tablicy :o

Nie ma to jak uprzykrzać sobie życie :smiley:

Z takim samym sukcesem możesz najpierw zidentyfikować kolor moją metodą potem do zmiennej wpisać Ord(k) lub -1 jeżeli nie znaleziono. A dalej porównywać w:

case kolor(x) of

i będzie znacznie prościej.

Czemu? Także w kodzie alien279 case można bez problemu zamienić na if…else i byłaby to chyba lepsza opcja, ale jeśli trzeba użyć instrukcji case to nic nie stoi na przeszkodzie żeby w pętli odczytać tylko indeks w tablicy kolorów i użyć w case

cayman3_11 , czyli (jeżeli dobrze rozumiem) informacje ze zmiennej ok (typu jest kolor/niema koloru) uzyskaną przez skanowanie tablicy lub nazw enum’a, proponujesz zamienić na indeks koloru lub zmienną typu enum aby potem za pomocą case

znowu sprowadzić informacje do postaci: jest kolor/niema koloru, dobrze rozumiem?

Gratuluje pomysłowości.

Tak przy okazji rozwijając twój pomysł można by też gdzieś w trakcie tego kodu zrobić kompresje danych zip/gzip/lh, zakodować to za pomocą steganografii do obrazku, wystawić go na jakiś wklej.to lub inny, potem ten obrazek wczytać łącząc się przez sokety, rozkodować i dopiero wyświetlić informacje czy to podstawowy kolor czy nie.

chyba jednak się nie rozumiemy. Po pierwsze musi być użyta instrukcja case…of. Gdyby nie to cały program sprowadzałby się do sprawdzenia czy wpisany przez użytkownika tekst to czerwony lub żółty lub niebieski. Jeśli tak wyświetl “kolor podstawowy”, w przeciwnym razie wyświetl “inny kolor lub błąd”. Ty uważasz jednak, że:

Heh chłopaki sprawdźcie Wikipedia i są 3 kolory podstawowe, a mi chodzi o jak najprostszy program z funkcją case no już bez motania kolorów np jasnoniebieski tylko np. jednowyrazowe, a nie takich: http://pl.wikipedia.org/wiki/Lista_kolor%C3%B3w chodź może jest jakaś funkcja hex :D?