int main() { void *a1, *a2; int x, n1, n2; a1 = InitS(sizeof(int),MAX); if(a1) { a2 = InitS(sizeof(int),MAX); if(a2) { fflush(stdin); n1 = CitS(", valorile din prima stiva", "%i", a1); n2 = CitS(", valorile din a doua stiva", "%i", a2); /*printf("Numar valori citite: %i si %i\n", n1, n2); Pop(a1, &x); printf("\n\nDupa Pop din stiva_1: "); AfiS("", AfiIntreg, a1); printf("\nDupa InvS (stiva_2)\n"); InvS(a2); AfiS("\tstiva_2: ", AfiIntreg, a2); */ printf("\nDupa Suprapune (stiva1,stiva_2)\n"); Suprapune(a1,a2); AfiS("\tstiva_1: ", AfiIntreg, a1); AfiS("\tstiva_2: ", AfiIntreg, a2); /*printf("\nAfisare stiva_1 de la varf\n"); n1 = Prel_V_B(a1, AfiIntreg); n1 = Prel_V_B(a1, SchimbaSemn); printf ("\nDupa Prel_V_B(stiva_1, SchimbaSemn)\n"); AfiS("\tstiva_1: ", AfiIntreg, a1); ResetS(a2); printf("\nDupa ResetS(stiva_2)\n"); AfiS("\tstiva_2: ", AfiIntreg, a2); */ //getch(); DistrS(&a2); } DistrS (&a1); } return 0; }
/* ** Hlavná funkcia syntaktickej analýzy, simuluje vytváranie derivačného stromu */ int analyza(FILE *fp, char *vstup, tState *tokenType){ char pravidla[16][6] = { // čísla sú z enum štruktúry v scanner.h {E, 4, E, -1, '\0'}, // * {E, 5, E, -1, '\0'}, // / {E, 6, E, -1, '\0'}, // + {E, 7, E, -1, '\0'}, // - {E, 8, E, -1, '\0'}, // < {E, 9, E, -1, '\0'}, // > {E, 10, E, -1, '\0'}, // <= {E, 11, E, -1, '\0'}, // >= {E, 13, E, -1, '\0'}, // == {E, 14, E, -1, '\0'}, // != {17, E, 16, -1, '\0'}, // zátvorky () {E, 7, -1, '\0'}, // záp**né číslo {37, -1, '\0'}, // cislo alebo identifikátor {E, 24, E, -1, '\0'}, // argumenty funkcie {17, E, 16, 37, -1, '\0'} // funkcia }; // 60 je $ char vyraz[5]; // výraz sa bude porovnávať s tabuľkou STACK zasobnik; char znak; // znak zo vstupu a zo zásobníku int i; printf("SAV **************\n"); InitS(&zasobnik); // inicializácia zásobniku PushS(&zasobnik, DOLAR); //na vrcholu zásobniku musí byť $ do{ znak = TopS(&zasobnik); if(znak == E){ //nemôže porovnávať s neterminálom, preto vyberie zo zásobníku druhý znak znak = TopSecS(&zasobnik); } //if(token T) if(*tokenType == 36 || *tokenType == 42){ // zmeni id na cislo *tokenType = 37; } /*pomocné ladiace funkcie*/ printf("SAV **************\n"); PrintS(&zasobnik); printf("SAV znak = %d\n", znak); printf("SAV vstup = %d\n******************\n", *tokenType); /** *********************** */ printf("PT: %c\n", precedencna_tabulka(znak, *tokenType)); switch(precedencna_tabulka(znak, *tokenType)){ case '=': PushS(&zasobnik, *tokenType); //FreeToken(vstup); vstup = Token(tokenType, fp); continue; case '<': if(TopS(&zasobnik) == E){ PopS(&zasobnik); PushS(&zasobnik, -1); PushS(&zasobnik, E); PushS(&zasobnik, *tokenType); } else{ PushS(&zasobnik, -1); // -1 je < PushS(&zasobnik, *tokenType); } //FreeToken(vstup); vstup = Token(tokenType, fp); continue; case '>': /* Vyberie zo zásobníku znaky a vloží do premennej výraz */ i = 0; do{ vyraz[i] = TopPopS(&zasobnik); i++; }while(vyraz[i - 1] != -1); vyraz[i] = '\0'; /* Porovnáva výraz s pravidlami */ for(i = 0; i<=16; i++){ if(i == 16){ // nenašla sa zhoda FreeS(&zasobnik); SAError(); } if(strcmp(pravidla[i], vyraz) == 0){ // našla sa zhoda break; } } PushS(&zasobnik, E); // Pushne neterminál na zásobník continue; case 'U': // výraz je správny FreeS(&zasobnik); return 0; case 'X': // chyba FreeS(&zasobnik); SAError(); } }while(1); FreeS(&zasobnik); return 0; }
int main() { Tx v[20], vv[10], *r, x = {3, -9.35, "test"}, y = {-1,1,"y"}, z = {0,0,"a"}; TMultime m1 = {sizeof(Tx),comp3,NULL,v,v+10,v+20}, *a = &m1, m2, *b = &m2, m3, *c; int i, nr, nvv, nrr1; int rez; randomize(); printf("--- Demo multimi generice ---\n"); /* initializeaza 10 elemente din v cu valori aleatoare */ for(i = 0; i < 10; i++) inix(v+i); for(nvv = 4,i = 0; i < nvv; i++) inix(vv+i); /* initializeaza b */ InitS(b, vv,10,sizeof(Tx),comp3,NULL); Adauga(v+5,b); /* o valoare preluata din a */ Adauga(&y, b), Adauga(&z, b); /* S = secventa de prelucrari, folosind operatii generice: */ /* - afisare multime, - test apartenenta, - test localizare */ printf("-- Multimea a --\n"); afiMx(a); rez = Apartine(&x, a); printf("elementul (%i,%4.2lf,%s) %sapartine multimii\n\n", x.v1, x.v2, x.v3, rez? "" : "nu "); y = v[2]; r = (Tx*)Loc(&y, a); if(!r) printf("elementul (%i,%4.2lf,%s) nu apartine multimii\n\n", y.v1, y.v2, y.v3); else printf("elementul (%i,%4.2lf,%s) are adresa %p si indice %i \n\n", y.v1, y.v2, y.v3, r, r-v); getch(); /* - adaugare 2 noi elemente: unul care nu exista si altul care exista - afisare multime */ printf("\n-- Teste adaugari --\n\n"); rez = Adauga(&x, a); if(rez) printf("(%i,%4.2lf,%s) %s\n", x.v1, x.v2, x.v3, rez? "adaugat" : "exista deja"); rez = Adauga(&y, a); if(rez) printf("(%i,%4.2lf,%s) %s\n\n", y.v1, y.v2, y.v3, rez? "adaugat" : "exista deja"); afiMx(a); /* - eliminare 2 elemente: unul care exista si altul care nu exista - afisare multime */ printf("\n-- Teste eliminari --\n\n"); rez = Elimina(&y, a); printf("(%i,%4.2lf,%s) %s\n", y.v1, y.v2, y.v3, rez? "eliminat" : "nu exista"); rez = Elimina(&z, a); printf("(%i,%4.2lf,%s) %s\n", z.v1, z.v2, z.v3, rez? "eliminat" : "nu exista"); afiMx(a); getch(); printf("\n-- Test reuniune --\n\n"); c = InitD(50,sizeof(Tx),comp3,comp3); if(!c) { printf("Initializate dinamica esuata\n"); getch(); return 1; } printf("\na:\n"); afiMx(a); printf("\nb:\n"); afiMx(b); nrr1 = Reuniune(a,b,c); printf("\n-- rezultat Reuniune(a,b)--\n"); afiMx(c); getch(); /* Sortare multime, urmata de afisare */ /* Repetarea S folosind functii specifice multimii sortate */ return 0; }