Documente Academic
Documente Profesional
Documente Cultură
PCLP Curs 11 1
9/5/2018
if (argc == 1 ) /* fara argumente; copiaza intrarea standard */ • Programul semnalează erorile în două moduri.
copiazafisier(stdin, stdout);
else
while (--argc > 0)
1. În primul rând, diagnosticul produs de funcţia
if ((pf = fopen(*++argv, ”r")) == NULL){ fprintf este trimis către stderr,
fprintf(stderr, "%s: nu se poate deschide %s\n",prog, *argv); deci îşi găseşte drumul către ecran
exit(l);
}else { în loc de a dispărea
copiazafisier(pf, stdout); în lungul unui canal de transfer
fclose(pf); sau într-un fişier de ieşire.
}
if (ferror(stdout)){ • Am inclus numele programului, din argv[0], în mesaj
fprintf(stderr, "%s: eroare la scrierea in stdout\n", prog);
exit(2); astfel încât dacă acest program este folosit împreună cu
} altele,
exit(0);
} să se poată identifica sursa unei eventuale erori.
21:38 PCLP CURS 11 7 21:38 PCLP CURS 11 8
• În interiorul funcţiei main, • Deşi erorile la scriere sunt rare, acestea apar totuşi
return expr de exemplu, când un disc este plin,
este echivalent cu în consecinţă un program demonstrativ ar trebui să
exit(expr) verifice şi acest lucru.
PCLP Curs 11 2
9/5/2018
PCLP Curs 11 3
9/5/2018
Funcţii diverse
• Biblioteca standard pune la dispoziţie o gamă
largă şi variată de funcţii.
PCLP Curs 11 4
9/5/2018
islower(c) valoare diferită de zero dacă c este isspace(c) valoare diferită de zero dacă c este
literă mică, 0 în caz contrar spaţiu, tab, rând nou, retur de car,
salt la pagină nouă la imprimantă,
isdigit(c) valoare diferită de zero dacă c este tab vertical
cifră, 0 în caz contrar
21:38 PCLP CURS 11 29 21:38 PCLP CURS 11 30
PCLP Curs 11 5
9/5/2018
ungetc
ungetc ungetc
• Biblioteca standard furnizează o versiune mai • Nu se garantează decât
restrânsă a funcţiei ungetch reintroducerea unui singur caracter în fiecare
decât cea pe care am scris-o noi în Cursul 6 fişier.
aceasta se numeşte ungetc
• Funcţia ungetc poate fi folosită cu oricare dintre
int ungetc(int c, FILE *pf) funcţiile de citire:
scanf
reintroduce caracterul c în fişierul pf şi returnează
getc
fie caracterul c,
getchar
fie EOF în caz de eroare.
21:38 PCLP CURS 11 33 21:38 PCLP CURS 11 34
Executarea comenzilor
• Funcţia
int system(const char *s)
execută comanda conţinută în şirul de caractere s,
după care reia execuţia programului curent din
punctul în care fusese oprită.
EXECUTAREA COMENZILOR
• Conţinutul şirului s depinde foarte mult de
sistemul de operare de pe calculator.
PCLP Curs 11 6
9/5/2018
return 0;
}
21:38 PCLP CURS 11 37 21:38 PCLP CURS 11 38
FUNCŢII MATEMATICE
PCLP Curs 11 7
9/5/2018
Funcţii matematice
log10(x) logaritm zecimal (în baza 10)
din x (x>0)
pow(x,y) xy
PCLP Curs 11 8
9/5/2018
• Funcțiile atexit() se pot înregistra oriunde în status = atexit(adio); /* inregistrez a 2-a functie (adio) apelata la o
iesire normala */
#include <assert.h>
Dacă odată cu includerea antetului
#include <stdio.h> #include <stdio.h> <assert.h> este definită
int main(){ #define NDEBUG constanta NDEBUG, macroul
int nota; #include <assert.h> assert(expresie) este ignorat.
int main(){
printf("Introduceti nota studentului (1..10) : ");
int nota;
scanf("%d", ¬a);
assert(nota <=10 && nota >= 1); printf("Introduceti nota studentului (1..10) : ");
printf("Nota introdusa %d\n", nota); scanf("%d", ¬a);
assert(nota <=10 && nota >= 1);
return 0;
printf("Nota introdusa %d\n", nota);
}
return 0;
}
PCLP Curs 11 9
9/5/2018
PCLP Curs 11 10
9/5/2018
#include <stdio.h>
#include <time.h>
struct tm timp descompus
void intarziere(unsigned int);
main(){ • Structură (numită broken-down time) care memorează
clock_t start, stop, total;
o dată și un timp, descompuse în componentele lor:
start = clock(); printf("Pornire program = %ld\n", start);
struct tm {
intarziere(10000); /* intarziere 10 de secunde */
stop = clock(); printf("Final program = %ld\n", stop); int tm_sec; /* secunde dupa minut, 0..60 */
total = stop - start; int tm_min; /* minute dupa ora, 0..59 */
printf("Timp total procesor = %ld batai\n", total); int tm_hour; /* ore de la miezul noptii, 0..23 */
printf("CLOCKS_PER_SEC = %ld\n", CLOCKS_PER_SEC); int tm_mday; /* ziua din luna, 1..31 */
printf("timpul scurs = %ld\n", total/CLOCKS_PER_SEC); int tm_mon; /* luna incepand de la ianuarie, 0..11 */
return 0; int tm_year; /* numarul de ani de la 1900 */
} int tm_wday; /* ziua din saptamana de la duminica, 0..6 */
void intarziere(unsigned int milisecunde){ int tm_yday; /* ziua din an de la 1 ianuarie, 0..365 */
clock_t stop = milisecunde + clock(); int tm_isdst; /* ora de vara, >0 daca e activa, 0 daca nu e
while ( stop > clock() ); si <0 daca nicio informatie nu e disponibila*/
} };
21:38 PCLP CURS 11 61 21:38 PCLP CURS 11 62
time_t mktime(struct tm
*timeptr)
#include <stdio.h>
#include <time.h>
• Convertește un timp descompus (broken-down time)
main () exprimat prin pointerul la structura tm: timeptr,
{
într-o valoare temporală codificată la fel ca valorile
time_t secunde;
returnate de funcția time().
secunde = time(NULL);
printf("Din 1 ianuarie 1970 au trecut %ld de ani.\n", • Valorile originale ale membrilor structurii tm:
secunde/(60*60*24*365)); tm_wday și tm_yday sunt ignorate,
iar valorile originale ale celorlalți membrii nu sunt
return 0;
} restricționate la intervalele precizate anterior în
comentariile din dreptul lor.
21:38 PCLP CURS 11 65 21:38 PCLP CURS 11 66
PCLP Curs 11 11
9/5/2018
PCLP Curs 11 12
9/5/2018
• Funcția convertește data și ora spre care indică • Funcția convertește timpul descompus (broken-
pointerul timer într-un timp descompus (broken down time) din structura spre care indică
down time) care exprimă ora și data UTC/GMT. timeptr într-un șir de forma:
• Valoarea returnată este un pointer la un timp Tue Nov 29 09:56:04 2016\n\0
descompus, sau pointerul nul, dacă data și ora
furnizate pe intrare nu pot fi convertite în dată și • Utilizând un algoritm echivalent cu următorul:
oră UTC/GMT.
#include <stdio.h>
#include <time.h> Aplicație 5
char *a(const struct tm *timeptr);
main(){ • Folosind funcția asctime din headerul
time_t timp = time(NULL);
<time.h>, scrieți un program care afișează
printf("Data si ora UTC/GMT: %s", a(gmtime(&timp)));
printf("Data si ora locala : %s", a(localtime(&timp))); data și ora UTC/GMT (furnizată de apelul funcției
}
return 0; gmtime) și
char *a(const struct tm *timeptr){
data și ora locală (furnizată de apelul funcției
static const char zi_sapt[7][3] = {"Dum", "Lun", "Mar", "Mie", "Joi",
"Vin", "Sam"}; localtime) în formatul:
static const char luna[12][3] = {"Ian", "Feb", "Mar", "Apr", "Mai",
"Iun", "Iul", "Aug", "Sep", "Oct", "Noi", "Dec"};
static char timp[26];
Tue Nov 29 09:56:04 2016
sprintf(timp, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n", zi_sapt[timeptr-
>tm_wday], luna[timeptr->tm_mon], timeptr->tm_mday,timeptr->tm_hour,
timeptr->tm_min, timeptr->tm_sec, 1900 + timeptr->tm_year);
• Apelând de fiecare dată, pentru cele două afișări,
return timp;
}
funcția asctime.
21:38 PCLP CURS 11 77 21:38 PCLP CURS 11 78
PCLP Curs 11 13
9/5/2018
main()
• Rescrieți aplicația anterioară (Aplicație 5)pentru {
afișarea time_t timp = time(NULL);
datei și orei locale (furnizată de data aceasta doar printf("Data ora UTC/GMT: %s", asctime(gmtime(&timp)));
de apelul funcției ctime) și a printf("Data ora locala : %s", ctime(&timp));
PCLP Curs 11 14
9/5/2018
#include <stdio.h>
#include <time.h>
size_t strftime(char *s,
Data și ora curente preluate
main(void){
time_t acum = time(NULL);
de pe ecranul calculatorului
size_t maxsize, const char *format,
struct tm ora_curenta;
/* memoram membrii variabilei temporale acum in membrii
const struct tm *timeptr)
variabilei temporale ora_curenta */
ora_curenta = *localtime(&acum);
/* variabila ora_curenta va avea toti membrii identici cu
• Funcția formatează informații de despre dată și oră
variabila acum mai putin minutul si secunda care le facem 0 */ indicate de timeptr
ora_curenta.tm_min = ora_curenta.tm_sec = 0;
plasându-le într-un șir de caractere indicat de pointerul s
/* cu functia difftime() scadem cele doua momente de timp si
aflam cate secunde s-au scurs de la inceputul orei curente */ și controlat de șirul indicat de pointerul format (analog
double secunde = difftime(acum, mktime(&ora_curenta));
formatelor din printf).
printf("Din ora curenta au trecut %.f secunde\n", secunde);
printf("Din ora curenta au trecut %.f minute\n", secunde/60);
• Funcția întoarce numărul de caractere din șirul indicat
}
return 0;
de s.
21:38 PCLP CURS 11 85 21:38 PCLP CURS 11 86
• În șirul s sunt copiate maxim maxsize caractere. %a e înlocuit de prescurtarea locală a numelui zilei din
• timeptr indică o structură de tip timp descompus. săptămână [tm_wday]
• Șirul de caractere indicat de pointerul format constă %A e înlocuit de numele local al zilei din săptămână
din zero sau mai mulți specificatori de conversie și alte [tm_wday]
caractere dorite de utilizator.
%b e înlocuit de prescurtarea locală a numelui lunii [tm_mon]
• Toate caracterele dorite de utilizator sunt copiate
neschimbate în șirul s. %B e înlocuit de numele local al lunii [tm_mon]
• Un specificator de conversie constă din caracterul % %c e înlocuit de o reprezentare locală adecvată a datei și orei
urmat de specificatorul de conversie.
%d e înlocuit de ziua din lună ca număr (01−31) [tm_mday]
• Fiecare specificator de conversie este înlocuit de
%H e înlocuit de oră ca număr (00−23) [tm_hour]
caractere corespunzătoare așa cum va fi descris în lista
următoare: %I e înlocuit de oră ca număr (01−12) [tm_hour]
21:38 PCLP CURS 11 87 21:38 PCLP CURS 11 88
%j e înlocuit de ziua din an ca număr (001−366) [tm_yday] %W e înlocuit de numărul din an al săptămânii (prima luni este
prima zi a săptămânii unu) ca număr (00−53) [tm_year,
%m e înlocuit de lună ca număr (01−12) [tm_mon]
tm_wday, tm_yday]
%M e înlocuit de minut ca număr (00−59) [tm_min]
%x e înlocuit de o reprezentare locală adecvată a datei
%p e înlocuit de echivalentul local al notației AM/PM asociat %X e înlocuit de o reprezentare locală adecvată a orei
un ceas cu 12 ore [tm_hour]
%y e înlocuit de ul mele 2 cifre ale anului (00−99) [tm_year]
%S e înlocuit de secundă ca număr (00−60) [tm_sec]
%Y e înlocuit de an (e.g. 2016) [tm_year]
%U e înlocuit de numărul din an al săptămânii (prima duminică
este prima zi a săptămânii unu) ca număr (00−53) %Z e înlocuit de fusul orar sau abrevierea lui (e.g. pentru
[tm_year, tm_wday, tm_yday] România se afișează: GTB Standard Time ceea ce este tot
una cu Ora Europei de Est (EET): GMT/UTC+2)
%w e înlocuit de ziua din săptămână ca număr (0−6), unde
duminică este 0 [tm_wday] %% e înlocuit de %.
21:38 PCLP CURS 11 89 21:38 PCLP CURS 11 90
PCLP Curs 11 15
9/5/2018
printf( "local %%B(luna) %%c(data ora locala) %%d(zi din printf( "local %%H(ora 00..23) %%I(ora 00..12) :
luna):\n %s\n\n", sir_timp ); %s\n\n", sir_timp );
PCLP Curs 11 16
9/5/2018
%U numărul din an al săptămânii (prima duminică %W numărul din an al săptămânii (prima luni
este prima zi a săptămânii unu) număr 00−53 e prima zi a săptămânii unu) număr 00−53
%w ziua din săptămână număr 0−6, 0 = duminică %x reprezentare locală adecvată a datei
. . . . . . . . . . . . . . . . . .
ptr_timp_local = localtime( &timp ); ptr_timp_local = localtime( &timp );
strftime( sir_timp, MAX_LUNG, "(%U) (%w)", strftime( sir_timp, MAX_LUNG, "(%W) (%x)",
ptr_timp_local ); ptr_timp_local );
printf( "local %%U(nr saptamana 00-53) %%w(zi saptamana printf( "local %%W(nr saptamana 00-53) %%x(reprezentare
0..6) : %s\n\n", sir_timp ); locala data) : %s\n\n", sir_timp );
PCLP Curs 11 17
9/5/2018
Headere noi în C99 Headere noi în C99 multibyte și wide character: tipuri
de date caracter pe mai mult de 8 biți
(16/32) pentru a permite utilizarea
unui set de caractere extins.
<iso646.h> definește 11 macrouri care reprezintă <tgmath.h> furnizează macrouri cu tip generic care permit
operatori de egalitate, relaționali și la ca funcții pentru operații matematice din
nivel de bit [C95] <math.h> și <complex.h> (incluse în el)
să fie utilizate cu argumente de diferite tipuri
<stdbool.h> definește macrourile bool, true și
false, utilizate pentru variabile <wchar.h> împreună cu <wctype.h>, furnizează suport
booleene pentru intrările și ieșirile multibyte character
și wide character [C95]
<stdint.h> definește tipuri întregi și macrouri
<wctype.h> împreună cu <wchar.h>, furnizează o
corespunzătoare bibliotecă pentru wide character [C95]
21:38 PCLP CURS 11 105 21:38 PCLP CURS 11 106
PCLP Curs 11 18
9/5/2018
PCLP Curs 11 19
9/5/2018
#include <stdio.h>
#include <stdio.h> Asemănător se petrec
struct cvartet{ lucrurile și pentru struct
void f(int [8]); int x, y, z, w;
};
(vezi exemplul) sau union.
int main(){
void f(struct cvartet);
printf( " afisare tablou \n" );
int main(){
f( ( int [ 8 ] ) { [ 0 ] = 5, [ 7 ] = 3 } ); printf( "Afisare structura \n" );
return 0; f( ( struct cvartet ) { .x = 5, .w = 3 } );
return 0;
}
}
void f(int a[8]) void f(struct cvartet p){
{ printf( "membrul x = %d \n", p.x );
for( int i = 0; i < 8; ++i ) printf( "membrul y = %d \n", p.y );
printf("%d ", a[i]); printf( "membrul z = %d \n", p.z );
printf( "membrul w = %d \n", p.w );
}
}
#include <stdio.h>
BIBLIOGRAFIE
struct punct_in_spatiu{
float x, y, z;
}; [1] Kernighan, B., Ritchie, D., The C Programming
int main(){ Language, 2nd ed., Ed. Prentice Hall, 1988.
struct punct_in_spatiu a[8] = {
[ 0 ] = { .x = 1.12, .y = -2.04, .z = 3.25 },
[ 7 ] = { .x = 15.31, .z = -12.14 } [2] Deitel, P., Deitel, H., C - How to program, 8th ed.,
};
Inițializarea Pearson Publisher, 2016.
printf( "Afisare tablou de struct \n" ); unui tablou
printf( " x y z\n" );
de struct.
for ( int i = 0; i < 8; ++i ) [3] ***, N1570, Standardul C11 - ISO/IEC 9899:2011,
printf( "%7.2f %7.2f %7.2f\n", a[ i ].x, a[ i ].y, http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
a[ i ].z );
return 0;
}
PCLP Curs 11 20