Sunteți pe pagina 1din 41

Subprograme definite de utilizator

Alexandru Lungu
Hai La Olimpiada! 2020
grupa 7-8
Subprograme: soluții în
care implementarea este
detașată de context
Problema

Există situații în care trebuie să


folosim aceeași porțiune de cod în
mai multe locuri.

De exemplu, dorim să sortăm doi


vectori. Asta ar însemna ca trebuie
să scriem de două ori același
algoritm de sortare.
Construim un subprogram
ce implementează
algoritmul de sortare.
Soluția Vom folosi subprogramul
pentru a sorta cei doi
vectori.
Termenii folosiți într-o structură cu
subprograme

Subprogram Program apelant Main Apel


Un program cu Un program ce folosește Main este subprogramul Apelul reprezintă o metodă
implementare individuală un subprogram. Această principal. Cu alte cuvinte, de a pune în funcțiune un
ce poate fi folosit în relație se stabilește atunci C++ va apela doar acest subprogram.
contextul altor programe când programul “apelează” subprogram numit main.
ori subprograme. subprogramul.
Pașii necesari în a folosi un subprogram

Definim Verificăm Testăm


Verificăm dacă toți parametrii au Verificăm dacă
Trebuie să alegem cu atenție tipul și
fost folosiți, iar valoare returnată subprogramul
numărul parametrilor, dar și tipul returnat
este corectă funcționează corect

Implementăm Folosim
Alegem o implementare cât mai Utilizăm subprogramul urmând
indiferentă de context. principiul “black-box”
Definire Numele subprogramului

În primul rând, trebuie să


definim subprogramul.

Numele subprogramului este


de regulă un verb ori o
denumire specifică.

Exemplu: putem folosi


numele sort pentru un
subprogram ce sortează un
vector.
Definire Numele subprogramului

În primul rând, trebuie să


definim subprogramul.

Parametrii reprezintă date de Tipul și numărul


intrare pentru subprog. și au parametrilor
tipuri de date.

Exemplu: putem folosi


parametrii (int n, int A[ ])
pentru un subprogram ce
sortează un vector A, ce are
n elemente.
Tipuri de parametrii

Intrare-ieșire
Ieșire Au o valoare predefinită, iar
Intrare modificările au efect în
Au valoare neutră, iar
Au o valoare predefinită, programul apelant.
modificările au efect în
iar modificările nu au programul apelant.
efect și în programul
apelant.
Modificările peste parametrii de intrare

Parametrii de
nu ar trebui să aibă efect în programul
apelant.

intrare sunt Comportamentul C++ în cadrul parametrilor


de intrare este de a crea o copie inițial, ce va

copii
fi folosită pe tot parcursul subprogramului.

Acest fapt evită ca modificările din


subprograme să afecteze programul apelant
Tipuri de parametrii - C++

Intrare-ieșire
Ieșire Parametrii de intrare-ieșire
Intrare sunt aceeași variabilă ca
Nu există în C++.
Parametrul de intrare cea din programul apelant -
este în fapt o copie a sub altă denumire.
variabilei din programul
apelant.
Vectorii pot avea dimensiuni foarte

Vectorul este mari; dorim să-i avem ca parametrii de


intrare?

parametru de C++ face copii pentru parametrii de intrare.


Vectorii pot fi foarte mari, așa că s-ar

intrare-ieșire consuma foarte mult timp în copierea lor.


Din acest motiv, vectorul este mereu un
parametru de intrare-ieșire.
Tipuri de parametrii - exemple în C++

Intrare-ieșire
Ieșire
Intrare
Nu există în C++.
Definire Numele subprogramului

În primul rând, trebuie să


definim subprogramul.

Tipul de date returnat Tipul și numărul


reprezintă valoarea pe care o parametrilor
dorim ca răspuns de la
subprogram

Exemplu: putem folosi tipul


de date void pentru a
Tipul de date returnat
simboliza faptul că subprog.
nu ne oferă înapoi o valoare.
Subprogramul nu este obligat să
returneze ceva.
Unele subprogramele ar trebui să returneze
o valoare sugestivă. De exemplu, un

