Prioritizează expresia aritmetică. Priorități operaționale

Salutări, dragi cititori ai site-ului blogului! Ultima dată ne-am uitat la problema în limbajul încorporat 1C:Enterprise 8. Astăzi vom vorbi despre despre prioritățile operațiilor aritmetice ale tipurilor de date primitive, și luați în considerare, de asemenea, câteva operații aritmetice consecutive. Să aruncăm o privire!

Din programa școlară, ești familiarizat cu faptul că cea mai mare prioritate în operațiile aritmetice sunt parantezele „()”.
Dacă o expresie este între paranteze, atunci ea va fi executată mai întâi. Următoarele priorități sunt operațiile unare „+” și „-”, o operație unară înseamnă că operația și o valoare sunt specificate, de exemplu „-5”. Operațiile de înmulțire și împărțire se efectuează pe al treilea, iar pe ultimul loc se efectuează adunarea și scăderea. Să ne uităm la cum funcționează:

99+15/5*8

În acest caz, primele 15 vor fi împărțite la 5, numărul rezultat va fi înmulțit cu 6, iar a treia operație: 99 va fi adăugat la numărul rezultat. În continuare, următoarea expresie simplă este 10+5/2+1. Este clar că mai întâi se va executa operația de împărțire, apoi se va executa operația de adăugare. Dacă folosești paranteze:

(90+30)/(7+5)

În acest caz, la început vom adăuga 90 și 30 și vom împărți totul la 7+5 și în acest caz expresia va fi egală cu 10. Să luăm în considerare și alte operații care sunt posibile în codul programului 1C:Enterprise 8 Perhaps ai lucrat in PHP, unde este posibil un astfel de operator i++; sau eu—;. Aceasta este o creștere sau o scădere cu o unitate. Executarea unor astfel de operatori în 1C este imposibilă, dar operatorul este posibil i++1;Şi j—1;. Să le privim mai detaliat. Acesta este un operator complet normal. Să deschidem un modul din orice director din Configurator:

Configurare -> Directoare -> Nomenclatură, faceți clic dreapta pentru a apela elementul Deschideți modulul obiect.

Pentru a evita erorile, să declarăm o variabilă în acest cod de program:

A=0; b=a++1;

Dacă verificați erori de sintaxă, nu vor exista. Chiar dacă expresia este plasată pe linii diferite:

A=0; b=a+ +1;

În general, rupturile de linie nu au niciun efect asupra execuției instrucțiunilor. Cum ar funcționa un astfel de operator? Compilatorul limbajului 1C va efectua mai întâi operația unară plus, adică +1 va da 1 și apoi la o va adăuga unul. Este același lucru cu adăugarea unui și unu. În același mod poți scrie:

A=0; b=a+-1;

Mai întâi, se efectuează operația unară cu minus, rezultatul este -1, apoi se adaugă minus și plus și rezultatul este -1. În consecință, acesta este același ca i-1. Trebuie să știți despre astfel de operațiuni specifice și să înțelegeți cum vor fi efectuate. Acest lucru vă va ajuta să prioritizați corect operațiile aritmetice în conformitate cu ordinea despre care vorbim.

Așadar, am aflat că sistemul procesează cu calm o operație în care două operații aritmetice apar pe rând, de exemplu ++, +-, -+, dar ce se întâmplă dacă scriem mai multe operații aritmetice la rând? Acest lucru poate fi verificat. Pentru a face acest lucru, deschideți 1C:Enterprise din Configurator în modul de depanare, apăsați „F5”. Să punem un punct de întrerupere, tasta „F9”, la sfârșitul expresiei noastre și să introducem o expresie simplă în tabel. În Configurator, deschideți elementul de meniu Debug -> Tableau.

