void Scriefisier(Rez* a,char* out) { FILE* f; f=fopen(out,"wt"); if(!f) return; while (a) { fprintf(f,"\n%s\n",a->nume_exp); fprintf(f,"%s=%5.2f\n",a->reprez,a->rezultat); AfiArb(a->arbore,f); a=a->urm; } fclose(f); return; }
int main(int argc, char*argv[]) { TArb arb=NULL,arb2=NULL,arb3=NULL,arbaux=NULL; /* Declaratii */ int p,i,in,k,k1,ind=0,j,alpha,rezultat,i2,ok,t=0,arbcon=0; char sir[100],sir2[5],sir3[5],sir4[5],sir5[5]; char numef[20]; VctArb varb; FILE* f; VctStr siro[50],sirn[50]; Tabela tab[50],tab2[50]; f=fopen(argv[1],"rt"); /*Deschidere fisier si verificare */ if (!f) {printf("\nNu s-a putut deschide fisierul!"); return 0; } else printf("\n\n\nFisierul %s s-a deschis cu succes !\n\n\n",argv[1]); while ( fgets(sir,100,f) != 0 ) /* Cat timp se citeste ecuatie din fisier */ {printf("\nArborele pentru : %s",sir); k=0; in=0; p=0; for (i=0;i<=strlen(sir);i++) /* Separare prin spatii si construirea unui vector de strings */ {if (sir[i]!= ' ' ) {sir2[in]=sir[i]; in++; sir2[in]='\0'; } else { siro[k].str=(char*)malloc(sizeof(sir2)+1); strcpy(siro[k].str,sir2); sir2[0]='\0'; /* Resetare sirurui */ sir2[1]='\0'; sir2[2]='\0'; sir2[3]='\0'; sir2[4]='\0'; in=0; k++; } } k1=k; k=0; for(i=0;i<k1;i++) /* Construirea unui vector de strings CORECT. Daca cel anterior putea avea pe o pozitie ceva de genul acesta: (a+ , acest vector va avea doar nume de variabile, operanzi sau paranteze */ if ( ( strlen(siro[i].str) != 1 ) && (ispunct(siro[i].str[0])) ) { sir3[0]=siro[i].str[0]; sir3[1]='\0'; sir4[0]=siro[i].str[strlen(siro[i].str)-1]; sir4[1]='\0'; sir4[2]='\0'; sirn[k].str=(char*)malloc(6); strcpy(sirn[k].str,sir3); k++; for ( j=1;j<strlen(siro[i].str)-1;j++) {sir5[j-1]=siro[i].str[j]; sir5[j]='\0'; alpha=1; } if (alpha == 1 ) {sirn[k].str=(char*)malloc(6); strcpy(sirn[k].str,sir5); k++; alpha=0; } sirn[k].str=(char*)malloc(6); strcpy(sirn[k].str,sir4); sir3[0]='\0'; /* Resetare sirurui */ sir3[1]='\0'; sir4[0]='\0'; sir4[1]='\0'; sir5[0]='\0'; sir5[1]='\0'; sir5[2]='\0'; sir5[3]='\0'; sir5[4]='\0'; k++; } else {sirn[k].str=(char*)malloc(6); strcpy(sirn[k].str,siro[i].str); k++; } if( strlen(siro[i-1].str) == 2) {sir3[0]=sir[strlen(sir)-3]; sir3[1]='\0'; sirn[k].str=(char*)malloc(6); strcpy(sirn[k].str,sir3); k++; } sir4[0]=sir[strlen(sir)-2]; sir4[1]='\0'; sirn[k].str=(char*)malloc(6); strcpy(sirn[k].str,sir4); /* Termninare construire vector strings */ /*-----------------------------------------------------------------*/ if ( arbcon == 0 ) /* Daca nu s-a construit arbore pentru aceasta ecuatie */ for(i2=0;i2<k;) /* Verificare prefixata. Varianta BONUS: verific daca sir[i] e operant */ if ( (ispunct(sirn[i2].str[0] )) && (sirn[i2].str[0] != '+' ) && (sirn[i2].str[0] != '-' ) && (sirn[i2].str[0] != '*' ) && (sirn[i2].str[0] != '/' ) ) i2++; else if (( sirn[i2].str[0] == '+' ) || (sirn[i2].str[0] == '-' ) || (sirn[i2].str[0] == '*' ) || (sirn[i2].str[0] == '/' ) || ( strcmp( sirn[i2].str, "sqrt") == 0 ) || ( strcmp( sirn[i2].str, "pow") == 0 ) || ( strcmp( sirn[i2].str, "sum") == 0 ) || ( strcmp( sirn[i2].str, "prod") == 0 ) ) { ConstrArbPref(&(varb[t]),sirn,&p,&k); printf("\n"); AfiArb(varb[t]); printf("cost = %i\n",*(varb[t]->cost)); PrelucrareArbore(varb[t]); printf("%lf\n",*(varb[t]->rez)); t++; arbcon=1; break; } else break; sir3[0]='\0'; /* Resetare siruri */ sir3[1]='\0'; sir4[0]='\0'; sir4[1]='\0'; k=0; printf("\n\n\n--------------------------------\n\n\n"); arbcon=0; } return 1; }