recursal/Fanatic-Fandom huggingface dataset:
Accesarea valorilor dintr-un tablou

Valorile dintr-un tablou pot fi accesate asemănător cu oricare variabilă din tipul de bază. În acest caz, sintaxa este:

```
identificator_tablou[index];

```

Să considerăm pentru exemplu, declararea:

```
int a[5]={1, 2, 3, 4, 5};

```

Conform celor spuse mai sus, a[0]=1, a[1]=2 şamd. Operaţiile permise asupra elementelor tabloului sunt cele specifice tipului de bază, pe care acesta este definit.

O precizare importantă trebuie făcută legat de accesarea unui index care depăşeşte dimensiunea vectorului. Acest lucru este permis în C++, nefiind semnalată eroare de compilare, dar valoarea prezentă la acel index poate cauza probleme.

O altă observaţie necesară trebuie făcută în privinţa folosirii parantezelor drepte. Astfel, în sintaxa: int a[10], acestea sunt utilizate pentru a preciza dimensiunea tabloului, la declarare. În sintaxa: a[5]=20; parantezele sunt folosite pentru a preciza indicele unui element, în vederea accesării acestuia.

Pentru o mai bună înţelegere a tablourilor, să analizăm exemplul următor.

```
#include <iostream>

using namespace std;

int a[20];

int n, suma=0;

int main ()

{

cout<<”Introduceti numarul de elemente ale vectorului : ”;

cin>>n;

for ( i=0 ; i<n ; i++ )

{

cin>>a[i];

suma=suma+a[i];

}

cout<<suma;

return 0;

}

```

Observăm că a fost utilizat tabloul a, declarat de tip int, cu 20 de elemente. Ulterior, a fost citită o valoare pentru variabila n şi, apoi, primele n valori ale vectorului. Desigur, ar fi o idee bună să verificăm valoarea lui n, pentru ca aceasta să nu depăşească 20, dimensiunea maximă a tabloului. După citire, fiecare valoare este adăugată la variabila suma, care, deci, va avea, la final, valoarea sumei elementelor vectorului. Putem afirma că utilizarea, în acest caz, a unui vector este inutilă, dat fiind că valorile nu vor fi utilizate ulterior citirii sale.

Acest lucru ar fi, însă, necesar dacă ar trebui, spre exemplu să sortăm valorile sale. În cele ce urmează vom prezenta un program care implementează metoda de sortarea Bubble Sort.

```
#include <iostream>

using namespace std;

int a[20];

int inversiuni=1, n, i;

int main ()

{

cout<<”Introduceti numarul de elemente ale vectorului : ”;

cin>>n;

for ( i=0 ; i<n ; i++ )

cin>>a[i];

while(inversiuni==1)

{

inversiuni=0;

for(i=0;i<n-1;i++)

 if(a[i]>a[i+1])

  {

  aux=a[i];

  a[i]=a[i+1];

  a[i+1]=aux;

  inversiuni=1;

}

}

for(i=0;i<n;i++)

 cout<<a[i]<<’ ’<<;

return 0;

}

```
Jason Wright

**Jason Rhoden Wright** (born August 30, 2017), also known as **"Jace"** or **"The Headmaster's Son,"** is a former male student of the Autumn House. He is among the most senior of Reopening Era students, being around since the school gained new ownership in Nathaniel Wright, his father. He is outgoing and friendly, but emotional. Jace is known for being a violinist, an instrument he uses as a key component to his power.
Pointeri și constante

Cum am văzut, pointerii pot fi folosiți pentru a accesa variabile prin adresele lor, mecanism care permite și modificarea conținutului acestora. Este posibil, însă, să accesăm prin intermediul lor și constante. Faptul este util mai ales când transmitem adrese ca parametri, pentru a bloca modificarea acestora.

Pentru a declara pointeri ce nu pot modifica valorile aflate la adresele indicate folosim sintaxa:

```
const tip *pointer=adresă;

Putem, în acest sens, să construim un exemplu:

int a, b=10;
const int *pb=&b;

```

În acest context, poiterul pa reține adresa variabilei b, care conține valoarea 10. Este posibil să folosim pointerul în construcții de tipul: a=\*pb; , dar nu și pentru a modifica valoarea din zona de memorie indicată, ca în construcția:

```
*p=20;

```

După cum spuneam, acest tip de pointeri este util în situația în care transmitem adrese ca parametri. Exemplul următor ilustrează o astfel de situație.

```
#include <iostream>
using namespace std;

void mareste(int* start, int* stop, int c)
   {
   int * idx= start;
   while (idx != stop)
       {
       *idx+=c;
        idx++;     // increment pointer
       }
   }

void afiseaza (const int* start, const int* stop)
   {
   const int * idx= start;
   while (idx != stop)
   {
    cout << *idx << '\n';
    ++idx;
   }

int main ()
   {
   int v[] = {10,20,30};
   mareste (v,v+3, 10);
   afiseaza (v,v+3);
   return 0;
}

```
Jane Grey

**Jane Cordelia Grey** (born April 12, 2020) is a popular and charismatic Autumn student who arrived at Beata Academy in July of 2035. Attractive, sociable, and quick-witted, she was fast to surround herself with friends, although she is probably most famous for taking a swan dive off the top of the school offices on her first day.
Inițializarea pointerilor

Variabilele de tip pointer pot fi inițializate, din momentul declarării, pentru a reține adresa unei locații de memorie.

```
int a;

int *pa=&a;

```

În exemplul anterior este declarată variabila a, de tip int și, ulterior, variabila pa, pointer, care este inițializată cu adresa variabilei a. Această precizare este necesară, deoarece trebuie înțeles că ceea ce se inițializează este adresa către care indică ei, nu valoarea ce se găsește acolo. În acest caz, operatorul \* este folosit nu ca operator de derefențiere, ci pentru a indica declararea unui pointer.

Ca o conluzie, pointerii pot fi inițializați fie cu adresa unei variabile, cum este cazul în exemplul de mai sus, fie cu valoarea unui alt pointer.
The People in Black

**The People in Black**, also known as **Agrona's Force**, is a group of gifted wrongdoers led by Agrona Rivers. A ragtag and dangerous group, any misfit gifted person is allowed to join. They are often seen attacking gifted communities similar to Rosebury. This group is considered one of the biggest adversaries in the gifted world, and a serious issue for Beata Academy.
Tipuri de date