Să scriem expresia 3+++5 în tabelul de scor; Platforma nu poate face o astfel de transformare. Expresia 3++5 funcționează, dar cu trei plusuri sistemul nu mai înțelege exact ce vor de la el. Dar dacă puneți paranteze 1++(+2) , atunci toate acestea se vor face corect. După cum putem observa, pentru a organiza corect munca operațiilor aritmetice, este necesar să avem o bună înțelegere a priorităților executării acestora. În articolul următor ne vom uita.

Atât în ​​comanda de atribuire, cât și în comanda writeln, am folosit expresii aritmetice, pentru care Pascal a înlocuit rezultatele calculelor lor. O expresie aritmetică constă din constante, variabile și funcții conectate prin semne de operații aritmetice.

Operațiile aritmetice au priorități (precedente) diferite. Dacă o expresie conține operații cu priorități diferite, atunci operațiile cu prioritate mai mare sunt efectuate mai întâi. Operațiile cu aceeași prioritate se execută pe rând, de la stânga la dreapta.

Semnul obișnuit de împărțire ( / ) în Pascal este folosit ca împărțire fracțională, adică împarte numere reale, iar rezultatul împărțirii este un număr real. Chiar dacă împărțiți 6 la 3, rezultatul nu va fi 2, ci 2,0, adică un număr real. Pe lângă împărțirea fracțională, există și împărțirea fără rest. div. Funcționează numai cu numere întregi, iar rezultatul împărțirii este un număr întreg. Restul este ignorat. Dacă, dimpotrivă, este nevoie de restul diviziunii, se folosește operația mod. De exemplu, expresia 20 div 63 , și rezultatul expresiei 20 mod 6 egală 2 . Spațiile nu pot fi omise în aceste expresii. Operatorul mod este util pentru a determina dacă o cantitate este divizibilă cu alta. Dacă restul împărțirii este zero, atunci se împarte fără rest.

Prioritate de operare— ordinea în care sunt efectuate operațiile într-o expresie, cu condiția ca expresia să nu indice în mod explicit ordinea în care sunt efectuate operațiile (folosind paranteze).

Dacă operațiunile au aceeași prioritate, atunci ordinea de execuție a acestor operații este determinată în funcție de proprietatea asociativității.

Asociativitatea— direcția de executare a operațiunilor dacă operațiunile au aceeași prioritate.

Tabelul 1 prezintă principalele operații în C++, prioritatea lor de execuție și asociativitatea.

Tabelul 1 - Prioritatea operațiilor în C++
Prioritate Operațiunea Asociativitatea Descriere
1 :: de la stânga la dreapta operațiune de rezoluție unică
operatie de indexare
() parantezele
. accesarea unui membru al unei structuri sau clase
-> accesarea unui membru al unei structuri sau clase printr-un pointer
2 ++ de la stânga la dreapta increment postfix
decrementul postfix
3 ++ de la dreapta la stânga increment de prefix
decrementarea prefixului
4 * de la stânga la dreapta multiplicare
/ diviziune
% restul diviziunii
5 + de la stânga la dreapta plus
scădere
6 >> de la stânga la dreapta schimba la dreapta
<< schimba la stânga
7 < de la stânga la dreapta Mai puțin
<= mai mic sau egal cu
> Mai mult
>= mai mare sau egal cu
8 == de la stânga la dreapta egală
!= nu egali
9 && de la stânga la dreapta logic ŞI
10 || de la stânga la dreapta logic SAU
11 ?: de la dreapta la stânga operație condiționată (operație ternară)
12 = de la dreapta la stânga misiunea
*= înmulțire cu atribuire
/= împărțire cu sarcină
%= restul diviziei cu misiunea
+= adaos cu atribuire
-= scăderea cu atribuire
13 , de la stânga la dreapta virgulă

Nu este întotdeauna posibil să vă amintiți prioritatea operațiilor, prin urmare, dacă nu sunteți sigur de ordinea operațiilor într-o expresie, indicați clar ordinea operațiilor, adică plasați paranteze. Să ne uităm la o bucată de cod în care prioritatea operațiunilor joacă un rol important.

