Documente Academic
Documente Profesional
Documente Cultură
PCLP CURS 4 1
11/9/2016
PCLP CURS 4 2
11/9/2016
c.m.m.m.c. Temă
Se dau două numere naturale nenule n şi m. Să se
calculeze cmmmc(n, m).
Exemplu: n = 36, m = 30 => cmmmc(36,30)= 180
PCLP CURS 4 3
11/9/2016
#include <stdio.h>
main() Întrebare
{
int n, b, nb, z; Se citește un număr n natural în baza 10. Să se
printf("nb = "); scanf("%d", &nb);
afișeze cifrele sale începând cu cifra cea mai puțin
printf("baza = "); scanf("%d", &b);
semnificativă ale reprezentării sale într-o bază
n = 0;
z = 1;
oarecare b. b se citește pe intrare.
while( nb != 0 ){
Exemplu: n = 9301, b = 8 => 5 2 1 2 2
n = n + z * (nb%10);
nb = nb/10;
z = b * z;
}
printf("n in baza 10 = %d\n", n);
}
17:51 PCLP CURS 4 19 17:51 PCLP CURS 4 20
printf("numarul = ");
scanf("%d",&n);
F F
printf("baza = ");
TEME
scanf("%d",&b);
1. Modificați codul astfel încât pentru
while( n != 0 ){ cifrele mai mari decât 9, programul
să afișeze corect cifrele A pentru
c = n % b;
10, B pentru 11 ş.a.m.d.
II. FUNCŢII
printf("%d ",c);
n = n / b; 2. Modificați codul astfel încât
} numărul citit pe intrare să poată fi
} un întreg în octal (%o)/ hexa (%x)
17:51 PCLP CURS 4 21
Funcţii Funcţii
• O funcţie furnizează un mod convenabil pentru a • C face utilizarea funcţiilor facilă, comodă şi
încapsula anumite calcule şi apoi eficientă;
poate fi utilizată fără nicio grijă asupra modului de multe ori o funcţie mică face mai clară o bucată
cum a fost implementată. de cod.
• Cu funcţii proiectate corect este posibil • Până acum am utilizat doar funcţii predefinite
să ignori cum a fost realizată o sarcină; furnizate de limbaj
este suficient să ştii doar ce a fost realizat. printf, scanf, getchar şi putchar ;
vom învăţa să scriem propriile noastre funcţii.
17:51 PCLP CURS 4 23 17:51 PCLP CURS 4 24
PCLP CURS 4 4
11/9/2016
#include <stdio.h>
ÎNTREBARE float scad(float, float);
main()
• Scrieţi un {
float x, y, dif;
program care x = 3.25;
apelează o y = 4.05;
dif = scad(x, y);
funcţie care printf("%g - %g = %g\n", x, y, dif);
calculează }
Aplicaţie
diferența a
două numere
float scad(float a, float b)
{
PROGRAM PENTRU RIDICAREA LA O
reale. float s;
s = a - b;
PUTERE ÎNTREAGĂ POZITIVĂ
return s;
}
17:51 PCLP CURS 4 29 30
PCLP CURS 4 5
11/9/2016
#include <stdio.h>
int power(int base, int n);
Forma definiţiei unei funcţii
int main() tipul-valorii-returnate nume-funcţie(declaraţii de parametrii)
{ base, power
power {
int i; n
for (i = 0; i < 10; ++i) declaraţii
printf("%d %d %d\n", i, power(2,i), power(-3,i)); instrucţiuni
return 0; }
}
Programul conţine o • Declaraţiile funcţiilor pot apărea în orice ordine,
int power(int base, int n)
{/* power: raise base to n-th power; n >= 0 */
funcţie power(m,n) într-un fişier sursă sau în mai multe,
pentru a ridica un întreg
int i, p;
m la o putere întreagă deşi nici o funcţie nu poate fi ruptă între mai multe
p = 1;
for (i = 1; i <= n; ++i)
pozitivă n. Adică fişiere.
valoarea returnată de
p = p * base;
power(2,5)este 32.
• Pentru moment vom presupune că funcţiile sunt în
return p;
} acelaşi fişier.
17:51 PCLP CURS 4 31 17:51 PCLP CURS 4 32
PCLP CURS 4 6
11/9/2016
PCLP CURS 4 7
11/9/2016
#include <stdio.h>
Prototipul funcţiei int main() /* testul de numar prim */ Întrebare
{
int n, i, prim = 1;
• Se semnalează eroare dacă definiţia unei funcţii printf("Introduceti nr care trebuie testat ca e prim\n");
scanf("%d",&n);
sau orice utilizare a ei nu este în conformitate cu for ( i = 2; i <= n - 1; ++i ){
prototipul său. if ( n%i == 0 ){
prim = 0; Rescrieți
/* break; */ programul testării
• Numele parametrilor nu trebuie să se conformeze. }
} unui număr dacă
if ( prim )
este prim sau nu
• Numele parametrilor sunt opţionali în prototipul printf("%d e prim\n", n);
else folosind o funcție
funcţiei, aşa că pentru prototip putem scrie şi aşa: printf("%d nu e prim\n", n); pentru testul de
număr prim.
int power(int, int); }
return 0;
În C toate argumentele sunt transmise /* power: raise base to n-th power; n >= 0; version 2 */
El conduce de obicei la programe mai compacte cu p = p * base; Tot ceea ce este făcut asupra lui
mai puţine variabile străine, n în interiorul funcţiei power nu
return p; are niciun efect asupra
deoarece parametrii pot fi trataţi ca variabile argumentului n original cu care
locale }
power a fost apelată.
inițializate convenabil în funcţiile apelate.
17:51 PCLP CURS 4 47 17:51 PCLP CURS 4 48
PCLP CURS 4 8
11/9/2016
Aplicaţie
PCLP CURS 4 9
11/9/2016
• Funcţia getline încărcă o linie nouă a intrării. • 0 este o valoare acceptabilă pentru a fi returnată
Ar trebui ca funcţia să fie utilă şi în alte contexte. deoarece ea nu poate fi niciodată o lungime
validă pentru o linie.
• Minim minimorum getline trebuie să returneze
un semnal despre un posibil sfârşit de fişier; • Orice linie de text are cel puţin 1 caracter.
o proiectare mai utilă trebuie să returneze
• Chiar şi o linie conţinând numai 1 caracter:
lungimea liniei, sau
newline are lungimea 1.
0 dacă este întâlnit un sfârşit de fişier.
PCLP CURS 4 10
11/9/2016
/* copy: copy 'from' into 'to'; assume to is big enough */ STRUCTURA PROGRAMULUI
void copy(char to[], char from[]) #include <stdio.h>
{ #define MAXLINE 1000 /* maximum input line length */
• Avem nevoie de funcţia main care să controleze int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
funcţiile: char longest[MAXLINE]; /* longest line saved here */
getline şi max = 0;
while ( (len = getline(line, MAXLINE)) > 0 )
copy. if (len > max) {
max = len; main şi getline
copy(longest, line); comunică printr-o
} pereche de argumente
if (max > 0) /* there was a line */ (line, MAXLINE) şi o
printf("%s", longest); valoare returnată
(len).
return 0;
}
17:51 PCLP CURS 4 63 17:51 PCLP CURS 4 64
int getline(char s[], int lim) void copy(char to[], char from[])
• Această linie spune că primul argument formal, s, e un • Unele funcţii returnează valori utile.
tablou, iar al doilea, lim, e un întreg. • Altele, precum copy, sunt utilizate numai pentru ceea ce
fac şi nu returnează nicio valoare.
• Declară că getline returnează un int
Tipul returnat de copy este void, care afirmă explicit
Deoarece int este tipul implicit returnat, putea fi omis. că nu este returnată nicio valoare.
Adică linia
• Cu toate acestea, funcţia returnează către main şirul to[]
int getline(char s[], int lim)
în care a copiat şirul from[], dar prin intermediul
putea fi substituită de linia parametrilor de ieşire - de tip adresă –
getline(char s[],int lim) adrese care, în cazul tablourilor, sunt tot una cu numele lor
17:51 PCLP CURS 4 65 17:51 PCLP CURS 4 66
PCLP CURS 4 11
11/9/2016
PCLP CURS 4 12
11/9/2016
int main()
int getline(char s[],int lim)
{ variabilele din main, cum ar fi len,
int len; { Acelaşi lucru este valabil şi pentru
max, line, longest sunt private
int max; int c, i; variabilele din alte funcţii.
sau locale funcţiei main.
char line[MAXLINE]; for(i=0;i<lim-1&&(c=getchar())!=EOF&&c!='\n‘;++i)
char longest[MAXLINE]; s[i] = c;
max = 0; if (c == '\n') { Variabila i din getline nu
s[i] = c; are absolut nicio legătură cu
while ((len = getline(line, MAXLINE)) > 0)
variabila i din copy.
if (len > max) { ++i;
} void copy(char to[], char from[])
max = len; Deoarece ele sunt în interiorul s[i] = '\0'; {
copy(longest, line); funcţiei main, nici o altă return i; int i;
} funcţie nu poate avea acces } i = 0;
if (max > 0) direct la ele.
while ((to[i] = from[i]) != '\0')
printf("%s", longest); ++i;
return 0; }
}
17:51 PCLP CURS 4 73 17:51 PCLP CURS 4 74
PCLP CURS 4 13
11/9/2016
PCLP CURS 4 14
11/9/2016
PCLP CURS 4 15
11/9/2016
• Există o tendinţă să se lucreze numai cu variabile • A te baza prea mult pe variabilele externe este
extern deoarece se pare că periculos deoarece:
se simplifică comunicarea, aceasta conduce la programe ale căror conexiuni
între date nu sunt toate evidente;
lista de argumente este scurtă şi
variabilele sunt totdeauna acolo unde le vrei. variabilele pot fi modificate în moduri neaşteptate
sau accidentale şi
• Dar variabilele externe sunt totdeauna acolo chiar programul este apoi greu de reparat.
şi atunci când nu le doreşti.
17:51 PCLP CURS 4 93 17:51 PCLP CURS 4 94
PCLP CURS 4 16
11/9/2016
PCLP CURS 4 17
11/9/2016
Nume de variabile
• Numele vor fi alese în corespondență cu scopul
variabilei.
• Se vor alege:
nume scurte pentru variabile locale,
în special pentru contoarele ciclurilor şi IV. TIPURI DE DATE
nume mai lungi pentru variabilele externe.
PCLP CURS 4 18
11/9/2016
Calificatori Calificatori
• Calificatorul signed sau unsigned poate fi aplicat • Tipul long double specifică numere reale în
la char sau la orice întreg. virgulă mobilă cu precizie extinsă.
• Numerele unsigned sunt totdeauna pozitive sau • Ca şi la tipurile întregi, dimensiunile tipurilor virgulă
zero. mobilă depind de implementare;
float, double şi long double pot avea una, două
• De exemplu, dacă char ocupă 8 biți: sau trei dimensiuni distincte.
variabilele unsigned char iau valori între 0 şi 255
• Headerele standard <limits.h> şi <float.h>
variabilele signed char iau valori între -128 şi 127
conțin constante simbolice pentru toate aceste
(în cod complement faţă de doi).
dimensiuni împreună cu alte proprietăți ale mașinii și
• Caracterele tipăribile sunt totdeauna pozitive. compilatorului.
17:51 PCLP CURS 4 109 17:51 PCLP CURS 4 110
Sufixe
• O constantă întreagă precum 1234 este un int.
Sufixe Sufixe
• Constantele fără semn • Sufixele f sau F
sunt scrise cu sufixul u sau U, indică o constantă float
• Sufixul ul sau UL indica tipul unsigned long.
• l sau L
• Constantele în virgulă mobilă conțin
indică o constantă long double
un punct zecimal (123.4) sau
un exponent (1e-2) sau
ambele;
• tipul lor este double, chiar dacă nu sunt sufixate.
17:51 PCLP CURS 4 113 17:51 PCLP CURS 4 114
PCLP CURS 4 19
11/9/2016
PCLP CURS 4 20
11/9/2016
#define BELL '\007' /* ASCII bell character */ \f avans la linie nouă (formfeed) \' apostrof
\n linie nouă (newline) \" ghilimea
• sau, în hexazecimal: \r return (carriage return) \ooo număr octal
\t tab orizontal \xhh număr hexa
#define VTAB '\xb' /* ASCII vertical tab */
\v tab vertical
#define BELL '\x7‘ /* ASCII bell character */
17:51 PCLP CURS 4 121 17:51 PCLP CURS 4 122
PCLP CURS 4 21
11/9/2016
PCLP CURS 4 22
11/9/2016
PCLP CURS 4 23