Valorile variabilelor sunt reprezentate, în memoria de lucru, sub forma binară. Spre exemplu, numărul 173, scris în baza 10 se poate reprezenta ca 10101101, într-o succesiune de 8 cifre binare. Problema se complică, însă, în cazul caracterelor sau al numerelor zecimale. Din cauza naturii lor diferite, toate aceste tipuri de valori sunt reprezentate conform unui cod propriu.

Deşi nu controlăm locul în care programul păstrează valorile variabilelor, putem controla asupra modul în care acestea sunt reprezentate, prin precizarea tipului. Acest fapt influenţează domeniul de valori pe care le poate lua variabila respectivă, spaţiul de memorie pe care îl va ocupa, foarma de reprezentare, precum şi operaţiile care li se pot aplica. Tipurile de date fundamentale, implementate în mod nativ în C++ sunt din trei categorii:

**Tipuri caracter**: pot reţine un singur caracter, precum ‘A’ sau ‘%’. Tipul de bază este char, dar există şi altele pentru reprezentări mai mari.

**Tipuri de date numerice întregi**: pot reţine valori întregi, precum -45, ori 102. Sunt mai multe astfel de tipuri, o  diferenţiere importantă făcându-se între signed şi unsigned, după cum acceptă doar valori pozitive sau şi negative.

**Tipuri de date numerice zecimale**: pot reprezenta valori reale, precum 2,16 sau 0,00002. Diferitele tipuri reale se diferenţiază prin precizia reprezentării.

**Tipul boolean**: are o singur reprezentant, fiind, evident, destinat păstrării valorilor de adevăr true sau false.
Kayla Croft

**Katherine "Kayla" Maple Croft** (born August 5, 2020) is an Autumn student and current Guardian in training. After having discovered her power almost nine months prior, she was coerced into joining Beata Academy in June of 2034 and has been a quarrelsome and rebellious student ever since. She carries a fierce reputation for destruction, a prickly personality, and almost constant fights with other students, and has been involved in several personal altercations with the people in black.

## History

Sleepy has her entire backstory worked out, and a lot of the basics have already been revealed, but he doesn't really feel like giving it all away over a dumb wikia section.

## Gift

Kayla possesses a powerful and destructive version of Electric Manipulation, or Electrokinesis, which includes the abilities to generate, control, conduct, and absorb electricity. There is an electric field across her skin, which is strong enough to shock anybody who touches her. As well as basic control over lightning and electricity, she can magnetize and vibrate metal and other conductive materials, and has shown enough control to launch them like projectiles or just levitate them in the air. A more creative application of her gift is the ability to manipulate iron in the air or in sand to form bladed weapons.

While she appears to have masterful control over her gift on the surface, the truth is different. There are constant electric currents and sparks crackling over her body, which often reflect or betray her emotions by increasing or decreasing in intensity. She often describes the sensation as *"[...] always pulsing through her, threatening to burst out and destroy everything she touched."*

Her signature move is to concentrate all her power into a specific point on her body, usually her finger, and releasing it in a railgun-esque laser. Similar to a railgun, she can flick coins or other scraps of metal for added destruction.

## Quotes

> *"Yeah, yeah, yeah. Math, history, English... But*this*is the only thing that matters, right? I can sit around daydreaming in Algebra in any normal school. As long as I'm better than everybody else with this... Then who's gonna care how lost I get, or how late I joined?"*
>
>

- to Emelia, Jailed

> *"Do you know how many volts are in a lightning bolt?"*
>
>

- to Sebastian, Jailed

> *"Have you ever killed anybody who was trying to kill you, Miss Prefect?"*
>
>

- to Hosa, Kayla Croft VS Hosa Corvina

> *"Do it. Pull the trigger. Just don't miss."*
>
>

- to a person in black, Kill the Cutie

> *"You really are pathetic. I could incinerate you right now if I wanted to. It'd be easier than squashing a bug. If killing someone is controlling their fate, and if your entire life's led up to this moment, then it'd be like you were born to be killed by me. But I can't really waste the time to do something like that. Do I look like a murderer to you?"*
>
>

- to Montare, Just Another Day
Griffin Camiron

**Griffin Camiron** (Born April 16th 2019) is a student of the Summer House. He is from the New York City area. Although, his voice does not carry the typical accent that most have there. Normally he is outgoing and sociable. However when things come to the topic of powers, Griffin gets hesitant. It is not unusual for people to take advantage of it, so he becomes shy at this moment. As a sign of weakness, he has a hard time saying no, Griffin blames his power for this. He also likes to study plants.

## History

Griffin was born in New York City, but his parents moved out into the suburbs so they could have him grow outside of the dangerous city. He lived a practically normal life until the age of five. When his friend accidentally activated Griffin's power for the first time.

His great grandfather was the only person in his family, as far as he knows, who had the same power as him.  So his family had been watching all the children born, in case they inherited the power.

Once his parents found out, everything went down hill for him. Especially after his father was laid off from his job, and his family fell into hard times. Before then, their wishes were minimal, like; I wish I had eggs to make breakfast. Or I wish the car window would be fixed. But when things fell down hard, they began making bigger wishes. Ones that caused large amounts of damage Griffin.They only took him to the hospital once, not wanting to be seen as abusive parents. After a few years of his parents desperately trying to hide their wishes from the family, and Griffin's powers (they wanted them for their selves) the extended family found out.

Unwilling to let the others take advantage of Griffin, they sent him to Beata. That is, after making a final wish of a steady (and wealthy) income.

## Gift

Griffin possesses the power of Wish Granting. While there isn't much he can do in the way of training it, he can develop the ability of saying no. However he is unable to do this at the moment, so he opts to not talk about it. On the other hand, he has an uncanny trust of the students of Beata. They seem to know that there is more to the power than just Granting Wishes.Because of the abuse he suffered at home, he hates granting wishes. If people want to wish for something, he would tell them if it was something they really wanted, they should work hard for it. Instead of taking a short cut and causing someone else pain for their own greed.

## Quotes

> "Like a genie...but worse."
>
>

-To Connor, Here Comes Metal Boy

> "[Not being able to grant his own wishes]...but it doesn't work that way. Even if I could, I wouldn't really want to."
>
>

-To Penny, Expanding Knowledge of Plants

## Trivia

* His dialogue color is cornflowerblue
* He's scared of ghosts (only a little bit of Hieta)
* He will usually be found in the forest or Conservatory.
Tablouri furnizate ca parametri

