<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://fiscomp.if.ufrgs.br/index.php?action=history&amp;feed=atom&amp;title=Rua_com_sinaleira</id>
	<title>Rua com sinaleira - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="http://fiscomp.if.ufrgs.br/index.php?action=history&amp;feed=atom&amp;title=Rua_com_sinaleira"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Rua_com_sinaleira&amp;action=history"/>
	<updated>2026-04-19T21:26:52Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Rua_com_sinaleira&amp;diff=2051&amp;oldid=prev</id>
		<title>Rodrigozferreira: Criou página com '&lt;source lang = c&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;math.h&gt;    /* declaracao de funcoes */ void passo(FILE *arq); void inicializacao(FILE *arq); void atualizar_pos...'</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Rua_com_sinaleira&amp;diff=2051&amp;oldid=prev"/>
		<updated>2018-01-24T20:01:25Z</updated>

		<summary type="html">&lt;p&gt;Criou página com &amp;#039;&amp;lt;source lang = c&amp;gt; #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;math.h&amp;gt;    &lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;declaracao de funcoes: &lt;/span&gt; void passo(FILE *arq); void inicializacao(FILE *arq); void atualizar_pos...&amp;#039;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang = c&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include&amp;lt;math.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* declaracao de funcoes */&lt;br /&gt;