Void subprogram ce caută maximul într-un vector


ar trebui să returneze o valoare int (anume
maximul din vector).

În cazul în care nu avem de gând să


întoarcem o valoare explicită, vom folosi
tipul de date void.
Definire Numele subprogramului

În primul rând, trebuie să


definim subprogramul.

Subprogramele ce Tipul și numărul


returnează void se mai parametrilor
numesc și proceduri.

Subprogramele ce nu
returnează void se mai
numesc și funcții.
Tipul de date returnat
void sort(int n, int A[ ])
{
// to be continued...
}
Pașii necesari în a folosi un subprogram

Definim Verificăm Testăm


Verificăm dacă toți parametrii au Verificăm dacă
Trebuie să alegem cu atenție tipul și
fost folosiți, iar valoare returnată subprogramul
numărul parametrilor, dar și tipul returnat
este corectă funcționează corect

nume param return

Implementăm Folosim
Alegem o implementare cât mai Utilizăm subprogramul urmând
indiferentă de context. principiul “black-box”
Implementare

Implementarea dintr-un subprogram


nu este cu nimic mai specială ca
orice am implementat până acum.

Presupunem că mai avem un


subprogram ce caută maximul într-un
vector dat.
Noi posibilități în implementarea
subprogramelor

Folosirea Întoarcerea unui Oprirea unui Subprograme


parametrilor rezultat subprogram void
În orice moment din Odată ce avem un rezultat, îl Utilizarea instrucțiunii return În subprogramele nu întorc
subprogram putem accesa putem întoarce prin va opri automat valori nu trebuie să avem
parametrii. Este asemănător intermediul instrucțiunii subprogramul. Orice instrucțiuni return. Dacă vrem
cu accesarea unor date de return. Tipul valorii întoarse instrucțiune de după return să oprim subprog. putem
intrare. (care nu mai trebuie trebuie să fie aceeași cu cea nu va mai fi executată. folosi instrucțiunea return
citite) din definiție. (asemănător cu break într-o fără valoare.
structură repetitivă)
Variabile Variabilele globale sunt “globale” cu
un motiv.

globale în Orice subprogram poate accesa orice


variabilă declarată global. Evident, nici un

subproceduri subprogram nu poate accesa variabilele


locale ale altui subprogram.
Folosirea variabilelor globale în subprog.

Variabilele globale pot fi accesate și


modificate permanent din interiorul
unei subprograme.

Presupunem că avem un subprogram


ce verifică dacă o persoană cu vârsta
n are buletin.
Pașii necesari în a folosi un subprogram

Definim Verificăm Testăm


Verificăm dacă toți parametrii au Verificăm dacă
Trebuie să alegem cu atenție tipul și
fost folosiți, iar valoare returnată subprogramul
numărul parametrilor, dar și tipul returnat
este corectă funcționează corect

nume param void impl return

Implementăm Folosim
Alegem o implementare cât mai Utilizăm subprogramul urmând
indiferentă de context. principiul “black-box”
După definirea și
implementarea
Verificare subprogramului, trebuie să
ne asigurăm că respectăm
anumite standarde.
Ce greșim?

În problema pe care o am trebuie să


calculez cel mai mic divizor de 3 ori.

Din acest motiv, am creat definit și


implementat o subprocedură ce îmi
calculează cmmdc-ul.

Ce observ la validare?
Soluții
Probleme ce pot apărea la validare
Nu am p
u s tipul d
g.! Am i m e return
subpro plemen corect!
estiv
en u mit sug t a t g re
Nu am d șit!

Am uitat să validez parametrii Am uitat s


ă
ție/
opresc su
bprocedura c
!
f un
î ntr-o ă
tur nez cedur
Am definit pre
a multe sau pre t s ă re r-o pro
a puține varia
bile! uita t înt
Am eturna
r
Am
Pașii necesari în a folosi un subprogram

Definim Verificăm Testăm


Verificăm dacă toți parametrii au Verificăm dacă
Trebuie să alegem cu atenție tipul și
fost folosiți, iar valoare returnată subprogramul
numărul parametrilor, dar și tipul returnat
este corectă funcționează corect