În varii situaţii tablourile pot fi furnizate funcţiilor ca parametri. Acest lucru, în C++, nu se face prin furnizarea întregului bloc de memorie, ci a adresei acestuia. Efectul obţinut este asemănător.

Să analizăm următorul exemplu:

```
#include <iostream>

using namespace std;

void afisare(int v[100], int n)

{

for (int i=0; i<n; i++)

cout << v[i] << ' ';

cout << '\n';

}

int main ()

{

int a[] = {5, 10, 15}, b[] = {2, 4, 6, 8, 10};

afisare(a,3);

afisare(b,5);

}

```

Observăm, în primul rând că, deşi la declararea funcţiei afisare parametrul v, de tip tablou este trecut cu tip şi dimensiune, la apel se foloseşte doar identificatorul său, care este un pointer la tablou.

Trebuie să mai precizăm că este permis, la declararea funcţiei, să nu trecem dimensiunea vectorului, în vedera unei utilizări cât mai permisive a funcţiei. Antetul se poate, deci scrie:

```
void afisare(int v[], int n);

```

Asemănător, pot fi trecute, ca parametri, tablourile multidimensionale.
Taylor Andrews

"**Taylor Lane Andrews"** (born January 1st, 1995) is a current guardian of Beata, living in Rosebury with most of his family. For most of his adult life, he's been working with computers, programming and assembling for top-tier companies with the use of his gift. He is often seen as a timid, off-beat, but well meaning man with rather strong powers, but without the will to put them to use in combat. He lives with his wife, Wisteria, and all his rabbit children.

## Quotes

> *Ebs was here.*
>
>

- to Frostato, Potatoes.
Citirea și afișarea șirurilor de caractere

Pentru citirea unui șir de caractere se poate folosi, desigur, maniera folosită la tablouri, citind elementele pe rând. În această situație trebuie avut în vedere că terminatorul nu este plasat automat și el ar trebui pus explicit în coada șirului.

Mai ușor, șirurile de caractere pot fi citite, cu adăugarea automată a caracterului NULL, în maniera specifică pointerilor, într-o sintaxă de forma:

```
cin>>s;

```

În această situație există, de asemenea, un dezavantaj, anume că citirea se termină la întâlnirea primului spațiu.

Cel mai convenabil mod de a citi șirurile de caractere, fără a omite spațiile goale și terminatorul, este cu ajutorul metodelor get sau getline.

Sintaxa este:

```
cin.get(id_sir_caractere, nr_caractere, caracter_delimitator);

cin.getline(id_sir_caractere, nr_caractere, caracter_delimitator);

```

În ambele cazuri caracterul delimitator implicit este ‘\n’.

Iată un exemplu de utilizare a celor două metode:

```
char s[100], t[100];

cin.get(s, 100, 'q');

cin.get();

cin.getline(t, 100, 'q');

cout<<"citire cu get: "<<s<<'\n'<<"citire cu getline: "<<t;

```

Vom observa, rulând, că obținem același efect. Totuși, între cele două citiri există un apel al metodei get, fără parametri. Acest lucru explică diferența dintre cele două metode, anume că, get păstrează în flux caracterul delimitator, pe când getline îl elimină. Faptul determină, în cazul folosirii primei funcții, necesitatea de a folosi între două apeluri ale sale, un apel fără parametri, pentru a scoate de flux caracterul delimitator. Pentru afișare lucrurile stau mai simplu, fiind suficientă, cum am văzut în exemplul anterior, funcția cout.
Funcții inline

Apelul unei funcții presupune o serie de mecanisme complicate, fiind, pentru funcții scurte, mai eficient să inserăm codul corespunzător decât să facem un apel propriu-zis al funcției. Lucrul se realizează prin precedarea funcției cu cuvântul inline, informând, astfel, compilatorul că se dorește inserarea codului generat de funcției peste tot unde se face apelul ei. Un astfel de exemplu este următoarea funcție:

```
inline int suma(int a, int b)

{

   return a+b;

}

```

Precizări utile: cuvântul inline se folosește doar la declararea funcției, nu și la apel. Multe compilatoare modifică, în mod implicit codul, generând cod inline atunci când consideră că pot, astfel, să optimizeze.
Obiectul cout

Obiectul cout are, de asemenea, ca obiect al clasei iostream, metode specifice.

Metoda flush() determină trimiterea către ieșire a tuturor informațiilor aflate in zona de memorie tampon, folosind sintaxa:

```
cout.flush(); sau cout << flush.

```

Metoda put() este utilizată pentru a trimite un caracter către ieșire. Sintaxa sa est: cout.put(caracter); Deoarece aceasta metodă returnează o referință de tip ostream, pot fi utilizate apeluri succesive ale acesteia, ca în exemplul următor:

```
 cout.put('S').put('a’).put('l’).put('u’).put('t’).put('\n');

```

Metoda write() are același rol ca și operatorul <<, permițând, în plus, specificare numarului maxim de caractere ce se doresc scrise. Sintaxa functiei cout.write() este: cout.write( sir, numar); Primul parametrul indică șirul de caractere din care vor fi afișate un număr de caractere specificat prin al doilea parametru.

În secvența următoare se citește un șir cu maxim 20 de caractere, afișându-se doar primele 5.

```
char a[20];

cin.getline(a, 20);

cout.write(a,5);

```
Funcții friend

Funcțiile friend (prieten) sunt funcţii asociate unor clase care au acces la datele şi metodele protejate ale acelor clase deşi nu sunt funcţii membre ale claselor respective. Funcțiile prieten pot fi funcții globale sau funcții membre ale altor clase.

Accesul la datele protejate ale unei clase se poate face, în mod normal, prin funcții membru. Acest lucru îngreunează, însă, accesul, în anumite situații. Soluția de compromis pentru a permite unor funcții nemembru accesul la datele sensibile, este declararea lor ca funcții friend.

