Documente Academic
Documente Profesional
Documente Cultură
DE DATE
Cabinet: 431
Email: cbologa@econ.ubbcluj.ro
Organizare:
Semigrupe:
MP=(P1+P2)/2
DA MT>=5 NU
DA MP>=5 NU
MG=(MT+MP)/2
STOP
Scurt istoric
Definitii:
Odagescu: "Un algoritm poate fi definit ca o funcţie f: D → F, unde
F este mulţimea informaţiilor finale, iar D este mulţimea
informaţiilor iniţiale".
Albeanu “Prin algoritm vom înţelege o secvenţă finită de comenzi
explicite şi neambigue care executate pentru o mulţime de date(ce
satisfac anumite condiţii iniţiale, conduce în timp finit la rezultatul
corespunzător.”
Caracteristici ale unui algoritm
Generalitate
Claritate
Finititudine
Corectitudine
Performanta
Robustete
Caracteristici ale unui program
+
Claritate
Extensibilitate
Reutilizabilitate
Compatibilitate
Portabilitate
Eficienta
Scurt istoric
Elaborare
Reprezentare
Executie
Analiza algoritmului
Testarea programului
Fazele dezvoltarii unei aplicatii software
Specificarea problemelor
Proiectarea solutiilor
Implementarea solutiilor
Analiza solutiilor
Testarea si depanarea
Documentarea
Limbaj natural
Pseudocod
Scheme logice
Diagrame arborescente
Tabele de decizie
Reprezentarea algoritmilor
73 15 15
Pseudocod
36 30 -
Inmultirea a 2 18 60 -
numere folosind
9 120 120
doar adunari,
inmultiri si 4 240 -
impartiri cu 2
(« inmultirea a 2 480 -
la russe »)
1 960 960
1.095
Reprezentarea algoritmilor
Pseudocod
function inmultire_a_la_russe(a, b)
x[1] a; y[1] b
i 1
cat timp x[i] > 1 execută
x[i+1] x[i] div 2 {div reprezintă împărţirea întreagă}
y[i+1] y[i]+y[i]
i i + 1
sf-cat timp
prod 0; i i - 1
cat timp i > 0 execută
dacă x[i] este impar atunci prod prod + y[i]
i i - 1
sf-cat timp
return prod
Reprezentarea algoritmilor
Scheme logice
Structura alternativa
Structura repetitiva
Structuri de control
Structura alternativa
Structuri de control
Avantaje
Aritmetica pointerilor
Exprimare concisa
Portabilitate
Limbajul C
Functii C
tip nume(lista_parametrii_formali)
declarare parametri
{
instrucţiuni specifice funcţiei: declarare variabile locale,
instrucţiuni executabile
}
Limbajul C
Functii C
#include<stdio.h>
void main(void)
{
printf(“Salut!”);
}
Limbajul C
Functii C
#include<stdio.h>
void schimbare(int x, int y) //se vor crea copii ale variabilelor x şi y
{ int tmp;
tmp=x;
x=y;
y=tmp; //în cadrul copiilor variabilelor se face inversarea
} //la revenire copiile variabilelor x şi y se distrug
void main(void)
{ int x=5, y=7;
schimbare(x,y); //transmitere prin valoare
printf(“%d %d\n”,x,y); //valorile rămân nemodificate adică se va afişa 5 7
}
Limbajul C
Transmiterea prin adresa
#include<stdio.h>
void schimbare(int *x, int *y) //se vor crea copii ale variabilelor x şi y
{ int tmp;
tmp=*x;
*x=*y;
*y=tmp; //se face inversarea asupra zonei original
}
void main(void)
{ int x=5, y=7;
schimbare(&x,&y); //transmitere prin adresă
printf(“%d %d\n”,x,y); //valorile sunt inversate adică se va afişa 7 5
}
Limbajul C
Constructiile de baza ale limbajului C
Caracterele
Identificatorii
Cuvintele cheie
Tipuri de date
Constantele si variabilele
Comentariile
Operatorii
Limbajul C
Constructiile de baza ale limbajului C
Identificatorii
Cuvintele cheie:
int extern else char register for
float typedef do double static while
struct goto switch union return case
long sizeof default short break if
unsigned continue auto
Standardul ANSI C a mai adaugat 5:
enum const signed void volatile
Limbajul C
Constructiile de baza ale limbajului C
Tipuri de date
Tipuri aritmetice
Limbajul C
Constructiile de baza ale limbajului C
Tipuri aritmetice
Limbajul C
Constructiile de baza ale limbajului C
Tipul intreg
int numar_octal=045;
int numar_hexa=0x25;
constanta zecimală 37 poate fi scrisă ca 045 în octal şi
ca 0x25 sau 0X25 în hexagesimal.
Tipul flotant
-1,5e-5
2.e-4
12.4
Limbajul C
Constructiile de baza ale limbajului C
Tipul caracter
Corect: ‘\’’ (pentru apostrof) ‘\\’ (pentru
backslash)
Gresit: ‘’’ ‘\’
“A” -> 65 00
Limbajul C
Constructiile de baza ale limbajului C
Constante
const double PI=3.1415;
const int LIM=10000;
Variabile –declarare:
tip lista variabile;
char a,b,c;
int d;
double d;
float f;
Variabile locale, parametri formali si variabile globale.
#include<stdio.h>
int factorial(int n) //n este parametru formal si este
// declarat de tip întreg
{ int i,fact=1;
for(i=2;i<=n;i++) fact=fact*i; //în variabila locala fact
//calculăm n!
return(fact);//functia factorial returnează valoarea lui n!
}
void main(void)
{ int v;
printf("3!=%d\n",factorial(3)); //în functia printf
apelam //functia factorial având ca parametru real valoarea
3
printf("Introd o valoare:");
scanf("%d",&v);
printf("%d!=%d\n",v,factorial(v)); //functia factorial
//este apelata având ca parametru
//real valoarea citita în variabila v
Variabile locale, parametri formali si variabile globale.
#include<stdio.h>
int factorial(int n)
{ int i,fact=1;
for(i=2;i<=n;i++) fact=fact*i;
return(fact);
}
void main(void)
{ int v;
printf("3!=%d\n",factorial(3));
printf("Introd o valoare:");
scanf("%d",&v);
printf("%d!=%d\n",v,factorial(v));
}
Variabile locale, parametri formali si variabile globale.
#include<stdio.h>
int fact=1;
void factorial(int n)
{ int i;
fact=1;
for(i=2;i<=n;i++) fact=fact*i;
}
void main(void)
{ int v;
factorial(3);
printf("3!=%d\n",fact);
printf("Introd o valoare:");
scanf("%d",&v);
factorial(v); printf("%d!=
%d\n",v,fact);
}
Limbajul C
Constructiile de baza ale limbajului C
int a[10];
float b[5][4];
char c[4];
Clasa de memorare:
clasa_de_memorare tip_de_baza lista_declaratori;
Comentarii
/* Acesta este
un comentariu in C */
//comentariu linie C++
Operatori aritmetici
Limbajul C
Constructiile de baza ale limbajului C
int a,v=0;
a=++v; //dupa executarea instructiunii v=1 si a=1
a=v++; //a=1 si v=2
a=v--; //a=2 si v=1
a=--v; //a=1 si v=0;
float b=5;
b=b + 1/2;
b=b + 1./2;
Limbajul C
Constructiile de baza ale limbajului C
0 –fals in C!
Orice val diferita de 0 = adevarat!
Limbajul C
Constructiile de baza ale limbajului C
Operatori logici pe biti
7 000000000000000111
8 000000000000001000
si pe biti: 000000000000000000
7&8=0
7&&8=1 (adevarat si adevarat adevarat).
Limbajul C
Constructiile de baza ale limbajului C
Operatori logici pe biti
Limbajul C
Constructiile de baza ale limbajului C
#include<stdio.h>
{
unsigned int n=5,p=1;
n|=1<<p;
printf(“%u\n”n);
}
Limbajul C
Constructiile de baza ale limbajului C
#include<stdio.h>
{
unsigned int n=7,p=1;
n&= ~(1<<p);
printf(“%u\n”n);
}
Limbajul C
Constructiile de baza ale limbajului C
Operatorul de atribuire
nume_variabila=expresie;
a = b = … = x =expresie;
(tip) operand
Instructiunea vida
Instructiunea de atribuire
Instructiunea compusa
Instructiunea if
if (expresie) instructiune1;
else instructiune2
Limbajul C
Instructiuni C
if(x)
if(y) printf(“1”);
else printf(“2”);
if(x)
{if (y) printf(“1”); }
else printf(“2”);
Instructiunea while
#include<stdio.h>
void main(void)
{
int a=18, b=12, r;
while (r=a%b) a=b,b=r;
printf(“cmmdc este %d\n”,b);
}
Limbajul C
Instructiuni C
Instructiunea do while
do
instructiune;
while(expresie);
Instructiunea for
for(exp1;exp2;exp3) instructiune;
#include<stdio.h>
void main(void)
{ int n=5, fact=1, i;
for(i=1;i<=n;i++) fact*=i;
printf(“%d! = %d\n”,n,fact);
}
Limbajul C
Instructiuni C
Instructiunea return
return;
return expresie;
Functia exit:
void exit(int cod_de_intoarcere);
-termina executia programului
goto eticheta;
eticheta: instructiune;
Instructiunea switch
switch (expresie) {
case c1: instr1;
[case c2: instr2;]
…
[default: instr_default;]
}
Limbajul C
Pointeri C
tip *nume;
Operatori: * &
int *p;
float x=1.23, y;
p=&x;
y=*p; ->valoare eronata pentru y
int *a,**b,c=1,d;
a=&c;
b=&a;
d=**b; ->d=1
Limbajul C
Operatii cu pointeri
Pointeri si tablouri
tip v[lim1][lim2]…[limn];
tip *v;
Limbajul C
Pointeri si tablouri
int v[10];
int *v;
v=malloc(10*sizeof(int));
Referire elemente:
v[i]
*(v+i),
Limbajul C
Pointeri si tablouri
int i;
double v[100],x,*p;
p=&v[0]; ->corect, neelegant
p=v;
x=v[5];
x=*(v+5);
v++; ->incorect
p++; ->corect
Limbajul C
Pointeri si tablouri
void main(void)
{ int v[10]; …
f(v); …
}
void f(int *p)
{ …}
void f(int a[10])
{ …}
void f(int a[])
{ …}
Limbajul C
Pointeri la functii
#include<stdio.h>
int suma(int a, int b)
{ return(a+b);}
int produs(int a, int b)
{ return(a*b);}
void main(void)
{ int a,b;
int (*p)(int,int);
scanf("%d %d",&a,&b);
p=suma;
printf("suma este %d\n",p(a,b));
p=produs;
printf("produsul este %d\n",p(a,b));
}
Limbajul C
Alocarea si dezalocarea memoriei
void *malloc(numar_de_octeti);
str=(char *)malloc(10);
free(str);
p=(int *)malloc(50*sizeof(int));
Limbajul C
Tipuri structurate de date
Structuri
struct nume_structura {
tip nume_camp_1;
tip nume-camp_2;
…
} [lista_variabile_structura];
struct data_calendaristica {
int zi;
int luna;
int an;
} d;
->Referire elemente: d.zi, d.luna, d.an
Limbajul C
struct {
int x;
int *y;
} *p;
++p->x incrementează pe x şi nu pe pointerul p, deoarece ordinea implicită este
++(p->x).
(++p)->x incrementează pointerul p inainte de a accesa x,
(p++)->x incrementează pointerul p după ce accesează pe x.
*p->y reprezintă valoarea întregului spre care pointează y
*p->y++ incrementează pointerul y după ce se accesează întregul spre care
pointează y
(*p->y)++ incrementează ceea ce pointează pointerul y
*p++->y incrementează pointerul p după accesul la întregul spre care pointează
y.
Limbajul C
struct NOD {
int cheie;
struct NOD *stanga, *dreapta;
} nod;
nod *creare();
void preordine(nod *p);
Limbajul C
Tipuri structurate de date
Campuri de biti
struct nume_generic {
tip nume1:lungime;
tip nume2: lungime;
…
tip numen: lungime;
} lista_variabile;
Limbajul C
Tipuri structurate de date
Uniuni
union nume_generic {
tip nume_variabilă;
tip nume_variabilă;
…
} variabile_uniune;
union exemplu_uniune {
int i;
char ch;
} eu; eu.i=10; eu.ch=’a’;
Limbajul C
Tipuri structurate de date
Enumerari
ec=albastru;
if (ec= =albastru) printf(“Albastru!\n”);
Limbajul C
Linii de comanda pentru compilator
Substitutia lexicala
#define void
#define then
#define begin {
#define end }
#define N 100
Limbajul C
Linii de comanda pentru compilator
Substitutia lexicala
#define void
#define then
#define begin {
#define end }
#define N 100
Limbajul C
Linii de comanda pentru compilator
Macroinstructiuni
#include<stdio.h>
#define PAR(a) a%2==0?1:0
void main(void)
{ if PAR(9+1)) printf(“este par\n”);
else printf(“este impar\n);
}
#undef identificator
Compilari conditionate
#if expresie_constanta
…
else
…
#endif
Limbajul C
Linii de comanda pentru compilator
Compilari conditionate
#ifdef NUME
…
#endif
#ifndef NUME
…
#endif
Limbajul C
Linii de comanda pentru compilator
Includerea fisierelor
#include<nume_fisier>
#include ”nume_fisier”
Limbajul C
Functii de intrare/iesire
Functia printf
Functia scanf
Functii de citire/scriere
int getchar(void);
int putchar(int c);
char *gets(char *s);
int *puts(char *s);
int getch(void);
int getche(void);
Limbajul C
#include<stdio.h>
void main(void)
{ int a[10],i.n;
for(i=0;i<10;a[i++]=0);
while((n=getchar())!=’\n’)
if((n-‘0’>=0)&&(n-‘0’<=9)) a[n-‘0’]++;
for(i=0;i<10;i++)
if(a[i]) printf(“Cifra %d apare de %d ori\n”,i,a[i]);
}
Limbajul C
Functii matematice
Limbajul C
Functii de conversie
int rand(void);
void srand(unsigned int i);
Limbajul C
Functii pentru operatii cu caractere si siruri de caractere
int isalpha(int c)
int isdigit(int c)
int isalnum(int c)
int isascii(int c)
int iscntrl(int c)
int isprint(int c)
int iscntrl(int c)
int isupper(int c)
int islower(int c)
int isspace(int c)
int ispunct(int c)
int isspace(int c)
int isxdigit(int c)
int toupper(int c)
int tolower(int c)
Limbajul C
Functii pentru operatii cu caractere si siruri de caractere
-text
-binar
stdin
stdout
stderr
FILE *fp;
#include<stdio.h>
#include<stdlib.h>
void main(int argc, char *argv[])
{
if(argc!=2)
{ printf(“Nr invalid de arg pe linia de comanda!\n”);
exit(1);
}
printf(“Salut %s!\n”,argv[1]);
}
Limbajul C
#include<stdio.h>
#include<stdlib.h>
void main(int argc, char *argv[])
{ FILE *fp;
char ch;
if(argc!=2)
{ printf(“Numar incorect de parametri!\n”);
exit(1); }
if((fp=fopen(argv[1],”w”))==NULL)
{ printf(“Nu se poate deschide in scriere fisierul precizat !\n”);
exit(1); }
do
{ch=getchar();
putc(ch,fp);
} while (ch!=EOF);
fclose(fp);
}