Declarații condiționale. Caracteristici ale utilizării operației de pauză într-o instrucțiune switch

Dar C++ are și un comutator cu opțiuni multiple, pe care îl vom analiza acum în detaliu.

// forma de scriere a comutatorului de comutator al operatorului cu alegeri multiple (/*variabilă sau expresie*/) ( case /*expresie constantă1/*: ( /*grup de operatori*/; break; ) case /*expresie constantă2*/: ( /*grup operatori*/; break; ) //... implicit: ( /*grup de operatori*/; ) )

În stadiul inițial, expresia sau variabila este analizată. După care se face trecerea la acea ramură a programului pentru care valoarea variabilei sau expresiei coincide cu expresia constantă specificată. Apoi, instrucțiunea sau grupul de instrucțiuni este executată până când întâlnește o acoladă de închidere. Dacă valoarea unei variabile sau expresii nu se potrivește cu nicio expresie constantă, atunci controlul este transferat în ramura programului care conține cuvântul rezervat implicit . După care se execută operatorul sau grupul de operatori ai acestei ramuri. Acum să ne uităm la o problemă folosind operatorul de selecție a comutatorului.

Condiția problemei: scrieți un program care adună, scade, înmulțește, împarte două numere introduse de la tastatură. Dezvoltați o interfață cu utilizatorul.

// switch.cpp: Definește punctul de intrare pentru aplicația de consolă. #include „stdafx.h” #include folosind namespace std; int main(int argc, char* argv) ( int count; // variabilă pentru selecție în switch double a,b; // variabile pentru stocarea operanzilor cout<< "Vvedite pervoe chislo: "; cin >>a; cout<< "Vvedite vtoroe chislo: "; cin >>b; cout<< "Vibirite deistvie: 1-clojenie; 2-vichitanie; 3-ymnojenie; 4-delenie: "; cin >> numără; switch (număr) // începutul instrucțiunii switch (cazul 1: // dacă număr = 1 ( cout<< a << " + " << b << " = " << a + b << endl; // выполнить сложение break; } case 2: // если count = 2 { cout << a << " - " << b << " = " << a - b << endl; // выполнить вычитание break; } case 3: // если count = 3 { cout << a << " * " << b << " = " << a * b << endl; // выполнить умножение break; } case 4: // если count = 4 { cout << a << " / " << b << " = " << a / b << endl; // выполнить деление break; } default: // если count равно любому другому значению cout << "Nepravilni vvod" << endl; } system("pause"); return 0; }

ÎN a 9-a linie Am declarat un număr de variabile de tip întreg. Este valoarea acestei variabile pe care programul o va compara cu valoarea expresiei constante. ÎN linia 10 sunt declarate două variabile reale pentru a stoca numerele introduse. Voi explica de ce este real mai târziu. CU 17 până la 41 de rânduri este scris un comutator de operator cu alegere multiplă condiționată. În etapa inițială, este analizată variabila de numărare. Se analizează astfel:
dacă variabila count este egală cu unu, atunci blocul de instrucțiuni cu Rândurile 20-23;
dacă variabila numărare este egală cu doi, atunci blocul de instrucțiuni cu Rândurile 25-28;
dacă variabila count este egală cu trei, atunci blocul de instrucțiuni cu Rândurile 30-33;
dacă variabila numărare este egală cu patru, atunci blocul de instrucțiuni cu Rândurile 35-38;

Dacă valoarea variabilei de numărare nu se potrivește cu nicio expresie constantă, atunci controlul este transferat în ramura programului care conține cuvântul rezervat implicit . Adică, următoarea linie va fi executată

Cout<< "Nepravilni vvod" << endl;