Funcţiile operatori pot fi, în egală măsură, funcţii membre sau funcţii nemembre. De regulă, funcţiile nemembre care implementează operatori sunt declarate friend. Chiar dacă un operator este implementat ca funcţie membră sau nu, el este folosit în acelaşi fel în expresii. Atunci când un operator este implementat ca funcţie membră, operandul din stânga operaţiei, sau unicul operand atunci când operaţia este unară, trebuie să fie obiectul clasei sau o referinţă la un obiect al clasei din care face parte operatorul. Dacă operandul din partea stângă a operaţiei trebuie să fie un obiect al altei clase sau dintr-un tip predefinit, atunci operatorul trebuie implementat ca funcţie nemembră a clasei. Acesta este exemplul operatorilor ‘<<’ şi ’>>’ care au în stânga operaţiei streamuri de ieşire sau de intrare. Operatorul ‘<<’ trebuie să aibă un operand stâng de tip ostream&, de exemplu cout din expresia cout << obiect, de aceea trebuie declarat ca funcţie nemembră. În mod similar, operatorul ‘>>’ are un operand stâng de tip istream&, de exemplu cin din expresia cin >> obiect, astfel că şi el trebuie supraîncărcat ca funcţie nemembră.
Structuri imbricate

Membrii unei structuri de date neomogene pot fi, ei înșiși de tip structură. În exemplul următor, definirea unei structuri necesare reținerii coordonatelor unui triunghi, naște necesitatea definirii unei structuri pentru păstrarea coordonatelor unui punct:

```
struct punct
{
float x,y;
};

struct triunghi
{
punct a,b,c,;
}t;

```

Accesul la datele membru ale variabilei t, de tip triunghi, se face utilizând de două ori operatorul de selecție. În prima fază este selectat puctul, a,  b sau c, apoi câmpul, x sau y, pe care îl accesăm. Mai jos avem un exemplu de citire a membrilor variabilei t.

```
cin>>t.a.x>>t.a.y;
cin>>t.b.x>>t.b.y;
cin>>t.c.x>>t.c.y;

```
Parametri

O funcţie poate fi apelată printr-o construcţie urmată de punct şi virgulă, numită instrucţiune de apel, de forma:

```
id_funcţie (lista_parametrilor_efectivi);

```

Parametrii efectivi trebuie să corespundă cu cei formali ca ordine şi tip (nu este necesar ca tipurile sa fie identice, ci convertibile implicit). La apel, se atribuie parametrilor formali valorile parametrilor efectivi, după care se execută instrucţiunile din corpul funcţiei. La revenirea din funcţie, controlul este redat funcţiei apelante, şi execuţia continuă cu instrucţiunea următoare instrucţiunii de apel, din funcţia apelantă. O altă posibilitate de a apela o funcţie este aceea în care apelul funcţiei constituie operandul unei expresii (apelul functiei intervine intr-o expresie). Acest lucru este posibil doar în cazul în care funcţia returnează o valoare, folosită în calculul expresiei(doar pentru functiile cu tip).

Parametrii declaraţi în antetul unei funcţii sunt numiţi formali, pentru a sublinia faptul că ei nu reprezintă valori concrete, ci numai ţin locul acestora pentru a putea exprima procesul de calcul realizat prin funcţie. Ei se concretizează la execuţie prin apelurile funcţiei.

Parametrii folosiţi la apelul unei funcţii sunt parametri reali, efectivi, concreţi, actuali iar valorile lor vor fi atribuite parametrilor formali, la execuţie. Utilizarea parametrilor formali la implementarea funcţiilor şi atribuirea de valori concrete pentru ei, la execuţie, reprezintă un prim nivel de abstractizare în programare. Acest mod de programare se numeşte programare procedurală şi realizează un proces de abstractizare prin parametri.

Variabilele declarate în interiorul unei funcţii, cât şi parametrii formali ai acesteia nu pot fi accesaţi decât în interiorul acesteia. Aceste variabile sunt numite variabile locale şi nu pot fi accesate din alte funcţii. Domeniul de vizibilitate a unei variabile este porţiunea de cod la a cărei execuţie variabila respectivă este accesibilă. Deci, domeniul de vizibilitate a unei variabile locale este funcţia în care ea a fost definită.
Supraîncărcarea funcțiilor

În anumite situații, când dorim, spre exemplu, să implementăm diferite operații pe mulțimi diferite de numere, este o idee bună să realizăm mai multe funcții cu același nume, destinate abordării separate a fiecărui caz.

Un bun exemplu ar fi adunarea numerelor complexe. Este necesar, în acest caz să tratăm independent fiecare din cazurile: cele două numere sunt reale, unul este real, iar unul este complex, respectiv ambele sunt complexe. Presupunând că, anterior, am definit tipul de date complex ca pe un conglomerat cu câmpurile re și im, o implementare ar putea arăta în acest caz, astfel:

```
complex suma(float a, float b)
{
  complex c;
  c.re=a+b;
  c.im=0;
  return c;
}

complex suma(float a, complex b)
{
  complex c;
  c.re=a+b.re;
  c.im=b.im;
  return c;
}

complex suma(complex a, complex b)
{
  complex c;
  c.re=a.re+b.re;
  c.im=a.im+b.im;
  return c;
}

```

În exemplu sunt trei funcții, numite identic, care au câte doi parametri de diferite tipuri. Astfel, prima are ambii parametri reali, a doua are un parametru real și celălalt complex, iar ultima are ambii parametri complecși. În funcție de parametrii de apel, compilatorul știe pe care dintre cele trei să o instanțieze.

În general, funcțiile pot avea comportamente complet diferite, deși,pentru a păstra coerența codului, este necesar ca funcțiile supraîncărcate să aibă efecte asemănătoare.
Autism

Autism is treated as a unit of time, distance, currency, and power unit. Abbreviated by (AU). The variations include all of the other chakras. Autism IS chakra.

## Levels

Everyone has an Autism Level, however there are only a few people with incredibly high and low amounts. The highest ever recorded was Orlie's at 696,969,696,969,696,969,696,969,696,969 AU. The lowest was Fedora Guy, who uses concentrated Synthetic Autism which is obtained by pirating Anime.

The second highest is Corey, at 34,964,295,423,697,637,927,267.

The third highest is Ginger Friend, at 847254736
Instrucțiunile de salt

Permit modificarea cursului obisnuit al unui program, prin realizarea saltului la executia anumitor secvente din program.

### **Instructiunea break**

Are rolul de a opri executia unei instructiuni repetitive, chiar dacă condiția impusă acesteia este îndeplinită. poate fi utilizată pentru a opri o buclă, ori pentru a opri execuția naturală. În exemplul următor, o instrucțiune for ce ar avea, în mod natural, zece pași este oprită după executarea a trei pași .