// expresie incorectă int value = 5; cout<< value += 3; //(ОШИБКА) передаем в поток вывода значение переменной value + 3

Compilatorul nu va înțelege expresia din linia 3, deoarece operația de schimbare la stânga are o prioritate mai mare decât operația de atribuire a sumei. Drept urmare, un program cu o astfel de expresie nici măcar nu va putea rula. Ideea este că compilatorul înțelege această expresie nu așa cum o facem noi, ci într-un mod complet diferit. Cum va raționa compilatorul: „Există două operații în expresie și prima operație<< имеет больший приоритет, чем вторая += , ceea ce înseamnă că mai întâi voi transfera valoarea variabilei valoare în fluxul de ieșire, apoi voi adăuga 3 la?????? Nu există nimic la care să adăugați 3, deoarece variabila valoare este transmisă fluxului de ieșire.” Aici se află eroarea, iar pentru a o evita trebuie doar să puneți paranteze.

// expresie corectă int value = 5; cout<< (value += 3); // передаем в поток вывода значение переменной value + 3

În acest caz, expresia din paranteze va fi executată mai întâi, iar apoi valoarea variabilei va fi transmisă fluxului de ieșire.

Curs 4 Departamentul de Matematică Aplicată M-703, tel. 362-79-62 dr., profesor Glagolev Viktor Borisovici, camera. Zh-405b, tel. 362-73-28 http://glagvik.narod2.ru/index.htm Operații aritmetice Prioritatea operațiilor aritmetice Funcții matematice Matrice Operații logice Prioritatea operațiilor


Operații și funcții VB are un set mare de funcții încorporate. Ele pot fi împărțite în mai multe categorii: Funcții financiare și matematice Funcții matematice Funcții de procesare a șirurilor Funcții de conversie a tipurilor Alte funcții


Puteți găsi descrieri detaliate ale funcțiilor în sistemul de ajutor VB. În continuare, ne vom uita doar la funcțiile matematice VB. Tabelul din diapozitivul următor oferă o listă completă de operații care pot fi aplicate datelor numerice.


Operatii aritmetice

Operațiuni de relație


Precedența operatorului Dacă într-o expresie sunt utilizați mai mulți operatori, operațiunile cu cea mai mare prioritate sunt efectuate mai întâi. Dacă prioritatea operațiunilor este aceeași, atunci acestea sunt efectuate de la stânga la dreapta. a + b/c + d (a + b)/(c + d) Exemple Cod de expresie


Funcții matematice

Unghiurile sunt exprimate în radiani. Proiectul dvs. trebuie să importe spațiul de nume System.Math adăugând linia Imports System.Math la începutul codului sursă (înainte ca primul modul sau clasă să fie declarat). În caz contrar, înainte de numele fiecărei funcții va fi necesar să adăugați numele clasei, de exemplu: Math.Sin(x)


Importul spațiului de nume System.Math într-un proiect


Funcțiile Int și Fix returnează o valoare egală cu partea întreagă a unui număr al cărui tip se potrivește cu tipul argumentului. Sintaxă: Int(număr) și Fix(număr) Numărul de argument necesar este orice expresie numerică validă.


Diferența dintre funcțiile Int și Fix este că, pentru o valoare a argumentului negativ, funcția Int returnează cel mai apropiat număr întreg negativ mai mic sau egal cu cel specificat, în timp ce Fix returnează cel mai apropiat număr întreg negativ mai mare sau egal cu cel specificat. De exemplu, funcția Int convertește -8,4 în -9, iar funcția Fix convertește -8,4 în -8.


Funcția Rnd returnează un Single care conține un număr aleator mai mic decât 1 și mai mare sau egal cu 0. Înainte de primul apel la funcția Rnd, trebuie să utilizați instrucțiunea Randomize() fără un argument pentru a inițializa generatorul de numere aleatoare.


