Documente Academic
Documente Profesional
Documente Cultură
net/publication/308938197
CITATIONS READS
0 974
2 authors, including:
Adrian Runceanu
University of Craiova
26 PUBLICATIONS 32 CITATIONS
SEE PROFILE
All content following this page was uploaded by Adrian Runceanu on 08 October 2016.
Despre autori
Tine legatura cu Mihaela-Ana Runceanu si Adrian Runceanu
Cuvânt înainte
1
Capitolul 1 - Structuri de date. Noţiuni
generale
Structura de tip tablou este, probabil, cea mai răspândită. Un tablou este
o structură de date omogenă ce este formată din mai multe componente de
acelaşi tip, numit tip de bază al tabloului şi este apelată printr-un identificator
numit numele tabloului. Toate tablourile ocupă locaţii de memorie continue.
Pentru a preciza o componentă individuală, numelui întregii structuri i se
adaugă un indice care selectează acea componentă. Indicii unui tablou trebuie
să fie de tip scalar.
Tablourile sunt de trei feluri:
tablouri unidimensionale (şiruri, vectori) – dacă referirea la elementele
tabloului se face printr-un singur indice
tablouri bidimensionale (matrici) - dacă se folosesc doi indici
tablouri n-dimensionale – dacă referirea la elementele unui tablou se
face folosind n indici
V= (1, 3, 6, 2, 4)
v5=4
, unde ai,j R.
Adresa
lui tab[0] tab[1] tab[2] tab[3] tab[4]
tab[0]
întotdeauna un
pointer spre primul element al tabloului. Cu alte cuvinte, numele unui tablou
este considerat ca fiind un pointer constant.
Exemplu:
Pointeri de indexare
În limbajul C++ pointerii şi tablourile sunt strict legaţi, numele unui tablou
fiind un pointer la adresa primului element din tablou. Fie tabloul: char p[10].
Atunci p= =&p[0].
Un tablou fără indice generează un pointer, iar, invers, un pointer poate
să aibă un indice ca şi cum ar fi fost declarat ca şi tablou:
Exemplu:
p=i;
tip_1 lista_parametri_tip_1;
tip_2 lista_parametri_tip_2;
……………………………
tip_n lista_parametri_tip_n;
} [ lista_variabile_structura ];
struct pers
{
char nume[35];
int ani;
}
S-a definit o structură de tip pers fără a fi folosită nici o variabilă de tipul definit.
Exemplul 2: Definirea unei structuri de tip angajat specificând pe lângă datele
de bază (un câmp de tip structură pers) adresa, salariul şi vechimea în muncă.
Declaraţia ei este următoarea:
struct angajat
{
struct pers p; //Structura pers a fost definită anterior
char adresa[50];
long salariu;
int vechime;
} persoana, firma[100];
struct angajat A[50] ;
typedef struct
{
struct pers p;
char adresa[50];
long salariu;
int vechime;
} ANGAJAT;
ANGAJAT persoana, firma[100];
Definiţia structurii poate figura atât în cadrul functiei main() cât şi în faţa ei, după
includerile de fişiere antet.
De asemenea, se pune următoarea întrebare: fiind dată o variabilă de tip struct,
care este modalitatea de acces la câmpurile ei? Pentru aceasta, se folosesc
operatorii de selecţie:
a) ‘.’ – operatorul de selecţie directă
Exemplul 3:
#include<iostream.h>
union test
{
int a;
char b[10];
double c;
};
int main()
{
test var; int i;
cin>>var.c; cout<<var.c<<endl;
cin>>var.b; cout<<var.b;
}
- domeniul TAD;
………
}[lista variabile];
Pentru a putea folosi în programare un TAD este necesar să decidem modul
de reprezentare în calculator a valorilor din domeniul tipului precum şi
subalgoritmii corespunzători operaţiilor scrişi în limbajul ales. Obţinem ceea ce
se cheamă un Tip Virtual de Date (TVD). Este de dorit ca acest TVD să fie privit
ca o cutie neagră. Utilizatorul nu trebuie să vadă cum se lucrează în interiorul
acestei unităţi de program. Singurul acces la datele tipului virtual trebuie să se
facă prin operaţiile TAD corespunzător, cunoscând doar specificaţiile acestor
operaţii. Nu toate limbajele de programare au această proprietate.
Un tip abstract de date trebuie să conţină operaţii suficiente pentru a fi util . El
trebuie să permită crearea oricărei valori din domeniul tipului. Trebuie să existe
suficiente operaţii de testare pentru a putea fi verificate toate precondiţiile
operaţiilor. Trebuie concepute operaţii suficiente pentru ca programatorul să
aibă acces la oricare din componentele din care e compus acest tip abstract de
date.
Deci tipurile de operaţii pe care le conţine un TAD sunt:
- operaţii de intrare-ieşire;
- operaţii de conversie (a unor valori din alte tipuri de date) în valori de acest
tip;
În primul rând, TAD Natural diferă de TAD Întreg prin domeniul tipului,
mulţimea N a numerelor întregi fiind o submulţime a lui Z. În al doilea rând, deşi
există operaţii cu acelaşi nume, aceste operaţii diferă atât prin domeniul lor de
definiţie cât şi prin definiţia lor. Astfel, 3-5 este o operaţie nedefinită în mulţimea
numerelor naturale, în timp ce era bine definită în Z. Operaţia de scădere diferă
esenţial de scăderea numerelor întregi, a - b fiind definită doar dacă a b.
Specificăm în continuare operaţiile definite în acest tip:
Precondiţia: n1, n2 N;
Postcondiţia: m = n1 + n2 .
Postcondiţia: m = n1 - n2 .
Precondiţia: n1, n2 N;
Postcondiţia: m = n1*n2.
Postcondiţia: m = n1 / n2.
Precondiţia: i N;
Postcondiţia: m = i.
Precondiţia: mN
Precondiţia: mN
Postcondiţia: Dacă m = 0 atunci esteZero = True altfel esteZero = False
Domeniul acestui TAD constă din mulţimea numerelor raţionale, notată prin Q:
Q = {(m, n) m Z, n N+, m, n prime între ele}.
În această mulţime vom specifica următoarele operaţii:
Operaţia adună { q := q1 + q2 }
Precondiţia: q1, q2 Q;
Postcondiţia: q = q1 + q2 .
Operaţia scade { q := q1 - q2 }
Precondiţia: q1, q2 Q;
Postcondiţia: q = q1 - q2 .
Operaţia multiplică { q := q1 * q2 }
Precondiţia: q1, q2 Q;
Postcondiţia: q = q1*q2.
Operaţia divide { q := q1 : q2 }
Precondiţia: q1, q2 Q şi q2 0;
Postcondiţia: q = q1/q2.
Operaţia atribuie { q := m / n}
Precondiţia: m Z, n N şi n 0;
Postcondiţia: q = m / n.
Precondiţia: q Q;
Precondiţia: q1, q2 Q;
Precondiţia: q1, q2 Q;
Precondiţia: q Q;
În cazul TAD Raţional definit mai sus, operaţiile de intrare-ieşire sunt citeşte
şi tipăreşte, operaţia atribuie este constructor, operaţia întreg este o conversie,
esteZero, egal şi maiMare sunt operaţii de testare, iar adună, scade, multiplică
şi divide sunt operaţiile aritmetice cunoscute.
Cu cât construcţiile de limbaj sunt mai aproape de lumea exterioară, cu atât
sunt mai uşor de modelat prin programe sistemele aparţinând lumii reale.
Programele ar trebui atunci să conţină obiecte care colaborează între ele
pentru a efectua un anumit calcul. Un obiect este caracterizat de stare şi
comportament. Similar, un obiect ar trebui să fie caracterizat de asemenea de
stare – variabile şi de un comportament – operaţii sau metode. Colaborarea
între obiectele unui program poate fi privită ca şi transmitere de mesaje. Dacă
un obiect a trimite un mesaj obiectului b, atunci b va reacţiona, modificându-şi
starea şi/sau provocând alte mesaje către diferite obiecte. De fapt obiectele
care primesc mesajele şi reacţionează la ele produc informaţie. Calculul
efectuat de programul ce conţine aceste obiecte va consta din informaţia
produsă de obiecte ca reacţie la mesaje. Este aproape evidentă observaţia că:
obiectul a transmite un mesaj obiectului b prin apelarea unei operaţii (metode)
a obiectului b.
class vector
{
int *e; // elementele vectorului
int d ; // dimensiunea vectorului
public:
vector (int *e1, int d1) ;
~vector() {delete [] e ;}
void lpatrat();
void afiseaza();
}
sau
pointer_nume_clasa->nume_functie_membru(…)
struct complex{
double real;
double imag;
};
Funcţia modul, pentru calculul modulului unei date de tip complex poate fi
definită, ca mai jos, ca o funcţie obişnuită:
class complex{
double real;
double imag;
public:
complex(double x=0,double y=0)
{
real=x;
imag=y;
}
double modul()
{
return sqrt(real*real + imag*imag);
}
….
};
#include<string.h>
#include<iostream.h>
class persoana {
char *nume; char *prenume ;
public:
persoana(); //constructor implicit
persoana(char *n, char *p); // constructor
persoana(const persoana& p1); //constructor de copiere
~persoana(); //destructor
void afiseaza();
};
persoana::persoana(){
nume=prenume=0;
cout<<”Apelarea constructorului implicit\n”;}
persoana::persoana(char *n, char *p){
nume=new char[strlen(n)+1];
prenume=new char [strlen(p)+1];
strcpy(nume,n);
1.3. Structuri de date
1.3.1. Stiva
Operaţia Init(St):
Precondiţie: True.
Postcondiţie: St este o stivă vidă.
1) Initializarea stivei:
1.3.2. Coada
E1 E2 En- En
1
NIL
E1 E2 En- En
1
NIL
E1 E2 En- En
1
NIL NIL
NIL
ION
0 A
1
B C
2 D E
3 F G
H
4
A
Exemplu: arbore binar plin
B C
D E
F G
Exemplu: arbore binar complet
A
B C
D E
F G
H I J
În contrast cu structurile precedente, arborii binari au formă; forma lor este
determinată de numărul nodurilor şi de distanţele dintre diferite noduri. Eficienţa
algoritmilor pentru prelucrarea arborilor binari este afectată de forma arborilor
binari.
Trăsătura fundamentală a arborilor binari este ramificarea (parte esenţială
a limbajului şi a gândirii). Arborii binari reduc ramificarea la o formă elementară,
în două. Fiecare ramură urmată într-un arbore binar înseamnă şi una care nu
va fi urmată. Structura de arbore binar este un instrument de decizie, un
separator de mulţimi.
A
B C
D E
F G
2.1. Pointeri
tip *nume;
void *nume;
- pointeri de date
- pointeri de funcţii
Exemple:
Fie declaraţiile:
int x,y ;
int *p;
1) y=x+100; este echivalentă cu secvenţa
p=&x;
y=*p+100; /* lui y i se atribuie suma dintre conţinutul zonei a cărei
adresă se afla în p şi 100*/
2) x=y; este echivalentă cu secvenţa
p=&x;
*p=y; /*conţinutul zonei a cărei adresă se află în p devine egal cu
valoarea lui y*/
3) x++; este echivalentă cu secvenţa
p=&x;
(*p)++; /*continuţul zonei a cărei adresă se află în p se măreşte cu
1*/
4) Fie funcţia f următoare:
void f(int x,int y)
{
int aux ;
aux=x;
x=y;
y=aux;
}
Un apel de forma f(a,b); nu are nici un efect, deoarece la acest apel
valoarea lui a se transferă parametrului x, iar valoarea lui b se transferă
parametrului y. Apoi funcţia interschimbă valorile parametrilor x şi y, însă prin
aceasta valorile parametrilor actuali a şi b rămân nemodificate. Pentru a realiza
o interschimbare a valorilor acestor variabile, este necesar să se transfere nu
valorile, ci adresele variabilelor. Acest lucru este posibil dacă modificăm apelul
în felul următor: f(&a,&b) - transmiterea parametrilor prin referinţă. Având în
vedere acest lucru, funcţia va suferi modificări:
void f(int* x,int* y)
{
int aux ;
aux=*x;
*x=*y;
*y=aux;
}
1) Utilizarea tipului void* implică conversii explicite de tip
int i;
void *p;
………..
p=&i; /* lui p i se atribuie adresa zonei de memorie alocată variabilei
i*/
*p=10; /* nu este acceptată de compilator deoarece tipul datei spre
care indică p este nedeterminat*/
*(int*)p=10; /* este corectă deoarece tipul void* este convertit spre
int* */
Tipul void* poate fi convertit în mod explicit spre orice tip de pointer.
Modificatorul const poate fi folosit şi la pointeri în sensul că se pot realiza
pointeri constanţi sau pointeri către valori constante. Fie declaraţiile următoare:
char *s= ”ABC”; /*pointer la un şir*/
const char *s1=”ABC”; /*pointer la un şir constant*/
char * const s2=”ABC”; /*pointer constant*/
const char* const s3=”ABC”; /*pointer constant la un şir constant*/
Am folosit toate combinaţiile posibile ale specificatorului const cu pointerii.
Astfel, s este un pointer variabil către un şir neavând nici o restricţie de
constantă, s1 este un pointer către un şir constant, s2 este un pointer de adresă
constantă către un şir, iar în ultimul caz s3 este un pointer de adresă constantă
către un şir constant.
1. Atribuirea: o variabilă de tip pointer primeşte valoarea unei alte variabile sau
funcţii de acelaşi tip pointer cu ea sau este iniţializată cu constanta NULL.
Înainte de atribuire: p *p
q *q
q
2. Operaţii de incrementare şi decrementare
Doi pointeri care indică spre elementele aceluiaşi tablou pot fi comparaţi
folosind operatorii de relaţie şi de egalitate.
Astfel, dacă p şi q sunt doi pointeri care indică spre elementele t[i]
respectiv t[j] ale tabloului t, expresia p<q are sens şi ea este adevărată dacă
i<j. De asemenea, p!=q are valoarea adevărat dacă i j.
Observaţii:
a) Pointerii nu pot fi comparaţi decât în condiţia amintită mai sus.
b) Operatorii de egalitate ( = = şi ! = ) permit totuşi compararea unui pointer cu
constanta simbolică NULL. Aceste comparaţii permit să stabilim dacă un
pointer conţine o adresă sau nu.
Doi pointeri care indică spre elementele aceluiaşi tablou pot fi scăzuţi.
Rezultatul diferenţei a doi pointeri este definit astfel: fie a un tablou de un tip
oarecare şi p, q doi pointeri: p conţine adresa elementului a[i], iar q conţine
adresa elementului a[i+n]. Atunci diferenţa q-p are valoarea n.
Exemple:
1) unsigned lungime(char *x)
/* returnează lungimea şirului spre care pointează x */
{
int i;
for(i=0;*x!=’\0’;i++)
x++;
return i;
}
Observaţii:
- Condiţia *x!=’\0’ poate fi înlocuită cu *x, deoarece *x!=’\0’ este adevarată când
*x este diferit de zero şi invers.
- Ciclul for poate fi compactat şi mai mult: for(i=0;*x++ ;i++) ;
Aşa cum am precizat anterior, numele unui tablou este un pointer constant
care are ca valoare adresa primului său element. Pentru declaraţia tip tab[…];
identificatorul tab are ca valoare adresa elementului tab[0], adică valoarea sa
este &tab[0].
Fie declararea: tip *p; Atunci o atribuire de forma p=tab; este corectă şi în
urma acestei atribuiri, p are ca valoare tot adresa lui tab[0].
Dacă tab este un parametru formal ce corespunde unui parametru efectiv
care este un nume de tablou, tab poate fi declarat fie ca tablou, fie ca un pointer
spre tipul tabloului.
Exemplu:
Fie funcţia: unsigned lungime(char tab[]) care se apelează prin expresii de
atribuire de forma: a = lungime(x); unde x este un tablou de tip caracter în care
se păstrează şirul de caractere pentru care se determină lungimea. Antetul
funcţiei lungime poate fi schimbat în felul următor: unsigned lungime(char *tab);
Identitatea dintre cele două declaraţii rezultă din cele spuse mai sus,
deoarece declaraţia char tab[]; defineşte pe tab ca numele unui tablou de tip
character, dar atunci el este un pointer spre caractere, deci se poate declara
prin char *tab.
În concluzie, dacă avem ca parametru formal un tablou unidimensional tab
în antetul unei funcţii f atunci se foloseşte unul din formatele:
……f(tip tab[]) sau …..f(tip *tab).
Indiferent care din antete se alege, în corpul funcţiei f se pot folosi atât
variabila cu indici: tab[exp] cât şi expresii cu pointeri *(tab+exp) pentru a face
acces la elementele tabloului tab.
În paragraful anterior am arătat ca în general, dacă tab este un tablou
unidimensional de tipul tip, atunci tab+n este chiar adresa elementului tab[n].
Deci: x=tab[n] sau x=*(tab+n) sunt atribuiri care au acelaşi efect (atribuie lui x
valoarea elementului tab[n]). Expresiile cu pointeri pot fi folosite şi în stânga
operatorului de atribuire, adică:
tab[n]=x si *(tab+n)=x
au acelaşi efect.
Aşadar, variabilele cu indici se pot echivala prin expresii cu pointeri. Este
posibil să procedăm şi invers, adică să înlocuim expresiile cu pointeri prin
variabile cu indici, deşi acest lucru nu este recomandabil.
De exemplu, fie declaraţia tip *p=(tip *)malloc(…);
Exemple:
1. Definesc o funcţie care realizează următoarele:
- afişează un text explicativ definit de primul parametru al funcţiei;
- citeşte un întreg de tip int şi-l păstrează într-o zonă spre care indică cel de-al
doilea parametru al funcţiei;
- returnează 0 la întâlnirea sfârşitului de fişier şi 1 altfel;
Funcţia testează dacă la intrare s-a tastat un întreg. În caz că la intrare nu s-a
aflat un întreg, se afişează un mesaj de eroare şi se reia citirea întregului:
int cit(char text[], int *n)
/* - afişează şirul de caractere păstrat în tabloul text;
- citeşte întregul de la intrarea standard şi-l păstrează în zona spre care indică
n;
- returnează : 0 – la întâlnirea sfârşitului de fişier
1 – altfel */
{
char t[255] ;
for( ;;)
{
printf(text);
if(gets(t)==0) /* s-a întâlnit sfârăitul de fişier */
return 0;
if (sscanf(t,”%d”,n)==1) return 1;
/* nu s-a tastat un întreg deoarece sscanf nu a returnat 1; se afişează mesaj şi
se reia citirea numărului */
printf( ”Nu s-a tastat un intreg\n”) ;
printf( ”Se reia citirea intregului\n”);
}
}
Observaţie:
În funcţia cit s-au folosit funcţiile gets şi sscanf pentru a realiza recuperarea
după eroare.
Pointerii fiind variabile, pot fi folosiţi pentru a forma alte tipuri de date
compuse. Spre exemplu se pot forma tablouri de pointeri. Sintaxa generală de
utilizare este:
Tip *tablou[dim];
Exemple:
1. Declaraţia char *s[25]; reprezintă un tablou de 25 pointeri la caracter.
2. Sortarea unor şiruri de caractere:
#include<iostream.h>
#include<string.h>
void sort_lines(char *tp[], int n)
{
int i, sort=0;
char *temp;
while (!sort)
{
sort=1;
for(i=0;i<n-1;i++)
if(strcmp(tp[i],tp[i+1])>0)
{
strcpy(temp,tp[i]);
strcpy(tp[i],tp[i+1]);
strcpy(tp[i+1],temp);
sort=0;
}
}
}
int main()
{
int i;
char *sir[]=({“manual”}, {“carte”}, {“mare”},
{“12345”}, {“4542”});
sort_lines(sir,5);
for(i=0;i<5;;i++)
cout<<sir[i]<<’ ‘;
cout<<endl;
return 0;
}
2. Fie declaraţia
short (*n) [10];
În acest exemplu n reprezintă adresa unui tablou de 10 întregi. Chiar
dacă acest lucru este iniţial sinonim cu adresa de început a tabloului, diferenţa
este esenţială: aritmetica acestora cu numerele întregi. Astfel, incrementarea
lui n va avea ca efect deplasarea cu 10 întregi de tip short (deci saltul este de
20 de octeţi), pe când în cazul unui pointer la întreg deplasarea ar fi fost de 2
octeţi.
Astfel, în programul:
/* deplasarea pentru un tablou la pointer */
#include<stdio.h>
void main()
{
short *a, (*b) [10], c[10];
a=c;
b=c;
printf(“\nInainte de incrementare:\n Adresa pointer la intreg:%p\t Adresa
pointer la tablou de intregi: %p”,a,b);
a++ ;
b++ ;
printf(“\nDupa incrementare:\n Adresa pointer la intreg:%p\t Adresa
pointer la tablou de intregi: %p”,a,b);
}
Înainte de incrementare:
Adresa pointer la întreg: FFE2 Adresa pointer la tablou de întregi:
FFE2
După incrementare:
Adresa pointer la întreg: FFE4 Adresa pointer la tablou de întregi:
FFF6
tip tab[…][…] ;
De asemenea, tab[i]+j are ca valoare adresa lui tab[i][j]. Deci tab[i][j] are aceeaşi
valoare ca şi expresia *(tab[i]+j), iar aceasta din urmă are aceeaşi valoare cu
expresia *(*(tab+i)+j).
Dacă tab este un tablou unidimensional declarat prin: tip tab[…]; atunci
tab are tipul tip* adică este pointer spre tip.
Dacă tab este un tablou bidimensional declarat prin tip tab[m][n]; atunci
tab are tipul tip (*)[n]; adică pointer spre un tablou de n elemente de tipul tip.
Menţionez că în declaraţia de mai sus m şi n sunt expresii constante.
Să presupunem că tab este parametru la apelul funcţiei f: …f(tab). În
acest caz, parametrul formal al funcţiei f poate fi declarat în următoarele
moduri:…f(tip t[][n]) sau …f(tip(*p)[n]).
Fie declaraţia: tip *tab1[n];
În acest caz, tab1 este un tablou unidimensional de pointeri spre tipul tip ,
adică fiecare element din cele n ale tabloului tab1 este un pointer spre tip.
Tablourile tab şi tab1 nu trebuie confundate. Tabloului tab i se alocă o memorie
de m*n*sizeof(tip) octeţi. Tabloului tab1 i se alocă n*sizeof(tip*) octeţi.
Dacă o funcţie q are la apel ca parametru pe tabloul tab1:…q(tab1)
atunci parametrul formal al funcţiei q poate fi declarat în următoarele
moduri:…q(tip *p[]) sau …q(tip **p).
Exemple:
1. Fie declaraţiile:
double tab[2][3]={{0,1,2},{3,4,5}}
double *p;
Atunci avem:
VALOAREA
INSTRUCŢIUNI ELEMENTUL AFIŞAT
ELEMENTULUI
p=tab[0];
tab[0][0] Zero
printf(”%g”,*p) ;
p=tab[1];
tab[1][0] 3
printf(”%g”,*p) ;
printf(”%g”,*(*(tab))) ; tab[0][0] Zero
printf(”%g”,*(*(tab+1)+2)) ; tab[1][2] 5
Numele unei funcţii este un pointer spre funcţia respectivă. El poate fi folosit ca
parametru efectiv la apeluri de funcţii. În felul acesta, o funcţie poate transfera
funcţiei apelate un pointer spre o funcţie. Aceasta, la rândul ei, poate apela
funcţia care i-a fost transferată în acest fel.
În instrucţiunile în care se atribuie pointeri la funcţii, tipurile de funcţii
trebuie să corespundă exact.
Sintaxa de declaraţie este:
tip functie(*pointer_functie)(lista_parametri);
Exemple:
1. Se observă importanţa folosirii parantezelor rotunde pentru pointeri la funcţii.
Fără acestea nu s-ar mai considera un pointer la funcţie ci o funcţie care
întoarce un pointer de un anumit tip.
a) Fie declaraţia
int *s(int *s1, int *s2);
În acest caz avem o funcţie care întoarce pointer la int.
b) În declaraţia
int (*s)(int *s1, int *s2);
avem un pointer la o funcţie care întoarce o valoare de tip int.
c) În declaraţia
int (*f (int,int)) [10];
În acest caz se defineşte o variabilă de tipul unei funcţii cu doi parametri de tip
int care întoarce ca valoare un pointer la un tablou de 10 întregi.
1. Declaraţia:
void (*v(int,int))[10] ;
nu este acceptată. Nu este acceptat pointerul la un tablou de tip void.
2. Voi da o schemă de program care foloseşte un tablou de pointeri la funcţii
predefinite.
În lista de parametri a unei funcţii pot apărea atât parametri de tip tablou cât şi
pointeri la un tip de dată. În cazul tablourilor nu se încarcă în stivă tot conţinutul
tablourilor ci numai adresa primului element. Este recomandată utilizarea ca
parametri a pointerilor în locul tablourilor. Pentru a vedea mai clar, vom defini
aceeaşi funcţie folosind pe rând tablouri şi apoi pointeri.
Exemple:
1. Funcţia lungime calculează lungimea unui şir de caractere. Varianta din
stânga defineşte funcţia prin utilizarea tabloului, varianta din dreapta defineşte
funcţia prin utilizarea pointerilor.
int lungime (char s[]) int lungime(char *s)
{ {
int i; char *p;
for(i=0;s[i];i++); for(p=s; *p; p++);
return i; return p-s;
} }
Pointerii vor fi convertiţi la char pentru a face accesul la nivel de octet. La fiecare
secvenţă de ciclare se transferă un octet şi se micşorează numărul de octeţi
transferaţi cu 1. În momentul în care nr devine 0 se iese din ciclul de transfer.
3. Produsul elementelor de pe diagonala principală a unei matrici de tip int:
Pointerul p este iniţializat cu adresa de început a matricei. Prin adunarea cu
valoarea n+1 se face mereu poziţionarea pe următorul element de pe diagonala
principală. Variabila k este înmulţită pe rând cu elementele de la adresa lui p.
#include<stdio.h>
#include<alloc.h>
#include<string.h>
char *memzona(char* s)
/* memoreaza şirul de caractere spre care indica s în zona de
memorie furnizata de malloc */
{
char *p;
if((p=(char*)malloc(strlen(s)+1))!=NULL)
{
strcpy(p,s);return p;
}
else return NULL;
}
Funcţia malloc se apelează pentru a rezerva strlen(s)+1 octeţi. Cum în zona
de memorie rezervată prin malloc se pastrează şi caracterul NUL, lungimea
returnată de funcţia strlen s-a mărit cu 1.
Pointerul returnat de malloc a fost convertit spre char*, deoarece este de tip
void*. Acest pointer se atribuie lui p, deci p indică spre începutul zonei de
memorie alocate prin apelul funcţiei malloc. Se testează dacă acest pointer este
diferit de NULL (dacă s-a putut aloca memoria de dimensiunea cerută). În caz
afirmativ, se transferă şirul prin apelul funcţiei strcpy, returnându-se apoi
valoarea pointerului p.
În afara funcţiilor prezentate anterior, limbajul C++ permite alocări în zona heap
prin intermediul operatorului new. Acesta este un operator unar şi are aceeaşi
prioritate ca şi ceilalţi operatori unari.
Operatorul new are ca valoare adresa de început a zonei de memorie
alocată în memoria heap sau zero (pointerul nul) în cazul în care nu se poate
face alocarea.
Operandul operatorului new în cea mai simpla formă, este numele unui
tip (predefinit sau definit de utilizator).
Exemple:
1) int *pint;
pint=new int;
Prin intermediul acestei expresii, se alocă în memoria heap o zonă de memorie
în care se pot păstra date de tip int. Adresa de început a zonei alocate se
atribuie pointerului pint.
Expresia: *pint=100; păstrează întregul 100 în zona respectivă.
Aceeaşi alocare se obţine, în limbajul C, folosind funcţia malloc ca mai jos:
pint=(int*)malloc(sizeof(int));
2) int& i=*new int;
Prin intermediul acestei declaraţii (definiţii) se alocă în memoria heap o zonă
de memorie în care se pot păstra date de tip int. Numele i permite referirea la
întregul păstrat în zona respectivă. Expresia de atribuire: i=100 păstrează
întregul 100 în zona respectivă.
Zonele de memorie alocate cu ajutorul operatorului new pot fi iniţializate. În
acest scop se utilizează o expresie de forma:
new tip(expresie)
unde:
tip – este numele unui tip;
expresie – este o expresie a cărei valoare iniţializează zona de memorie
Exemple:
1. double *pdouble;
pdouble=new double(3.14159265);
Această instrucţiune realizează următoarele:
- alocă în memoria heap o zonă de memorie în care se pastrează valoarea
3.14159265 în flotantă dublă precizie;
- adresa de început a acestei zone de memorie se atribuie variabilei pdouble.
new tip[expresie]
delete [expresie] p;
Adăugarea sau extragerea unui element se face la un singur capăt numit vârful
stivei. Elementul introdus primul în stivă se afla la baza stivei. Pornind de la
această definiţie, se poate deduce ce informaţie de legătură este necesară.
Astfel, informaţia de legătură a fiecărui element din stivă reprezintă adresa
elementului pus anterior în stivă, excepţie făcând elementul de la bază, a cărui
informaţie de legătură este NULL.
Operaţia Init(St):
Precondiţie: True.
Postcondiţie: St este o stivă vidă.
Operaţia Adaug (St,Element):
Precondiţie: Stiva St= (x1,x2,...,xn), n0.
Postcondiţie: Stiva St= (y1,y2,...,yn,yn+1), unde y1=Element iar yi+1=xi, pentru
i=1,2,..,n.
Operaţia Extrag (St,Element):
Precondiţie: Stiva St= (x1,x2,...,xn), n>0.
Postcondiţie:Element=x1 iar Stiva St= (y1,y2,...,yn,yn-1), unde yi=xi+1, pentru
i=1,2,..,n-1.
Funcţia StVida (St):
Precondiţie: St este o stivă arbitrară.
Postcondiţie: StVida este True dacă numărul elementelor din stivă St este 0.
Funcţia Cardinal (St):
Precondiţie: St este o stivă arbitrară.
Postcondiţie: Cardinal = Numărul elementelor din stiva St.
Aceste operaţii pot fi implementate dinamic, în felul următor:
Astfel, având următoarele declaraţii:
- Într-un pointer de lucru notat p, se reţine adresa elementului din vârful stivei;
(a)
Ultimul element al cozii nu mai are succesor, deci informaţia sa de legatură are
valoarea NULL. De asemenea, având în vedere că structura de coadă are două
capete (primul şi ultimul) sunt necesare două variabile de tip referinţă care să
indice primul element din coadă (prim) şi ultimul element din coadă (ultim). În
cazul în care coada este vidă, prim şi ultim au valoarea NULL. Astfel, o
reprezentare grafică a cozii poate arăta în felul următor:
Dacă coada era iniţial vidă, după adăugarea unui element arată astfel:
- Se reţine într-o variabilă (*q) informaţia utilă din primul element al cozii; (a)
- Se reţine într-un pointer de lucru adresa acestui element (să numim pointerul
de lucru p); (b)
- Se actualizează valoarea pointerului prim cu adresa următorului element din
coadă; (c)
- Se eliberează zona de memorie ce fusese alocată iniţial primului element din
coadă (acum indicat de pointerul p); (d)
O listă simplu înlănţuită este formată dintr-o colecţie de elemente de acelaşi tip.
Fiecare element conţine în afară de elementul propriu-zis şi o legatură care ne
spune unde putem găsi un alt element din mulţime. Elementele listei vor fi
numite şi noduri. Ideea este că fiecare nod dintr-o listă simplu înlănţuită conţine
informaţii despre cum putem localiza un alt nod dintr-o mulţime de noduri.
Accesul imediat la fiecare nod din mulţime nu este necesar pentru că fiecare
nod conduce la un altul.
inf leg
Pentru a putea construi şi a folosi cât mai eficient o listă simplu înlănţuită este
necesară o variabilă de tip referinţă care să indice primul element din listă.
Convenim să notăm cu prim – adresa primului nod. Uneori, întâlnim aplicaţii
care necesită şi folosirea adresei ultimului nod, notată cu ultim.
- În primul rând, sunt mai flexibile decât stiva şi coada (care restricţionează
operaţiile de adăugare, acces şi ştergere a elementelor conform definiţiilor lor)
- Se recomandă folosirea listelor simplu înlănţuite în rezolvarea problemelor
specifice vectorilor deoarece se utilizează eficient memoria care poate fi
alocată sau eliberată în funcţie de cerinţele programatorului
- Anumite genuri de probleme (cum ar fi operaţiile cu matrici rare; respectiv
polinoame rare) îşi găsesc o rezolvare mai rapidă, eficientă şi utilă folosind
listele
Definiţia listei simplu înlănţuite permite o mai mare diversitate a operaţiilor care
se pot face asupra ei şi astfel o mai largă aplicabilitate a acesteia.
Această operaţie se poate face înaintea sau după un element al listei. Cel mai
comod se face inserarea după un element specificat al listei. Deoarece se
realizează o inserare după un nod, acest lucru poate determina o adăugare la
sfârşitul listei în cazul în care nodul respectiv este ultimul nod din această listă,
operaţie descrisă anterior în funcţia adaugs. Sunt necesari doi pointeri de lucru:
q – indică nodul după care este facută inserarea; p – pointer de lucru necesar
pentru crearea unui nou element. Presupunem că avem o listă cu cel puţin două
elemente, unde după nodul indicat de q vom adăuga un nou element cu
valoarea informaţiei propriu-zise x.
- alocarea unei zone de memorie pentru noul element, dar cu scopul de face
inserare după nodul referit de q (folosind pe p); (a)
LISTA* caut(int x)
// x-informatia pe care o cautam în lista
{
LISTA *P // folosit pentru parcurgerea listei
int gasit;
gasit=0;
p=prim;
while (p!=NULL && !gasit )
if (p->inf==x) gasit=1;
else
p=p->leg;
if (gasit) return p;
else return NULL;
}
}
Acestea sunt principalele operaţii care se pot realiza cu listele simplu înlănţuite
şi pe baza cărora se poate rezolva o gamă largă de probleme, multe dintre ele
rezolvate anterior cu tablouri. Este bine să se facă o paralelă între rezolvarea
aceleiaşi probleme cu ajutorul listelor şi rezolvarea folosind vectorii. Astfel se
pot evidenţia avantajele folosirii alocării dinamice (probleme ce prelucrează:
matrici rare, polinoame, numere mari etc.).
E1 E2 En- En
1
NULL NIL
NULL
Fiecare element al unei liste dublu înlănţuite are două câmpuri de legătură: ant
– adresa nodului precedent din listă şi urm – adresa nodului următor din listă.
Se observă că datorită câmpului ant structura de listă dublu înlăţuită este mai
flexibilă decât cea de lista simplu înlănţuită. În primul rând este posibilă o
parcurgere în ambele sensuri a listelor dublu înlănţuite, iar pe de altă parte
dubla informaţie de legatură ne permite să accesăm mai uşor datele care ne
interesează din listă. Având în vedere prezentarea detaliată făcută anterior
listelor simplu înlănţuite, listele dublu înlănţuite le voi prezenta pe scurt
insistând asupra funcţiilor ce implementează operaţiile necesare.
Inserarea la sfârşitul listei are ca efect atât modificarea pointerului ultim cât şi a
câmpului urm al ultimului nod.
Operaţia de inserare în interiorul listei se face mai uşor având în vedere dublul
acces la adresele elementelor listei. Deoarece se realizează o inserare după
un nod, acest lucru poate determina o adăugare la sfârşitul listei în cazul în care
nodul respectiv este ultimul nod din această listă, operaţie descrisă anterior în
funcţia adaugs. Sunt necesari doi pointeri de lucru: q – indică nodul după care
este facută inserarea; p – pointer de lucru necesar pentru crearea unui nou
element. Presupunem că avem o listă cu cel puţin două elemente, unde după
nodul indicat de q vom adăuga un nou element cu valoarea informaţiei propriu-
zise x.
3
Capitolul 3 - Aspecte metodice cu
privire la predarea alocării dinamice a
memoriei
Consideraţii generale
b) Instrumentele programării
Din acest domeniu fac parte cunoştinţele privind instrumentele soft care
sunt necesare pentru implementarea algoritmilor şi structurilor de date, de
asemenea pentru verificarea şi depanarea lor.
Din această grupă fac parte metodele de reprezentare a algoritmilor
(scheme logice, diferitele variante de pseudocod, organigrame etc.), limbajele
de programare, instrumentarul oferit de mediile de programare pentru
urmărirea/depanarea programelor.
Învăţarea acestor instrumente nu se poate separa de cunoştinţele învăţate
la punctul a), rezultă deci că nu este indicată predarea independenţa a lor.
Legat de un limbaj de programare, se va preda atât cât este necesar pentru
rezolvarea şi verificarea problemelor enuntate.
În condiţii ideale, limbajul de programare rămâne la latitudinea profesorului
şi va fi ales în funcţie de problemele propuse spre rezolvare, de categoria de
vârstă şi de obiectivele generale urmărite.
g) Informatica şi societatea
Elevii trebuie să cunoască istoricul informaticii ca subdomeniu al culturii; la
fel de important este să ne ocupăm şi de “prezicerea” viitorului, respectiv de
prezentarea efectelor informaticii în zilele noastre asupra societăţii. Nu se va
preda într-un bloc contiguu tot ceea ce trebuie să înveţe elevii despre relaţia
informatică-societate, ci sub forma unor părţi de 5-10 minute din anumite lecţii.
Nu sunt suficiente doar enumerările, respectiv prezentările “distante”;
trebuie accentuate modificările care intervin deodată cu aceste “prezenţe” ale
informaticii în viaţa şi munca de zi cu zi.
h) Matematica informaticii
Se referă la acele cunoştinţe din matematică (de bază) care la această
disciplină, matematică, fie nu sunt tratate deloc, fie sunt tratate într-un moment
nepotrivit scopurilor noastre. De exemplu, în cadrul disciplinei matematică elevii
se intâlnesc cu noţiunea de matrice doar în clasa a XI-a, iar profesorul de
informatică are nevoie de noţiunea de tablou în clasa a IX-a.
Se vor prezenta noţiuni matematice doar atunci şi acolo unde rezolvarea
problemei necesită cunoaşterea acestor noţiuni de bază.
Este important să nu se trateze superficial aceste noţiuni de matematică,
dar totodată să nu se supraliciteze în detrimentul disciplinei matematică. Chiar
dacă este vorba despre aceeaşi noţiune, informaticianul o va privi altfel decât
matematicianul, în primul rând datorită faptului că el este interesat în rezolvarea
unei probleme concrete, a unei aplicaţii.
Obiectivele cadru
- Dezvoltarea deprinderilor de utilizare a unui sistem de calcul şi a unor
produse soft de largă răspândire
- Dezvoltarea gândirii algoritmice, a spiritului inventiv şi creator
- Dezvoltarea deprinderilor necesare activităţilor individuale şi în echipă
- Conştietizarea conexiunilor dintre informatică şi societate.
Clasa a IX-a
La nivel de clasa a IX-a, profesorul va prezenta doar structurile de date
implementate static, insistând în mod deosebit pe înţelegerea şi însuşirea
acestora, în paralel cu dezvoltarea gândirii algoritmice a elevilor şi dezvoltarea
deprinderilor necesare activităţilor individuale şi în echipă, pentru a constitui o
bază pentru desfăşurarea eficienţă a actitivităţii de predare-învăţare pe
parcursul clasei a X-a, unde se insistă pe programarea modulară şi pe tehnicile
de programare. Asupra structurilor de date, dar de această dată implementate
dinamic, se va reveni în clasa a XI-a, unde o mare parte a orelor de informatică
sunt rezervate capitolului Alocarea dinamică a memoriei.
Activitatea de predare-învăţare a structurilor de date alocate static, pe
parcusul unui an şcolar (clasa a IX-a) parcurge, în conformitate cu programa
şcolara, următorii paşi:
- Prezentare noţiunilor de date, variabile, constante (ca fiind obiecte cu care
lucrează algoritmii)
Obiective:
- Însuşirea de către elevilor cu noţiunile de date şi tip de date;
- Familiarizarea cu noţiunile: variabile şi constante. Diferenţierea
acestora;
- Elevii să ştie să prelucreze date la nivel de componente (simple) ;
- Elevii să recunoască tipurile de date pe exemple concrete;
Exemple de activităţi de predare-învăţare:
- definirea noţiunii de date în general;
- definirea noţiunilor de tipuri de date (legate de un limbaj de
programare; caracteristici ale tipurilor de date), variabile, constante; noţiunea
de structură de date (prin renunţarea la legătura cu un limbaj de programare);
- clasificarea tipurilor de date în funcţie de diverse criterii:
- în funcţie de modul de definire: standard şi definite de utilizator
- în funcţie de modul de memorare a datelor în calculator: simple
şi compuse
- în funcţie de modul de implementare: date implementate static
şi date implementate dinamic
- Reprezentarea datelor în memorie
Obiective:
- Elevii trebuie să cunoască organizarea fizică a memorie;i
- Elevii trebuie să-şi însuşească codificarea caracterelor şi
codificarea datelor numerice;
- Elevii trebuie să cunoască operaţii aritmetice de bază în sistemele
de numeraţie: binar, octal, hexazecimal;
Exemple de activiiăţi de predare-învăţare:
- prezentarea organizării logice a memoriei:
- noţiunile de bit, byte, kilobyte etc.
- noţiunile de adresă fizică, segment, adresă logică
- explicarea codificării caracterelor – cel mai utilizat cod alfanumeric,
codul ASCII;
- explicarea codificării datelor numerice:
- codificarea numerelor naturale
- codificarea numerelor întregi (codul complementar)
- codificarea numerelor raţionale (reprezentarea în virgulă
mobile simplă precizie şi reprezentarea în virgulă mobilă dublă precizie)
- Prezentarea tipurilor de date compuse
Obiective:
- Elevii trebuie să-şi însuşească tipurile de date compuse
- Elevii trebuie să prelucreze date de tipuri compuse: tablouri,
şiruri de caractere, fişiere text etc.
Exemple de activităţi de predare-învăţare:
- prezentarea principalelor tipuri de date compuse
- tipul tablou (tablouri unidimensionale, bidimensionale,
multidimensionale)
- tipul şir de caractere
- tipul articol (structură, înregistrare)
- tipul fişier text
- activităţi de dezvoltare a deprinderilor de abstractizare şi
organizare a informaţiilor în diverse structuri de date
- implementarea structurilor de tip tablou, articol etc.
- formularea unor probleme care să poată fi realizate în grupuri
de elevi pe baza unor discuţii preliminare şi analiza problemei
- exerciţii de prelucrare a datelor stocate pe suport extern, în
fişiere text
- exerciţii de manipulare a fişierelor text, cu folosirea şi altor
tipuri de date compuse
- evidenţierea analogiilor şi diferenţelor între citirea/scrierea
utilizând dispozitivele standard de intrare/iesire şi fişiere text
Clasa a XI-a
La disciplina informatică, pornind de la o bază solidă de cunoştinţe
dobândite pe parcursul a doi ani de studii (clasele a IX-a şi a X-a) cu privire la
structurile de date cât şi o gândire alogoritmică deja bine conturată precum şi
un spirit inventiv şi creator, programa permite prezentarea structurilor de date
implementate dinamic.
Se începe cu o absolut necesară recapitulare a structurilor de date, cu
această ocazie profesorul putând evalua cantitatea şi calitatea cunoştintelor
actuale ale elevilor clasei. Acesta este un foarte bun punct de plecare pentru a
eficientiza activitatea de predare-învăţare în continuare. Eventual, profesorul
poate puncta elementele mai importante acolo unde este cazul.
Se vor sublinia diferenţele dintre variabilele statice şi cele dinamice, cu
această ocazie profesorul putând prezenta elevilor un tip de date nou – tipul
referinţă şi noţiunea de pointer. Pentru o corecta însuşire a noilor informaţii este
bine ca profesorul să sublinieze caracteristicile datelor alocate static şi ale
datelor alocate dinamic precum şi avantajele alocării dinamice faţă de alocarea
statică.
După ce elevii şi-au însuşit cele predate de profesor, conform programei
şcolare, se vor prezenta aplicaţii ale alocării dinamice a memoriei: stiva şi coada
alocate dinamic, listele liniare (simplu şi dublu înlănţuite), structuri
arborescente. Deoarece, programa şcolară nu rezervă capitole speciale pentru
structurile de stivă, coadă şi listă liniară implementate static, devine absolut
necesar ca profesorul să introducă aceste noţiuni, în primul rând implementate
static (cu ajutorul tablourilor). Singura structură cunoscută elevilor este cea de
stivă, prezentată succint de către profesor cu ocazia predării metodei
backtracking, în cadrul predării tehnicilor de programare (clasa a X-a). Odată
întelese aceste noţiuni de către elevi, se pot preda cu succes şi implementate
dinamic, elevii putând sesiza cu uşurinţă avantajele alocării dinamice.
Scopul final este ca elevul să-şi însuşească cunoştintele de bază cu privire
la alocarea dinamică a memoriei, să înţeleagă importanţa folosirii acesteia şi
să stie să realizeze diverse aplicaţii relativ la structurile dinamice de date. În
acest sens, elevii trebuie să-şi însuşească operaţiile ce se pot face asupra
listelor (simplu sau dublu înlănţuite), stivei sau cozii, să înţeleagă utilitatea
alocării dinamice a memoriei în implementarea listelor. Odată înţelese şi
însuşite operaţiile cu liste, se vor introduce noţiunile referitoare la arbori. Este
important ca elevii să cunoască operaţiile elementare asupra arborilor binari (în
special arborii binari de căutare): creare, parcurgere, etc. De asemenea, elevii
trebuie să-şi însuşească minimul de cunoştinţe referitoare la arborii oarecare,
a căror importanţă nu trebuie neglijată, chiar dacă reprezintă un capitol mai
dificil.
Pornind de la atingerea acestor obiective, se pot realiza în cele din urmă
aplicaţii complexe care să valorifice capacitatea creatoare a elevului şi care în
acelasi timp să testeze calitatea şi cantitatea cunoştinţelor acumulate. Este
important ca elevii să nu înveţe pe dinafară operaţiile ce se pot face asupra
listelor şi arborilor, ci să deducă logic modul de realizare a acestora. În acest
scop este indicat (şi cred eu cel mai eficient) să folosim principiul vizualizării în
predarea alocării dinamice. Elevii vor fi sigur mai receptivi şi vor înţelege mai
bine ceea ce profesorul doreşte să le comunice.
Activitatea de predare-învăţare a structurilor de date alocate dinamic, pe
parcursul unui semestru dintr-un an şcolar (clasa a XI-a) parcurge, în
conformitate cu programa şcolară, următorii paşi:
- Structuri statice de date (recapitulare)
Obiective:
- Elevii să-şi reamintească cunoştinţele dobândite în clasele
precedente cu privire la structurile de date
- Elevii să-şi fixeze cunoştinţele legate de structuri de date, necesare
trecerii la predarea alocării dinamice a memoriei
Exemple de activităţi de predare-învăţare:
- Testarea de către profesor a cunoştinţelor elevilor
- Evidenţierea, prin exemple, a caracteristicilor datelor implementate
static
- Alocarea dinamică a memoriei
Obiective:
- Elevii să-şi însuşească noul tip de date – tipul referinţă
- Elevii să cunoască şi să înteleagă caracteristicile structurilor statice
şi dinamice
- Elevii să ştie să foloseascş operaţiile cu pointeri şi legatura dintre
pointeri şi tablouri
- Elevii trebuie să recunoască situatiile în care alocarea dinamică
este impusă de contextul de prelucrare specific unor probleme
- Elevii trebuie să cunoască modul de declarare şi apel al
subprogramelor
- Elevii să poată formula modul în care un subprogram comunică cu
programul apelant
Exemple de activităţi de predare-învăţare:
- Definirea şi discutarea conceptelor de baza ale modului de alocare
dinamică a datelor
- Clarificarea avantajelor şi dezavantajelor folosirii structurilor
dinamice de date
- Prezentarea operaţiilor cu pointeri
- Explicarea şi exemplificarea legăturii dintre pointeri şi tablouri
- Folosirea pointerilor ca parametri în funcţii
- Exersarea creării şi folosirii subprogramelor pentru rezolvarea unor
probleme cunoscute, rezolvate anterior fără utilizarea subprogramelor
- Evidenţierea instrumentelor existente pentru realizarea transferului
de date între diferite module de program (variabile globale şi parametri)
- Discutarea situaţiilor în care un subprogram necesită transfer de
date prin intermediul parametrilor (transmisi prin referinţă/valoare)
- Structuri dinamice de date
Obiective:
- Elevii să înteleagă şi să-şi însuşească noţiunile de stivă, coadă, listă
liniară, arbore, în primul rând implementate static, iar apoi dinamic
- Elevii să fie capabili să aleagă şi să folosească tipul de structură
alocată dinamic adecvată metodei de rezolvare a unei probleme
- Elevii să înţeleagă mecanismele de lucru cu structuri de tip coada
şi stivă
- Elevii să înteleagă mecanismele de lucru cu structuri de tip listă
liniară
- Elevii să înţeleagă mecanismele de lucru cu structuri de tip arbore
binar de căutare
- Formarea de priceperi şi deprinderi în utilizarea structurilor de date
alocate dinamic
- Elevii să fie capabili să finalizeze individual sau în echipa o aplicaţie
Exemple de activităţi de predare-învăţare:
- Explicarea şi discutarea noţiunilor de stivă, coadă, listă, arbore
- Identificarea diferitelor situaţii în care este necesară alegerea unui
anumit tip de structură
- Prezentarea şi discutarea operaţiilor specifice diferitelor tipuri de
structuri; realizarea acestora împreună cu elevii
- Realizarea a diverse aplicaţii ce pun în evidenţă necesitatea şi
avantajele implementării dinamice a diverselor tipuri de structuri
“- Ce voi face ? ”; “ - Cum voi face ? ” ; “- Cum voi şti dacă s-a realizat ceea ce
trebuia? ”.
- categoria de vârstă;
- nivelul clasei;
- personalitatea clasei;
- personalitatea profesorului;
- convingerile profesorului.
Profesorul Profesorul
Metodele interogative
Pot avea puternice valenţe formative dacă sunt utilizate corect, la
momentul oportun şi presupun o bună pregătire anterioară din partea
profesorului.
Conversaţia este o metodă interogativă care îmbracă mai multe forme, în
funcţie de obiectivele şi conţinutul diferitelor activităţi didactice:
- conversaţia euristică, cu scopul de a redescoperi cunoştinţele;
- conversaţia ca mijloc de aprofundare a cunoştinţelor;
- conversaţia pentru fixarea şi sistematizarea cunoştinţelor;
- conversaţia de verificare a cunoştinţelor.
Conversaţia, problematizarea şi descoperirea constituie o strategie
euristică de o mare valoare formativă. Prin folosirea euristicii ca stil cognitiv
operaţional de munca intelectuală, elevii participă prin efort propriu de gândire
şi de acţiune la însuşirea creativă a noilor cunoştinţe, îsi dezvoltă capacitatea
de a prelua şi combina în forme noi cunoştinţele.
Procesul de predare-învăţare algoritmică trebuie îmbinat cu învăţarea
euristică, profesorul redescoperind împreună cu elevii algoritmii, iar după
fixarea lor în memorie, aceştia urmând să fie utilizaţi pentru rezolvarea de
probleme de acelaşi tip.
Funcţiile evaluării
Rolul evaluatorului în evaluarea curentă precum şi în testări şi examinări
se distinge clar de cel al simplului profesor, acesta trebuind să asigure
îndeplinirea întregului proiect educaţional. Pornind de la planificarea evaluării
în funcţie de resursele proprii, interne (motivaţii, interese, timp, disponibilităţi) şi
cele externe, evaluatorul parcurge etape care necesită pregătire intensă,
cunoaştere, ajungând până la faza de „iluminare" în crearea sarcinilor de lucru
şi la aplicarea conştientă şi responsabilă asupra educabilului, în plus el
interpretează rezultatele, le analizează, sintetizează, clasifică şi asigură în final,
ameliorările necesare.
Astfel el îndeplineşte motivat, conştient, riguros, activ şi interactiv, reglativ
funcţiile evaluării.
Pornind de la ideea că „scopul evaluării nu este de a parveni la anumite
date, ci de a perfecţiona procesul educativ.", se pot face diverse clasificări ale
funcţiilor evaluării.
Clasificarea funcţiilor evaluării care vizează procesul de învăţământ în
ansamblu:
a) funcţia educativă-motivaţională - urmăreşte stimularea obţinerii de
performanţe superioare în pregătirea elevilor, ca urmare a influenţelor
psihomotivaţionale şi sociale ale rezultatelor învăţării, necesitând cu
precădere conştientizarea rezultatelor evaluării, conduce la stimularea
cunoaşterii şi autocunoaşterii, a puterii de apreciere şi autoapreciere,
raportând la obiectivele stabilite şi la rezultatele obţinute;
b) funcţia selectivă - presupune ierarhizarea şi selectarea elevilor sub
raport valoric şi al performanţelor în cadrul grupului studios, se obţine în urma
testelor standardizate, sau nu, cu scop normativ;
c) funcţia diagnostică - evidenţiază valoarea, nivelul şi
performanţele pregătirii elevilor la un moment dat (a punctelor tari şi a celor
slabe în diferite zone de interes), se obţine prin teste diagnostice
(psihologice, docimologice, de cunoştinţe, etc);
d) funcţia prognostică - pe baza analizei rezultatelor în comparaţie cu
obiectivele, prevede probabilistic zonele, nivelul şi distribuţia
performanţelor ce trebuie obţinute în viitor de către educabili, se obţine prin
teste de aptitudini, capacităţi şi abilităţi specifice, corelate cu teste şi/sau
chestionare de opinie, de atitudine, etc.;
e) funcţia de certificare - conduce la recunoaşterea oficială a unui statut
dobândit de către educabili, eventual în urma unui examen, prin acordarea de
certificate, diplome, sau alte documente de acest tip;
f) funcţia cibernetică (sau de feed-back) - conduce la ideea de optimizare
a procesului de predare-învăţare prin aplicarea reglajelor şi autoreglajelor;
g) funcţia de consiliere - conduce la orientarea şcolară şi profesională a
elevilor în cadrul sesiunilor de consiliere ale elevilor sau ale familiei;
h) funcţia social-economică - în planul macro - socio - economic şi în plan
individual referitor la performanţele pregătirii fiecărui elev - se referă la eficienţa
învăţământului.
Instrumente de evaluare
Rezultatele şcolare ale fiecărui elev se concretizează în efectele
(rezultatele) învăţării personale. Deoarece aceste efecte nu se pot măsura
direct pentru că sunt constituite din comportamente formate în sfera psihică a
individului, apare necesitatea ca ele să fie exteriorizate şi traduse în mărimi
măsurabile. Aceste mărimi măsurabile nu sunt altele decât rezultatele probate
de elevi şi care pun în evidenţa nivelul de formare a comportamentelor dorite şi
exprimate prin obiective pedagogice. Deci, pentru obţinerea unor informaţii de
evaluare şcolară sunt necesare următoarele acţiuni:
- probarea de către elevi a nivelului la care au ajuns în realizarea
obiectivelor pedagogice;
- măsurarea rezultatelor probate;
- evaluarea lor.
Testele de evaluare
Testul reprezintă un instrument de evaluare folosit în general în sensul de
test şcolar şi cu orientări specifice de genul: test de cunoştinţe, de aptitudini, de
dezvoltare mintală, de comportament etc.
Prelucrând clasificarea tipurilor de teste de cunoştinţe relevate de
P.Lisievici [17.] se poate face clasificarea:
Criteriu Tipuri de teste Caracteristici
Utilizate în perioada preştiinţifică a evaluării
Integrative vizează structuri integrate de cunoaştere,
înţelegere, aplicare
Fiecare element de test măsoară un
Specificitate Punctuale
element cognitiv izolat, precis determinat
Introduc elemente de tip integrativ abordânc
„din generaţia a
obiective aparţinând nivelurilor cognitive
treia"
superioare
Itemi care pot fi cotaţi prin compararea
răspunsului cu un model complet a;
Obiective
răspunsului corect, cu coeficienţi de
Obiectivitate
fidelitate ridicaţi
Subiective Cu fidelitate redusă
Semiobiective Cu itemi combinaţi
Diagnostice (de Formative, nu urmăresc ierarhizarea,
progres) prezintă nevoia unei validităţi satisfăcătoare
De succes Sumative, au rol de ierarhizare, validitatea
educaţional şi fidelitatea fiind foarte importante
Ierarhizează şi permit repartizarea pe grupe
De plasament
Utilitate de nivel
Orientate către cerinţe esenţiale pentru
activitatea ulterioară (de tip TOEFL),
De capacitate
ierarhizează, presupun colaborarea unoi
(proficiency)
grupuri de experţi şi existenţa organelor
specializate de evaluare
Orale [ternii aleşi pot fi de multe ori subiectivi
Scrise Conţin itemi de toate tipurile
Forma de
Presupun existenţa şi eficienţa aparaturii
prezentare a Cu manipularea de
necesare, eventual înregistrarea
sarcinii aparate şi piese
rezultatelor intermediare
[mplică stabilirea unor grade de
De performanţă performanţă superioară, permiţând
selectarea, ierarhizarea
Necesită o stabilire riguroasă a timpului
Cu timp de
necesar de lucru pentru atingerea
Modul de execuţie limitat
performanţelor dorite
executare
Permit creaţia, pot fi evaluate de multe ori
Cu timp liber
subiectiv, pierd din validitate şi fidelitate
Construite pentru fiecare elev în parte pot fi
Individuale
standardizate sau nestandardizate
Modul de
Pe lângă performanţele dorite permit
aplicare
Colective (de grup) comunicarea, colaborarea, transmiterea,
motivarea superioară la nivelul grupului
Itemii pot fi divizaţi pentru a viza concret
Analitice
Forma de comportamentele urmărite
solicitare Cuprind itemi subiectivi, urmărind capacităţi
Sintetice
cum ar fi cea de sintetizare
Proiectarea unui test presupune legătura dintre relevanţa acestuia,
fidelitatea şi practicabilitatea să. Raportarea permanentă la obiectivele stabilite
conduce la obţinerea unei mai mari obiectivităţi a testului, aceasta reprezentând
şi calea eficientizării evaluării tradiţionale.
Exemplu:
"Elevul să recunoască şi să grupeze... " cuprinde două sarcini calitativ diferite
şi va trebui să fie evaluat prin doi itemi distincţi.
Deoarece evaluarea se aplică după desfăşurarea acţiunii compacte de
instruire, este indicat să se respecte regula ca "un obiectiv pedagogic să fie
evaluat printr-un singur item", acesta aducând simplificări acţiunii.
Pentru a uşura urmărirea corespondenţei dintre obiectivele care se
realizează şi itemii prin care se evaluează realizarea lor, la temele cu numărul
mare de obiective devine necesară elaborarea unei diagrame "obiective-itemi".
Itemii stabiliţi în elaborarea unui test pot fi aleşi din sursele de
documentare sau pot fi proiectaţi de către profesor. Este necesară deci
cunoaşterea diferitelor tipuri de itemi, a particularităţilor lor specifice. Evaluarea
procesului de instruire vizează aceleaşi domenii ca şi instruirea însăşi:
domeniul cognitiv (cunoştinţe), afectiv (atitudini) şi psihomotor (deprinderi), în
general nevoia de teste se adresează cu precădere domeniului cognitiv.
Tipurile reprezentative de itemi din domeniul cognitiv se pot clasifica
astfel:
1. Itemi obiectivi
- cu alegere multiplă
- cu o singură variantă de răspuns corectă
- cu mai multe variante de răspuns corecte
- cu alegere duală (de tip adevărat - fals);
- de tip cauză - efect
- cu modificarea alternativei F (fals)
- de asociere (pereche)
- de ordonare (ierarhizare)
- de tip selectare (grupare) după caracteristici
2. Itemi semiobiectivi
- cu răspuns scurt
- de completare a unei propoziţii lacunare
- cu ordine impusă de completare
- în orice ordine
- de tip întrebare structurată
3. Itemi subiectivi
- de tip rezolvare de problemă
- de tip redactare de text '
- de tip analiză, rezumat, sinteză, schematizare etc.
- de tip creaţie.
- prin răspunsuri în scris: comportamente de scriere, compunere,
recunoaştere, ordonare, identificare;
- prin răspunsuri concretizate în activităţi practice: comportamente de
tehnică profesională, deprinderi motorii şi intelectuale, executare de operaţii;
- prin răspunsuri date cu ajutorul calculatorului: comportamente de
recunoaştere, identificare, calcul;
3.6 Proiecte didactice – exemplificări sugestive
O unitate de învăţare poate acoperi una sau mai multe ore de curs. Ea
este cunoscută din punct de vedere al obiectivelor/competenţelor vizate,
prezintă o unitate din punct de vedere tematic (conţinut), se desfăşoară
continuu pe o perioadă de timp şi este finalizată prin evaluare.
Demersul pedagogic pentru o unitate de învăţare este proiectat individual
de fiecare profesor în parte. Etapele proiectării sunt înlănţuite logic şi contribuie
la detalierea conţinuturilor în scopul atingerii obiectivelor de referinţă şi
formarea competenţelor specifice.
Proiectarea se realizează ţinând cont de:
- Centrarea demersului pedagogic pe obiective/competenţe;
- Implicarea următorilor factori:
- obiective/competente (de ce?);
- activităţii (cum?);
- resurse (cu ce?);
- evaluare (cui?);
În proiectarea unităţii de învăţare se parcurg următoarele etape:
1. Identificarea setului de achiziţii anterioare necesar abordării noului conţinut:
- implică precizarea noţiunilor de bază şi a comportamentelor operatorii,
necesare pentru înţelegerea şi prelucrarea noului conţinut (achiziţii anterioare);
- se poate realiza o probă de evaluare iniţială
2. Activităţile de învăţare pregătitoare:
- se realizează prin prezentarea unor situaţii problemă desprinsă din
cotidian;
- sunt exemple din cotidian abordate prin descoperire; reprezintă
valorificarea achiziţiilor din ciclul anterior;
- conduc la compatibilizarea noilor cunoştinţe cu experienţa anterioare
a elevului într-o formă accesibilă cu realizarea unor legături interdisciplinare;
3. Introducerea suportului noţional:
- necesită esenţializarea şi sistematizarea conţinuturilor în limbaj simplu;
4. Modelarea:
- presupune aplicaţii relevante ale modelului şi evidenţierea limitelor;
permite dezvoltarea unor rezultate teoretice;
- se realizează prin decurs dirijat cu activităţii pe grupe sau individual şi
sarcini precise.
5. Exersare direcţională
- Constă din aplicaţii ordonate progresiv care conduce la elaborarea unor
strategii de rezolvare;
- Modul de organizare se adaptează nevoilor grupului de elevii şi se
personalizează pe filiere şi specializări;
- Are rol de fixare şi sistematizare;
- Include probe de evaluare formative/curente.
6. Aprofundarea / generalizarea
- Oferă oportunităţiile de învăţare necesare pentru dobândirea
competenţelor acţionale şi focalizarea pe finalitate;
- Presupune activităţi diferenţiate pentru valorificarea diferitelor stiluri de
învăţare şi a diferenţelor individuale;
- Proba de evaluare sumativă.
EXEMPLU DE UNITATE DE ÎNVĂŢARE
STRUCTURI DINAMICE DE DATE
CLASA A XI-A profil matematică-informatică
Competenţe specifice:
S1: Cunoaşterea şi înţelegerea operaţiiilor cu pointeri
S2. Aplicarea corectă a funcţiilor de alocare şi dezalocare a memoriei
S3. Înţelegerea avantajelor alocării dinamice a memoriei
S4. Cunoaşterea definiţiei de stivă şi a operaţiilor cu aceasta
S5. Cunoaşterea definiţiei de coadă şi a operaţiilor cu aceasta
S6. Cunoaşterea definiţiei de listă simplu înlănţuită şi a operaţiilor cu aceasta
S7. Cunoaşterea definiţiei de listă dublu înlănţuită şi a operaţiilor cu aceasta
S8. Recunoaşterea diferitelor tipuri de structuri în rezolvarea problemelor
a) Lecţie mixtă
Caracteristici: urmăreşte realizarea aproximativ în aceeaşi măsură a mai
multor sarcini didactice (comunicare, sistematizare, fixare, verificare, etc.),
fiecăreia fiindu-i rezervată o verigă a instruirii, sarcinile profesorului şi elevilor
se situează pe acelaşi plan, succesiunea evenimentelor este variabilă, volumul
cunoştinţelor predate este mai redus.
Structură:
- organizarea clasei pentru lecţie şi captarea atenţiei elevilor;
- actualizarea elementelor învăţate anterior;
- pregătirea elevilor pentru asimilarea noilor cunoştinţe;
- comunicarea şi asimilarea noilor cunoştinţe
- fixarea cunoştinţelor predate (sistematizare, exerciţii aplicative, reluarea
într-un alt context a esenţialului, etc.);
- conexiunea inversă - pe tot parcursul lecţiei
} LISTA;
6. Obţinerea performanţelor
- durata: 10 minute;
- activitatea profesorului: profesorul propune elevilor scrierea de rutine
care să implementeze în limbajul C++ operaţiile cu listele simplu înlănţuite,
îndrumă şi supraveghează activitatea elevilor.
- activitatea elevului: utilizând materialul didactic (calculatorul, notiţe,
documentaţii), elevii vor scrie rutinele corespunăatoare operaţiilor cu nodurile
unei liste simplu înlănţuite;
prim=NULL;
p=new LISTA;
p->inf=x;
p->leg=prim;
prim=p;
}
- Adăugarea unui element la sfârşitul listei
void adaugs( tip x; LISTA *ultim) // realizează adaugarea valorii x la sfarşitul
listei
p=new LISTA;
p->leg=NULL;
p->inf=x;
ultim->leg=p;
ultim=p;
p=new LISTA;
p->inf=x;
p->leg=q->leg;
q->leg=p;
LISTA *p;
p=prim;
while (p!=NULL)
cout<<p->inf;
p=p->leg;
LISTA *s,*q;
if (r==prim)
s=prim;
prim=prim->leg;
delete s;
else
if (r==ultim)
q=q->leg;
s=ultim;
ultim=q;
ultim->leg=NULL;
delete s;
else
r->inf=r->leg->inf;
delete s;
int gasit;
gasit=0;
p=prim;
if (p->inf==x) gasit=1;
else p=p->leg;
if (gasit) return p;
}
- metode şi procedee didactice: metoda învăţării prin descoperire, metoda
problematizării, metoda lucrului în grupe mici
7. Dirijarea învăţării
- durata: 4 minute;
- activitatea profesorului: profesorul solicită elevilor prezentarea modului
de implementare a algoritmului de sortare prin insertie folosind o listă simplu
înlănţuită.
- activitatea elevului: elevii prezintă varianta de implementare solicitată şi
evidenţiază operaţiile care se vor efectua cu nodurile listei;
- metode şi procedee didactice: metoda conversaţiei, metoda expunerii
Obiectiv fundamental:
Însuşirea noţiunilor de pointer şi variabilă dinamică, înţelegerea şi
însuşirea operaţiilor cu pointeri disponibile în limbajul C++.
Obiective operaţionale:
La sfârşitul acestei lecţii elevii vor fi capabili:
- Să definească noţiunile de variabilă dinamică şi pointer
- Să facă diferenţa între variabile statice şi dinamice
- Să recunoască avantajele alocării dinamice
- Să deprindă folosirea funcţiilor de alocare şi eliberare a memoriei
- Să cunoască şi să folosească în aplicaţii operaţiile care se pot efectua
cu pointerii
Metode şi strategii didactice: conversaţia frontală şi individuală, explicaţia,
expunerea etc.
Mijloace de învăţământ: manuale, culegeri de probleme
Forme de organizare: activitate frontală
Resurse:
- pedagogice – cursuri de informatică, manualul şcolar;
- oficiale: programa şcolara;
- temporale – 50 de minute;
- psihologice: cunoştinţele dobândite de către elevi la disciplina
Informatică, pe parcursul clasei a IX-a
Desfăşurarea lecţiei:
Punctul 1
Momentele lecţiei: Organizarea clasei (60 secunde)
Activitatea profesorului: Profesorul face prezenţa şi se asigură că sunt pregătiţi
pentru începerea lecţiei
Metode didactice: Activitate frontală, expunerea, explicaţia
Punctul 2
Momentele lecţiei: Enunţarea scopului lecţiei. În cadrul lecţiei care urmează vor
fi expuse urmăatoarele probleme legate de alocarea dinamică a memoriei în
limbajul C++:
- noţiunile de tip referinţă şi pointer
- declararea unui pointer
- utilizarea funcţiilor de alocare şi eliberare a memoriei
- prezentarea şi folosirea operaţiilor cu pointeri
Punctul 3
Momentele lecţie: Predarea noilor cunoştinţe
Activitatea profesorului:Profesorul explică elevilor noile noţiuni, exemplificând
cu desene la tablă sau folosind planşe în acest sens. De asemenea, dacă este
posibil, se poate folosi un retroproiector sau soft educaţional;
Pentru alocarea dinamică se utilizează tipul de date referinţă (pointer).
Structurile dinamice, neavând nume, sunt accesibile prin intermediul altor
variabile, care conţin adresele lor, şi în felul acestea “le indică”. Aceste variabile
se numesc pointeri şi formează tipul referinţă. Pointerii sunt variabile statice
obişnuite şi au ca valori adrese, care pot fi adresele de început ale unor structuri
dinamice sau a unei componente a unei asemenea structuri. Deci, accesul la o
variabilă dinamică, indicată de o variabilă pointer se realizează prin adresarea
indirectă a variabilei pointer. Această indirectare se pune în evidenţă prin
ataşarea operatorului unar ‘*’ (operator de indirectare) înainte de numele
variabilei pointer.
În general, un pointer se declară prin: tip *nume; ceea ce înseamnă că
nume este un pointer care pointează spre o zonă de memorie ce conţine o dată
de tipul tip.
Spaţiul necesar variabilelor alocate dinamic se rezervă într-o zonă
specială de memorie numită HEAP. Aşadar, valorile unui tip reper reprezintă
fie adrese din Heap ale unor variabile dinamice de tipul specificat în definiţia
tipului reper respectiv, fie valoarea constantei standard NULL.
Operaţiile cu pointeri:
1. Atribuirea: o variabilă de tip pointer primeşte valoarea unei alte variabile sau
funcţii de acelaşi tip pointer cu ea sau este iniţializată cu constanta NULL.
2. Operaţii de incrementare şi decrementare:
Asupra variabilelor de tip pointer operatorii de incrementare şi
decrementare se execută altfel decât asupra datelor de alte tipuri.
- operatorul de incrementare aplicat asupra unui operand de tip pointer
spre tipul t măreşte adresa conţinută de operand cu numărul de octeţi necesari
pentru a păstra o dată de tipul t;
- operatorul de decrementare se execută în mod analog, cu singura
diferenţă ca în loc să se mărească valoarea pointerului, ea se micşorează cu
numărul corespunzător de octeţi.
Aceste operaţii sunt deosebit de utile când au loc prelucrări de tablouri.
Fie urmâtoarele declaraţii:
int tab[100] ;
int *p;
int i;
Fie atribuirea p=&tab[i]; unde 0<i<100. În acest caz, instrucţiunea p++; măreşte
valoarea lui p cu 2 (tipul int se pastrează pe doi octeţi) şi deci în acest moment
p conţine adresa elementului tab[i+1]. În mod analog, instrucţiunea p--;
micşorează valoarea lui p cu 2 şi deci în urma acestei decrementări p conţine
adresa elementului tab[i-1].
3. Adunarea şi scăderea unui întreg dintr-un pointer
Dacă p este un pointer, sunt corecte expresiile de forma: p+n şi p-n unde
n este de tip întreg.
- Expresia p+n măreşte valoarea lui p cu cu n*t, unde t este numărul
de octeţi necesari pentru a memora o dată de un tip spre care pointează p;
- În mod analog, expresia p-n micşorează valoarea lui p cu n*t.
Dacă x este un tablou de tipul t, atunci x este pointer, deci o expresie de
forma x+n este corectă şi deoarece x este un pointer spre primul său element
x[0], x+n va fi un pointer spre elementul x[n]. Rezultă că valoarea elementului
x[n] se poate reprezentă prin expresia *(x+n) care este o expresie cu pointeri.
Astfel, o expresie cu indici se poate înlocui printr-o expresie cu pointeri.
Acest lucru permite ca la tratarea tablourilor să se folosească expresii cu
pointeri în locul variabilelor cu indici
4. Compararea a doi pointeri
Doi pointeri care pointează spre elementele aceluiaşi tablou pot fi
comparaţi folosind operatorii de relaţie şi de egalitate.
Astfel, dacă p şi q sunt doi pointeri care indică spre elementele t[i]
respectiv t[j] ale tabloului t, expresia p<q are sens şi ea este adevărată dacă
i<j. De asemenea, p!=q are valoarea adevărat dacă i j.
Observaţii:
a) Pointerii nu pot fi comparaţi decât în condiţia amintită mai sus.
b) Operatorii de egalitate ( = = şi ! = ) permit totuşi compararea unui pointer
cu constanta simbolică NULL. Aceste comparaţii permit să stabilim dacă un
pointer conţine o adresă sau nu.
5. Diferenţa a doi pointeri
Doi pointeri care pointează spre elementele aceluiaşi tablou pot fi scăzuţi.
Rezultatul diferenţei a doi pointeri este definit astfel: fie a un tablou de un tip
oarecare şi p, q doi pointei: p conţine adresa elementului a[i], iar q conţine
adresa elementului a[i+n]. Atunci diferenţa q-p are valoarea n.
EXEMPLE:
1) unsigned lungime(char *x) /* returnează lungimea şirului spre care pointează
x */
{
int i;
for(i=0;*x!=’\0’;i++)
x++;
return i;
}
Observaţii:
- Condiţia *x!=’\0’ poate fi înlocuită cu *x, deoarece *x!=’\0’ este adevarată când
*x este diferit de zero şi invers.
- Ciclul for poate fi compactat şi mai mult: for(i=0;*x++ ;i++) ;
2) void copiază(char *x, char *y) /* copiază şirul spre care indică y în zona spre
care indică x*/
{
while(*x++=*y++);
}
Expresia de atribuire *x++=*y++ realizează atribuirea *x=*y utilizând
valorile neincrementate ale lui x şi y. Dacă valoarea atribuită este diferită de
zero, expresia de atribuire se consideră adevarată, deci ciclul continuă. În
momentul în care se atribuie valoarea 0, adică s-a ajuns la sfarşitul şirului spre
care indică y, expresia de atribuire este falsă şi ciclul se întrerupe.
4) int compară(char *x, char *y) /* returnează o valoare negativă dacă x<y, zero
dacă x=y respectiv o valoare pozitivă dacă x>y */
{
while(*x==*y){ /* ciclul funcţionează cât timp caracterele curente din
cele două şiruri sunt egale*/
if(*x==’\0’) /* dacă s-a ajuns la sfârşitul sirului din x, s-a ajuns şi la cel
din y şi toate caracterele corespunzătoare au fost egale, deci şirurile sunt egale
*/
return 0; /* se trece la perechea următoare de caractere */
x++; y++;
}
/* deoarece ciclul s-a terminat, rezultă că s-au găsit cel puţin două caractere
diferite */
return *x-*y; /* dacă diferenţa caracterelor este negativă atunci x<y, altfel
x>y */
}
Punctul 4
Momentele lecţiei: Fixarea noilor cunoştinţe
Activitatea profesorului: Profesorul pune întrebări elevilor pentru a evalua
înţelegerea noilor cunoştinţe de către elevi, precum şi necesitatea folosirii lor
Activitatea elevului: identifică probleme şi propune soluţii în care se vor folosi
cunoştinţele învăţate, prezentând avantajele unei astfel de implementări;
- metode şi procedee didactice: metoda învăţării prin descoperire, metoda
problematizării
Punctul 5
Momentele lecţiei: Prezentarea temei pentru acasă (care nu se face niciodată
în pauză)
Activitatea profesorului: profesorul solicită realizarea unei aplicaţii care să
folosească numai variabile alocate dinamic (rezolvarea ecuaţiei de gradul I)
Activitatea elevului: notează problema propusă spre rezolvare şi indicaţiile de
implementare ale profesorului şi cere eventuale lămuriri suplimentare;
Metode şi procedee didactice: metoda conversaţiei
3.7 CONCLUZII
8. Profesorul trebuie să înveţe elevii să fie capabili să desprindă din mai multe
rezolvări un algoritm general
Cum în algoritmizare oricum se caută rezolvări pentru o clasă de
probleme, această cerinţă se îndeplineşte relativ uşor. Sunt şi situaţii în care
din reuniunea mai multor clase de probleme se conturează o clasă nouă. De
exemplu: algoritm de conversie din baza 2 în baza l0, algoritm de conversie din
baza 10 în baza 16, algoritm de conversie din baza 60 în baza 8. Reuniunea
lor va conţine problemele de conversie din orice bază în orice bază pentru care
se va căuta un algoritm cu valabilitate generală.
Atunci când se predă/învaţă metoda backtracking, se vor scoate în
evidenţă paşii având caracter general, care conduc la întocmirea unui algoritm
corect şi care pot constitui un mode! pentru rezolvarea altor probleme.
De asemenea, elevii trebuie învăţaţi să compună enunţuri de probleme
care se rezolvă pe baza modelului învăţat. Elevii din clasă, împreună cu
profesorul se vor juca cu aceste enunţuri, schimbând prima dată doar un
element din ele, apoi îmbogăţindu-le, schimbându-le cerinţele, sau adăugând
cerinţe suplimentare. O importanţă deosebită în acest proces are determinarea
elevilor să observe că anumite cerinţe se pot îndeplini, în paralel, în cadrul
aceleiaşi structuri de control sau subpogram cu o singură parcurgere a structurii
de date. Modularizarea nu înseamnă neapărat câte o procedură pentru fiecare
cerinţă.
10. Profesorul trebuie să fie un bun actor, un bun diplomat şi un bun prieten al
elevilor
Un profesor bun, de multe ori, se va preface (până la un moment dat) că
o soluţie propusă de elev este bună, lăsându-1 să descopere el greşeala.
Evident, este nevoie de diplomaţie, de siguranţă, altfel elevul nu realizează că
profesorul a ştiut de la bun început că soluţia corectă este diferită de ceea ce a
prezentat el.
Profesorul nu are voie să-şi etaleze supărările, nu are voie să-şi verse
nervii pe elevi, nu are voie să-şi bârfească colegii (profesori), chiar dacă elevii
au avut dreptate. Din nou este nevoie de diplomaţie şi de talent (actoricesc
uneori).
Profesorul trebuie să-şi rezolve problemele cu elevul sau cu clasa pe cât
se poate între patru ochi. Numai în situaţii grave de abateri va apela la
conducerea şcolii sau la diriginte. Legătura cu familia de asemenea este o
problemă de diplomaţie.
Mulţi profesori consideră că atunci sunt prieteni cu elevii dacă le permit o
serie de lucruri interzise de alţii. Dar adevărata prietenie profesor-elev există
doar atunci când profesorul îi învaţă pe elevi tot ce ştie el, uneori "îi învaţă şi
mai mult", perfecţionându-se tot timpul. Profesorul depăşit de unii elevi
pasionaţi, olimpici sau care cunosc un utilitar în detaliu nu trebuie să se
ofenseze, dimpotrivă trebuie să constituie un stimulent. Un profesor de
informatică trebuie să ţină pasul cu ce apare nou în informatică cel puţin la
nivelul cerinţelor învăţămintului. Dar există şi posibilitatea ca elevii să întrebe
ceva ce "nu este în programă". Pe măsura timpului disponibil şi a complexităţii
răspunsului este recomandabil ca profesorul să se documenteze şi să
răspundă acestor întrebări în loc să refuze răspunsul sau să dea un răspuns
confuz.
Elevii în şcoală ar trebui să fie învăţaţi să devină oameni în sensul filosofic al
cuvântului. Evident există activităţi educative care se planifică în scopul
realizării acestui obiectiv. Dar şi de-a lungul orelor de informatică se pot ivi
diferite oportunităţi care pot fi fructificate din punct de vedere educativ cu
succes. Nu este nevoie ca profesorul să povestească elevilor istoria vieţii lui,
sau să comenteze programul de la TV în ora de informatică. Sunt totuşi anumite
momente în care din dorinţa de a fi cât mai credibil este nevoie de câte-un
exemplu din propria viaţă. [4, 5, 6, 7, 8, 9]
Bibliografie
[1.] Dorian Stoilescu, Manual de C/C++ pentru licee, Editura Radial, Galati,
1998, ISBN 9739833703
[2.] Dr. Jamsa, Kris, Klander, Lars, Totul despre C şi C++. Manualul
fundamental de programare în C şi C++, Editura Teora, Bucureşti, 2002;
[3.] Doina Hrinciuc Logofătu, C++. Probleme rezolvate şi algoritmi, Editura
Polirom, 2001;
[4.] Clara Ionescu, Internet: instrument de bază în procesul de predare şi
învăţare în Restructuring of the (re)training of schoolteachers in Computer
Sciences, TEMPUS S_JEP 11168-96, Editura Computer Libris Agora, 1997
[5.] Clara Ionescu, Metodica predării informaticii, Universitatea “Babeş- Bolyai”,
Cluj, 1999 – curs litografiat
[6.] Carmen Petre, Daniela Popa, Ştefania Crăciunoiu, Camelia Ilieşu, Metodica
predării Informaticii şi Tehnologiei Informaţiei, Editura Arves, Craiova, 2002,
ISBN 9738533198
[7.] Cristian Masalagiu, Ioan Asiminoaei. Didactica predării informaticii, Ed.
Polirom, 2004.
[8.] Cristian Masalagiu, Ioan Asiminoaei, Ion Maxim, Metodica predării
informaticii, Ed. MatrixRom, Bucuresti, 2001, ISBN: 9736852180
[9.] Adrian Adascalitei, Instruire asistata de calculator. Didactica informatica,
Editura Polirom, 2007, ISBN: 978-973-46-0687-0
[10.] T. H. Cormen, C. E. Leiserson, R. L. Rivest – Introduction to Algorithms,
M.I.T. Press, 1990
[11.] Adrian Runceanu, Programare orientată pe obiecte, Editura Academica
Brâncuşi, Târgu-Jiu, 2007, ISBN (13) 978-7637-89-5
[12.] Adrian Runceanu, Programare orientată pe obiecte - limbajul C++.
Laborator, Editura Academica Brâncuşi, Târgu-Jiu, 2008, ISBN 978-973-144-
109-2
[13.] Adrian Runceanu, Tehnici de programare - îndrumar de laborator, Editura
Academica Brâncuşi, Târgu-Jiu, 2002, ISBN 973-85805-7-9
[14.] Adrian Runceanu, Programarea şi utilizarea calculatoarelor, Editura
Academica Brâncuşi, Târgu-Jiu, 2003, ISBN 973-8436-44-3
[15.] Adrian Runceanu, Mihaela Runceanu, Notiuni de programare – limbajul
C++, Editura Academica Brâncuşi, Târgu-Jiu, 2012, ISBN 978-973-144-550-2
[16.] R.F. Mager, Goal Analisys, Fernon, 1972
[17.] P. Lisievici, Evaluarea in invatamant. Teorie, practica, instrumente, Editura
Aramis, 2002
[18.] http://www.runceanu.ro/adrian/pa2015 accesat iulie 2015
[19.] http://www.runceanu.ro/adrian/poo2013 accesat octombrie 2014
Despre autori
Multumim pentru citirea acestei carti! Urmareste in continuare activitatea acestui autor
prin canalele sociale de mai jos.
Facebook: http://www.facebook.com/adrianrunceanu
LinkedIn: https://ro.linkedin.com/in/mihaela-runceanu-66762416
Site: http://www.runceanu.ro/mihaela/
Multumim pentru citirea acestei carti! Urmareste in continuare activitatea acestui autor
prin canalele sociale de mai jos.
Facebook: http://www.facebook.com/adrianrunceanu
Research Gate: http://www.researchgate.net/profile/Adrian_Runceanu/
LinkedIn: http://ro.linkedin.com/in/adrianrunceanu
Site: http://www.runceanu.ro/adrian/