```
for (int i=1; i<=10; i++)
   {
   cout << i << ", ";
   if (i==3)
      {
       cout << "execuţie întreruptă !";
       break;
      }
   }

```

### **Instrucţiunea continue**

Permite, în cadrul unei instrucţiuni repetitive, saltul peste executarea anumitor iteraţii.  Reluând exemplul anterior, vom afişa numerele de la 1 la 10, exceptând afişarea lui 3,

```
for (int i=1; i<=10; i++)
   {
    if (i==3) continue;
    cout << i << ", ";
   }

```

### **Instrucțiunea goto**

Determină saltul la un alt punct din program, ignorând liniile aflate între punctul acesta și respectivul punct. Destinația este identificată printr-o etichetă, folosită apoi ca argument al instrucțiunii goto. Construcția unei etichete presupune un identificator valid, urmat de semnul (:).  Această instrucțiune provine din programarea  low-level, fiind evitată în paradigmele moderne de programare la nivel înalt. În exemplul următor vom determina afișarea numerelor de la 1 la 10 prin utilizarea intrucțiunii goto.

```
int i=1;
eticheta1: cout<<i<<’ ’;
i++;
if (i<=10) goto eticheta1;

```
Operaţii I/O

Acest tip de operaţii sunt, în general, mari consumatoare de resurse, fapt ce generează întîrzieri în execuția diverselor aplicaţii. Abordarea C++ asupra intrărilor/ieșirilor se bazează pe conceptul de stream(flux). Astfel, informațiile transmise către un stream nu sunt direct scrise, ci încărcate într-o zonă de memorie-tampon, de unde, ulterior sunt transmise către dispozitivul fizic. Fluxurile pot fi clasificate în: fluxuri de intrare/ieşire standard, fluxuri de intrare/ieşire folosind fişiere, fluxuri de intrare/ieşire în memorie. Efectiv, streamurile abstractizează operațiile de intrare/ieșire, oferind metode de scriere și citire a datelor  independente de dispozitivul fizic și chiar de platformă. Librăria care conține aceste metode se numește iostream.  În ea sunt definite, totodată și clasele: clasa streambuf (pentru gestionarea bufferelor), clasa ios(clasa de bază pentru clasele de stream-uri de intrare și de ieșire), clasele istream si ostream (derivate din ios), clasa iostream (derivată din istream si ostream, oferă metode pentru lucrul cu terminalul), clasa fstream (oferă metode pentru operații cu fișiere).

Utilizarea librăriei iostream.h, într-un program C++, determină automat crearea și inițializarea a patru obiecte:  cin (gestioneaza intrarea de la intrarea standard- tastatura), cout (gestioneaza iesirea catre iesirea standard-ecranul), cerr (gestioneaza iesirea catre dispozitivul standard de eroare – ecranul - neutilizand buffere), clog (gestioneaza iesirea catre dispozitivul standard de eroare – ecranul, utilizand buffere).

2.1 Redirectări

2.2 Obiectul cin

2.3 Obiectul cout

2.4 Formatarea ieșirii

2.5 Fișiere
Declararea funcțiilor

Pentru a putea fi folosiți, identificatorii trebuie declarați, fie că e vorba de numele unei variabile, constante, ori funcții. Acesta este motivul pentru care, în toate exemplele anterioare, funcțiile au fost scrise înaintea funcției main.

Pentru declararea unei funcții nu este nevoie decât de antetul acesteia, cuprinzând tipurile de date necesare (tipul funcției, precum și al parametrilor săi). Desigur, în acest caz, definirea funcției va fi scrisă în altă parte. Sintaxa generală a unei declarări este următoarea:

```
<tip_functie> <identificator_nume> ([<tip1> <parametru1>], [<tip2> <parametru2>]...);

```

Mai mult, în lista parametrilor nu este necesar și denumirea acestora, ci doar tipurile de date cărora aparțin. Deci, prototipul funcției următoare: int funcție(int a, int b); ar putea fi scris: int functie(int, int);  Este, totuși, o idee bună, pentru a îmbunătăți lizibilitatea, să denumim parametrii formali.

Un motiv foarte bun pentru a declara funcțiile înainte, definindu-le ulterior, este că putem observa foarte ușor structura unui program, modul și ordinea în care diferitele lui părți comunică. Există și situații în care acest lucru este, însă, obligatoriu. Presupunând că am avea de scris funcții pentru a implementa formulele de calcul pentru șirurile:

```
an=c,dacă n=1 an-1+bn-1,altfel

bn=d,dacă n=1 an-1-bn-1, altfel

```

constatăm că nevoia de a defini, înainte, funcțiile, este reală.
Instrucţiunea expresie

O instrucţiune expresie provoacă evaluarea expresiei componente, fără să producă ramificaţii în fluxul de execuţie al programului (eventualele apeluri de funcţii din cadrul  expresiei introduc o ramificare temporară, dar ele returnează controlul execuţiei în  punctul în care s-a întrerupt evaluarea expresiei). Cele mai des utilizate instrucţiuni expresie sunt instrucţiunile expresie de atribuire şi instrucţiunile expresie apel de funcţie.

Expresia de atribuire are forma generală:

```
variabila=expresie;

```

Locul expresiei poate fi luat fie de o simplă constantă, fie de o construcţie complexă, care să cuprindă diferiţi operatori.

Iată câteva exemple:

```
i+j; //instrucţiune expresie care nu va produce niciun efect

i++; //instrucţiune expresie de incrementare

cout<<j<<endl; //instrucţiune de apel al funcţiei cout, pentru afişarea valorii variabilei j

x=5; //variabilei x i se atribuie o valoare simpla

n=2*m+1; //variabilei n i se atribuie valoarea obţinută prin evaluarea expresiei din partea dreaptă

z=x>y ? x:y; // variabilei z i se atribuie valoarea x sau y, după cum rezultă din evaluare

```
Probleme cu cifrele unui numar

1. Se da un număr natural cu cel mult 9 cifre. Sa se afle numărul de cifre pare.

2. Care sunt numerele prime de 3 cifre care au produsul cifrelor egal cu o valoare p data.

3. Sa se găsească toate numerele formate din 5 cifre care indeplinesc simultan conditiile:

• a doua cifra este egala cu de 4 ori prima cifra

• ultima cifra este egala cu a doua cifra

• a treia cifra reprezinta produsul dintre a patra si a cincea

