Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Directive de preprocesare
#define
Directiva #define permite definirea unor constante sau macrouri. Sintaxa sa este:
#define nume valoare
Rolul ei este de a defini o constant sau o macroinstruciune numit nume i care
este nlocuit n fiierul n care este inclus, prin valoare.
Exemple:
#define MAX_WIDTH 100
char str1[MAX_WIDTH];
char str2[MAX_WIDTH];
Se definesc dou iruri str1 i str2 avnd o lungime de 100 caractere.
#undef
#undef ndeplinete o funcie invers celei realizate de #define. Ea elimin din lista
de constante predefinite pe cea al crei nume este precizat ca parametru al directivei
#undef:
#define MAX_WIDTH 100
char str1[MAX_WIDTH];
#undef MAX_WIDTH
#define MAX_WIDTH 200
77
char str2[MAX_WIDTH];
#ifdef name
// secven de cod
#endif
Exemplu:
#ifdef MAX_WIDTH
char str[MAX_WIDTH];
#endif
n cazul dat, linia char str[MAX_WIDTH]; este pstrat n codul care va fi supus
compilrii n cazul n care constanta MAX_WIDTH a fost anterior definit, indiferent de
valoarea sa.
#ifndef opereaz invers: codul cuprins ntre directiva #ifndef i directiva #endif
este compilat numai n cazul n care constanta specificat nu a fost anterior definit.
Exemplu:
#ifndef MAX_WIDTH
#define MAX_WIDTH 100
#endif
char str[MAX_WIDTH];
78
#if, #else i #elif (elif = else if) servesc la specificarea unei secvene de cod
care va fi compilat n funcie de ndeplinirea unei condiii. Condiia care poate fi scris
trebuie s poat fi evaluat ca valoare constant.
De exemplu:
#if MAX_WIDTH>200
#undef MAX_WIDTH
#define MAX_WIDTH 200
#elsif MAX_WIDTH<50
#undef MAX_WIDTH
#define MAX_WIDTH 50
#else
#undef MAX_WIDTH
#define MAX_WIDTH 100
#endif
char str[MAX_WIDTH];
#error
Aceast directiv provoac abandonarea compilrii dac se produce eroarea
specificat ca parametru.
Exemplu:
#ifndef __cplusplus
#error A C++ compiler is required
79
#endif
#include
La ntlnirea acestei directive, preprocesorul o nlocuiete cu fiierul specificat.
Exist dou moduri de specificare a fiierului de inclus:
#include "file"
#include <file>
Singura diferen dintre cele dou forme este faptul c ele specific directoare
diferite n care preprocesorul caut fiierul de inclus. n primul caz, cel n care numele
fiierului este ncadrat ntre ghilimele, fiierul este cutat n acelai director n care este
fiierul care conine directiva. n cazul n care nu este acolo, fiierul este cutat n
directorul implicit n care sunt cutate fiierele antet standard.
Dac numele fiierului este inclus ntre caractere < >, fiierul este cutat direct n
directorul destinat pstrrii fiierelor antet standard.
#pragma
Aceast directiv este folosit pentru a specifica unele opiuni suplimentare
necesare procesului de compilare. Aceste opiuni sunt specifice compilatorului folosit, deci
pentru folosirea lor trebuie consultat documentaia acestuia.
Algoritmi fundamentali
2. Algoritmi de sortare
Ordonarea unor masive mari de date reprezint una primele activiti n care au fost
folosite calculatoarele. Exist muli algoritmi de sortare, fiecare cu avantajele,
dezavantajele i variantele sale.
Metoda bulelor (bubble sort) const n compararea elementelor succesive, dou
cte dou, i inversarea lor dac nu respect ordinea dorit. Procedeul continu prin
reluarea prelucrrii irului de valori pn cnd toate elementele acestuia respect ordinea
dorit.
#include <iostream>
using namespace std;
void main()
{
int n, a[20], i;
cout << "n = "; cin >> n;
for(i=0; i<n; i++)
{
cout << "a[" << i << "]= ";
cin >> a[i];
}
ordon(a, n);
cout << "Sirul ordonat:" << endl;
for(i=0; i<n; i++)
cout << "a[" << i << "]= " << a[i] << endl;
82
3. Algoritmi de interclasare
Interclasarea este intercalarea elementelor a dou sau mai multe iruri ordonate
cresctor.
#include <iostream>
using namespace std;
void inter(int a[], int b[], int rez[], int na, int nb);
void main()
{
int na, nb, a[20], b[20], c[40], i;
cout << "na = "; cin >> na;
for(i=0; i<na; i++)
{
83
void inter(int a[], int b[], int rez[], int na, int nb)
{
int i=0, j=0;
do
{
if(i < na && j < nb)
if(a[i]<= b[j])
{
rez[i+j] = a[i];
i++;
}
else
{
rez[i+j] = b[j];
j++;
}
else
if(i < na)
{
rez[i+j] = a[i];
i++;
}
else
{
rez[i+j] = b[j];
j++;
}
}
while(i + j < na + nb);
}
84
4. Algoritmi de iniializare
Realizarea unui set de date de test sub forma unui ir de valori, de obicei aleatoare,
sau a unei matrice revine frecvent n aplicaii.
Exemple:
a. Iniializarea unui ir cu valori aleatoare produse prin apelul funciei rand().
#include <stdlib.h>
#include <iostream>
#include <time.h>
using namespace std;
b. Iniializarea unei matrice unitare. O astfel de matrice are toate elementele nule
cu excepia celor de pe diagonala principal. Elementele de pe diagonala
principal au proprietatea de a avea indicele de linie egal cu cel al coloanei.
#include <iostream>
using namespace std;
int n, i, j;
double a[10][10];
cout << "n= "; cin >> n;
int main(void)
{
int t1[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int t2[3] = {4, 5, 6};
if (includ(t1, t2, 10, 3))
cout << "t1 contine t2" << endl;
return 0;
}
int i, j;
i = 0;
do
{
if(a[i] == b[0])
for(j = 1; j < nb; j++)
{
if(a[i+j] != b[j])
break;
};
if(j == nb)
return 1;
i++;
}
while (i < na - nb);
return 0;
}
#include <iostream>
using namespace std;
void main(void)
{
int t1[10] = {2, 4, 6, 8, 9, 10, 15, 15, 15, 17};
int t2[10] = {1, 4, 5, 8, 11, 15, 15, 16, 18, 19};
int t[10], n, i;
// Se efectueaza intersectia multimile t1 si t2 :
// Afiseaza rezultatul :
for( i = 0; i < n; i++ )
{
cout << t[i] << " ";
}
cout << endl;
}
do
{
if(a[i] < b[j])
i++;
else
if(a[i] > b[j])
j++;
else
{
rez[nrez] = a[i];
i++; j++; nrez++;
}
}
while(i < na && j < nb);
}