Jest wynikiem wykonania instrukcji. Pisanie kodu programu przy użyciu procedur

Pierwszym operandem - "wyrażenie1" - może być dowolne wyrażenie, którego wynikiem jest wartość typu bool. Jeśli wynik jest PRAWDA , wówczas wykonywany jest operator określony przez drugi operand, czyli „wyrażenie2”.

Jeśli pierwszy operand jest równy FAŁSZ , wówczas wykonywany jest trzeci operand - „wyrażenie3”. Drugi i trzeci operand, czyli „wyrażenie2” i „wyrażenie3”, muszą zwracać wartości tego samego typu i nie mogą być typu void. Wynikiem wykonania instrukcji warunkowej jest wynik „wyrażenia2” lub wynik „wyrażenia3”, w zależności od wyniku „wyrażenia1”.

Ograniczenia użytkowania operatora

Operator bazujący na wartości „wyrażenie1” musi zwrócić jedną z dwóch wartości – albo „wyrażenie2”, albo „wyrażenie3”. Istnieje wiele ograniczeń dotyczących tych wyrażeń:

  1. Nie można mieszać typu zdefiniowanego przez użytkownika z typem prostym lub wyliczeniem. Dopuszczalne jest użycie NULL dla wskaźnika.
  2. Jeśli typy wartości są proste, typem operatora będzie typ maksymalny (zobacz Wymuszanie typu).
  3. Jeśli jedna z wartości jest typem wyliczeniowym, a druga jest typem numerycznym, to wyliczenie zostaje zastąpione przez int i obowiązuje druga reguła.
  4. Jeżeli obie wartości są wartościami wyliczeniowymi, to ich typy muszą być takie same, a typem operatora będzie wyliczenie.

Ograniczenia dla typów niestandardowych (klas lub struktur):

  1. typy muszą być takie same lub jeden musi dziedziczyć po drugim.
  2. jeśli typy nie są takie same (dziedziczenie), wówczas dziecko jest niejawnie rzutowane na rodzica, to znaczy typem operatora będzie typ rodzica.
  3. Nie można mieszać obiektu i wskaźnika — oba wyrażenia są obiektami lub wskaźnikami. Dopuszczalne jest użycie NULL dla wskaźnika.

Notatka

Należy zachować ostrożność podczas używania operatora warunkowego jako argumentu przeciążonej funkcji, ponieważ typ wyniku operatora warunkowego jest określany w momencie kompilacji programu. Ten typ jest zdefiniowany jako większy typ typów „wyrażenie2” i „wyrażenie3”.

Przykład:

void func(double d) ( Drukuj („podwójny argument: „ ,d); )
void func(string s) ( Drukuj („argument ciągu: „, s); )

bool Wyrażenie1=prawda;
podwójne Wyrażenie2=M_PI;
string Wyrażenie3= "3,1415926" ;

unieważnij OnStart()
{
func(Wyrażenie2);
func(Wyrażenie3);

func(Wyrażenie1?Wyrażenie2:Wyrażenie3);
func(!Wyrażenie1?Wyrażenie2:Wyrażenie3);// pobierz ostrzeżenie kompilatora o jawnym rzutowaniu na typ łańcuchowy
}

// Wynik:
// podwójny argument: 3.141592653589793

// argument ciągu: 3.141592653589793
// argument ciągu: 3.1415926

Operator to element języka, który określa pełny opis czynności, która ma zostać wykonana. Każdy operator jest pełną frazą języka programowania i określa jakiś całkowicie zakończony etap przetwarzania danych. Operatory mogą obejmować słowa funkcyjne, dane, wyrażenia i inne operatory. W języku angielskim pojęcie to oznacza się słowem „oświadczenie”, które oznacza również „zdanie”.