4. Se cere sa se afișeze toate numerele de 3 cifre avand cifrele in ordine crescatoare si suma lor egala cu 18.

5. Sa se găsească numerele de 2 cifre care au urmatoarea proprietate: rasturnatul patratului numărului este egal cu patratul numărului rasturnat.

6. Sa se afișeze toate perechile de numere palindromice din intervalul [a,b]. O pereche de numere s.n. palindromica daca al doilea este rasturnatul primului.

7. Sa se determine un număr natural de 2 cifre al carui cub are 6 cifre si se scrie cu numerele 6, 7 si 8.

8. Se da de la tastatura un număr natural cu cel mult noua cifre. Se cere sa se afișeze cifrele numărului impreuna cu frecventele lor de aparitie. Ex: n=12452

0 cifre de 0    1 cifre de 1    2 cifre de 2    0 cifre de 3    1 cifre de 4    1 cifre de 5

0 cifre de 6    0 cifre de 7    0 cifre de 8    0 cifre de 9

9. Se da un număr intreg (de tip longint). Sa se afișeze cel mai mare număr obtinut prin eliminarea unei cifre din acest număr.

10. Se citește un număr n si o baza b. Sa se verifice daca n poate fi scrierea in baza b a unui număr.

11. Sa se genereze toate numerele n de p cifre cu proprietatea ca n-1 si n+1 sunt numere prime si in plus suma cifrelor lui n este tot număr prim.

12. Pentru un intreg n dat, sa se afișeze toate numerele naturale mai mici sau egale cu n a caror suma a cifrelor este impara.
Tablouri multidimensionale

Tablourile multidimensionale nu sunt limitate la dimensiunea doi. Pot fi, astfel, utilizate tablouri tridimensionale, patrudimensionale etc. Limita este impusă în aceste cazuri, în primul rând, de posibilităţile hardware ale computerelor. Dacă am dori să declarăm un vector pentru păstrarea unor date calendaristice complexe, de tip an, zi, ora, minut, secundă, am crea următorul tablou:

```
char data[100][365][24][60][60];

```

Trebuie să fim conştienţi, însă, că un asemenea tablou ar ocupa 100x365x24x60x60x1Byte, adică 3153600000 Bytes, ceea ce reprezintă aproximativ 3 GB.

În practică, utilizarea tablourilor multidimensionale poate fi evitată prin utilizarea unor vectori a căror dimensiune este mărită pentru a putea memora acelaşi număr de elemente. Următoarele variabile, una de tip vector, una de tip matrice (tablou bidimensional) sunt din acest punct de vedere, echivalente.

```
int m[10][10], v[100];

```

Mai jos putem vedea două exemple echivalente în care un tablou bidimensional este înlocuit printr-unul unidimensional.

 #define l 5#define c 3int m[l][c];int i,j,k;int main (){for (i=0; i<l; i++)     for (j=0; j<c; j++)

          m[i][j]=k++;}

În ambele cazuri, tablourile vor reţine valorile de la 0 la 14. Dispunerea lor diferă, precum diferă şi modul în care compilatorul va accesa indecşii elementelor.
Sume

1. Pentru numărul n , dat, sa se calculeze următoarele sume:

a. S=1-2+3-4+…+ (-1)n-1 \*n

b. S2=1+1\*2+1\*2\*3+…+1\*2\*3\*…\*n

c. S3=1/2+2/3+3/4+…+n/n+1

d. S4=1+1/22+1/32+…+1/n2

2. Să se calculeze suma numerelor naturale cuprinse între două numere date (dintr-un interval). Exemplu: Date de intrare: capetele intervalului  3  6  Date de ieșire  suma=18(3+4+5+6).

3. Sa se afișeze suma numerelor naturale divizibile cu 3  mai mici sau egale cu o valoare data n. Ex. n=20   => s=63(3+6+9+12+15+18)

4. Sa se afle numerele de doua cifre care împărțite la 15 dau restul egal cu pătratul catului.

5. Sa se determine suma divizorilor proprii ai unui număr natural, dat. Sa se verifice daca numarul respectiv este perfect (un numar perfect este egal cu suma divizorilor proprii plus 1). Exemplu: daca n=6 se va afisa: 2, 3, „numar perfect” (pentru ca 6=2+3+1)

6. Se introduce un număr. Să se verifice dacă este număr prim, calculand suma divizorilor sai. Exemple: Date de intrare 23  date de ieșire  Prim ; Date de intrare  45  Date de ieșire  Nu este prim.

7. Să se calculeze suma numerelor naturale cuprinse între două numere date ( dintr-un interval). Exemplu: Date de intrare: capetele intervalului  3  6  Date de ieșire  suma=9.

8. Să se afișeze toate numerele de două cifre care adunate cu răsturnatul lor dau 55.

9. Se dau numerele a, b și c. Să se scrie un program care să afișeze în ordine crescătoare toate numerele care se divid cu a sau b și sunt mai mici decât c.

10. Sa se calculeze suma numerelor de trei cifre formate doar din cifre impare

11. Sa se determina suma primelor n numere prime, unde n este un număr natural dat.

12. Se dă un număr. Să se scrie, dacă se poate, ca sumă de două numere impare. Exemple : date de intrare  24  Date de ieșire  24=1+23  24=3+21  24=5+19  24=7+17  24=9+15  24=11+13 ; Date de intrare 33 Date  de ieșire  Nu se poate.

13. Se dă un număr. Să se scrie, dacă este posibil, ca sumă de două numere consecutive. Exemple : Date de intrare 5  Date de ieșire 5=2+3 ; Date de intrare   6  Date de ieșire  Nu se poate.

14. Dându-se un număr natural n, să se găsească toate posibilitățile de scriere a acestui număr ca sumă de numere consecutive. Exemplu : Date de intrare 15  Date de ieșire  15=1+2+3+4+5  15=4+5+6  15=7+8.

15. Se citesc, pe rând, n numere întregi. Sa se determine media aritmetica a numerelor pozitive.
Variabile

Utilitatea programului „Hello World !” este, desigur, limitată. Am putea spune că pentru a obţine un simplu text afişat pe ecran, este prea mare efortul. Desigur, programele nu se limitează la a afişa diferite mesaje. Este necesară, însă, pentru a trece mai departe, să introducem noi concepte. În mod concret, variabilele sunt zone de memorie care conţin anumite valori. Iată un simplu exemplu:

```
a=1;
b=2;
suma=a+b;
diferenta=a-b;

```

Pentru a utiliza aceste entităţi, ele trebuie să fie asociate cu un identificator. În exemplu anterior, identificatorii sunt: a, b, suma, diferenta. De asemenea, este necesară, înainte de utilitarea propriu-zisă, de operaţia numită declarare.

Sintaxa declarării include tipul de date din care variabila va reţine valori, identificatorul variabilei şi, dacă este vorba de vectori, dimensiunea acesteia(numărul maxim de elemente):  <tip\_baza> <identificator>;

Exemple:

```
int a;
float suma_elemente;
char lit;

```

Să precizăm că, atunci când este cazul, putem declara mai multe variabile în acelaşi tip, precum în exemplul următor:   int x, z, y;

Trebuie să menţionăm încă două concepte: durată de viaţă, respectiv vizibilitate; ele vor fi însă definite și dicutate pe larg în Capitolul 4, dedicat funcțiilor.

Să analizăm următorul program C++:

```
#include <iostream>
using namespace std;
int main ()
{
// declararea  variabilelor:
int a, b;
int suma;
//prelucrare
a = 5;
b = 2;
suma=a+b;
// afisarea
cout << suma;
//sfarsitul executiei functiei main
return 0;
}

```

O altă operaţie specifică, necesară, uneori, în lucrul cu variabile, este iniţializarea. Intuitiv, prin intermediul ei, putem spune că atribuim variabilelor valori iniţiale. Acest lucru este necesar în anumire situaţii, de exemplu când ne propunem numărarea unor valori ce corespund unor criterii, caz în care va trebui să iniţializăm variabila de numărare cu valoarea zero.

În C++ sunt acceptate mai multe forme pentru a realiza acest lucru. Cea mai simplă arată astfel: <variabila>=<valoare\_initiala>;  Spre exemplu: nr\_pare=0;

Este, insă, acceptată şi forma de intiţializare încă de la declararem, ca în exemplul: int produs=1;

În maniera C++, numită constructor initialization , iniţializarea poate fi făcută astfel: int suma(0); sau, în maniera numită  uniform initialization: int suma{0};

Analizând următorul exemplu, conchidem că toate cele trei forme sunt valide, echivalente şi pot fi folosite, după bunul plac al programatorului în scrierea codului:

```
#include <iostream>
using namespace std;
int main ()
{
int a=5;
int b(3);
int c{2};
int result;
a = a + b;
result = a - c;
cout << result;
return 0;
}

```
Funcții recursive

Funcțiile recursive sunt echivalentul șirurilor recurente din matematică. În termenii limbajului C++, ele au proprietatea de a se autoapela, permițând rezolvarea unui apel prin rezolvarea unui apel de complexitate mai mică. Spre exemplu, putem scrie o funcție recursivă pentru a calcula termenul de rang n al unei progresii aritmetice, definite de formula:

a\_n=2,dacă n=1, 3+an-1,altfel

```
int progresie(int n)

{

if (n==1) return 2;

else return 3+progresie(n-1);

}

```
Structura unui program

Cel mai bun mod de a invata un limbaj de
programare este de a scrie cod. Cum este traditia, primul program afiseaza
mesajul "Hello World !". Deși foarte simplu, din analiza exemplului
putem observa componentele fundamentale pe care un program C++ le are:

```
//primul meu program C++
#include <iostream.h>

int main()

{
std::cout << "Hello World!";
}

```

Să le examinăm, pe rând, linie cu linie !
**Linia**
1: // primul meu program C++

Cele doua slash-uri indica un comentariu, pe o
singura linie. Astfel, restul elementelor de pe linie nu vor avea vreo
influenta asupra executiei programului. Sunt folosite, fie pentru a include
scurte explicatii despre cod, fie pentru a suspenda, in procesul de depanare,
executia unei linii.

**Linia**
2: #include<iostream.h>

Linile precedate de semnul # sunt directive,
fiind interpretate de ceea ce se numeste preprocesor, inainte de compilarea
programului.In acest caz, directiva include comunica preprocesorului sa includa
o sectiune de cod C++, anume headerul iostream,  care permite realizarea
operatiilor de intrare / iesire, precum scrierea textului "Hello World
!" pe ecran.

**Linia**
3:

Liniile goale nu au niciun efect asupra
executiei programului. Sunt necesare, uneori, pentru a mari lizibilitatea
codului.

**Linia**
4: int main ()

Această linie inițiază declararea unei funcții.
În principiu, o funcție este un grup de instrucțiuni, asociate sub un nume.
Acesta este, însă, subiectul unui capitol ulterior. Funcția main() este specială
în C++, fiind prima executată la executarea programului, indiferent de locul în
care aceasta este scrisă in codul sursă.

**Liniile**
5 si 7: { și }

Acolada deschisă la linia 5 indică faptul că
urmează definiția unei funcții, așa cum, cea inchisă la linia 7 indică faptul că
acolo se termină. Ce este cuprins între ele constituie corpul funcției, care
determină efectul execuției ei.

**Linia**
6: std::cout << "Hello World!";

Această linie conține o instrucțiune C++.
Execuția instrucțiunilor se face in ordinea în care apar în corpul funcției.
Instructiunea de față are trei părți.

Prima parte, std::cout, indică
dispozitivul de ieșire (cel mai frecvent acesta este monitorul). A doua parte,
operatorul „<<”, numit de inserție, arată că ceea ce urmează va fi
inserat în std::cout. Ultima parte, "Hello world !", este conținutul
care urmează a fi afișat.
Constante

Constantele sunt obiecte din program care reţin valori şi care nu îşi schimbă conţinutul pe parcursul executării unui program. Cele mai simple exemple, sunt constantele literale, de exemplu 100. Pot fi folosite în construcţii de forma:

```
a=100;

```

C++ admite pentru constantele literale întregi, trei baze de numeraţie: 8,10 şi 16. Pentru a folosi o valoare in baza 8, aceasta trebuie precedată de 0, iar pentru a o folosi în baza 16, de grupul 0x. Iată un exemplu:

```
b=0144;

c=0x64;

```

Desigur, pot fi utilizate şi constante reale.  În acest caz putem utiliza două forme: scrierea comună, de exemplu 2.75, respectiv scrierea ştiinţifică, folosind simbolul e pentru puteri ale lui 10. Un astfel de exemplu este: 1.6e12. Semnificaţia este 1.6 înmulţit cu 10 la puterea a 12. Această formă de scriere este, evident, utilizată în cazul numerelor foarte mari.

