Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
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”