Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Tłumaczenie: mgr Jerzy Wałaszek

©2023 mgr Jerzy Wałaszek
I LO w Tarnowie

Rozdział 15

Więcej o PRINT i INPUT

Kilka bardziej skomplikowanych zastosowań tych rozkazów z użyciem separatorów: , ; ' TAB, AT, LINE i CLS

SPIS TREŚCI

Rozdział 15: Więcej o PRINT i INPUT

Podsumowanie

CLS
Elementy polecenia PRINT: puste polecenie
Wyrażenia (typu liczbowego lub łańcuchowego): TAB wyrażenie liczbowe, AT wyrażenie liczbowe, wyrażenie liczbowe
Separatory polecenia PRINT: , ; '
Elementy polecenia INPUT: zmienne (typu liczbowego lub łańcuchowego)
LINE zmienna łańcuchowa
Dowolny element polecenia PRINT nie rozpoczynający się literą. (Tokeny nie uważa się za rozpoczynające się od litery, ponieważ są całością o jednym kodzie.)
Przewijanie ekranu.
SCREEN$


Polecenie PRINT widziałeś już dosyć często, zatem posiadasz pewne pojęcie, jak się je używa. Wyrażenia, których wartości się drukuje, nazywają się elementami PRINT i rozdziela się je przecinkami lub średnikami, które nazywamy separatorami PRINT. Elementu PRINT może wcale nie być, co pozwala wyjaśnić zachowanie się tego polecenia, gdy użyjesz w wierszu dwa przecinki.

Istnieją dwa dodatkowe rodzaje elementów PRINT, których używa się, aby powiedzieć komputerowi nie co, lecz gdzie ma drukować. Na przykład, PRINT AT 11,16;"*" wydrukuje gwiazdkę na środku ekranu.

AT wiersz, kolumna

przesuwa pozycję PRINT (miejsce, gdzie zostanie wydrukowany kolejny element) do podanego wiersza i kolumny. Wiersze są numerowane od 0 (u góry ekranu) do 21, a kolumny od 0 (po lewej) do 31.

SCREEN$ jest funkcją odwrotną do PRINT AT i powie ci (w określonych granicach), jaki znak znajduje się na danej pozycji na ekranie. Używa ona numerów wierszy i kolumn w ten sam sposób co PRINT AT, lecz ujętych w nawiasy: na przykład:

PRINT SCREEN$(11,16)

odczyta gwiazdkę wydrukowaną przez poprzednie polecenie.

Znaki wzięte z tokenów zostaną rozpoznane jako pojedyncze litery, a puste miejsca jako spacje. Niestety, linie rysowane przez PLOT, DRAW lub CIRCLE, grafika definiowana przez użytkownika i znaki graficzne dają w wyniku pusty łańcuch. Tak samo będzie, gdy zostanie zastosowana funkcja OVER do otrzymania znaku złożonego. Powodem takiego zachowania się SCREEN$ jest to, iż porównuje ona zawartość pola znaku na ekranie z matrycami kształtów znaków w ROM. Jeśli wystąpi niezgodność na poziomie choćby jednego piksela, znak nie zostanie rozpoznany — aż takie mądre to nie jest, to tylko prosta namiastka optycznego rozpoznawania znaków.
 

obrazek

 

 

TAB kolumna

drukuje wystarczającą liczbę spacji, aby przesunąć pozycję druku do określonej kolumny. Pozostaje w tym samym wierszu lub , jeśli wymagałoby to cofania się, przechodzi do następnego wiersza. Zwróć uwagę, że komputer redukuje numer kolumny 'modulo 32' (dzieli przez 32 i bierze resztę z dzielenia); zatem TAB 33 oznacza to samo co TAB 1.

Poniższy przykład:

PRINT TAB 30;1;TAB 12;"Zawartosc";AT 3,1;"ROZDZIAL";TAB 24;"strona"

pokazuje, w jaki sposób mógłbyś wydrukować nagłówek strony ze spisem treści jakiejś książki.

Spróbuj uruchomić to:

10 FOR n=0 TO 20
20 PRINT TAB 8*n;n;
30 NEXT n

Pokazuje to, co oznacza, że liczby TAB są redukowane modulo 32.

Aby otrzymać bardziej elegancki przykład, zmień 8 w wierszu 20 na 6.

Kilka małych uwag:

(i) Te nowe elementy najlepiej kończyć średnikami, jak robiliśmy to powyżej. Możesz używać przecinków (a na końcu polecenia nawet niczego), lecz będzie to oznaczało, że po troskliwym ustawieniu pozycji PRINT natychmiast przenosisz ją gdzieś indziej — zwykle niezbyt użyteczne.