Exemplu. Joc „Ghicește numărul” Condiția jocului: Calculatorul ghicește un număr întreg aleatoriu k din intervalul 0 – 100. Ar trebui să ghiciți numărul ghicit, făcând cât mai puține încercări posibil. După fiecare încercare, computerul vă spune dacă numărul ascuns este mai mare sau mai mic decât numărul sugerat.


Tabel de date


Diagrama bloc al algoritmului Generarea unui număr aleator k de la 0 la 100 Intrare k1 a



Interfață


Valorile proprietăților


Cod program

Matrice O matrice este un grup de variabile care conțin elemente de date de același tip și cu același nume. Pentru fiecare element al matricei este alocată o celulă de memorie separată. Toate elementele matricei au același tip. Sunt posibile referiri la elemente de matrice individuale. Fiecare element individual al matricei este identificat prin numele matricei și valorile indexului.


De exemplu, referințele a(7) sau a1(2, 9) înseamnă că: a este numele unei matrice unidimensionale (vector) cu un index, elementul matricei are o valoare a indicelui egală cu 7. a1 este numele unei matrice bidimensionale (matrice). Acest lucru este evidențiat de utilizarea a doi indici pentru a determina un element de matrice.


Primul indice al unei matrice bidimensionale este interpretat ca numărul rândului în care se află elementul matricei, iar al doilea indice ca numărul coloanei. Indicele poate fi o expresie de tip întreg cu o valoare nenegativă. Limita inferioară a unui index este întotdeauna 0. Limita superioară a fiecărui index de matrice este specificată atunci când este declarat.


Nume matrice Index (număr de poziție) al elementului matrice km Exemplu de matrice cu numele km de tip Întregul citirilor contorului de kilometri de pe vitezometrul mașinii la începutul fiecărei luni pe tot parcursul anului:


La fel ca variabilele simple, tablourile sunt declarate folosind instrucțiunile Dim, Static, Private sau Public. Exemple de declarații de matrice: Dim x() As Single Dim y(,) As Single


Sunt declarate o matrice unidimensională numită x și o matrice bidimensională numită y. Acest lucru este indicat prin paranteze în declarație după numele fiecărui tablou. Când declarați o matrice bidimensională, trebuie să existe o virgulă între paranteze. Declarația limitelor superioare ale indicilor din aceste exemple este amânată pentru mai târziu (astfel de tablouri se numesc dinamice). O matrice unidimensională se numește vector. O matrice bidimensională se numește matrice.


Pentru a declara limita superioară a indexului și a plasa matrice în memorie, ar trebui să plasați instrucțiunea: Redim x(10), y(4,5) Aici sunt specificate valorile limitelor superioare ale fiecărui index de matrice.


Indicele matricei x poate varia de la 0 la 10. Matricea x are 11 elemente. Primul indice al matricei y poate varia de la 0 la 4. Al doilea indice al matricei y poate varia de la 0 la 5. Matricea y are 30 de elemente (produsul dintre numărul de rânduri și numărul de coloane).


Când declarați o matrice, o puteți inițializa: Dim z() As Single = (1.3, -2.7, _ 14.6, -5) Acest exemplu declară o matrice unidimensională z, care are 4 elemente, ale căror valori sunt specificate de lista de inițializare. O matrice care a fost declarată fără limite superioare ale indicilor săi (matrice dinamică) poate fi redeclarată în mod repetat utilizând instrucțiunea ReDim.


Printre instrucțiunile din cadrul procedurii puteți scrie: ReDim y(5, 10) Apoi această matrice poate fi redeclarată: ReDim y(5, 20)


Declarația ReDim poate modifica doar limitele superioare ale indicilor. Mărimea matricei (numărul de indici) poate fi setată o singură dată. Nu poate fi schimbat. Declarația ReDim poate fi folosită pentru a modifica o matrice dinamică de câte ori este necesar. Cu toate acestea, de fiecare dată când este utilizat, datele conținute în matrice se pierd.