În fine, a treia categore de constante literale o constituie caracterele sau şirurile de caractere. Primele dintre ele, sunt scrise între apostrofuri, iar şirurile între ghilimele. Spre exemplu:

```
c=’a’;

s=”text exemplificator”;

```

Atenţie deci, pentru că a este un identificator ce desemnează o variabilă, iar ‘a’ este o constantă de tip caracter.

Un exemplu remarcabil de utilizare a acestui tip de constante este pentru a reda diferite caractere speciale, cum ar fi newline sau tab. În acest caz, literalele sunt precedate de caracterul \ (backslash). Iată o listă  a acestor constante şi a semnificaţiei lor:

Un exemplu de utilizare a acestor constante ar putea fi:  cout<<’\n’; ceea ce ar produce, ca efect, trecerea pe o nouă linie.

În afara categoriilor enumerate, C++ mai admite trei alte constante literale: true, false şi nullptr. Evident, true şi false sunt folosite pentru expresii booleane, iar nullptr este utilizat pentru expresii cu pointeri. Iată un exemplu de construcţii cu aceste valori:

```
bool t=true;

bool f=false;

int *adrn-nullptr;

```

Chiar dacă cel mai frecvent folosim constante literale, uneori este necesar să le definim, în maniera specifică varibilelor. Sintaxa pentru definirea unei constante este:

```
const tip_baza id_nume = valoare;

Spre exemplu:

const double pi=3.1415926;

```
Rozdělená přitažlivost

**Rozdělená přitažlivost** [anglicky *split attraction*] je stav, kdy sexuální přitažlivost a romantická přitažlivost existují jako dvě rozdílné, samostatně stojící přitažlivosti, které se mohou vzájemně odlišovat. Podle opačného názoru jsou obě orientace vždy totožné, takové uspořádání však ve skutečnosto mnoha lidem nevyhovuje.

## Model rozdělené přitažlivosti

(anglicky *split attraction model*), zkráceně **SAM**

https://historicallyace.tumblr.com/post/152267147477/what-kind-of-attraction-a-history-of-the-split

https://twitter.com/asharevas/status/1148401713939922944

https://twitter.com/LuxAlptraum/status/1089874288897912834

Hubert Kennedy: Karl Heinrich Ulrichs, Pioneer of the Modern Gay Movement - http://hubertkennedy.angelfire.com/Ulrichs.pdf

https://asexuality-and-aphobia.tumblr.com/post/148412098768/holmganga-acephobia-is-real-i-really-like
Instrucţiunea vidă

Instructiunea vidă este, aparent, absurdă, pentru că nu are niciun efect. Poate avea, însă, utilitate în cazul în care este necesară prezenţa unei instructiuni, dar nu se doreşte a se execute ceva (de exemplu în instructiunile repetitive). Un exemplu generic, deşi depăşeşte un pic acest capitol, ar fi:

```
for(i = 1, s = 0; i <=10; s = s + i, ++i);

```

în care se realizează suma primelor 10 numere naturale.
Declarare structuri

O structură de date este un grup de elemente grupate sub un singur nume. Aceste elemente, numite membri, pot avea diferite tipuri și dimensiuni. În C++, o astfel de structură poate fi declarată folosind sintaxa:

```
struct [id_nume] {

tip_membru1 id_membru1;

tip_membru2 id_membru2;

tip_membru3 id_membru3;

…

} id_structura1, id_structura2,…id_structuran;

```

În construcția de mai sus, id\_nume este numele tipului de date definit de structură, iar id\_structura1 etc sunt variabile declarate în acest tip. Trebuie precizat că este posibil ca strctura să nu primească un identificator. În acest caz, declararea variabilelor trebuie făcută obligatoriu, înainte de caracterul ; care încheie definirea structurii. Între acolade sunt enumerați, prin specificarea tipului și a numelui, membrii structurii.

Iată un exemplu de declarare a unei structuri de date, care cuprinde doi membri, de tip float:

```
struct complex{

float re;

float im;

};

complex z1, z2;

```

Desigur, structura definește, practic, un tip de date, numit complex, care conține două câmpuri, reale, re, respectiv im. Ulterior, acest tip este folosit pentru a declara două variabile, z1 și z2.

Inițializarea unor variabile de tip structură este posibilă la declarare, asemănător tipurilor simple. Petntur exemplul de mai sus, inițializarea variabilelor z1 și z2 ar putea fi făcută astfel:

```
complex z1(0, 0), z2(0,0);

```
POO

Dacă programarea clasică, structurată, are la baza celebra ecuație a lui Nikolaus Wirth:

**Program = Structuri de date + Algoritmi***,*  prin parafrazare, se poate spune că Programarea Orientata pe Obiecte este fundamentată de relația: **Obiect = Date + Functii.**

Diferența dintre cele doua paradigme de programare constă în maniera de abordare a programării. În timp ce programarea structurată se concentrează pe prelucrarea datelor, adică pe programe, proceduri si funcții, POO se bazează pe definirea obiectelor, adică, pe proprietățile acestora, numite date, si pe functiile ce se pot aplica acestor obiecte, numite metode.

Programarea Orientată Obiect (POO) este o paradigmă de proiectare și implementare modernă, în care programele sunt reprezentate sub forma unor colecții de obiecte care interacționează între ele, prin intermediul mesajelor. Principalele concepte care stau la baza POO sunt:

* Abstractizarea

* Încapsularea

* Moștenirea

* Polimorfismul

Cum spuneam, la baza POO stau conceptele de clasă și de obiect. Clasa, intr-un anumit limbaj de programare, reprezintă definirea unui tip de obiecte, adica descrierea proprietăților, a datelor și a metodelor, a prelucrărilor posibile asupra datelor. Clasa este, de fapt, o noțiune abstracta, care definește un anumit tip de obiecte, sau, altfel spus, o clasă reprezintă mulțimea posibilă a mai multor obiecte de același tip.

Obiectul, reprezintă o mulțime de date care descriu un anumit obiect,  împreună cu funcțiile de prelucrare a acestora. Crearea unui obiect presupune specificarea clasei din care face parte, astfel identificându-se proprietățile obiectului și modul în care acestea pot fi folosite și prelucrate.