Każdy operator w dowolnym języku programowania ma swój specyficzny składnia I semantyka. Pod składnia Operator rozumiany jest jako system reguł (gramatyki), który określa jego zapis za pomocą elementów alfabetu danego języka, który wraz z różnymi symbolami zawiera np. słowa funkcyjne. Pod semantyka operator rozumie jego znaczenie, tj. te działania, które odpowiadają zapisowi konkretnego operatora. Na przykład nagrywaj ja:= ja + 1 jest przykładem składniowo poprawnej notacji operator przypisania w języku Pascal, którego semantyka jest w tym przypadku następująca: wyodrębnij wartość komórki pamięci odpowiadającą zmiennej i, dodaj ją o jeden i zapisz wynik do tej samej komórki pamięci.

W większości proceduralnych języków programowania zestaw operatorów jest prawie taki sam i składa się z operatora przypisania, operatorów selekcji, operatorów pętli, operatora wywołania procedury i operatorów skoku. Czasami rozróżnia się także operatory puste (brak akcji) i złożone. Wiele operatorów jest sposobem reprezentowania pewnych konstrukcji algorytmicznych (patrz „ Projekty algorytmiczne”) w języku programowania. Przyjrzyjmy się grupom operatorów bardziej szczegółowo, korzystając ze składni języka Pascal.

Operator przypisania

Przypisanie to czynność komputera, w wyniku której zmienna otrzymuje wartość obliczonego wyrażenia (jest umieszczana w komórce pamięci odpowiadającej zmiennej). Aby opisać takie działanie w językach programowania, istnieje operator przypisania.

Ogólnie operator przypisania zapisuje się w następujący sposób:

<переменная> <знак присваивания> <выражение>

Na przykład w języku Pascal jako znak przypisania używana jest kombinacja symboli: =. W wielu innych językach jest to znak równości.

Efektem wykonania operatora przypisania jest zmiana stanu danych: wszystkich zmiennych innych niż zmienny, znajdujące się po lewej stronie operatora przypisania, nie zmieniają ich znaczenia, lecz określone zmienny dostaje wartość wyrażenia, znajdujący się po prawej stronie operatora przypisania. W większości przypadków wymagane jest podanie typu wyrażenia pasował do typu zmienny. Jeżeli tak nie jest, to albo uznaje się, że operator jest niepoprawny składniowo, albo typ wyrażenia jest konwertowany na typ zmiennej (patrz „ Typy danych” ).

Operatory selekcji

Operatory te nazywane są inaczej Instrukcje warunkowe. Instrukcje warunkowe służą do programowania algorytmów zawierających konstrukcję rozgałęzienia algorytmicznego.

W językach programowania istnieje kilka typów instrukcji warunkowych. Pełna instrukcja warunkowa odpowiada strukturze algorytmicznej pełnego rozgałęzienia:

W języku programowania odpowiedni operator warunkowy ma postać:

jeśli B Następnie S1 w przeciwnym razie S2

Jeśli wyrażenie B, która jest obliczana na początku wykonania instrukcji warunkowej, ma wartość „true”, wówczas instrukcja zostanie wykonana S1, w przeciwnym razie - operator S2. Operatorzy S1 I S2 może być złożony.

Algorytmiczna struktura niepełnego rozgałęzienia jest realizowana za pomocą niepełnego operatora warunkowego, który ma postać:

jeśli B Następnie S

Tutaj B jest wyrażeniem logicznym, oraz S- dowolny operator. Operator S zostanie wykonane, jeśli wyrażenie B będzie prawdziwe.

Jeśli operator warunkowy implementuje tylko dwie gałęzie wyboru („tak” i „nie”), to używa operatora wariantowego (sprawa-operator) można zaprogramować strukturę wielobranżową. Operator wariantu wygląda następująco:

sprawa E z

Ten operator jest wykonywany w następujący sposób: wartość wyrażenia mi przeszukiwane wśród wartości znajdujących się w rekordzie operatora V1, V2, …, Vn, a jeśli taka wartość zostanie znaleziona, wykonywany jest odpowiedni operator S1, S2, …, Sn.

W różnych językach programowania składnia, a nawet semantyka wymienionych operatorów może się różnić, ale możliwości zapewniane programiście przez takie konstrukcje są w przybliżeniu takie same.

Przykład 1. W artykule " Projekty algorytmiczne”2 podano przykład napisania algorytmu rozwiązywania uogólnionego równania kwadratowego za pomocą konstrukcji rozgałęziających. Oto fragment programu w Pascalu, który implementuje ten sam algorytm:

