17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

- functie care prelucreazã o directivã define, prin extragerea celor douã siruri;<br />

- functie care ignorã spatii albe succesive de la o adresã datã.<br />

Urmeazã implementarea a douã dintre aceste functii:<br />

// cauta urmatorul identificator dintr-un sir dat s<br />

// rezultat adresa imediat urmatoare ; nume depus la "id"<br />

char * nxtid ( char * adr, char * rez) {<br />

while ( *adr && ! isalpha(*adr) ) // ignora caracterele care nu sunt litere<br />

++adr;<br />

if (*adr==0) // daca sfarsit sir “adr”<br />

return 0; // 0 daca nu mai sunt identificatori<br />

*rez++=*adr++; // prima litera<br />

while (*adr && (isalpha(*adr)|| isdigit(*adr)) ) // muta in rez litere si cifre<br />

*rez++=*adr++;<br />

*rez=0; // terminator sir de la adresa “rez”<br />

return adr; // adresa urmatoare cuvantului gasit<br />

}<br />

// inlocuieste n1 caractere la adresa s1 prin n2 caractere de la adresa s2<br />

void subst (char* s1, int n1, char * s2, int n2) {<br />

char t[256]; int m;<br />

// sterge n1 caractere de la adresa s1<br />

m=strlen(s1);<br />

if (m < n1) n1=m; // daca sunt mai putin de n1 caractere in s1<br />

strcpy (s1, s1+n1); // stergere prin deplasare la stanga caractere<br />

// introduce la s1 n2 caractere de la adresa s2<br />

strncpy(t,s2,n2); t[n2]=0; // copiere n2 octeti de la s2 la t<br />

strcpy(s1,strcat(t,s1)); // copiere sir din t la s1 dupa concatenare<br />

}<br />

Programul principal este destul de lung <strong>în</strong> acest caz, dar definirea altor functii nu ar<br />

aduce avantaje (ele ar avea cam multe argumente sau ar folosi variabile globale):<br />

int main () {<br />

char lin[128], * p, *q; // in “lin” se citeste o linie<br />

char * def ="#define"; // sir care incepe o directiva define<br />

char s1[128]={0}, s2[128]={0}; // s1 se va inlocui cu s2<br />

char *tid[20], *ts[20]; // un vector de identificatori si un vector de siruri<br />

int i,nd=0; // numar de definitii (de directive define)<br />

char id[256]; // un identificator<br />

FILE * f;<br />

f=fopen("test.txt","r"); // un fisier de test<br />

assert (f 1= NULL); // se iese daca nu exista acest fisier<br />

while ( fgets (lin,128,f) ) { // citeste o linie din fisier (terminata cu ‘\n’)<br />

lin[strlen(lin)-1]=0; // elimina '\n' din sirul s2<br />

p=skip(p=lin); // ignora spatii la inceput de linie<br />

if (strncmp (def,p,7)==0) { // daca e o directiva "define"<br />

pdef (lin,s1,s2); // extrage identificator in s1 si al doilea sir in<br />

s2<br />

tid[nd]=strdup(s1); // pune s1 in vectorul “tid”

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!