Declarația ReDim Preserve poate crește dimensiunea unei matrice, păstrând în același timp conținutul acestuia. Următorul exemplu arată cum puteți crește dimensiunea matricei a4 cu 10 elemente fără a distruge valorile curente ale elementelor matricei. Să fie declarată o matrice: Dim a4 () As Integer Apoi dimensiunea acestei matrice este setată în program: ReDim a4 (n)



Dacă, la declararea unei matrice, sunt specificate limite superioare ale indicilor, atunci o astfel de matrice se numește fixă. Exemplu Dim s(10) As Single Dim b(4, 5) As Integer Instrucțiunea ReDim nu este aplicabilă tablourilor fixe.


Este posibil să atribuiți conținutul unui tablou altuia în același mod ca și pentru variabilele simple. Dar aceste matrice trebuie să aibă aceeași dimensiune și același număr de elemente.


Dacă există o matrice dinamică în partea stângă a operatorului de atribuire, atunci numărul de elemente nu trebuie să se potrivească. Numărul de elemente de matrice din partea stângă a operatorului de atribuire se va modifica dacă este necesar.


Exemplu. Dim a() As Integer = (1, 2, 3, 4), _ b(), i As Integer b = a For i = 0 To 3 MsgBox(b(i)) Next Secvențial pe ecran în funcția MsgBox va apărea fereastra: 1, 2, 3, 4.


Exemplul 1 Calculați media aritmetică a k numere date.


Date aplicabile Date inițiale: k – variabilă de tip întreg, număr de valori specificate; a() – matrice de tip Single, valori ale valorilor specificate. Rezultate: s – variabilă de tip Single, valoarea mediei aritmetice.


Intermediar: Sum – Variabilă de tip unic, valoarea sumei primelor k elemente ale tabloului a; i este o variabilă de tip întreg, valoarea indexului elementului matrice a.


Diagrama algoritmului (1) (2) 1


(3) (4) (5) (6) (7) (8) 1 2 Nr



Să ne uităm la această diagramă bloc în ceea ce privește structurile de bază care intră în ea. Blocurile 1 – 2 alcătuiesc o structură secvențială (în continuare), pe care o vom numi Structura 1. Blocurile 3 – 8 aparțin ciclului. Vom numi această structură Structura 2. Blocurile 9 și 10 sunt din nou o structură secvențială, pe care o vom numi Structura 3.


Structura 1, Structura 2 și Structura 3, considerate împreună, sunt, de asemenea, o structură ulterioară. Într-o diagramă a oricărui algoritm structurat, se pot vedea întotdeauna clar structurile de bază din care este construit algoritmul.


Interfața proiectului Câmpul de text este destinat pentru afișarea rezultatelor calculelor. Făcând clic pe butonul vor începe calculele.


Interfața proiectului


Cod proiect Când creați un proiect, sistemul generează automat următorul șablon de cod asociat cu Form1, care este o declarație a clasei Form1. Tot codul asociat formularului trebuie să fie conținut în acest șablon.


Proiectul ar trebui să înceapă să ruleze făcând clic pe butonul BtnStart. Prin urmare, codul proiectului trebuie să includă subrutina BtnStart_Click, a cărei execuție este declanșată de evenimentul Click care apare cu butonul BtnStart (prin clic pe acest buton).


Următorul pas în crearea codului de proiect ar trebui să fie includerea în codul proiectului a șablonului de subrutină BtnStart_Click, care este creat de sistem dacă faceți dublu clic pe butonul BtnStart, de exemplu.


Mai jos este codul care va fi obținut după crearea șablonului subrutinei BtnStart_Click.

După lansarea proiectului pentru execuție, codul programului va începe să fie executat numai după ce se apasă butonul BtnStart. În acest caz, pentru acest buton are loc evenimentul Click, ceea ce duce la executarea procedurii de eveniment BtnStart_Click. Rezultate soluție

