Descărcați ca pdf sau txt
Descărcați ca pdf sau txt
Sunteți pe pagina 1din 40

Dorel Lucanu Algoritmica si programare

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
suma_n_prime.c
interface
prime_fct.h
prime_fct.c
prime_fct.c
suma_n_prime.exe
prime_fct.o
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 <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "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 4 dim x 8
Dorel Lucanu Algoritmica si programare
int*
p
adr
*p
Pointeri
int *p;
int a;
/* ... */
p = &a;
*p = 7;
int
adr
a
7
Dorel Lucanu Algoritmica si programare
Pointeri notatia grafica scurta
*p int
p
adr
int
adr
sau
*p
p
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 a = 1723;
b = sqr(a);
c = b-2;
x int
a
int
1723 1723
o copie
Dorel Lucanu Algoritmica si programare
Functii: parametri pointeri
void dubleaza(int *x)
{
*x += *x;
}
x
int*
a
int
adr adr
int a = 23;
dubleaza(&a);
/* a == 46 */
*x
int
46 23
Dorel Lucanu Algoritmica si programare
Functii: parametri
parametri de intrare
int sqr(int x) {
return x*x
}
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;
}
intrare
iesire
Dorel Lucanu Algoritmica si programare
Declarare tablouri unidimensionale
#define NMAX 45
int a[NMAX];
a[0]
int
a[1]
int
a[NMAX-1]
int
a
int[NMAX]
...
0
1
NMAX-1
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)
for (i=0; i < n; ++i)
suma += a[i];
/* Varianta 1 */
for (i=0; i < n; ++i)
suma += *(a+i);
/* Varianta 2 */
for (p=a; p < &a[n]; ++p)
suma += *p;
/* Varianta 3 */
p=a;
for (i=0; i < n; ++i)
suma += p[i];
/* Varianta 4 */
Dorel Lucanu Algoritmica si programare
sizeof(double)
Aritmetica pointerilor
p
p+1
sizeof(int)
int *p;
p
p+1
double *p;
Dorel Lucanu 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[0][0]
a
int[2][3]
int
int
a[0][1]
a[0][2]
int
int
a[1][0]
a[1][1]
int
int
a[1][2]
Dorel Lucanu Algoritmica si programare
Parcurgerea unui tablou bidimensional (I_39.c)
suma = 0;
for (i = 0; i < m; i++)
for(j = 0; j < n; j++)
suma += a[i][j];
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]);
Dorel Lucanu Algoritmica si programare
Tablouri vazute bi- ca tablouri uni-
a
int[2][3]
a[0] int[3]
int[3] a[1]
Dorel Lucanu Algoritmica si programare
Tablouri bi-: functia de alocare a memoriei
*(&a[0][0] + NMAX*i +j)
(*(a + i))[j]
*((*(a + i)) + j)
*(a[i] + j)
Expresii echivalente cu a[i][j]
... ... ...
. . .
... a[1][1] a[1][0]
linia 1
... a[0][1] a[0][0]
linia 0
. . . coloana
1
coloana
0
Dorel Lucanu Algoritmica si programare
Initializarea tablourilor
int a[] = {-1, 0, 4, 7} /* echivalent cu */
int a[4] = {- 1, 0, 4, 7}
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];
99 2 1 0
s char[100]
Dorel Lucanu Algoritmica si programare
Siruri II (Exemplul I_9)
citirea unui sir
printf("Sirul: ");
scanf("%s", s);
s
char[100]
\0 r i s _ n u
6 4 5 99 3 2 1 0
Sirul: un_sir
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 j

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