void passo(FILE *arq);&lt;br /&gt;
void inicializacao(FILE *arq);&lt;br /&gt;
void atualizar_posicao(void);&lt;br /&gt;
int mudar_velocidade(int(v));&lt;br /&gt;
int calculo_distancia(void);&lt;br /&gt;
int trocar_faixa(void);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*  declaracao var global   */&lt;br /&gt;
#define veloc_max 6&lt;br /&gt;
#define tempo_max 50&lt;br /&gt;
#define num_carros 30&lt;br /&gt;
#define comprimento_rua 60&lt;br /&gt;
#define num_faixas 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*  velocidade: numero de posições   */&lt;br /&gt;
/*  que o carro andará num passo     */&lt;br /&gt;
&lt;br /&gt;
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova&lt;br /&gt;
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[num_carros];&lt;br /&gt;
&lt;br /&gt;
//nao podemos printar assim que mudamos a velocidade do carro, como no caso de uma pista, ja que os carros podem mudar de pista. So podemos printar no final do passo&lt;br /&gt;
int print[num_faixas][comprimento_rua];&lt;br /&gt;
&lt;br /&gt;
int prim_carro[num_faixas], dist[num_faixas];&lt;br /&gt;
int i, j, k, t, ultimo, k_novo, faz_nada;&lt;br /&gt;
&lt;br /&gt;
//posicao da sinaleira&lt;br /&gt;
int pos_sinaleira = 50;&lt;br /&gt;
&lt;br /&gt;
//tempo em que a sinaleira abre e fecha&lt;br /&gt;
int sinaleira_fecha = 5, sinaleira_abre = 20;&lt;br /&gt;
&lt;br /&gt;
//probab_vel = probabilidade de reduzir a velocidade&lt;br /&gt;
double probab_vel = 0.3;&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
	&lt;br /&gt;
	FILE *arq;&lt;br /&gt;
	char nome[30];&lt;br /&gt;
	sprintf(nome, &amp;quot;%d_lanes_sinaleira.dat&amp;quot;, num_faixas);&lt;br /&gt;
	arq = fopen(nome,&amp;quot;w+&amp;quot;);	&lt;br /&gt;
	&lt;br /&gt;
    inicializacao(arq);&lt;br /&gt;
	&lt;br /&gt;
	for(t = 0; t &amp;lt; tempo_max; t++)&lt;br /&gt;
	{	&lt;br /&gt;
		&lt;br /&gt;
		passo(arq);&lt;br /&gt;
				&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	fclose(arq);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void inicializacao(FILE *arq){&lt;br /&gt;
&lt;br /&gt;
	//srand48(time(NULL));&lt;br /&gt;
&lt;br /&gt;
   	// zerando vetores&lt;br /&gt;
   	//-1 significa que a posicao esta vazia&lt;br /&gt;
   	&lt;br /&gt;
	for(i = 0; i &amp;lt; comprimento_rua; i++){&lt;br /&gt;
&lt;br /&gt;
		for(j = 0; j &amp;lt; num_faixas; j++){&lt;br /&gt;
&lt;br /&gt;
			rua[j][i] = -1;&lt;br /&gt;
			rua_nova[j][i] = rua[j][i];&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//iniciando os carros - rua[k][i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[k][i]]&lt;br /&gt;
	//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)&lt;br /&gt;
	k = 0;&lt;br /&gt;
	for(i = 0; (i &amp;lt; num_carros) &amp;amp;&amp;amp; (k &amp;lt; num_faixas); i++)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		vel[i] = 0;	&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;&lt;br /&gt;
		rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;&lt;br /&gt;
		&lt;br /&gt;
		//para trocar de faixa quando a condicao for satisfeita&lt;br /&gt;
		if((i+1)*comprimento_rua*num_faixas/num_carros &amp;gt;= comprimento_rua* (k + 1))&lt;br /&gt;
		{&lt;br /&gt;
			k++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//printando a condição inicial, no terminal e no arquivo&lt;br /&gt;
	for(k = 0; k &amp;lt; num_faixas; k++){&lt;br /&gt;
		for (i = 0; i &amp;lt; comprimento_rua; i++){&lt;br /&gt;
			if(rua[k][i] == -1){&lt;br /&gt;
&lt;br /&gt;
			printf(&amp;quot;.&amp;quot;);&lt;br /&gt;
			fprintf(arq, &amp;quot;-1 &amp;quot;);&lt;br /&gt;
			&lt;br /&gt;
			}&lt;br /&gt;
			else{&lt;br /&gt;
				printf(&amp;quot;%d&amp;quot;, vel[rua[k][i]]);&lt;br /&gt;
				fprintf(arq, &amp;quot;%d &amp;quot;, (vel[rua[k][i]]));&lt;br /&gt;
			}&lt;br /&gt;
		}	&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
		fprintf(arq, &amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	fprintf(arq, &amp;quot;\n&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void passo(FILE *arq)&lt;br /&gt;
{&lt;br /&gt;
	&lt;br /&gt;
	//atualizando a matriz rua, trocando -2 por -1&lt;br /&gt;
	for(k = 0; k &amp;lt; num_faixas; k++)&lt;br /&gt;
	{&lt;br /&gt;
		for(i = 0; i&amp;lt; comprimento_rua; i++)&lt;br /&gt;
		{&lt;br /&gt;
			if(rua_nova[k][i] == -2)&lt;br /&gt;
			{&lt;br /&gt;
				rua_nova[k][i] = -1;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			rua[k][i] = rua_nova[k][i];&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)&lt;br /&gt;
		prim_carro[k] = -1;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas&lt;br /&gt;
	for(i = 0; i&amp;lt; comprimento_rua; i++)&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
		//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas&lt;br /&gt;
		for(k = 0; k &amp;lt; num_faixas; k++)&lt;br /&gt;
		{&lt;br /&gt;
			dist[k] = calculo_distancia();&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    	for(k = 0; k &amp;lt; num_faixas; k++)&lt;br /&gt;
  		{&lt;br /&gt;
  			//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k&lt;br /&gt;
		&lt;br /&gt;
  	  		/*  realiza até percorrer todos os carros.  */&lt;br /&gt;
    		/*  tem carro na posição 'i'?               */&lt;br /&gt;
		&lt;br /&gt;
			if (rua[k][i] == -1){	&lt;br /&gt;
	&lt;br /&gt;
				/*	não, não tem carro em 'i'	*/&lt;br /&gt;
				/*	vai pra prox posicao 'i'   	*/&lt;br /&gt;
				&lt;br /&gt;
				//so printar -1 se o carro anterior nao tiver trocado para essa pista&lt;br /&gt;
				if(k_novo != k)&lt;br /&gt;
				{&lt;br /&gt;
					print[k][i] = -1;&lt;br /&gt;
				}&lt;br /&gt;
				k_novo = k;&lt;br /&gt;
				&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			else{&lt;br /&gt;
				k_novo = k;&lt;br /&gt;
	&lt;br /&gt;
				/*	caso for o primeiro carro,	*/&lt;br /&gt;
				/*	salvar sua posicao para    	*/&lt;br /&gt;
				/*	calcularmos a distancia do 	*/&lt;br /&gt;
				/*	ultimo carro ao primeiro   	*/&lt;br /&gt;
&lt;br /&gt;
				if(prim_carro[k] == -1){&lt;br /&gt;
&lt;br /&gt;
					prim_carro[k] = i;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				//mudando velocidades&lt;br /&gt;
				vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);&lt;br /&gt;
				&lt;br /&gt;
				/*	           Regra 3              */&lt;br /&gt;
				/*	redução de velocidade randomica	*/&lt;br /&gt;
&lt;br /&gt;
				/* fazemos isso aqui por causa da possibilidade de troca de pista: */&lt;br /&gt;
				/* ao trocar de pista, o carro vai ter sua velocidade verificada e */&lt;br /&gt;
				/* modificada novamente - se a regra 3 estivesse dentro da funcao  */&lt;br /&gt;
				/* mudar_velocidade, ela seria aplicada duas vezes nesse caso 	   */&lt;br /&gt;
&lt;br /&gt;
				if( ( vel[rua[k][i]] &amp;gt; 0 ) &amp;amp;&amp;amp; ( drand48() &amp;lt; probab_vel )){&lt;br /&gt;
&lt;br /&gt;
					vel[rua[k][i]]--;&lt;br /&gt;
				}&lt;br /&gt;
			&lt;br /&gt;
				//caso k = k_novo, o que conta sera o ultimo comando&lt;br /&gt;
				//caso k != k_novo, o primeiro colocara -1 na posicao anterior, e o carro na posicao nova&lt;br /&gt;
				print[k][i] = -1;&lt;br /&gt;
				print[k_novo][i] = vel[rua[k][i]];&lt;br /&gt;
				&lt;br /&gt;
				//atualizando posicoes&lt;br /&gt;
				atualizar_posicao();&lt;br /&gt;
&lt;br /&gt;
			}	&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//printando&lt;br /&gt;
	for(k = 0; k &amp;lt; num_faixas; k++)&lt;br /&gt;
	{&lt;br /&gt;
		for(i = 0; i &amp;lt; comprimento_rua; i++)&lt;br /&gt;
		{&lt;br /&gt;
			if(print[k][i] == -1)&lt;br /&gt;
			{&lt;br /&gt;
				printf(&amp;quot;.&amp;quot;);&lt;br /&gt;
				fprintf(arq, &amp;quot;-1 &amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				printf(&amp;quot;%d&amp;quot;, print[k][i]);&lt;br /&gt;
				fprintf(arq, &amp;quot;%d &amp;quot;, print[k][i]);&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
		fprintf(arq, &amp;quot;\n&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	fprintf(arq, &amp;quot;\n&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void atualizar_posicao(void){&lt;br /&gt;
&lt;br /&gt;
	/*	atualiza apenas se a velocidade	*/&lt;br /&gt;
	/*	for diferente de zero        	*/&lt;br /&gt;
	if(vel[rua[k][i]] != 0){&lt;br /&gt;
&lt;br /&gt;
		//se for o ultimo carro, usamos condicoes de contorno periodicas&lt;br /&gt;
		if( i + vel[rua[k][i]] &amp;gt;= comprimento_rua ){&lt;br /&gt;
&lt;br /&gt;
			rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];&lt;br /&gt;
			&lt;br /&gt;
			j = i+1;&lt;br /&gt;
			while(j &amp;lt; (i+ vel[rua[k][i]]) % comprimento_rua)&lt;br /&gt;
			{&lt;br /&gt;
				/* -2 indica o caminho percorrido por um carro (para que nenhum */&lt;br /&gt;
				/* outro consiga trocar de pista para essa posicao)				*/&lt;br /&gt;
				rua_nova[k_novo][j] = - 2;&lt;br /&gt;
&lt;br /&gt;
				/* caso estejamos na ultima celula, se fizermos j = -1, */ &lt;br /&gt;
				/* no proximo passo j = 0 e voltaremos ao inicio da rua */&lt;br /&gt;
				if(j==comprimento_rua - 1)&lt;br /&gt;
				{&lt;br /&gt;
					j = -1;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				j++;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
&lt;br /&gt;
			rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];&lt;br /&gt;
			for(j = i + 1; j &amp;lt; i + vel[rua[k][i]]; j++)&lt;br /&gt;
			{&lt;br /&gt;
				rua_nova[k_novo][j] = -2;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
		//-2 indica que havia um carro ali	&lt;br /&gt;
		rua_nova[k][i] = -2;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/* caso v=0. mas troque de pista, (ja que pode ser que o carro */&lt;br /&gt;
	/* troque de pista com v=1, mas tenha sua velocidade diminuida */&lt;br /&gt;
	/* para 0 por causa da Regra 3)								   */&lt;br /&gt;
	else if((vel[rua[k][i]] == 0) &amp;amp;&amp;amp; (k != k_novo))&lt;br /&gt;
	{&lt;br /&gt;
		rua_nova[k_novo][i] = rua[k][i];&lt;br /&gt;
		rua_nova[k][i] = -2;&lt;br /&gt;
	}&lt;br /&gt;
				&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int calculo_distancia(void){&lt;br /&gt;
&lt;br /&gt;
		int x;&lt;br /&gt;
		/*	RETORNA A DISTANCIA ENTRE O	*/&lt;br /&gt;
		/*	CARRO 'i' E O QUE ESTA NA   */&lt;br /&gt;
		/*	SUA FRENTE NA FAIXA 'x'    	*/ &lt;br /&gt;
&lt;br /&gt;
		/*	caso não for o ultimo carro	*/&lt;br /&gt;
		/*	procura posição do prox. e	*/&lt;br /&gt;
		/*	calcula a distancia até ele	*/&lt;br /&gt;
&lt;br /&gt;
		/* temos que isolar o caso i = comprimento_rua - 1,*/&lt;br /&gt;
		/*	já que j = i + 1 = comprimento_rua, e usamos   */&lt;br /&gt;
		/*	rua[j][k], sendo que j &amp;lt; comprimento_rua	   */&lt;br /&gt;
		/*												   */&lt;br /&gt;
		/*	se i = comprimento_rua - 1, j = comprimento_rua*/&lt;br /&gt;
		/*	e j deve ser &amp;lt; comprimento_rua				   */&lt;br /&gt;
&lt;br /&gt;
		ultimo = 0;&lt;br /&gt;
		&lt;br /&gt;
		if( i + 1 &amp;lt; comprimento_rua )&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			j = i + 1;&lt;br /&gt;
&lt;br /&gt;
			while ( rua[k][j] == -1 ){&lt;br /&gt;
&lt;br /&gt;
				if( j == comprimento_rua - 1 ){&lt;br /&gt;
					ultimo = 1;&lt;br /&gt;
					break;&lt;br /&gt;
				}&lt;br /&gt;
				j++;	&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
			if ( ultimo == 0 ){&lt;br /&gt;
&lt;br /&gt;
				x = j - i;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
			/*	para o ultimo carro a distan-	*/&lt;br /&gt;
			/*	cia é calculada em relacao ao	*/&lt;br /&gt;
			/*	primeiro, pois são C.C. perio-	*/&lt;br /&gt;
			/*	dicas.                       	*/&lt;br /&gt;
			//aqui devemos tomar cuidado, pois caso a pista esteja vazia, &lt;br /&gt;
			//ultimo = 1, mas nao existe prim_carro[k]. Por isso &lt;br /&gt;
			//definimos prim_carro[k] inicialmente como -1&lt;br /&gt;
&lt;br /&gt;
		else if(i == comprimento_rua - 1)&lt;br /&gt;
		{&lt;br /&gt;
			ultimo = 1;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		//ultimo carro, e existe um primeiro carro (numero de carros &amp;gt; 1)&lt;br /&gt;
		if((ultimo == 1) &amp;amp;&amp;amp; (prim_carro[k] != -1)){&lt;br /&gt;
&lt;br /&gt;
			x = comprimento_rua - (i - prim_carro[k]);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		//caso a pista esteja vazia	ou numero de carros = 1&lt;br /&gt;
		else if((ultimo == 1) &amp;amp;&amp;amp; (prim_carro[k] == -1))&lt;br /&gt;
		{&lt;br /&gt;
			x = comprimento_rua;&lt;br /&gt;
		}	&lt;br /&gt;
&lt;br /&gt;
		return x;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int mudar_velocidade(int(v)){&lt;br /&gt;
&lt;br /&gt;
	int x;&lt;br /&gt;
	&lt;br /&gt;
	//implementacao da sinaleira&lt;br /&gt;
	if((i == pos_sinaleira) &amp;amp;&amp;amp; (t &amp;gt;= sinaleira_fecha) &amp;amp;&amp;amp; (t &amp;lt; sinaleira_abre))&lt;br /&gt;
	{&lt;br /&gt;
		x = 0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
		/*   	RETORNA NOVA VELOCIDADE  	*/	&lt;br /&gt;
&lt;br /&gt;
		/*	            Regra 1         	*/&lt;br /&gt;
		/*	caso dê pra acelerar, acelere	*/&lt;br /&gt;
		if( ( v &amp;lt; veloc_max ) &amp;amp;&amp;amp; ( dist[k_novo] &amp;gt; v + 1 ) ){&lt;br /&gt;
	&lt;br /&gt;
			x = v + 1;&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
		/*	           Regra 2           	*/&lt;br /&gt;
		/*	caso pouco espaço, desacelere	*/&lt;br /&gt;
		else if( dist[k_novo] &amp;lt; v + 1 ){&lt;br /&gt;
			&lt;br /&gt;
			//indica se a verificacao de troca de pista resultou em algo&lt;br /&gt;
			faz_nada = 0;&lt;br /&gt;
			&lt;br /&gt;
			//para garantir que um carro que ja trocou de faixa nao entre aqui&lt;br /&gt;
			if(k == k_novo)&lt;br /&gt;
			{&lt;br /&gt;
				//verificacao para trocar de faixa&lt;br /&gt;
				x = trocar_faixa();&lt;br /&gt;
			}&lt;br /&gt;
			//caso o carro ja tenha trocado de faixa&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				x = dist[k_novo] - 1;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			//se nao deu pra trocar de faixa&lt;br /&gt;
			if(faz_nada == 1)&lt;br /&gt;
			{&lt;br /&gt;
				x = dist[k_novo] - 1;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		/*Caso em que v=dist-1, ou seja, nao se alteraria*/&lt;br /&gt;
		else if((dist[k_novo] == v + 1) &amp;amp;&amp;amp; (v != veloc_max))&lt;br /&gt;
		{&lt;br /&gt;
			faz_nada = 0;&lt;br /&gt;
			&lt;br /&gt;
			//para garantir que um carro que ja trocou de faixa nao entre aqui&lt;br /&gt;
			if(k == k_novo)&lt;br /&gt;
			{&lt;br /&gt;
				x = trocar_faixa();&lt;br /&gt;
			}&lt;br /&gt;
			//caso o carro ja tenha trocado de faixa&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				x = v;&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
			//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa&lt;br /&gt;
			if(faz_nada == 1)&lt;br /&gt;
			{&lt;br /&gt;
				x = v;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			x = v;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return x;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int trocar_faixa(void)&lt;br /&gt;
{&lt;br /&gt;
	int y;&lt;br /&gt;
	//verificacao para trocar de faixa	&lt;br /&gt;
	&lt;br /&gt;
	//tem duas pistas de cada lado&lt;br /&gt;
	if((k_novo - 1 &amp;gt;= 0) &amp;amp;&amp;amp; (k_novo + 1 &amp;lt; num_faixas))&lt;br /&gt;
	{&lt;br /&gt;
		//ambas vazias&lt;br /&gt;
		if((rua_nova[k_novo-1][i] == -1) &amp;amp;&amp;amp; (rua_nova[k_novo+1][i] == -1))&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			//ambas com mais espaço&lt;br /&gt;
			if((dist[k_novo-1] &amp;gt; dist[k_novo]) &amp;amp;&amp;amp; (dist[k_novo+1] &amp;gt; dist[k_novo]))&lt;br /&gt;
			{&lt;br /&gt;
				if(dist[k_novo-1] &amp;gt; dist[k_novo+1])&lt;br /&gt;
				{&lt;br /&gt;
					k_novo--;&lt;br /&gt;
				}&lt;br /&gt;
				else if(dist[k_novo+1] &amp;gt; dist[k_novo-1])&lt;br /&gt;
				{&lt;br /&gt;
					k_novo++;&lt;br /&gt;
				}&lt;br /&gt;
				//caso dist[k+1]=dist[k-1], escolha aleatoria&lt;br /&gt;
				else if(drand48() &amp;lt; 0.5)&lt;br /&gt;
				{&lt;br /&gt;
					k_novo--;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					k_novo++;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				y = mudar_velocidade(vel[rua[k][i]]);&lt;br /&gt;
			}&lt;br /&gt;
			//so o lado k-1 com mais espaco&lt;br /&gt;
			else if(dist[k_novo-1] &amp;gt; dist[k_novo])&lt;br /&gt;
			{&lt;br /&gt;
				k_novo--;&lt;br /&gt;
				&lt;br /&gt;
				y = mudar_velocidade(vel[rua[k][i]]);&lt;br /&gt;
			}&lt;br /&gt;
			//so o lado k+1 com mais espaco&lt;br /&gt;
			else if(dist[k_novo+1] &amp;gt; dist[k_novo])&lt;br /&gt;
			{&lt;br /&gt;
				k_novo++;&lt;br /&gt;
				&lt;br /&gt;
				y = mudar_velocidade(vel[rua[k][i]]);&lt;br /&gt;
			}&lt;br /&gt;
			//nenhuma com espaco&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				faz_nada = 1;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		//so o lado k-1 vazio&lt;br /&gt;
		else if((rua_nova[k_novo-1][i] == -1) &amp;amp;&amp;amp; (dist[k_novo-1] &amp;gt; dist[k_novo]))&lt;br /&gt;
		{&lt;br /&gt;
			k_novo--;&lt;br /&gt;
			&lt;br /&gt;
			y = mudar_velocidade(vel[rua[k][i]]);&lt;br /&gt;
		}&lt;br /&gt;
		//so o lado k+1 vazio&lt;br /&gt;
		else if((rua_nova[k_novo+1][i] == -1) &amp;amp;&amp;amp; (dist[k_novo+1] &amp;gt; dist[k_novo]))&lt;br /&gt;
		{&lt;br /&gt;
			k_novo++;&lt;br /&gt;
		&lt;br /&gt;
			y = mudar_velocidade(vel[rua[k][i]]);&lt;br /&gt;
		}&lt;br /&gt;
		//nenhum lado vazio&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			faz_nada = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	//so pista do lado k-1&lt;br /&gt;
	else if(k_novo - 1 &amp;gt;= 0)&lt;br /&gt;
	{&lt;br /&gt;
		//se esta vazia e se ha mais espaco&lt;br /&gt;
		if((rua_nova[k_novo-1][i] == -1) &amp;amp;&amp;amp; (dist[k_novo-1] &amp;gt; dist[k_novo]))&lt;br /&gt;
		{&lt;br /&gt;
			k_novo--;&lt;br /&gt;
			&lt;br /&gt;
			y = mudar_velocidade(vel[rua[k][i]]);&lt;br /&gt;
		}&lt;br /&gt;
		//nao esta vazia/ sem espaco&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			faz_nada = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	//so pista do lado k+1&lt;br /&gt;
	else if(k_novo + 1 &amp;lt; comprimento_rua)&lt;br /&gt;
	{&lt;br /&gt;
		//se esta vazia e se ha mais espaco&lt;br /&gt;
		if((rua_nova[k_novo+1][i] == -1) &amp;amp;&amp;amp; (dist[k_novo+1] &amp;gt; dist[k_novo]))&lt;br /&gt;
		{&lt;br /&gt;
			k_novo++;&lt;br /&gt;
			&lt;br /&gt;
			y = mudar_velocidade(vel[rua[k][i]]);&lt;br /&gt;
		}&lt;br /&gt;
		//nao esta vazia/sem espaco&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			faz_nada = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		faz_nada = 1;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return y;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigozferreira</name></author>
	</entry>
</feed>