Declarația switch poate conține sau nu cuvântul rezervat implicit. Dacă valoarea variabilei nu se potrivește cu nicio expresie constantă și nu este implicită, atunci controlul programului în acest caz va trece pur și simplu la prima instrucțiune după comutare. ÎN rândurile 19, 24, 29, 34 se scriu expresii constante cu care programul compară valoarea variabilei de numărare.
ÎN rândurile 22, 27, 32, 37, înregistrat de . Apare întrebarea: „De ce este nevoie?” Să presupunem că utilizatorul a introdus 2, adică variabila de numărare a fost inițializată la doi. Comutatorul de operator cu alegere multiplă condiționată începe să funcționeze. Adică, se efectuează o căutare a doi în expresii constante. Mai întâi se verifică linia 19, vedem asta în linia 19 expresia constantă este egală cu unu, dar avem nevoie de două. Să verificăm mai departe. Și apoi în ordine linia 24. Vedem asta în linia 24 expresia constantă este egală cu două, de asta ai nevoie!!! Variabila count este egală cu o expresie constantă, cu care se execută un bloc de instrucțiuni 25 până la 28 de linii. Și aici înăuntru a 27-a linie este scrisă o instrucțiune break, ceea ce face ca programul să treacă la prima instrucțiune după instrucțiunea switch. În acest caz, controlul este transferat linia 42. Și această tranziție este necesară doar pentru ca acțiunile în mod evident inutile să nu fie efectuate. Dacă eliminați instrucțiunea break, programul va continua să compare valoarea variabilei cu expresii constante până când toate se termină și apoi va transfera controlul oricum linia 42. Rezultatul programului este prezentat mai jos (vezi Figura 1).

Figura 1 - Operator de selecție multiplă în C++

Să revenim la linia 10 , acolo sunt declarate două variabile de tip double. Probabil apare întrebarea: „De ce un tip real și nu un număr întreg?” Răspund: „Pentru că una dintre acțiunile pe care le poate efectua un program este împărțirea, iar la împărțire, rezultatul are un tip de date real. La împărțirea numerelor, compilatorul C++ acordă atenție tipurilor de date ale acestora. Dacă pur și simplu împărțim numere pe un calculator, de exemplu 4/5 = 0,8, compilatorul C++ ne va da rezultatul unei astfel de împărțiri 0. Deoarece ambele numere sunt numere întregi, înseamnă că rezultatul va fi și întreg, adică parte întreagă a diviziunii obișnuite, iar în cazul nostru, întreaga parte din această diviziune este 0, deci o parte din informații este pierdută sau, după cum se spune, tăiată (opt zecimi, în cazul nostru, sunt tăiate). Și dacă dividendul și divizorul sunt schimbate, pe calculator obținem: 5/4=1,25; compilatorul C++ va afișa un rezultat ușor diferit, și anume 5/4=1 (0,25 este tăiat). Acest fenomen în C++ se numește turnare de tip implicit.” Tipul de date real este folosit pentru a reprezenta numerele mai precis decât tipul de date întreg (adică reprezintă partea fracțională).

Există două reale în C++:

1) double este un tip de date reale cu precizie dublă, ceea ce înseamnă că ocupă de două ori mai multă memorie decât tipul float
2) float – tip de date reale cu precizie unică

Declarații condiționale

Declarațiile condiționate vă permit să controlați curgere execuția programului astfel încât fiecare linie de cod să nu fie executată așa cum ar trebui în program. Să ne uităm la toate instrucțiunile condiționale în C#:

declarația dacă

Pentru a organiza ramificarea condiționată, limbajul C# a moștenit constructul if...else din C și C++. Sintaxa sa ar trebui să fie intuitivă pentru oricine a programat în limbaje procedurale:

dacă (condiție)
operator(i)
altfel
operator(i)

