Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
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;
}