Пример #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;
}
Пример #2
0
int main(int argc, char* argv[]){
	int nr_events, step = 0, identity, priority, event, i;
	char *action, *parse, input[MAX], output[MAX];
	char redundant;
	TStack *s;
	TQueue q = NULL;
	void *aux, *aux2;
	aux = (TProces*)malloc(sizeof(TProces));
	if(!aux) return 0;
	
	strcpy(input, argv[1]); //Identificam numele fisierului de intrare
	strcpy(output, argv[2]); //Identificam numele fisierului de iesire
	//Deschidem fisierele de intrare si de iesire
	FILE* fin = fopen(input, "r");
	FILE* fout = fopen(output, "a");

	//Alocam memorie pentru zona in care vom citi actiunile
	action = malloc(MAX);
	if(!action){
		free(aux);
		return 0;
	}

	//Citim numarul de evenimente si generam stivele
	fscanf(fin, "%d", &nr_events);
	fscanf(fin, "%c", &redundant);
	s = (AStack)calloc(nr_events, sizeof(TStack));
	if(!s){
	 free(aux);
	 free(action);
 	 return 0;
	}
	
	//Executam actiunile citite din fisierul de intrare
	while(fgets(action, MAX, fin)){
		parse = strtok(action, " ");
		if(!strcmp(parse, "\n"))
			break;

		step++;
		//Executam instructiunea corespunzatoare
		if(!strcmp(parse, "start")){
			parse = strtok(NULL, " ");
			identity = string_to_number(parse);
			parse = strtok(NULL, " \n");
			priority = string_to_number(parse);
			((TProces*)aux)->id = identity;
			((TProces*)aux)->pr = priority;
			((TProces*)aux)->time = step;

			//Introducem elementul in coada de prioritati
			IntrQ(&q, aux, sizeof(TProces), CmpProc);
		}

    if(!strcmp(parse, "wait")){
			parse = strtok(NULL, " ");
			event = string_to_number(parse);
			parse = strtok(NULL, " \n");
			identity = string_to_number(parse);
			
			//Extragem elementul din coada si il punem in stiva corespunzatoare
			aux2 = ExtrElQ(&q, identity, CmpProc);
			if(aux2)
				Push(&s[event], aux2, sizeof(TProces));
			free(aux2);
		}

    if(!strcmp(parse, "event")){
			parse = strtok(NULL, " \n");
			event = string_to_number(parse);
			
			/*Extragem toate elementele din stiva asociata evenimentului si le 
				punem inapoi in coada*/
			while(s[event]){
				aux2 = Pop(&s[event], sizeof(TProces));
				IntrQ(&q, aux2, sizeof(TProces), CmpProc);
				free(aux2);
			}
		}

    if(!strcmp(parse, "end")){
			parse = strtok(NULL, " \n");
			identity = string_to_number(parse);
			//Extragem elementul din coada
			aux2 = ExtrElQ(&q, identity, CmpProc);
			free(aux2);
		}

		//Afisam elementele din coada si din stive pentru pasul curent
		fprintf(fout, "%d\n", step);
		AfisQ(q, fout);
		fprintf(fout, "\n");
		for(i = 0; i < nr_events; i++)
			if(s[i]){
				fprintf(fout, "%d: ", i);
				AfisS(s[i], fout);
				fprintf(fout, "\n");
			}
		
		fprintf(fout, "\n");
	}
	
	//Eliberam memoria si inchidem fisierele
	for(i = 0; i < nr_events; i++)
			DistrS(&s[i]);
	free(s);
	DistrQ(&q);
	free(aux);
	free(action);
	fclose(fin);
	fclose(fout);
	return 0;
}