Sunteți pe pagina 1din 40

Curs 8 - Agenda

Test Problem solving: suma primelor n numere prime conversii operatorul sizeof() pointeri functii: legarea parametrilor tablouri siruri

Dorel Lucanu

Algoritmica si programare

Problem solving: suma primelor n numere


experienta anterioara: suma primelor n numere naturale

s 0 for i 1 to n do s s + i
adaptam la problema noastra

s 0 x 2 for i 1 to n do s s + x x urmPrim(x)
Dorel Lucanu Algoritmica si programare

Problem solving: suma primelor n numere


urmatorul prim dupa x cu exceptia lui 2, orice numar prim este impar; deci pot testa numai numerele impare urmatorul prim dupa 2 este 3 function urmPrim(x) if (x = 2) then return 3 y x+2 while (true) if (estePrim(y)) then return y; y y+2 end cine asigura terminarea lui while?
Dorel Lucanu Algoritmica si programare

Problem solving: suma primelor n numere


testarea daca un numar este prim daca x < 0, atunci estePrim(x) = estePrim(-x) primul numar natural prim este 2 cu exceptia lui 2, orice numar prim este impar a*b = x, a <= b implica a <= sqrt(x)

Dorel Lucanu

Algoritmica si programare

Problem solving: suma primelor n numere


function estePrim(x) /* exceptii */ if (x < 0) then x = -x if (x < 2) then return false if (x = 2 or x = 3) return true if (x % 2 = 0) then return false /* cazul general */ sqrtx = (int) sqrt((double)x); i 3 while (i <= sqrtx) do if (x % i = 0) then return false return true end
Dorel Lucanu Algoritmica si programare

Problem solving: suma primelor n numere


int estePrim(int x) { int i, sqrtx; if (x < 0) x = -x; if (x < 2) return 0; if (x == 2 || x == 3) return 1; if (x % 2 == 0) return 0; sqrtx = (int) sqrt((double)x); if (sqrtx * sqrtx == x) return 0; for (i = 3; i < sqrtx; i += 2) if (x % i == 0) return 0; return 1; }
Dorel Lucanu Algoritmica si programare

Problem solving: suma primelor n numere


int urmPrim(int x) { int y; if (x == 2) return 3; for (y = x+2; 1; y += 2) if (estePrim(y)) return y; }

Dorel Lucanu

Algoritmica si programare

Problem solving: suma primelor n numere programul principal declarare variabile se prezinta citeste date proceseaza datele s 0 x 2 for i 1 to n do s s + x x urmPrim(x) afiseaza rezultatele

Dorel Lucanu

Algoritmica si programare

Problem solving: suma primelor n numere


int main() { int i, x, n, suma; printf("Programul calculeaza ....\n\n"); printf("Introduceti n: "); scanf("%d",&n); if (n <= 0) { printf("Eroare! Valoare gresita.\n"); exit(1); } x = 2; suma = 0; for (i = 0; i < n; x = urmPrim(x), ++i) suma += x; printf("suma este %d.\n", suma); }
Dorel Lucanu Algoritmica si programare

Demo

Dorel Lucanu

Algoritmica si programare

Problem solving: suma primelor n numere


probleme cu vederea rezultatului in VC? printf("Apasati CTRL/Z! \n"); while ((c = getchar()) != EOF) /* nimic */; printf("\n");

Dorel Lucanu

Algoritmica si programare

Demo

Dorel Lucanu

Algoritmica si programare

Arhitectura unei aplicatii simple scrise in C

interface prime_fct.h

prime_fct.c prime_fct.c

prime_fct.o

suma_n_prime.c

suma_n_prime.exe

Dorel Lucanu

Algoritmica si programare

prime_fct.h
/ // prototipuri functii cu numere prime // // testeaza daca un numar este prim // intrare: x - numarul ce urmeaza a fi testat // intoarce: // 1 - daca numarul x este prim // 0 - in caz contrar int estePrim(int x); // determena urmatorul prim ...
Dorel Lucanu Algoritmica si programare