nume param void impl return erori

Implementăm Folosim
Alegem o implementare cât mai Utilizăm subprogramul urmând
indiferentă de context. principiul “black-box”
Date de intrare
Black-box Ex: int n și int A[ ]
Trebuie să privim un
subprogram ca o “cutie
opacă”. Cu alte cuvinte,
sort(n, A);
când folosim un
subprogram, nu trebuie
să ne intereseze
implementarea; trebuie
să ne intereseze doar Date de ieșire
utilizarea. Ex: n rămâne la fel
A va fi sortat
Folosirea subprogramelor

Obținerea valorii Apelul unei


întoarse proceduri Argumente Neapelarea
Este crucial să știm să Odată ce avem un rezultat, îl Argumentele reprezintă Termenul de dead-code se
obținem o valoare de return. putem întoarce prin valorile oferite referă la cod ce nu va fi
Trebuie să privim o funcție ca intermediul instrucțiunii subprogramului. Parametrii niciodată executat. A nu
o variabilă read-only - deci return. Tipul valorii întoarse vor lua valoarea valorilor apela un subprog. niciodată
care poate fi folosită în trebuie să fie aceeași cu cea oferite ca argumente. înseamnă că avem dead-
expresii. din definiție. code.
Pașii necesari în a folosi un subprogram

Definim Verificăm Testăm


Verificăm dacă toți parametrii au Verificăm dacă
Trebuie să alegem cu atenție tipul și
fost folosiți, iar valoare returnată subprogramul
numărul parametrilor, dar și tipul returnat
este corectă funcționează corect

nume param void impl return erori args d-c apel result

Implementăm Folosim
Alegem o implementare cât mai Utilizăm subprogramul urmând
indiferentă de context. principiul “black-box”
După definirea,
implementarea, verificarea
și folosirea
Testare subprogramului, trebuie să
ne asigurăm că îl folosim
corect.
Ce greșim?

În problema pe care o am trebuie să


sortez vectorul A.

Din acest motiv, am creat definit,


implementat și verificat o
subprocedură ce îmi sortează un
vector.

Ce observ la testare?
Soluție
Probleme ce pot apărea la testare
Nu dau
la
un Nu folo ori valo parametrii tipu
m en t pentru sesc c ri corec ri de da
c a a r gu te. te
valoare orespunzăto
e rin ță
o re f
Nu pun de ieșir
e! a retur r
a m e t r u nată
p ar

uri/
Nu pun parametrii în ordinea bună! Nu pun su
ficienți pa ed
proc
prea mulți rametrii, o
ri pun i
ne
r n- ul u funcții
Nu scriu bine i n r etu l unei
numele funcți
ei, ori funcția să obț turn-u
există! u re
Vrea losesc
chiar nu
o
Nu f
Pașii necesari în a folosi un subprogram

Definim Verificăm Testăm


Verificăm dacă toți parametrii au Verificăm dacă
Trebuie să alegem cu atenție tipul și
fost folosiți, iar valoare returnată subprogramul
numărul parametrilor, dar și tipul returnat
este corectă funcționează corect

nume param void impl return erori args d-c apel result test :)

Implementăm Folosim
Alegem o implementare cât mai Utilizăm subprogramul urmând
indiferentă de context. principiul “black-box”
Programator vs STL

Definit de utilizator: Existent în librării:


!SUBPROGRAME ==
DUPLICATE-CODE
Exerciții propuse
https://docs.google.com
/spreadsheets/d/1Bf_C0
lvk4RTOHXx7wSOVqZp
bGL0jrXtilJq_F2LoEO0/e
dit#gid=0
Link-uri utile

● https://www.pbinfo.ro/articole/3
656/subprograme
● https://profs.info.uaic.ro/~infogi
m/2020/78.html
● Infogim-2019
● Infogim-2017
● Infogim-2016
● Infogim-2015
Subprograme definite de utilizator
Alexandru Lungu

Hai La Olimpiada! 2020

grupa 7-8

S-ar putea să vă placă și