Jeśli a = 0 Następnie

Jeśli b = 0 Następnie

jeśli c = 0 Następnie writeln("x - dowolny")

w przeciwnym razie writeln("bez korzeni")

w przeciwnym razie napiszln(-c/b)

inaczej zacznij

D:= b*b - 4*a*c;

Jeśli D< 0 Następnie writeln("bez korzeni")

inaczej zacznij

x1:= -b + sqrt(D);

x2:= -b - sqrt(D);

writeln(x1:0:2,""", x2:0:2)

Instrukcje pętli

Operatory pętli implementują cykliczne struktury algorytmiczne; wykorzystywane są do działań, które powtarzają się wielokrotnie. W wielu językach programowania istnieją trzy typy operatorów pętli: „z warunkiem wstępnym”, „z warunkiem końcowym”, „z parametrem”.

Niezbędną i wystarczającą strukturą algorytmiczną dla pętli programistycznych jest pętla „z warunkiem wstępnym”, dlatego można ją nazwać pętlą głównego typu. Operator pętli z warunkiem wstępnym wygląda następująco:

podczas gdy B Do S

Operator S, dla którego tworzona jest pętla do wielokrotnego wykonania, nazywa się ciało pętli. Wykonanie operatora pętli sprowadza się do wielokrotnego wykonywania treści pętli aż do osiągnięcia wartości wyrażenia logicznego B prawda (aż stanie się fałszywa). W rzeczywistości podobne instrukcje pętlowe implementują wielokrotne wykonywanie instrukcji warunkowych Jeśli B Następnie S, gdy warunek jest prawdziwy B.

Przykład 2. Rozważ użycie takiego operatora pętli do obliczenia sumy cyfr liczby naturalnej N:

chwila N>0 zacznij

S:=S+N mod 10;

N:=N div 10

W pętli z warunkiem końcowym treść pętli poprzedza warunek B. W przeciwieństwie do pętli z warunkiem wstępnym, tutaj B jest warunkiem zakończenia pętli. Operator pętli z warunkiem końcowym w Pascalu ma postać:

powtórz S dopóki B

Przy takiej organizacji cyklu, jest to treść cyklu S należy wykonać przynajmniej raz.

W prawie wszystkich językach proceduralnych istnieje operator pętli z parametrem. Można to przedstawić schematycznie w następujący sposób:

Do< zmienny > E1 Do E2 krok E3 Do S

Oto znaczenie zmienny(parametr cyklu) zmienia się z wartości wyrażenia E1 na E2 w krokach E3. Dla każdej takiej wartości parametru pętli wykonywany jest operator S. W języku Pascal w opisie tego operatora nie ma pojęcia kroku, a sam krok dla parametru pętli całkowitej może być równy 1 lub . –1. Operator „pętla z parametrem” służy do programowania pętli z określoną liczbą powtórzeń. Nie nadaje się do programowania pętli iteracyjnych (których liczba powtórzeń nie jest z góry znana).

Operator wywołania procedury

W artykule " Podprogramy” opisuje szczegółowo tego typu podprogramy, takie jak procedury. Standardowe procedury języka programowania zawarte w jednej z bibliotek procedur, a także procedury użytkownika opisane w tym bloku, wywoływane są za pomocą operatora wywołanie procedury:

<имя процедуры>(E1,E2,…,En)

Tutaj E1, E2,…, En są zmiennymi lub wyrażeniami, które reprezentują rzeczywiste parametry dostęp do procedury. Najczęściej używanymi procedurami standardowymi są procedury wejściowe i wyjściowe (odczyt i zapis w języku Pascal).

Wywołanie procedury jest semantycznie równoznaczne z wykonaniem bloku opisanego jako ciało procedury, po przekazaniu do niego początkowych wartości niektórych zmiennych (parametrów wartości) lub zastąpieniu nazw niektórych zmiennych (parametrów zmiennych) nazwami aktualne zmienne określone podczas wywoływania procedury.

Przykład 3. Opiszmy procedurę abc:

procedura abc(a,b:liczba całkowita; odm c: liczba całkowita);

Wywołanie tej procedury abc(2,3,x) jest równoważne blokowi akcji:

Operatorzy skoków

Najbardziej znanym operatorem z tej grupy jest operator skoku bezwarunkowego iść do. Jeśli dodasz do wszystkich lub niektórych istniejących instrukcji programu tagi, wówczas w programie możliwe staje się zastosowanie operatora przejścia w postaci:

iść do<метка>

Etykieta w tym przypadku odpowiada początkowi instrukcji, od której należy kontynuować wykonywanie programu. Operator ten umożliwia pisanie algorytmów w języku programowania o dowolnie złożonej strukturze. Ale często stosowanie bezwarunkowego przejścia jest nieuzasadnione, ponieważ prowadzi do zagmatwanego i trudnego do odczytania programu. Prawie jedyne sensowne zastosowanie operatora iść do jest wyjściem z kilku zagnieżdżonych pętli jednocześnie, na przykład podczas przetwarzania tablic dwuwymiarowych.

Przykład 4. Załóżmy, że musimy ustalić, czy dwuwymiarowa tablica a zawiera element równy 0:

Do ja:= 1 Do N Do

dla j:= 1 Do N Do

jeśli a = 0 potem zacznij

1: Jeśli B Następnie napisz("jest") w przeciwnym razie napisz("nie");

Program opracowany zgodnie z zasadami programowania strukturalnego nie powinien zawierać operatorów skoków bezwarunkowych. Powyższy program bez użycia operatora iść do można przepisać w następujący sposób:

podczas gdy nie B I(I< N) zacznij

podczas gdy nie B I(J< N) zacznij

Jeśli a = 0 Następnie b:= prawda;

Jeśli B Następnie napisz("jest") w przeciwnym razie napisz("nie");

W tym przypadku program strukturalny jest mniej wizualny niż program z iść do.

Inne operatory skoków można zdefiniować w językach programowania. Na przykład w Pascalu: przerwa(wcześniejsze przerwanie pętli, przejście do instrukcji, która musi zostać wykonana po zakończeniu pętli), Kontynuować(wcześniejsze zakończenie bieżącej iteracji pętli i przejście do kolejnej), Wyjście(wcześniejsze przerwanie podprogramu, wyjście z niego), postój(wcześniejsze przerwanie programu, przejście do jego zakończenia). Podobne operatory istnieją w językach C, C++ i Java.

Operator złożony

Instrukcja złożona to grupa instrukcji ujętych w nawiasy operatorowe (w języku Pascal - zaczynaćkoniec; w C, C++ - (…)).

Operator złożony został wprowadzony do języków programowania, aby ułatwić opis konstrukcji językowych. Na przykład w Pascalu wykonywalna część każdego bloku (programu, procedury, funkcji) jest jedną instrukcją złożoną. Dokładnie w ten sam sposób ciało dowolnego operatora pętli składa się tylko z jednego operatora, być może złożonego. Alternatywą dla operatora złożonego może być słowo funkcyjne wskazujące koniec konkretnego operatora, np. KONIEC JEŚLI w języku podstawowym.

Temat „Operatory języka programowania” jest zwykle studiowany tylko w kontekście konkretnego języka programowania. Przy rozważaniu tego ważne jest pokazanie powiązania pomiędzy podstawowymi konstrukcjami algorytmicznymi a operatorami: konstrukcje algorytmiczne pisane są w języku programowania przy użyciu odpowiednich operatorów. Wyjątkiem jest w pewnym sensie konstrukcja sekwencyjna, która wyznacza liniowy porządek działań. Akcje w programie ściśle liniowym realizowane są wyłącznie za pomocą instrukcji przypisania i instrukcji wywołania procedury.

Na początkowym etapie nauki programowania uczniowie napotykają wiele problemów. Pierwszą barierą psychologiczną, którą muszą pokonać, jest nauka operatora przypisania. Jednym z głównych zadań, które musisz rozwiązać wspólnie ze swoimi uczniami, jest zamiana wartości dwóch zmiennych. Możesz poprosić uczniów, aby mentalnie rozwiązali problem zamiany zawartości dwóch szuflad, na przykład biurka. Zazwyczaj na tym etapie dyskusji uczniowie zdają sobie sprawę, że do rozwiązania problemu potrzebne jest trzecie pole (zmienna). Jednak pisząc ten algorytm często mylą się, w której części operatora przypisania (lewej czy prawej) powinna pojawić się konkretna zmienna.

Błędy w pisaniu wyrażeń arytmetycznych i logicznych wynikają z nieznajomości pierwszeństwa operacji używanych w wyrażeniu. Jednocześnie operacje oznaczają nie tylko arytmetykę, ale także operacje porównania i spójniki logiczne, a w języku C operację przypisania, co jest bardzo nietypowe dla uczniów. Sytuację komplikuje fakt, że w różnych językach programowania te same operacje mają różne względne priorytety. Należy także zwrócić uwagę na zgodność typów zmiennej z wyrażeniem po lewej i prawej stronie operatora przypisania (patrz „ Typy danych”).

Podczas opanowywania operatorów selekcji przydatne jest, aby uczestnicy kursu zaprogramowali algorytm zawierający strukturę wielogałęziową, zarówno przy użyciu kombinacji instrukcji warunkowych, jak i przy użyciu operatora selekcji.

Przykład. Do zmiennej całkowitej N Wprowadź wiek osoby w latach. Wpisz frazę „ Mam K lat”, zastępując słowo lata NA rok Lub roku w zależności od numeru K. Oto dwa rozwiązania tego problemu:

Jeśli(k mod 100) W

Następnie writeln("Mam ",k", lat")

sprawa k mod 10 z

0,5..9:writeln("Mam ",k", lat");

1:writeln("Mam ",k", lat");

2..4:writeln("Mam ",k", lat");

var k, n: liczba całkowita;

czytajln(k); n:= k mod 10;

Jeśli(k mod 100) W

Następnie writeln("Mam ",k", lat") w przeciwnym razie

Jeśli n=1 Następnie writeln("Mam ",k", lat")

Jeśli(n >=) I(N<= 4)

Następnie writeln("Mam ",k", lat")

w przeciwnym razie writeln("Mam ",k", lat")

Rozważając operatory pętli, warto zaproponować zaprogramowanie tego samego zadania na trzy różne sposoby przy użyciu trzech operatorów pętli i odwrotnie, w oparciu o warunki problemu, nauczyć się określać, który operator pętli jest najbardziej odpowiedni w konkretnym przypadku.

Operator wywołania procedury jest na pierwszy rzut oka prosty. W tym miejscu ważne jest wyjaśnienie zasad przekazywania parametrów do procedur i funkcji, różnica pomiędzy parametrami zmiennych a parametrami wartości (w tym drugim przypadku możemy przekazać nie tylko nazwę zmiennej, ale także stałą lub nawet wyrażenie odpowiadającej jej wartości) typ). Parametry formalne i faktyczne muszą odpowiadać rodzajowi, a nie nazwie, co dla studentów nie jest oczywiste.

Przestudiowanie instrukcji warunkowej, a zwłaszcza instrukcji złożonej, jest dobrą okazją do porozmawiania z uczniami o stylu pisania programów. Istnieje kilka powszechnych sposobów pisania programów strukturalnych w Pascalu, ale wszystkie zawierają wcięcia umożliwiające dostosowanie zagnieżdżonych struktur. Ważne przy nagrywaniu programów i komentarzy.

Wyjście danych
Wysyłanie danych z pamięci RAM na ekran monitora:
pisać
(<выражение 1> ,< выражение 2> , ...,< выражение N>)
lista wyjściowa
Wyrażenia - symboliczne, numeryczne, logiczne,
łącznie ze zmiennymi i stałymi
Przykład:
napisz("s=", s).
Dla s=15 na ekranie pojawi się: s=15.
Informacje ujęte w cudzysłów są wyświetlane na ekranie
bez zmian

Opcje organizacji wyników
Opcja
organizacja wycofania
Brak separatorów
Operator wnioskowania
napisz (1, 20, 300).
Wynik
120300
Dodaj ograniczniki, napisz (1, ’,’ , 20,
– przecinki
’, ’, 300)
1, 20, 300
Dodaj ograniczniki, napisz (1, „”, 2, „”, 3)
– spacje
1 20 300

Format wyjściowy
Format wyjściowy umożliwia ustawienie liczby pozycji
na ekranie zajmowanym przez wyświetlaną wartość.
napisz(s:x:y)
x – łączna liczba stanowisk przypisanych do danego numeru;
y - liczba pozycji w części ułamkowej liczby.
Operator wnioskowania
Wynik wykonania
operator
write(‘s=’, s:2:0);
s=15
write(‘s=’, s:3:1);
s=15,0
write(‘s=’, s:5:1);
s=
napisz
15.0
- wyjście z nowej linii!

Pierwszy program
program n_1;
stała pi=3,14;
var r, c, s: rzeczywisty;
zaczynać
r:=5,4;
c:=2*pi*r;
Wynik programu:
s:=pi*r*r;
writeln("c="", c:6:4);
writeln("s=", s:6:4)
Turbo Pascala
Wersja 7.0
koniec.
c =33,9120
s = 91,5624

Wejście klawiatury
Wprowadzanie wartości zmiennych do pamięci RAM:
Czytać
(<имя переменной1>, …, <имя переменной N>)
lista wejściowa
Wykonywanie instrukcji read:
1) komputer przechodzi w tryb czuwania danych:
2) użytkownik wprowadza dane z klawiatury:
wiele wartości zmiennych
można wprowadzić typy numeryczne
oddzielone spacją lub przecinkiem;
podczas wprowadzania zmiennych znakowych
Nie można używać spacji i przecinków;
3) użytkownik naciska klawisz Enter.

Wejście klawiatury
!
Typy wartości wejściowych muszą być zgodne
typy zmiennych określone w sekcji opisu
zmienne.
var i, j: integer;x: real;a: char;
czytaj (i, j, x, a);
opcje organizacji strumienia wejściowego:
1 0 2,5 A 1,0 1
2,5, A 0
2.5
A
Po wykonaniu instrukcji readln kursor przesuwa się do
Nowa linia.

Ulepszony program
program n_1;
stała pi=3,14;
var r, c, s: rzeczywisty;
zaczynać
writeln("Oblicz obwód i pole koła");
write("Wpisz r>>");
czytajln(r);
c:=2*pi*r;
Wynik programu:
s:=pi*r*r;
writeln("c="", c:6:4);
Wersja Pascala 7.0
writeln("s=", s:6:4) Turbo
Obliczanie obwodu i pola koła
Wpisz r >> 8.5
koniec.
c =53,3800
s =226,8650

Najważniejsze
Aby wprowadzić wartości zmiennych do pamięci RAM
Stosowane są operatory wejściowe read i readln.
Aby wyświetlić dane z pamięci RAM na ekranie
Monitor używa operatorów wyjściowych write i writeln.
Konieczne jest wprowadzanie danych początkowych i wyprowadzanie wyników
być zorganizowane w sposób przejrzysty i wygodny; to zapewnia
przyjazność interfejsu użytkownika.

Pytania i zadania
1) Biorąc pod uwagę fragment programu:
a:=10; b:=a+1: a:=b–a; napisz (a, b)
Jakie liczby zostaną wyświetlone na ekranie komputera?
2) Opisać zmienne potrzebne do obliczeń
obszar trójkąta wzdłuż jego trzech boków, oraz
napisz oświadczenie zawierające dane wejściowe
niezbędne dane początkowe.
3) Jaki jest rezultat wykonania instrukcji?
a) napisz (a)
b) napisz("a")
c) napisz("a=", a)
4) Należy przypisać zmienne całkowite i, j, k
odpowiednio wartości wynoszą 10, 20 i 30.
Zapisz instrukcję wejściową odpowiadającą wejściu
strumień:
a) 20 10 30
b) 30 20 10
c) 10,30,20