Documente Academic
Documente Profesional
Documente Cultură
Forme de reprezentare
a algoritmilor.
Algoritm-un set finit de operatii(actiuni) pentru a rezolva problema data.
Algoritmul are 3 parti:
1) Introducerea datelor de intrare(initiale)
2) Prelucrarea datelor de intrare in scopul obtinerii datelor de iesire(rezultatele).
3) Evidentierea datelor de iesire
Forme de reprezentare a algoritmilor:
1) Forma limbajului natural
2) Forma grafica
3) Pseudocodul
4) Programul
Schemele logice sunt notaii grafice formate din blocuri legate ntre ele prin sgei. O schem
logic descrie grafic paii unui algoritm Totodat ea specific prelucrrile care se execut
asupra datelor
Operatia de startareSTART
De stopare STOP
Introducerea de la tastatura
De afisare pe ecran
De calcul(atribuire)
De apel la subprogram
De decizie
Atunci cand doriti ca printf sa afiseze o valoare sau o variabila, trebuie sa includeti informatia despre
tipul variabilei in primul parametru. Pe langa caractere in primul parametru puteti sa introduceti
specificatori de format, care arata functiei printf cum sa afiseze ceilalti parametri.
Spre ex. pentru a afisa o valoare de tip int, veti folosi %d. De asemenea, pentru a tipari o valoare in
virgula mobila (float), puteti folosi %f. Functia printf permite utilizarea unor specificatori de format care furnizeaza
informatii despre tipurile parametrilor (cum ar fi int, float, char etc.) Pentru a afisa valorile de tip int cu printf se foloseste
specificatorul de format %d.
Funtia scanf()
Functia scanf este o functie cu ajutorul careia putem citi date de la tastatura.
%c citeste un caracter
%p citeste un pointer
%n argumentul asociat primeste o valoare intreaga egala cu numarul de caractere deja citite
5) Algoritmi cu structura liniara si ramificata. Instructiuni conditionate if, if-else, if-else ifelse
Structuri de algoritmi:
Structura liniara
Structura ramificata
Structura ciclica
Structura mixta
Structura liniara (n-are operatia de conditie) include operaiile de:
- citirea date de intrare;
- calculul valorii unei/unor expresii i atribuirea valorii unei/unor variabile;
- afiarea rezultatelor
Structura de decizie (se mai numete i structur alternativ sau structur ramificat) introduce n
algoritm operaia de ramificare, adic evaluarea unei condiii stabilirea valorii adevrat sau fals a
acesteia i adoptarea unei decizii privind modul n care se continu calculele.
Structura obligatorie a secvenei de decizie este:
- o condiie
- dou subblocuri de instruciuni (notate aciune 1 , aciune 2) a cror interpretare este decis de
valoarea logic a condiiei DA/NU; (adevrat/fals; true/false). Niciodat nu se pot interpreta i executa
ambele subblocuri.
Instruciunea introdus prin cuvntul cheie if exprim o decizie binar i poate avea dou forme: o form
fr cuvntul else i o form cu else:
Sintaxa: If (expresie)
instructiune1
else
instructiune2 SAU:
If (expresie)
Instructiune
instructiunea1;
instructiunea2;
if(conditie_iteratie_fortata) continue;
..
instructiunean;
}
while (conditie);
Utilizarea instructiuni continue pentru fortarea iteratiei urmatoare dintr-un ciclu for prin
omiterea executarii urmatoarelor instructiuni aflate dupa instructiunea continue:
for ([expresie1];[expresie2];[expresie3])
{
instructiunea1;
instructiunea2;
if(conditie_iteratie_fortata) continue;
..
instructiunean;
}
Instructiunea goto
Instructiunea goto muta controlul execuiei programului ctre o instruciune etichetat (n cadrul aceleiai
metode!). Instructiunea goto are sintaxa:
goto eticheta;
unde:
- eticheta este un identificator ales de programator care eticheteaza (identifica) o anumita
instructiune din program astfel:
eticheta: instructiune;
Folosirea acestei instructiuni NU este recomandata!
eticheta;
for()
{
if(conditia)
{goto eticheta;}
}
Intreg
Real
Caracter
Tip vid
13)
Tabloul este o colectie finita de elemente de acelasi tip, numit tip de baza al tabloului, care
ocupa un spatiu continuu de memorie.
Forma generala de declarare a unui tablou unidimensional este:
Tip nume_tablou[dimensiune]; unde:
Tip declara tipul de baza al tabloului, tipul fiecarui element al tabloului;
Dimensiune specifica numarul de elemente ale tabloului;
Nume_tablou este numele dat tabloului;
De exemplu , pentru a declara un tablou t cu 10 elemente de tip int cu elementele t[0],t[1]
t[9] vom scrie:
Int t[10];
Pentru prelucrarea tabloului unidimensional este nevoie de a declara 2 variabile de ex n si I ,
unde:
N numarul de locuri prelucrate
I indicele elementului current
For(i=0;i<n;i++)
{procesarea A[i];
}
Utilizarea unui vector presupune repetarea unor operaii asupra fiecrui element din vector
deci folosirea unor structuri repetitive. De obicei, pentru a realiza o prelucrare asupra tuturor
elementelor tabloului se folosete instruciunea for cu o variabil contor care s ia toate
valorile indicilor.
- operatori
- functii(subprograme)
15)
Expresii:
Aritmetice(au valori)
Logice(poate avea 2 valori: 0 sau 1) (a+b)-aritmetica
Binar(2 operanzi)
Unar(1 operand)
Ternar(3 operanzi)
16)
Instructiuni
In sens general o instructiune este o portiune de program ce poate fi executata, adica specifica o
actiune:atribuire, selectie, iterare, salt etc.
Instructiuni declarative
Instructiune executabile
a)simple:
variabila=expresie
Break-iesire din ciclu
Goto eticheta
Continue;
Nume functia()
; - instructiunea vida
Return exp, return
b) compuse :
- if-else
- switch
- while
-do while
-for
Instructiuni conditionale:
If-else
Switch
Instructiuni de repetitie
While
Do while
For
Instructiuni de salt(speciale):
Break
Continue
Return
Goto
Aritmetice(+,-,/,*,%)
Operatorul de atribuire
Logici si relationali(++,--)
Operatori de atribuire compusa
Operatorul de conversie explicita
Operatorul sizeof
Operatorul virgule(,)
Speciali(=,&,*,.,
(a<b)- logica
adresa la care punctul curent de execuie va sri, n cazul n care acea funcie este apelat
3. adresa unei adrese de memorie
int *pa
atunci asignarea
pa = &a[0]
face ca pa sa pointeze pe al "zero-ulea" element al tabloului a; aceasta inseamna ca pa contine adresa lui
a[0]. Acum asignarea
x = *pa
va copia continutul lui a[0] in x.
Numele unui tablou este un pointer constant spre primul sau element. Expresiile de mai jos sunt deci echivalente :
nume_tablou
&nume_tablou
*nume_tablou
nume_tablou[0]
&nume_tablou[0]
18)
19)
terminat:
i=1, j=2 este a[1]>a[2]? nu, deci nu se ntmpl nimic;
i=1, j=3 este a[1]>a[3]? da, deci sevor interschimba elementele a[1] i
a[3]:
a devine: 1, 2, 9, 7, 3
..
n final, componentele vectoruluivor fi: 1, 2, 3, 7, 9
Citire:
for(i=1;i<n;i++){
for(j=1;j<m;j++){
scanf(%f,&a[i][j];}}
Afisare:
for(i=1;i<n;i++)
{
for(j=1;j<j;j++)
printf(%f\t,a[i][j]
Printf(\n)
}
Declararea funciei
Forma general a unei funcii este urmtoarea:
tip nume_funcie (lista de parametri)
{
declaraii locale instruciuni
}
Apelul funciei
Apelul unei funcii se face astfel:
nume_functie(pa1, pa2, . . . ,pan);
Unde pa1, pa2, . . . ,pan, reprezint lista parametrilor actuali (reali) cu care se folosete funcia respectiv.
Prototipul funciei
Pentru a funciona corect programul, orice funcie trebuie declarat anterior folosirii ei. Declararea este necesar
dac funcia este definit n alt parte dect n fiierul n care este apelat, sau dac este definit n acelai fiier
dar n urma apelrii. Prototipul unei funcii are urmtoarea form general:
tip nume_funcie(lista declaraii parametrii);
24)Interschimbarea datelor inre 2 functii. Trimiterea si obtinerea datelor.
Trimiterea datelor:
Obtinerea datelor:
O variabil sau o funcie declarat (sau implicit) static are durata de via egal cu cea a programului. In
consecin, o variabil static declarat ntr-o funcie i pstreaz valoarea ntre apeluri succesive ale funciei,
spre deosebire de variabilele auto care sunt realocate pe stiv la fiecare apel al funciei i pornesc de fiecare dat
cu valoarea primit la iniializarea lor (sau cu o valoare imprevizibil, dac nu sunt iniializate).
Alocarea dinamic:
Cele trei funcii de alocare (malloc, calloc i realloc) au ca rezultat adresa zonei de memorie alocate (de tip void*)
i ca argument comun dimensiunea, n octei, a zonei de memorie alocate (de tip size_t ). Dac cererea de alocare
nu poate fi satisfcut pentru c nu mai exist un bloc continuu de dimensiunea solicitat, atunci funciile de
alocare au rezultat NULL (ce reprezint un pointer de tip void * la adresa de memorie 0, care prin convenie este o
adres nevalid - nu exist date stocate n acea zon).
char c1 [50];
Pentru a arta c folosim pointeri la tablouri (i nu tablouri la pointeri) avem pentru declaraie sintaxa urmtoare:
Tip (*p) [dim] ;
Diferena dintre pointerii la tablouri de un tip i tablourile de pointeri la acelai tip este modul de stabilire a unitii de
deplasare.
In definiia
a) int (*x) [50];
x este un pointer la un tablou de 50 ntregi.
b) int* x[50];
x este un tablou de 50 pointeri la ntregi
Pointerii fiind variabile, pot fi folosii pentru a forma alte tipuri de date compuse. Spre exemplu se pot forma tablouri de
pointeri. Sintaxa general de utilizare este :
Tip *tablou[dim] ;
Exemple: Declaraia char *s[25]; reprezint un tablou de 25 pointeri la caracter.
Pentru a atribui adresa unei variabile de tip intreg cu nume num elementului al doilea al tabloului de pointeri x se va
scris: x[1]=&num iar pentru a obtine valoarea num se va scrie *x[1]. Tablourile de pointeri sunt folosite de obicei
pentru a pastra pointeri catre siruri de caractere.
Este posibil sa avem un pointer care puncteaza un alt pointer. Cind un pointer puncteaza un alt pointer primul pointer
contine adresa celui de al doilea pointer care puncteaza locatia ce contine obiectul ,valoarea dorita. Pentru a declara un
pointer catre un alt pointer trebuie plasat un asterix suplimentar in fata numelui pointerului. De ex: char**p
O funcie poate s apeleze la rndul ei alte funcii. Dac o funcie se apeleaz pe sine nsi, atunci funcia este
recursiv. Pentru a evita un numr infinit de apeluri recursive, trebuie ca funcia s includ n corpul ei o condiie de
oprire, astfel ca, la un moment dat, recurena s se opreasc i s se revin succesiv din apeluri. Condiia trebuie s fie
una generic, i s opreasc recurena n orice situaie. Aceast condiie se refer n general la parametrii de intrare,
pentru care la un anumit moment, rspunsul poate fi returnat direct, fr a mai fi necesar un apel recursiv suplimentar.
35) Functiile standard qsort() si bsearch() pentru sortatrea rapida si cautarea binara.
Bsearch
void * bsearch(const void *key, const void *base, size_t nelem, size_t width, int (*fcmp)(const void * , const void *));
returneaz adresa primei intrri din tablou care coincide cu parametrul cutat i zero dac acesta nu exist n tablou
(cutare binar)
key- adresa cheii cutate base - nceputul tabloului nelem - nr.elemente din tablou width - dim. unui elem. de tablou
fcmp - funcia de comparare definit de utilizator i care primete doi parametric
qsort
void qsort (void *base, size_t nelem, size_t width, int (*fcmp)(const void * , const void *));
sorteaz tabloul dat (algorimtul Quicksort)
base - nceputul tabloului nelem - nr.elemente din tablou width - dim. unui elem. de tablou fcmp - funcia de
comparare definit de utilizator i care primete doi parametric
switch ( expresie ) {
case value1:
instructiune 1;
instructiune 2;
......
break;
case valuen:
instructiune k_1;
.......
break;
default:
.......
.......
break;
}
Cuvintul cheie break trebuie pus la sfirsitul fiecarei instructiuni case. Ramura default este optionala, si se executa
atunci cind nici unul din celelalte cazuri nu a fost intilnit.
int main()
{float **A;
int n,m;
int nm;
float s,sum;
while(1)
{system("cls");
puts("\tMeniu\n");
puts("1.Alocarea dinamica a memoriei pentru tabloul bidimensional");
puts("2.Introducerea elementelor in tabloul bidimensional");
puts("3.Afisarea tabloului bidimensional pe ecran");
puts("4.Suma elementelor negative ce se afla sub diagonala principala");
puts("5.Suma elementelor pozitive ce se afla mai sus de elementul minimal din fiecare rind");
puts("6.Eliberarea memoriei");
puts("0.Exit");
printf("\n\tAlegeti optiunea:");
scanf("%d",&nm);
ptrsir = sir;
scanf(%c,&ch); buferizate
ch=getchar();
buferizate
ch=getch();
nebuferizate
ch=getche(); nebuferizate
printf(%c,ch);
putchar(ch);
putch(ch);
strcpy
Funcia determin copierea unui ir surs peste un ir destinaie, incluznd caracterul NULL. Sintax:
strcpy(sir_destinatie,sir_sursa)
strncpy
Funcia determin copierea unui ir surs peste un ir destinaie, incluznd caracterul NULL. Sintax:
strcpy(sir_destinatie,sir_sursa)
strcmp
Funcia este folosit pentru compararea lexicografica a doua siruri de caractere. Forma general este: strcmp(sir1,
sir2 );
Funcia are ca parametru adresa zonei de memorie n care se introduc caracterele citite.
Funcia are ca parametru adresa zonei de memorie de unde ncepe afiarea caracterelor.
Funcia returneaza codul ultimului caracter din irul de caractere afiat i -1 daca a aparut
o eroare.
Funcia gets() va citi de la tastatura cte caractere sunt introduse, chiar daca irul declarat are o lungime
mai mic. Presupunem un ir declarat: char a[]=unsir , care va avea deci 5 caractere. Citind un ir de
lungime mai mare ca 5 de la tastatura, n irul a, la afiare vom vedea ca s-a reinut tot sirul!(nu doar
primele 5 caractere). Nimic deosebit pn acum. Dar dac lum n considerare c citirea caracterelor
auxiliare se face n continuare n zona de memorie, ne punem problema ce se va suprascrie?! Raspunsul
este: nu se tie poate nimic important pentru programul nostru, poate ceva ce il va bloca sau duce la
obinerea de date eronate.
Pentru a evita aceasta se recomand utilizarea fgets().
fgets(zona, lung_zona, stdin) - citete de la stdin un ir de caractere terminat printr-o linie nou
dac lungimea lui este mai mic decat lung_zona sau primele lung_zona - 1 caractere n caz
contrar. Parametrii sunt: zona de memorie, lungimea maxima admis a irului, i terminalul
standard de intrare. n cazul n care irul dorit are lungime mai mic dect cea maxim, naintea
terminatorului de ir (\0), n zona de memorie va fi reinut i enter-ul dat(\n).
#include <stdio.h>
#include <string.h>
#define N 256
int main () {
char text[N];
printf("Introduceti un text: ");
gets(text);
printf("Textul are %u caractere.\n", strlen(text));
return 0;
}
Iesire:
Introduceti un text: just testing
Textul are 12 caractere.
memset()
void* memset(void *ptr, int val, size_t num);
n zona de memorie dat de pointerul ptr, sunt setate primele num poziii la valoarea dat de val. Funcia
returneaz irul ptr.
Exemplu:
#include <stdio.h>
#include <string.h>
int main () {
char str[] = "nu prea vreau vacanta!";
memset(str, '-', 7);
puts(str);
return 0;
}
Iesire:
------- vreau vacanta!
memmove()
void* memmove(void *destination, const void *source, size_t num);
Copiaz un numr de num caractere de la surs, la zona de memorie indicat de destinaie. Copierea are
loc ca i cum ar exista un buffer intermediar, deci sursa si destinatia se pot suprapune. Funcia nu verific
terminatorul de ir la surs, copiaz mereu num bytes, deci pentru a evita depsirea trebuie ca
dimensiunea sursei sa fie mai mare ca num. Funcia returneaz destinaia.
Exemplu:
#include <stdio.h>
#include <string.h>
int main () {
char str[] = "memmove can be very useful......";
memmove(str + 20, str + 15, 11);
puts(str);
return 0;
}
Iesire:
memmove can be very very useful.
memcpy()
void* memcpy(void *destination, const void *source, size_t num);
Copiaz un numr de num caractere din irul surs in irul destinaie. Funcia returneaz irul destinaie.
Exemplu:
#include <stdio.h>
#include <string.h>
#define N 40
int main () {
char str1[] = "Exemplu";
char str2[N];
char str3[N];
memcpy(str2, str1, strlen(str1) + 1);
memcpy(str3, "un sir", 7);
printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
return 0;
}
Iesire:
str1: Exemplu
str2: Exemplu
str3: un sir
strcpy()
char* strcpy(char *destination, const char *source);
Copiaz irul surs in irul destinaie. irul destinaie va fi suprascris. Funcia asigur plasarea
terminatorului de ir n irul destinaie dup copiere. Funcia returneaza irul destinaie.
strncpy()
char* strncpy(char *destination, const char *source, size_t num);
Asemeni cu strcpy(), dar in loc de a fi copiat toata sursa sunt copiate doar primele num caractere.
Exemplu:
#include <stdio.h>
#include <string.h>
#define N 40
int main () {
char str1[] = "Exemplu";
char str2[N];
char str3[N];
strcpy(str2, str1);
strncpy(str3, "un sir", 2);
str3[2] = '\0';
printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
return 0;
}
Iesire:
str1: Exemplu
str2: Exemplu
str3: un
strcat()
char* strcat(char *destination, const char *source);
Concatenenaza irul surs la irul destinaie. Funcia returneaz irul destinaie.
strncat()
char* strncat(char *destination, const char *source, size_t num);
Asemeni cu strcat(), dar n loc de a fi concatenat toat sursa sunt concatenate doar primele numcaractere.
Exemplu:
#include <stdio.h>
#include <string.h>
#define N 80
int main () {
char str[N];
strcpy(str, "ana ");
strcat(str, "are ");
strcat(str, "mere ");
puts(str);
strncat(str, "si pere si prune", 7);
puts(str);
return 0;
}
Iesire:
ana are mere
ana are mere si pere
strcmp()
int strcmp(const char *str1, const char *str2);
Compar irul str1 cu irul str2, verificndu-le caracter cu caracter. Valoarea returnat este 0 daca cele
iruri sunt identice, mai mare ca 0 daca str1 este mai mare(alfabetic) i mai mic ca 0 altfel.
Exemplu:
#include <stdio.h>
#include <string.h>
#define N 80
int main () {
char cuv[] = "rosu";
char cuv_citit[N];
do {
printf ("Ghiceste culoarea...");
gets(cuv_citit);
} while (strcmp(cuv,cuv_citit) != 0);
puts("OK");
return 0;
}
strchr()
char* strchr(const char *str, int character);
Caut caracterul character n irul str i returneaz un pointer la prima sa apariie.
strrchr()
char* strrchr(const char *str, int character);
Caut caracterul character n irul str i returneaz un pointer la ultima sa apariie.
strstr()
char* strstr(const char *str1, const char *str2);
Caut irul str2 n irul str1 i returneaz un pointer la prima sa apariie, sau NULL dac nu a fost gsit.
strdup()
char* strdup(const char *str);
Realizeaz un duplicat al irului str, pe care l i returneaz.
Exemplu:
#include <stdio.h>
#include <string.h>
#define N 80
int main () {
char str[N], *d;
do {
if (gets(str) == 0) {
break;
}
d = strdup(str);
puts(d);
} while (1);
return 0;
}
strtok()
char* strtok(char *str, const char *delimitators);
Funcia are rolul de a mpari irul str n tokens(subiruri separate de orice caracter aflat n lista de
delimitatori), prin apelarea ei succesiv.
La primul apel, parametrul str trebuie sa fie un ir de caractere, ce urmeaz a fi mpartit. Apelurile
urmatoare, vor avea n loc de str, NULL coninund mparirea aceluiai ir.
Funcia va returna la fiecare apel un token(un subsir), ignornd caracterele cu rol de separator aflate n
irul de delimitatori. O dat terminat irul, funcia va returna NULL.
Implementarea curent din <string.h> nu permite folosirea strtok() n paralel pe mai mult de un ir.
Exemplu:
#include <stdio.h>
#include <string.h>
int main () {
char str[] = "- Uite, asta e un sir.";
char *p;
p = strtok(str, " ,.-");
/* separa sirul in "tokeni" si afiseaza-i pe linii separate. */
while (p != NULL) {
printf("%s\n", p);
p = strtok(NULL, " ,.-");
}
return 0;
}
Iesire:
Uite
asta
e
un
sir
structurilor - permit gruparea unor obiecte (date) de tipuri diferite, referite printr-un nume
comun;
cmpurilor de biti - membri ai unei structuri pentru care se aloca un grup de biti, n interiorul
unui cuvnt de memorie;
uniunilor - permit utilizarea n comun a unei zone de memorie de catre mai multe obiecte de
diferite tipuri;
declaratiilor typedef - asociaza nume tipurilor noi de date;
enumerarilor - sunt liste de identificatori cu valori constante, ntregi.
Limbajul C pune la dispoziie o facilitate numit typedef pentru crearea de noi nume de tipuri de date.
Declaraia:
typedef int Lungime;
face numele Lungime sinonim cu int. Tipul Lungime poate fi folosit n declaraii, conversii etc.,
Declaraia typedef char *Sir; face numele Sir sinonim cu char * ( pointer spre caracter );
O declaraie typedef nu creeaz un tip nou. Ea doar atribuie un nume unui tip existent. Motivele
principale pentru utilizarea construciilor typedef sunt:
1. Creterea portabilitii programelor: dac se folosesc construcii typedef pentru tipuri de date care pot fi
dependente de main, numai construciile typedef trebuie modificate atunci cnd programul este mutat
pe alt calculator.
2. Furnizarea unei documentaii mai bune pentru un program
45)Tipuri de date structura. Declaratia unui tip de date struct si a variabilelor de tip struct.
Campurile unei structuri pot fi de orice tip, simplu sau derivat, dar nu void sau functie. Un camp al unei
structuri poate fi de tip structura, dar nu aceeasi cu cea definita - se poate insa sa se declare un camp
pointer la structura definite.
Selectarea unui camp al unei variabile structura se realizeaza folosind operatorul de selectie . .
Campul selectat se comporta ca o variabila de acelasi tip, deci i se pot aplica aceleasi prelucrari
ca oricarei variabile de tipul respectiv.
.nume_camp
variabila_structura
O variabila structura nu poate fi citita sau scrisa direct, ci prin intermediul campurilor
Tipul rezultatului returnat de o functie poate fi structura - a se studia exemplele de mai jos.
47) Tabloul unidimensional de structuri. Baza de date in forma de tablou de structure. Operatiuni
de prelucrare a tabloului de structure.
48) Tipul de date uniunea. Declaratia unui tip de date union si a variabilelor de tip union.
O uniune este o locatie de memorie care poate fi accesata de 2 sau mai multe variabile de diferite tipuri in momente
diferite. Iar Structurile sunt tipuri de date n care putem grupa mai multe variabile eventual de tipuri diferite.
Uniunile sunt asemntoare structurilor, dar lor li se rezerv o zon de memorie ce poate conine, la momente de
timp diferite, variabile de tipuri diferite.
50) Tipul de date enumerarea .Declaratia unui tip de date enum si a variabilelor de tip enum
Tipul enumerare este un caz particular al tipurilor intregi. Se utilizeaza pentru a realiza o reprezentare comoda si
sugestiva a unor obiecte ale caror valori sunt identificate printr-un numar finit de nume simbolice. Tipul enumerare
declara constante simbolice, carora li se asociaza coduri numerice de tip intreg, astfel:
enum nume_tip { lista_constante_simbolice };
Compilatorul asociaza constantelor enumerate cate un cod intreg din succesiunea incepand cu 0.
Exemple:
enum zile_lucr { luni, marti, miercuri, joi, vineri }; /* luni e asociat cu 0, marti cu 1, ..., vineri cu 4 */
Daca se doreste o alta codificare a constantelor din enumerare decat cea implicita, pot fi folosite in enumerare
elemente de forma:
nume_constanta=valoare_intreaga;
Constantelor simbolice ce urmeaza unei astfel de initializari li se asociaza numerele intregi urmatoare:
enum transport { tren, autocar=5, autoturism, avion };
gcc
-Wall
-I/usr/include/sys
-DDEBUG
-o
My Shell
myshell.c
Definirea de simboluri este cel mai des folosit n conjuncie cu instruciunile de procesare condiionat, fiind
folosit pentru activarea i dezactivarea unor segmente de cod n funcie de prezena unor simboluri. Definirea unui
simbol se face n cod cu instruciunea
#define SIMBOL
Probabil cea mai des folosit instruciune de preprocesare este cea de incluziune, de forma
#include <nume_fiier>
care are ca rezultat nlocuirea sa cu coninutul fiierului specificat de nume_fiier.
Instruciunile de preprocesare mai pot fi folosite i pentru definirea de constante simbolice i macroinstruciuni. De
exemplu
#define CONSTANTA valoare
va duce la nlocuirea peste tot n cadrul codului surs a irului CONSTANTA cu irul valoare. nlocuirea nu se
face totui n interiorul irurilor de caractere.
53) Pointer de tip fisier. Deschiderea si inchiderea a unui fisier folosind functiile fopen( ) si fclose().
Prelucrarea unui fiier presupune asocierea acestuia cu un canal de I/E (numit flux sau stream). *fopen-pointer spre
fisier
FILE *fopen(char *nume_fis,char *mod);
deschide fiierul cu numele dat pentru acces de tip mod.
Returneaz pointer la fiier sau NULL dac fiierul nu poate fi deschis; valoarea returnat este memorat n
variabila fiier, care a fost declarat pentru accesarea lui.
Modul de deschidere poate fi:
+ - permite scrierea i citirea - actualizare (ex: r+, w+, a+). O citire nu poate fi direct
urmat
de o scriere i reciproc. nti trebuie repoziionat cursorul de acces printr-un apel la fseek.
x & y (I): bitul al k-lea are valoarea 1 dac ambii bii k din x i y au valoarea 1;
x | y (SAU): bitul al k-lea are valoarea 1 dac cel puin un bit k din x i y are valoarea 1;
x ^ y (XOR sau SAU EXCLUSIV): bitul al k-lea are valoarea 1 dac exact un bit k din x i y are
valoarea 1;
~x (NOT): bitul al k-lea are valoarea 1 dac bitul k din x are valoarea 0;
x >> k (SHIFT DREAPTA): deplaseaz numrul n baza 2 cu k bii spre dreapta, pierznd
ultimii k bii i completnd cu k zerouri la stnga;
x << k (SHIFT STNGA): deplaseaz numrul n baza 2 cu k bii spre stnga, pierznd
primii k bii i completnd cu k zerouri la dreapta;
negatie logica
&& si logic
||
sau logic
Operanzii sunt intregi, interpretati ca valori logice. Operatorii trateaza operanzii ca valori logice, deci orice
valoarea diferita de 0 este interpretata ca adevarat, iar 0 ca fals. Aplicand unui intreg operatorul de negatie logica,
se obtine 1 daca operandul e fals, respectiv 0 daca operandul este adevarat.
int a=4,b=6;
printf("%d %d %d %d\n", !a, !!a, a&&b-6, a||(b=8));
printf("b=%d\n");