(ii) Nie możesz drukować w dwóch dolnych wierszach (22 i 23) ekranu, ponieważ są one zarezerwowane na rozkazy, dane dla INPUT, raporty itd. 'Dolny wiersz' zwykle oznacza wiersz 21.

(iii) Możesz stosować AT, aby umieścić pozycję PRINT nawet tam, gdzie już coś zostało wydrukowane; poprzednia treść zostanie usunięta w niebyt, gdy zaczniesz więcej drukować.

Kolejnym poleceniem związanym z PRINT jest CLS. Czyści ono cały ekran, czyli wykonuje coś, co również robią polecenia CLEAR i RUN.

Gdy wydruk osiąga spód ekranu, ekran zaczyna się przewijać w górę jak w maszynie do pisania. Zobaczysz to, jeśli wykonasz:

CLS: FOR n=1 TO 22: PRINT n: NEXT n

a następnie kilka razy:

PRINT 99

Jeśli komputer wypisuje na ekran mnóstwo tekstu, to troszczy się, aby nic nie zostało przewinięte poza górny margines ekranu, zanim zdążysz się temu przyjrzeć. Zobaczysz ten efekt, jeśli wpiszesz:

CLS: FOR n=1 TO 100: PRINT n: NEXT n

Gdy zostanie zapisany ekran tekstu, program zatrzyma wydruk i wypisze scroll? (przewinąć?) na spodzie ekranu. Teraz możesz wygodnie przeglądnąć pierwsze 22 liczby. Gdy z nimi skończysz, naciśnij y (dla 'yes' —  tak), a komputer da ci kolejny ekran pełen liczb. Właściwie kontynuację powoduje każdy klawisz z wyjątkiem n (dla 'no' — nie), STOP (SYMBOL SHIFT i A) lub SPACE (klawisz BREAK). Powodują one zatrzymanie wykonywania programu z komunikatem D BREAK - CONT repeats (D PRZERWANIE - CONT powtarza).

Polecenie INPUT może robić o wiele więcej, niż powiedzieliśmy ci dotychczas. Widziałeś już polecenia INPUT w stylu:

INPUT "Ile masz lat?",wiek

w których komputer wypisuje napis Ile masz lat? na spodzie ekranu, a następnie musisz wpisać swój wiek.

W rzeczywistości polecenie INPUT zbudowane jest z elementów i separatorów dokładnie w taki sam sposób jak polecenie PRINT, zatem zarówno Ile masz lat? jak i wiek są elementami INPUT. Elementy te są zwykle takie same jak elementy PRINT, lecz istnieje kilka bardzo ważnych różnic.

Po pierwsze, oczywistym dodatkowym elementem INPUT jest zmienna, której wartość masz wpisać — w powyższym przykładzie wiek. Regułą jest, że jeśli element INPUT rozpoczyna się od litery, to musi być zmienną, której wartość ma być wprowadzona.

Po drugie, to oznaczałoby, że nie możesz wydrukować wartości zmiennych jako części napisu; jednakże możesz to obejść przez umieszczenie zmiennej w nawiasach. Każde wyrażenie rozpoczynające się od litery musi być umieszczone w nawiasach, jeśli ma zostać wydrukowane jako część napisu.

Dowolnego rodzaju element PRINT, na którego nie wpływają te reguły, jest również elementem INPUT. Oto przykład ilustrujący nasze wywody:

LET moj wiek=INT(RND*100): INPUT ("Mam ";moj wiek;" lat. ");"A ile ty masz lat?",twoj wiek

Zmienna moj wiek jest umieszczone w nawiasach, zatem jej zawartość zostanie wydrukowana. Zmienna twoj wiek nie jest umieszczona w nawiasach, zatem będziesz musiał wpisać jej wartość.

Wszystko wypisywane przez polecenie INPUT trafia do dolnej części ekranu, która działa jakby niezależnie od górnej części. W szczególności wiersze są numerowane względem górnego wiersza dolnej części, nawet gdy została ona powiększona w górę ekranu telewizyjnego (co się zdarza, jeśli wpisujesz mnóstwo danych dla polecenia INPUT).

Aby zobaczyć, jak AT działa w poleceniach INPUT, spróbuj uruchomić to:

10 INPUT "To jest wiersz 1."a$; AT 0,0;"To jest wiersz 0."a$; AT 2,0;"To jest wiersz 2.",a$; AT 1,0;"To dalej jest wiersz 1.",a$

(za każdym razem, gdy się zatrzyma, po prostu naciskaj ENTER.) Gdy jest drukowane To jest wiersz 2., dolna część ekranu rozbudowuje się w górę, aby zrobić na nie miejsce; lecz numeracja też idzie w górę, aby wiersze zachowały te same numery.

Teraz spróbuj tego:

10 For n=0 TO 19: PRINT AT n,0;n;: NEXT n
20 INPUT AT 0,0;a$; AT 1,0;a$; AT 2,0;a$; AT 3,0;a$; AT 4,0;a$;AT 5,0;a$

Gdy dolna część rośnie w górę ekranu, górnej to nie przeszkadza aż do momentu, gdy część dolna grozi nadpisaniem tego samego wiersza, w którym znajduje się pozycja PRINT. Wtedy górna część ekranu również zaczyna się przewijać w górę, aby temu zapobiec.

Kolejna subtelność polecenia INPUT, której jeszcze nie widzieliśmy, nazywa się LINE i pozwala wprowadzać w inny sposób dane dla zmiennych łańcuchowych. Jeśli przed nazwą zmiennej łańcuchowej umieścisz LINE, jak w:

INPUT LINE a$

to komputer nie wyświetli znaków cudzysłowu, które zwykle pojawiają się przy zmiennej łańcuchowej, chociaż będzie on udawał, że tam są. Zatem, gdy wpiszesz:

kot

jako dane dla INPUT, zmienna a$ otrzyma wartość kot. Ponieważ cudzysłowy łańcucha nie pojawiają się przy wprowadzaniu danych, nie możesz ich wykasować i wpisać innego rodzaju wyrażenia łańcuchowego jako danych dla INPUT. Pamiętaj, że element LINE nie może być stosowany przy zmiennych liczbowych.

Znaki sterujące CHR$ 22 i CHR$ 23 dają efekt podobny do AT i TAB. Jako znaki kontrolne są one raczej dziwne, ponieważ zawsze, gdy jeden jest wysyłany do wydruku na ekranie, muszą za nim wystąpić dwa dodatkowe znaki, które nie posiadają swojego zwykłego znaczenia: są one traktowane jako liczby (ich kody) określające wiersz i kolumnę (dla AT) lub pozycję tabulacji (dla TAB). Prawie zawsze łatwiejsze jest użycie w normalny sposób AT i TAB niż tych znaków sterujących, lecz w pewnych okolicznościach mogą się przydać. Znakiem sterującym dla AT jest CHR$ 22. Pierwszy znak za nim określa numer wiersza, a drugi numer kolumny, zatem:

PRINT CHR$ 22+CHR$1+CHR$ c;

ma dokładnie takie samo działanie jak:

PRINT AT 1,c;

Dzieje się tak, nawet gdy CHR$ 1 lub CHR$ c normalnie miałyby inne znaczenia (przykładowo dla c=13); umieszczenie przed nimi CHR$ 22 zmienia to.

Znakiem sterującym TAB jest CHR$ 23, a dwa znaki z nim są używane do otrzymania liczby pomiędzy 0 a 65535, która określa wartość dla elementu TAB:

PRINT CHR$ 23+CHR$ a+CHR$ b;

ma takie samo działanie jak:

PRINT TAB a+256*b;

Aby zakazać komputerowi pytania się o przewijanie ekranu napisem scroll?, możesz używać za każdym razem polecenia POKE

POKE 23692,255

Po jego wykonaniu ekran będzie przewijany przez 255 wierszy, zanim ponownie zatrzyma się z napisem scroll?. Jako przykład, wypróbuj:

10 FOR n=0 TO 10000
20 PRINT n: POKE 23692,255
30 NEXT n

i patrz, jak wszystko śwista z ekranu!

Ćwiczenia

  1. Wypróbuj ten program na jakiś dzieciach, aby sprawdzić ich znajomość tabliczki mnożenia.

      10 LET m$=""
      20 LET a=INT (RND*12)+1: LET b=INT (RND*12)+1
      30 INPUT (m$)' ' "ile jest "(a);" * ";(b);"?";c
    100 IF c=a*b THEN LET m$="Dobrze": GO TO 20
    110 LET m$="Zle. Sprobuj jeszcze raz.": GO TO 30

    Jeśli są one spostrzegawcze, to mogą odkryć, że wcale nie muszą same robić tych obliczeń. Na przykład, gdy komputer prosi je o wpisanie odpowiedzi na 2*3, wystarczy, że wpiszą 2*3*.

    Jednym ze sposobów zapobieżenia temu jest zmiana danych wejściowych z liczb na łańcuchy. Zamień c w wierszu 30 przez c$, a w wierszu 100 przez VAL c$ oraz wprowadź dodatkowy wiersz


    40 IF c$<> STR$ VAL c$ THEN LET m$="Wpisuj tylko liczby.":GO TO 30

    To ich oszuka. Jednakże po kilku dniach jeden z nich może odkryć, że wciąż jest w stanie obejść rachunki przez wymazanie cudzysłowów łańcucha i wpisanie STR$ (2*3). Aby definitywnie zatrzymać te wykręty, możesz zastąpić c$ w wierszu 30 przez LINE c$.
Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2023 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.