Dacă trebuie executată mai mult de o instrucțiune pentru fiecare condiție, aceste instrucțiuni trebuie combinate într-un bloc folosind acolade (...). (Acest lucru se aplică și altor constructe C# în care instrucțiunile pot fi combinate într-un bloc, cum ar fi buclele for și while.)

Este de remarcat faptul că, spre deosebire de limbajele C și C++, în C# instrucțiunea condițională if poate funcționa numai cu expresii booleene, dar nu și cu valori arbitrare precum -1 și 0.

Instrucțiunea if poate folosi expresii complexe și poate conține instrucțiuni else, permițând efectuarea unor verificări mai complexe. Sintaxa este similară cu cea utilizată în situații similare în limbajele C (C++) și Java. Când se construiesc expresii complexe în C#, se folosește un set complet așteptat de operatori logici. Să ne uităm la următorul exemplu:

Utilizarea sistemului; folosind System.Collections.Generic; folosind System.Linq; folosind System.Text; namespace ConsoleApplication1 ( clasa Program ( static void Main(string args) ( șir myStr; Console.WriteLine("Introduceți linia: "); myStr = Console.ReadLine(); if (myStr.Length = 5) && (myStr.Length

După cum puteți vedea, numărul de else if-uri adăugate la un singur if nu este limitat. Un lucru de reținut dacă este că acoladele nu sunt necesare dacă există o singură declarație în ramura condiționată, așa cum se arată în exemplul original.

declarație switch

Al doilea operator select în C# este declarație switch, care oferă ramificare multidirecțională a programului. În consecință, acest operator vă permite să alegeți între mai multe opțiuni alternative pentru execuția ulterioară a programului. Deși testarea multidirecțională se poate face folosind o serie de instrucțiuni if ​​imbricate, în multe cazuri este mai eficient să se folosească o instrucțiune switch. Acest operator funcționează după cum urmează. Valoarea expresiei este comparată secvenţial cu constantele de selecţie dintr-o listă dată. Odată ce se găsește o potrivire cu una dintre condițiile de selecție, se execută secvența de instrucțiuni asociate cu acea condiție. Următoarea este forma generală a unei instrucțiuni switch:

comutator(expresie) ( constanta de caz 1: secvență de instrucțiuni break; constanta de caz 2: secvență de instrucțiuni break; constanta de caz 3: secvență de instrucțiuni break; ... implicit: secvență de instrucțiuni break; )

Deși declarația switch...case ar trebui să fie familiară programatorilor C și C++, este puțin mai sigură în C# decât echivalentul său în C++. În special, interzice condițiile de „privire” în aproape toate cazurile. Aceasta înseamnă că, dacă partea case este apelată la începutul blocului, atunci fragmentele de cod după părțile ulterioare case nu pot fi executate decât dacă o instrucțiune goto este utilizată în mod explicit pentru a sări la ele. Compilatorul impune această restricție solicitând ca fiecare clauză de caz să fie urmată de declarație de pauză, altfel aruncă o eroare.

Este important de reținut că expresia dată în instrucțiunea switch trebuie să fie de tip întreg (char, byte, short sau int), enumerată sau șir. Expresiile de alte tipuri, cum ar fi virgulă mobilă, nu sunt permise într-o instrucțiune switch. Adesea, expresia care controlează o instrucțiune switch este pur și simplu redusă la o singură variabilă. În plus, constantele de selecție trebuie să fie de tip compatibil cu tipul expresiei. Într-o instrucțiune switch, prezența a două constante de selecție cu aceeași valoare nu este permisă.

  • 2. Forma generală descrieri ale operatorului de selecție a comutatorului. Cuvinte cheie comutare, caz, pauză, implicit
1. Scopul operatorului de selecție a comutatorului

Operatorul de selecție comutator vă permite să selectați o opțiune pentru rezolvarea unei probleme din mai multe, în funcție de valoarea expresiei. Acest lucru asigură ramificarea multidirecțională în program.

Declarația switch poate fi înlocuită. Cu toate acestea, în unele cazuri, utilizarea unei instrucțiuni switch poate fi mai eficientă decât utilizarea unui .

2. Forma generală de descriere a comutatorului operator de selecție. Cuvinte cheie comutare, caz, pauză, implicit

Forma generală de scriere a unei instrucțiuni switch este următoarea:

intrerupator ( expresie ) (caz constanta1: instrucțiuni_secvență1; pauză ; caz constanta2: ulterior _operatori 2; pauză ; ...caz constantN: N; pauză ; Mod implicit statement_sequence; }
  • expresie– o expresie de tip întreg (int) sau tip de caracter (char);
  • constanta1 , constanta2 , …, constantN – valori constante cu care se compară valoarea expresiei. Valorile constante trebuie să fie de tip întreg sau caracter;
  • ulterior _operatori 1 , ulterior _operatori 2 , …, ulterior _operatoriN – secvența corespunzătoare de operatori (instrucțiuni) care sunt asociate cu condiția corespunzătoare;
  • statement_sequence – o secvență de operatori care se execută dacă nu se găsește o potrivire între valoarea expresiei și valoarea constantelor.

Declarația switch funcționează după cum urmează. În primul rând, se calculează valoarea expresiei. Apoi această valoare este comparată secvenţial cu constantele din lista dată. Odată ce este găsită o potrivire pentru una dintre condițiile de comparație (ramura de caz), secvența de instrucțiuni care sunt asociate cu acea comparație este executată. Dacă nu sunt găsite potriviri, atunci instrucțiunile care urmează cuvântul cheie implicit sunt executate.

Cuvântul cheie case este folosit pentru a specifica valoarea unei constante, dacă valoarea expresiei se potrivește, se va executa secvența corespunzătoare de instrucțiuni.

Operația break întrerupe (încheie) execuția codului care este definit de instrucțiunea switch.

Operațiile plasate după cuvântul cheie implicit sunt executate dacă niciuna dintre constantele caz nu se potrivește cu rezultatul expresiei de comutare.

Cuvântul cheie implicit și secvența corespunzătoare de instrucțiuni pot fi omise. În acest caz, dacă niciuna dintre ramurile după cuvântul case nu este executată, execuția este transferată la următoarea instrucțiune care urmează instrucțiunii switch.

3. Exemple de utilizare a operatorului de selecție a comutatorului

Exemplul 1. Valorile date n= 1..7, care este numărul zilei săptămânii. După valoare n stabiliți dacă această zi este o zi liberă sau o zi lucrătoare. Scrieți rezultatul în variabila bool fDayOff.

Un fragment de cod care rezolvă această problemă.

int zi; bool fDayOff; zi = 3; comutare (zi) ( cazul 1: fDayOff = fals ; pauză ; cazul 2: fDayOff = fals ; pauză ; cazul 3: fDayOff = fals ; pauză ; cazul 4: fDayOff = fals ; pauză ; cazul 5: fDayOff = fals ; pauză ; cazul 6: fDayOff = adevărat; pauză; cazul 7: fDayOff = adevărat; pauză;)

O altă opțiune, mai compactă, pentru rezolvarea acestei probleme.

int zi; bool fDayOff; ziua = 7; comutare (zi) ( cazul 1: cazul 2: cazul 3: cazul 4: cazul 5: fDayOff = fals ; pauză ; cazul 6: cazul 7: fDayOff = adevărat ; pauză ; )

O altă opțiune pentru rezolvarea acestei probleme

int zi; bool fDayOff; ziua = 7; comutare (zi) (cazul 6: cazul 7: fDayOff = adevărat; pauză; implicit: fDayOff = fals; )

Exemplul 2. Dat un număr întreg n= 1..3, care este numărul funcției. După valoarea variabilei n calculați valoarea funcției corespunzătoare:

1) -2x 2 -4; 2) 5x+2; 3) 15-3x.

Un fragment de cod care rezolvă această problemă folosind o formă scurtă a instrucțiunii switch.

int n; float f, x; n = 3; x = 3; comutator (n) ( cazul 1: f = -2*x*x-4; pauză ; cazul 2: f = 5*x+2; pauză ; cazul 3: f = 15-3*x; pauză ; )
4. Caracteristici ale utilizării operației break într-o instrucțiune switch

Într-o instrucțiune switch, operația break este opțională.

Dacă este prezentă o operație de pauză, instrucțiunea switch este ieșită și următoarea instrucțiune este executată. Dacă nu există nicio instrucțiune break într-o ramură case, atunci toate instrucțiunile care sunt asociate cu acea ramură case, precum și toate instrucțiunile care o urmează imediat, sunt executate până când se întâlnește o altă instrucțiune break sau se ajunge la sfârșitul instrucțiunii switch. .