prime_fct.c
// // implememnteaza functiile din prime_fct.h // #include <math.h> #include <stdlib.h> #include "prime_fct.h" // testeaza daca un numar este prim // intrare: x - numarul ce urmeaza a fi testat // intoarce: // 1 - daca numarul x este prim // 0 - in caz contrar int estePrim(int x) { int i, sqrtx; if (x < 0) x = -x; ...
Dorel Lucanu Algoritmica si programare

suma_n_prime.c
// // calculeaza suma primelor n numere prime // #include #include #include #include <math.h> <stdio.h> <stdlib.h> "prime_fct.h"

int main() { int i, x, n, suma; char c; printf("Programul calculeaza ... ...


Dorel Lucanu Algoritmica si programare

cast-uri
int a = 7, b = 5; float x, y; x = a; /* OK. echivalenta cu */ x = (float) a;

x = 3.14; a = x; /* ok dar de preferat asa:*/

a = (int) x;

a = 7; b = 5; x = a/b; /* x va avea valoarea 1 */ x = (float) a / (float) b; /* x va avea valoarea 1.4 */

Dorel Lucanu

Algoritmica si programare

Operatorul sizeof() (ex. I_17.c)


sizeof() intoarce dimensiunea locatiei de memorie ocupate de o variabila apartinand unui tip parametru un tip: printf("%15s%5u\n","int",sizeof(int)); parametru o variabile simple: double x; printf("%15s%5u\n",dim x",sizeof(x));

int dim 4 x 8

Dorel Lucanu

Algoritmica si programare

Pointeri
int *p; int a; /* ... */ p = &a; *p = 7; adr p int* a *p
Dorel Lucanu Algoritmica si programare

7 adr

int

Pointeri notatia grafica scurta

*p p sau *p p

int int

adr adr

Dorel Lucanu

Algoritmica si programare

Pointeri
atentie! int *p, q; este echivalent cu int *p; int q; pentru ca memoreaza adrese, lungimile locatiilor de memorie nu depind de tipul variabilei asociate sizeof(int*) = sizeof(double*) = ... afisarea unui pointer int *px; px = &x; printf(%p, px);
Dorel Lucanu Algoritmica si programare

Functii: legarea parametrilor (apel prin valoare)

int sqr(int x) { return x*x }

int

o copie a

int a = 1723; b = sqr(a); c = b-2;

int

1723

Dorel Lucanu

Algoritmica si programare

Functii: parametri pointeri


void dubleaza(int *x) { *x += *x; } x *x int* int

int a = 23; dubleaza(&a); /* a == 46 */

int

23 46 adr

Dorel Lucanu

Algoritmica si programare

Functii: parametri
parametri de intrare int sqr(int x) { return x*x iesire intrare } parametri de iesire int imparte(int x, int y, int *q, int *r) { if (!y) return 1; *q = x / y; *r = x % y; return 0; } parametri de intrare+iesire void dubleaza(int *x) { *x += *x; }
Dorel Lucanu Algoritmica si programare

Declarare tablouri unidimensionale


#define NMAX 45 int a[NMAX];
0 1 int[NMAX] int int NMAX-1 ...

a a[0] a[1]

a[NMAX-1]

int

Dorel Lucanu

Algoritmica si programare

Numele unui tablou


Numele unui tablou: nume de variabila ex: sizeof(a) pointer catre primul element din tablou: a echivalent cu &a[0] *a echivalent cu a[0] a+1 echivalent cu &a[1] *(a+1) echivalent cu a[1] a+2 echivalent cu &a[2] *(a+2) echivalent cu a[2] etc

Dorel Lucanu

Algoritmica si programare

Parcurgerea unui tablou (Exemplul I_36.c)


/* Varianta 1 */ for (i=0; i < n; ++i) suma += a[i]; for (i=0; i < n; ++i) suma += *(a+i); for (p=a; p < &a[n]; ++p) suma += *p; p=a; for (i=0; i < n; ++i) suma += p[i];

/* Varianta 2 */

/* Varianta 3 */

/* Varianta 4 */

Dorel Lucanu

Algoritmica si programare

Aritmetica pointerilor
int *p;
sizeof(int)

p double *p;

p+1

sizeof(double)

p
Dorel Lucanu

p+1
Algoritmica si programare

Aritmetica pointerilor (Exemplul I_37.c)

int

a[2], *p1, *q1;

p1 = a; q1 = p1+1; printf("%d",q1-p1); printf("%d, %d", sizeof(int), (int)q1 - (int)p1);

q1 - p1 = 1 sizeof(int) = 4, (int)q1 - (int)p1 = 4

Dorel Lucanu

Algoritmica si programare

Aritmetica pointerilor (Exemplul I_37.c)


double c[2], *p3, *q3;

p2 = c; q3 = p3+1; printf("%d",q3-p3); printf("%d, %d", sizeof(double), (int)q3 - (int)p3); q3 - p3 = 1 sizeof(double) = 8, (int)q3 - (int)p3 = 8
Dorel Lucanu Algoritmica si programare

Tablourile ca parametri (Exemplul I_38.c)


void insert_sort(int a[], int n) { //... }

/* utilizare */ int w[100]; ... insert_sort(w, 10);

Dorel Lucanu

Algoritmica si programare

Tablouri bidimensionale
int a[2][3]; a a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
Dorel Lucanu

int[2][3] int int int int int int


Algoritmica si programare

Parcurgerea unui tablou bidimensional (I_39.c)


double a[MMAX][NMAX]; /* decl. tablou bidim. */ double suma; /* suma elemenetelor din tablou */

for (i = 0; i < m; i++) for(j = 0; j < n; j++) fscanf(finp, "%lf", &a[i][j]); suma = 0; for (i = 0; i < m; i++) for(j = 0; j < n; j++) suma += a[i][j];
Dorel Lucanu Algoritmica si programare

Tablouri vazute bi- ca tablouri uni-

a a[0]

int[2][3] int[3]

a[1]

int[3]

Dorel Lucanu

Algoritmica si programare

Tablouri bi-: functia de alocare a memoriei


linia 0 linia 1 ... coloana coloana . . . 0 1 a[0][0] a[0][1] ... a[1][0] a[1][1] ... ... ... ...

Expresii echivalente cu a[i][j] *(a[i] + j) *((*(a + i)) + j) (*(a + i))[j] *(&a[0][0] + NMAX*i +j)
Dorel Lucanu Algoritmica si programare

Initializarea tablourilor
int a[] = {-1, 0, 4, 7} int a[4] = {- 1, 0, 4, 7} /* echivalent cu */

char s[] = un sir /* echivalent cu */ char s[7] = {u, n, , s, i, r, \0}

int b[2][3] = {1,2,3,4,5,6} /* echivalent cu */ int b[2][3] = {{1,2,3},{4,5,6}} /*echivalent cu*/ int b[][3] = {{1,2,3},{4,5,6}}

Dorel Lucanu

Algoritmica si programare

Tablouri bidimensionale ca parametri (I_40.c)


int minmax(int t[][NMAX], int i0,int j0, int m,int n) { //... } /* utilizare */ if (minmax(a,i,j,m,n)) { // ... }
Dorel Lucanu Algoritmica si programare

Siruri I (Exemplul I_9 - palindroame)


Declarare siruri #define MAX_SIR 100 ... char s[MAX_SIR];

char[100]
0 1 2 99

Dorel Lucanu

Algoritmica si programare

Siruri II (Exemplul I_9)


citirea unui sir printf("Sirul: "); scanf("%s", s);

Sirul: un_sir

char[100]

u n _ s i r \0 0 1 2 3 4 5 6 99

Dorel Lucanu

Algoritmica si programare

Siruri III (Exemplul I_9)


determinarea lungimii sirului lg = 0; while (s[lg] != '\0') lg++; testarea proprietatii de palindrom i=0; j=lg-1; while (s[i]==s[j] && i<j) { i++; j--; } if (i >= j) printf("\nSirul este palindrom.\n"); else printf("\nSirul nu e palindrom.\n");
C A P A C

i
Dorel Lucanu

j
Algoritmica si programare

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

  • Istoria Bizantului
    Istoria Bizantului
    Document59 pagini
    Istoria Bizantului
    Flocea Mihai
    100% (3)
  • Analiza Matematica - CULEGERE DE PROBLEME
    Analiza Matematica - CULEGERE DE PROBLEME
    Document198 pagini
    Analiza Matematica - CULEGERE DE PROBLEME
    pancev
    100% (12)
  • Verilog HDL Tutorial
    Verilog HDL Tutorial
    Document29 pagini
    Verilog HDL Tutorial
    stefan
    Încă nu există evaluări
  • Programe
    Programe
    Document17 pagini
    Programe
    Catalin Serban
    Încă nu există evaluări
  • Poo 4
    Poo 4
    Document13 pagini
    Poo 4
    Iulian Curca
    Încă nu există evaluări
  • USO Tema3
    USO Tema3
    Document7 pagini
    USO Tema3
    Iulian Curca
    Încă nu există evaluări
  • Tsa Seminar Loopshaping
    Tsa Seminar Loopshaping
    Document3 pagini
    Tsa Seminar Loopshaping
    Iulian Curca
    Încă nu există evaluări
  • Curs 02
    Curs 02
    Document59 pagini
    Curs 02
    Iulian Curca
    Încă nu există evaluări
  • Lucrarilaborator
    Lucrarilaborator
    Document119 pagini
    Lucrarilaborator
    Mantulescu Marius
    Încă nu există evaluări
  • Lab 9
    Lab 9
    Document1 pagină
    Lab 9
    Iulian Curca
    Încă nu există evaluări
  • Tema Laborator To
    Tema Laborator To
    Document6 pagini
    Tema Laborator To
    Daniel John Ioan
    Încă nu există evaluări
  • Lab4 2013
    Lab4 2013
    Document26 pagini
    Lab4 2013
    Iulian Curca
    Încă nu există evaluări
  • USO Tema2 Update 3
    USO Tema2 Update 3
    Document8 pagini
    USO Tema2 Update 3
    IDontHack
    Încă nu există evaluări
  • Curs 02
    Curs 02
    Document59 pagini
    Curs 02
    Iulian Curca
    Încă nu există evaluări
  • Roma Antica-Curs 2
    Roma Antica-Curs 2
    Document2 pagini
    Roma Antica-Curs 2
    Aditos94
    Încă nu există evaluări
  • Stabilit Ate
    Stabilit Ate
    Document14 pagini
    Stabilit Ate
    Iulian Curca
    Încă nu există evaluări
  • Functii Nerecursive
    Functii Nerecursive
    Document29 pagini
    Functii Nerecursive
    Mr Crossplane
    Încă nu există evaluări
  • Curs 8
    Curs 8
    Document40 pagini
    Curs 8
    Iulian Curca
    Încă nu există evaluări
  • Sumar Curs 8
    Sumar Curs 8
    Document1 pagină
    Sumar Curs 8
    Iulian Curca
    Încă nu există evaluări
  • Code Blocks
    Code Blocks
    Document8 pagini
    Code Blocks
    Iulian Curca
    Încă nu există evaluări
  • File O1256847231 File 4 Ae 9 F 77 FD 30 CF
    File O1256847231 File 4 Ae 9 F 77 FD 30 CF
    Document10 pagini
    File O1256847231 File 4 Ae 9 F 77 FD 30 CF
    Iulian Curca
    Încă nu există evaluări
  • BazeELTH-4-Elemente Ideale de Circuit
    BazeELTH-4-Elemente Ideale de Circuit
    Document79 pagini
    BazeELTH-4-Elemente Ideale de Circuit
    Dragos Carstocea
    Încă nu există evaluări
  • Serii Numerice
    Serii Numerice
    Document10 pagini
    Serii Numerice
    Iulian Curca
    Încă nu există evaluări
  • Unde Electromagnetice Probleme
    Unde Electromagnetice Probleme
    Document28 pagini
    Unde Electromagnetice Probleme
    Alex Florian
    Încă nu există evaluări
  • Cap1 1
    Cap1 1
    Document32 pagini
    Cap1 1
    Iulian Curca
    Încă nu există evaluări
  • Grecia Antica
    Grecia Antica
    Document4 pagini
    Grecia Antica
    Iulian Curca
    Încă nu există evaluări
  • Curs 2
    Curs 2
    Document15 pagini
    Curs 2
    Iulian Curca
    Încă nu există evaluări
  • Grecia Antica
    Grecia Antica
    Document4 pagini
    Grecia Antica
    Iulian Curca
    Încă nu există evaluări