Rândurile de la 1 la 5 din corpul acestei proceduri declară datele. Linia 6 șterge câmpul de text. Pentru aceasta este folosită metoda Clear. Dacă acest lucru nu se face, atunci când proiectul este lansat de mai multe ori, informațiile afișate în câmpul de text în timpul următoarei lansări vor fi adăugate la informațiile afișate în acesta în timpul lansărilor anterioare.


Linia 7 oferă intrare pentru valoarea variabilei k. Este recomandat să monitorizați întotdeauna corectitudinea introducerii datelor. În acest scop, în rândul 8, valoarea variabilei k este afișată în câmpul de text. Linia 9 alocă matricea a în memorie.


În rândurile de la 10 la 12, sunt introduse valorile elementelor matricei a. Valoarea elementului a(0) nu este introdusă. Vom ignora prezența acestui element. Nu va fi folosit nicăieri. În rândurile de la 13 la 16, valorile elementelor introduse ale matricei a sunt afișate pentru control în câmpul de text.


Rândurile de la 17 la 20 calculează valoarea variabilei s. În cele din urmă, linia 21 oferă rezultatul variabilei s într-un câmp de text.


Observați că programul nu include instrucțiunea i = 1 și instrucțiunea i = i + 1, chiar dacă aceste instrucțiuni apar în diagrama bloc. De asemenea, nu există nicio verificare pentru starea i<= k. Выполнение всех этих действий обеспечивает инструкция цикла For … Next.


Vă rugăm să rețineți că programul nu conține nici instrucțiunea sum = 0. Variabila suma a primit valoarea 0 ca urmare a declarației sale. Puteți elimina instrucțiunea Dim i As Integer. Declarația de buclă For...Next este un bloc. Variabila i din interiorul blocului va primi automat tipul Integer (în funcție de tipul valorilor inițiale și finale ale parametrului), dar va acționa doar în cadrul blocului.


Operații logice VB.NET definește operațiile logice: Și (înmulțire logică), Or (adunare logică), Nu (negație logică) și Xor (adunare logică exclusivă). Operatorul Not are următoarea sintaxă: Not Operand


Un operand de tip boolean este o relație, variabilă sau funcție de tip boolean sau rezultatul unei operații booleene. Rezultatul unei negații logice are sensul opus operandului său, așa cum arată tabelul de mai jos.


Operația nu nu este operand


Operația And are doi operanzi: Operand 1 și Operand 2 Rezultatul operației And este determinat de tabel:


Operatorul Și evaluează la Adevărat numai atunci când ambii operanzi evaluează la Adevărat. Exemplu Inegalitate a ? x? b trebuie scris: a<= x And x <= b Неправильно написать: a <= x <= b


Operația Or are și doi operanzi: Operand 1 Sau Operand 2 Rezultatul operației Or este dat în tabel:


Operatorul Or se evaluează la Adevărat dacă cel puțin un operand (și chiar ambii împreună) este Adevărat. Exemplu: Condiția „x nu aparține segmentului” trebuie scrisă: x< a Or x >b sau nu (a<= x And x <= b)


Xor (Adăugare Booleană Excepțională) Rezultatul operației Xor este dat în tabel: Operația Xor se evaluează la Adevărat dacă unul dintre operanzi (dar nu ambii) este Adevărat.


VB.NET definește și operațiuni logice: AndAlso și OrElse. Operația AndAlso este foarte asemănătoare cu operațiunea Și. De asemenea, efectuează înmulțirea logică pe doi operanzi booleeni.


Principala diferență dintre AndAlso și And este că AndAlso permite evaluarea scurtă, parțială a operanzilor săi. Dacă primul operand din AndAlso este fals, al doilea operand nu este evaluat și operațiunea AndAlso returnează False.


De asemenea, operația OrElse este foarte asemănătoare cu operația Or. Efectuează adăugarea logică prescurtată a doi operanzi logici. Dacă primul operand din expresia OrElse este True, al doilea operand nu este evaluat și este returnat True pentru operația OrElse.