Пример #1
0
void ST1countdiffer(int *palavrasTotais, int* palavrasDistintas, int *tokensDistintos)
{
  int i = 0, j = 0, pD = 0, pT = 0 ;
  Item *ordem = mallocSafe(N*sizeof(*ordem));
  Key p;
  sentence *s;
  for(i = 0; i < M; i++)
    if(st[i] != NULLitem){
      ordem[j] = mallocSafe(sizeof(*(ordem[j])));
      ordem[j] = st[i];
      if( isLetter(ordem[j]->literal[0] ))
	for(s = ordem[j]->occurencies; s != NULL; s = s->next)pT++;
      j++;
    }

  mergeSort(ordem, 0, N);
  
  p = ordem[0]->literal;
  if( isLetter(p[0]) )
    pD++;
  for(j = 1; j < N; j++){
    if(!eq(p, ordem[j]->lema)){
      p = ordem[j]->lema;
      if(isLetter(p[0]))
	for(s = ordem[j]->occurencies; s != NULL; s = s->next) pD++;
    }
  }
  *palavrasDistintas = pD;
  *palavrasTotais = pT;
  *tokensDistintos = ST1count()+1;
  free(ordem);
}
Пример #2
0
Nave* newNave(float rEsfera, float posX, float posY, float posZ, 
              float velocity, float dirX, float dirY, float dirZ, 
              float life, float shield_energy, float weapon_damage, float weapon_rate) 
{
    Nave* nave = mallocSafe(sizeof(Nave));

    nave->rEsfera = rEsfera;

    nave->pos[X] = posX;
    nave->pos[Y] = posY;
    nave->pos[Z] = posZ;

    nave->vel = velocity;
    nave->dir[X] = dirX;
    nave->dir[Y] = dirY;
    nave->dir[Z] = dirZ;

    nave->life = life;
    nave->shield_energy = shield_energy;
    nave->weapon_damage = weapon_damage;
    nave->weapon_rate = weapon_rate;

    nave->ultimoTiro = 0;
    nave->atira = FALSE;
    nave->shield_active = FALSE;
    nave->isDead = FALSE;

    return nave;
}
Пример #3
0
int juntaPixels(Imagem *img, int x, int y, float corNova, CelPixel *cabeca)
	/* 	A função juntaPixels recebe uma imagem e 2 posições. Captura re-
		cursivamente todas as células com COR_FUNDO e as pinta com corNova.
		Armazena a posição desse pixel numa lista encadeada iniciada por
		'cabeça'. Retorna o total de pixels da região. */
{	
	/** ALOCAÇÃO DE VARIÁVEIS *****************************************/
		int r; /*contador*/
		CelPixel *nova;
	
	/** BASE DA RECURSÃO **********************************************/
		if(getPixel(img, x, y) == corNova) return 0;
		if(getPixel(img, x, y) == COR_BORDA) return 0;
	
	/** AÇÕES *********************************************************/
		nova = mallocSafe(sizeof(CelPixel));
		setPixel(img, x, y, corNova);
	
		nova->x = x;
		nova->y = y;
		nova->prox = cabeca->prox;
		cabeca->prox = nova;
		r=1; /* Conta a chamada recursiva atual para o total */
	
	/** NOVAS CHAMADAS RECURSIVAS *************************************/
		r += juntaPixels(img, x+1, y, corNova, nova); /* direita	*/
		r += juntaPixels(img, x, y+1, corNova, nova); /* baixo		*/
		r += juntaPixels(img, x-1, y, corNova, nova); /* esquerda	*/
		r += juntaPixels(img, x, y-1, corNova, nova); /* cima 		*/
		
	return r;
}
Пример #4
0
/*Cria novo nó da tabela*/
static link NEW(Item_lema item, link next)
{
    link x = mallocSafe(sizeof *x);
    x->item = item;
    x->next = next;
    return x;
}
Пример #5
0
void ST1insert(Item item)
{ Key v = key(item);
  int i = hash(v, M), j = 0;
  while (!null(i)){
    if( eq(st[i]->literal, item->literal) ){
      item->occurencies->next = st[i]->occurencies;
      st[i]->occurencies = item->occurencies;
      return;
    }
    i = (i+1) % M;
  }
  st[i] = item;
  N++;

  if(N >= M/2){ /*resize dinamico*/
    Item *aux;
    int oldsize = M;
    M = prime_m(2*M);
    aux = mallocSafe(M*sizeof(Item));
    for(i = 0; i < M; i++) aux[i] = NULLitem;
    for(i = 0; i < oldsize; i++){
      if(st[i] != NULLitem){
	Key v = key(st[i]);
	j = hash(v, M);
	while( aux[j] != NULLitem ) j = (j+1)%M;
	aux[j] = st[i];
      }
    }
    free(st);
    st = aux;
  }
}
Пример #6
0
/*
------------------------------------------------------------------------
Funcao removeFilme
    Questiona o usuario sobre as caracteristicas do filme. Procura se
    ele existe e, em caso negativo, o adiciona ao fim da lista.
*/
void removeFilme(Lista *lista)
{
    /** VARIÁVEIS *****************************************************/
        Filme *aux;             /*  Auxiliar para percorrer a lista  */
        char *nome_procurado;   /*  Filme buscado pelo usuário       */
        char *caracterAtual;    /*  Auxiliar para contar 'tNome'     */
        char opcao[3];          /*  Identifica o filme encontrado    */
        int tNome;              /*  Auxiliar para tamanho do nome da
                                    função auxiliar 'achaPalavra'    */

        nome_procurado = (char *) mallocSafe((TAMNOME+1)*sizeof(char));
        aux = lista->ini;
    
    /** INFORMAÇÕES DO FILME PROCURADO ********************************/
        printf("Digite parte do nome a ser procurado: ");
        leString(nome_procurado, TAMNOME+1);

        for(caracterAtual = nome_procurado, tNome = 0; 
            *caracterAtual != '\0'; tNome++, caracterAtual++);
    
    /** LISTA VAZIA ***************************************************/
        if(lista->ini == NULL)
        {
            printf("A lista esta vazia!");
            return;
        }
        
    /** BUSCA DO FILME ************************************************/
        for(aux = lista->ini; aux != lista->fim->prox; aux = aux->prox)
        {
            if(achaPalavra((unsigned char *) nome_procurado, tNome, 
                (unsigned char *) aux->nome, TAMNOME) == TRUE)
            {
                mostraUmFilme(aux); 
                printf("Esse eh o filme procurado? [s/n] ");
                leString(opcao, 3);
                if(!strcmp(opcao, "s"))
                {
                    if(aux->prox != NULL)
                        aux->prox->ant = aux->ant;
                    else lista->fim = aux->ant;
                    
                    if(aux->ant != NULL)
                        aux->ant->prox = aux->prox;
                    else lista->ini = aux->prox;
                    
                    free(nome_procurado); free(aux);
                    nome_procurado = NULL; aux = NULL;
                    return;
                }
            }
        }
        
        if(aux == lista->fim->prox)
            printf("\n\nFilme nao encontrado\n");   
    
    /** LIBERAÇÃO DE MEMÓRIA ******************************************/
        free(nome_procurado); nome_procurado = NULL; aux = NULL;
}
Пример #7
0
void insertItem(Link head, double altura) {
    Link novo = (Link) mallocSafe(sizeof(Node));
    novo->altura = altura;

    novo->next = head->next;
    head->next = novo;
    head->total++;
}
Пример #8
0
/*Inicia tabela com M primo pequeno e arbitrrio*/
void st_lema_init()
{
    int i;
    N = 0;
    M = 1021;
    st_lema = mallocSafe(M*sizeof(Item_lema));
    for (i = 0; i < M; i++) st_lema[i] = NULLitem_lema;
}
Пример #9
0
/*Inicia tabela com M primo pequeno e arbitrrio*/
void st_lema_init()
{
    int i;
    N = 0;
    M = 1021;
    heads = mallocSafe(M*sizeof(link));
    z = NEW(NULLitem_lema, NULL);
    for (i = 0; i < M; i++) heads[i] = z;
}
Пример #10
0
/*
------------------------------------------------------------------------
Funcao adicionaFilme
    Questiona o usuario sobre as caracteristicas do filme. Procura se
    ele existe e, em caso negativo, o adiciona ao fim da lista.
*/
void adicionaFilme(Lista *lista)
{
    /** VARIÁVEIS *****************************************************/
        Filme *novo; /* Apontador para o novo filme que será criado  */
        char *nome; char *dist; int votos; float nota; int ano;

        nome = (char *) mallocSafe(sizeof(TAMNOME+1));
        dist = (char *) mallocSafe(11*sizeof(char));
        
    /** INFORMAÇÕES DO FILME ******************************************/
        printf("Digite o nome do filme: ");
        leString(nome, TAMNOME+1);
        
        printf("Digite o ano: ");
        scanf("%d", &ano);
        
        printf("Digite a nota: ");
        scanf("%f", &nota);
        
        printf("Digite o numero de votos: ");
        scanf("%d", &votos);
        
        printf("Digite a distribuicao: ");
        leString(dist, 11);
        
    /** INSERÇÃO ******************************************************/
        novo = criaFilme(dist, votos, nota, nome, ano);
        
        /* Filmes repetidos não são inseridos */
        if(achaFilme(lista, novo) == TRUE) 
        {
            free(novo); novo = NULL;
            return;
        }

        /* Coloca o filme não-listado no final */
        insereFilme(lista, novo);
        mostraUmFilme(novo);
    
    /** LIBERAÇÃO DE VARIÁVEIS ****************************************/
        nome = NULL; dist = NULL; novo = NULL;

}
Пример #11
0
Lista *criaLista()
{
  Lista *lista;

  lista =  mallocSafe(sizeof(Lista));

  lista->ini = NULL;
  lista->fim    = NULL;

  return lista;
}
Пример #12
0
/*Executa a função visit em cada item, sendo que eles estão ordenados*/
void st_lema_sort(void (*visit)(Item_lema))
{
    int i, j;
    Item_lema *v = mallocSafe(N*sizeof(Item_lema));

    for (j = 0, i = 0; i < M; i++)
        if (!null(i)) v[j++] = st_lema[i];

    qsort(v, N, sizeof(Item_lema), lema_cmp);
    for(i = 0; i < N; i++)
        visit(v[i]);
    free(v);
}
Пример #13
0
void ST1sort(int mod){
  Item* ordem = mallocSafe(N*sizeof(*ordem));
  Key p;
  int i = 0, j = 0;
  for(i = 0; i < M; i++)
    if(st[i] != NULLitem){
      ordem[j] = mallocSafe(sizeof(*(ordem[j])));
      ordem[j++] = st[i];
    }

  mergeSort(ordem, 0, N);

 if(mod == ALL){
    p = ordem[0]->literal;
    puts(p);
    for(j = 1; j < N; j++){
      if(!eq(p, ordem[j]->literal)){
	p = ordem[j]->literal;
	puts(p);
      }
    }
  }

  if(mod == WORDS){
    p = ordem[0]->literal;
    if( isLetter(p[0]) )
      puts(p);
    for(j = 1; j < N; j++){
      if(!eq(p, ordem[j]->literal)){
	p = ordem[j]->literal;
	if(isLetter(p[0]))
	  puts(p);
      }
    }
  }

  free(ordem);
}
Пример #14
0
void mochilaAdd(Item item, int quant)
{
	Mochila *aux;
	aux = mochilaFind(item.indice);

	/* Caso item não esteja no inventário, criamos ele */
	if (aux == NULL) {
		Mochila *novo = mallocSafe(sizeof (Item));
		novo->quant = 0;
		fim->prox = novo;
		aux = fim = novo;
	}
	aux->quant += quant;
}
Пример #15
0
/*
----------------------------------------------------------------------
Funcao quickSort(Lista *l)
  Ordena a lista em ordem decrescente de nota utilizando o 
  algoritmo Quicksort adaptado para listas encadeadas.
*/
void quickSort(Lista *lista)
{
    /** VARIÁVEIS *****************************************************/
        Lista *esquerda; /* Lista para os elementos maiores que 'i'  */
        Lista *direita;  /* Lista para os elementos menores que 'i'  */
        Filme *ini;      /* Apontador para primeiro filme da lista   */
        Filme *fim;      /* Apontador para o último filme da lista   */
        Filme *i;        /* Filme com nota pivô para as sublistas
                            devolvido pelo algoritmo de separação    */
        
        ini = lista->ini; fim = lista->fim;
    
    /** BASE DA RECURSÃO **********************************************/
        if(ini == NULL || fim == NULL) return; /* Lista vazia        */
        if(ini == fim) return;                 /* Apenas 1 elemento  */
        if(fim->prox == ini) return;           /* Começo precede fim */
        
    /** SEPARAÇÃO *****************************************************/
        i = separa(lista);
        
    /** PASSO DA RECURSÃO *********************************************/
        esquerda = (Lista *) mallocSafe(sizeof(*esquerda));
        direita = (Lista *) mallocSafe(sizeof(*direita));
        
        esquerda->ini = lista->ini; esquerda->fim = i->ant;
        direita->ini = i->prox; direita->fim = lista->fim;
        
        quickSort(esquerda);  /* Filmes com nota maior que i->nota */
        quickSort(direita);   /* Filmes com nota menor que i->nora */ 
        
        /* Atualiza início e fim */
        lista->ini = esquerda->ini; lista->fim = direita->fim;
        
    /** LIBERAÇÃO DE MEMÓRIA ******************************************/
        free(esquerda); esquerda = NULL;
        free(direita); direita = NULL;
}
void nRainhas(int n)
{
	int i;	/*linha*/
	int j;	/*coluna*/
	int *s;	/*fila*/
	int nSolucoes = 0;
	s = mallocSafe((n+1)*sizeof(int));
	/* NÃO usaremos o índice 0, mas começaremos com '1' */
	
	i = j = 1;
	
	while(i > 0) /* Até o backtrack voltar até o '0', que significa
					que ele percorreu todas as possibilidades */
	{
		int achouPos = FALSE;
		while(j <= n+1  && achouPos == FALSE)
			/* 	Enquanto não chegamos ao final do 'tabuleiro' e não
				achamos uma posição válida, realizamos a ação */
		{
			s[i] = j;
			if(solucaoParcial(i, s) == TRUE)
				achouPos = TRUE;
			/* 	Se a solução parcial for válida, achamos a posição */
			else j += 1;
			/*	Caso não conseguimos ainda uma posição válida, avan-
				çamos para a coluna */
		}
		
		if(j <= n) /*AVANÇA*/
		{
			i += 1;
			j = 1;
			if(i == n+1)
			{
				/*achou solução*/
				nSolucoes++;
				imprimaTabuleiro(n, s);
			}
			j = s[--i] + 1; 	/*i -= 1; j = s[i];*/
		}
		else /*BACKTRACK - VOLTA*/
		{
			i -= 1; s[i] + 1;
			/* Fomos até o final do caminho, e aí voltamos */
		}
		printf("n-Solucoes %d\n", nSolucoes);
	}
	free(s); /* Libera a pilha */
}
Пример #17
0
Imagem *criaImagem(int nLins, int nCols)
	/*	A função recebe o número de linhas e de colunas e cria uma estru-
		tura do tipo 'Imagem', na qual será criada uma matriz de tamanho
		nLins x nCols */
{
	 /** ALOCAÇÃO DE VARIÁVEIS ****************************************/
		int i;				/* Variável auxiliar 	*/
		Imagem *novaImagem;	/* Imagem a ser alocada */
		novaImagem = mallocSafe(sizeof(Imagem));
			/* 	Alocamos com malloc para a variável não ser descartada
				com o fim da função */

	 /** CRIAÇÃO DA IMAGEM ********************************************/
		novaImagem->nL = nLins;
		novaImagem->nC = nCols;
		
		/* Alocando a matriz 'pixel' na estrutura novaImagem */
		novaImagem->pixel = mallocSafe(nLins * sizeof(int *));
		for(i = 0; i < nLins; i++)
			novaImagem->pixel[i] = mallocSafe(nCols * sizeof(int));
		
	 /** RETORNO ******************************************************/
		return novaImagem;
}
Пример #18
0
/*Executa a função visit em cada item, sendo que eles estão ordenados*/
void st_lema_sort(void (*visit)(Item_lema))
{
    int i,j;
    link t;
    Item_lema *v = mallocSafe(N*sizeof(Item_lema));

    for (j = 0, i = 0; i < M; i++)
        if (heads[i] != z)
            for (t = heads[i]; t != z; t = t->next)
                v[j++] = t->item;

    qsort(v, N, sizeof(Item_lema), lema_cmp);
    for(i = 0; i < N; i++)
        visit(v[i]);
    free(v);
}
Пример #19
0
void
intercala( int p, int q, int r, Item* v)
{
  int i, j, k;
  Item *w;
  w = mallocSafe( (r-p) * sizeof (*w));
  for (i = 0, k = p; k < q; ++i, ++k)
    w[i] = v[k];
  for (j = r-p-1, k = q; k < r; --j, ++k)
    w[j] = v[k];
  i = 0; j = r-p-1;
  for (k = p; k < r; ++k)
    if (w[i] != NULLitem && w[j] != NULLitem){
      if ((eq(w[i]->lema, w[j]->lema) || less(w[i]->lema, w[j]->lema))) v[k] = w[i++];
      else v[k] = w[j--];
    }
  free( w);
}
Пример #20
0
Filme *criaFilme(char *d, int v, float n, char *nm, int a)
{
  Filme *f;

  f = mallocSafe(sizeof(Filme));

  strncpy(f->dist, d, 10);
  f->dist[10] = '\0';

  strncpy(f->nome, nm, TAMNOME);
  f->nome[TAMNOME] = '\0';

  f->votos = v;
  f->nota  = n;
  f->ano   = a;

  f->prox = f->ant = NULL;  /* paranoia */
  return f;
}
Пример #21
0
/*Função que torna o hash dinamico.
   Dobra o tamanho da tabela e reinsere os elementos*/
static void reHash()
{
    int K, i;
    link *aux, t;
    K = prime_m(2*M);
    aux = mallocSafe(K*sizeof(link));
    for (i = 0; i < K; i++) aux[i] = z;

    for (i = 0; i < M; i++)
        while ((t = heads[i]) != z)
        {
            int h = hash(key_lema(t->item), K);
            heads[i] = heads[i]->next;
            t->next = aux[h];
            aux[h] = t;
        }
    free(heads);
    heads = aux;
    aux = NULL;
    M = K;
}
Пример #22
0
/*Função que torna o hash dinamico.
   Dobra o tamanho da tabela e reinsere os elementos*/
static void reHash()
{
    int K, i;
    Item_lema *aux;
    K = prime_m(2*M);
    aux = mallocSafe(K*sizeof(Item_lema));
    for (i = 0; i < K; i++) aux[i] = NULLitem_lema;

    for (i = 0; i < M; i++)
        if(!null(i))
        {
            int h = hash(key_lema(st_lema[i]), K);
            while (aux[h].lema != NULLitem_lema.lema) h = (h+1) % K;
            aux[h] = st_lema[i];
        }

    free(st_lema);
    st_lema = aux;
    aux = NULL;
    M = K;
}
Пример #23
0
/*
----------------------------------------------------------------------
Funcao separa
    Recebe uma lista de elementos e devolve um ponteiro para o filme
    'i' que separa os filmes à esquerda com notas maiores ou iguais
    à nota de 'i' e os filmes à direita com notas menores.
*/
static Filme *separa(Lista *lista)
{
    /** VARIÁVEIS *****************************************************/
        Filme *i;   /* Posição que mantêm a relação invariante       */
        Filme *j;   /* Batedor para percorrer a analisar a lista     */
        Filme *cab; /* Auxiliar para manter a relação invariante     */
        Filme *ini; /* Apontador para o primeiro filme da lista      */
        float nota; /* Guarda a nota que separa os filmes            */
        
        cab = (Filme *) mallocSafe(sizeof(*cab));
        ini = lista->ini; cab->prox = ini; 
        i = cab; nota = lista->fim->nota;
        
    /** SEPARA ********************************************************/
        for(j = ini; /*ι*/ j != NULL; j = j->prox) 
        {
            if(j->nota >= nota) 
            {
                i = i->prox;
                troca(&i, &j, &lista);
            }
        }
        
        /*------------------------------------------------------------
          RELAÇÃO INVARIANTE:                                        
          Em ι, vale que todos os elmentos da lista até 'i' têm notas 
          maiores ou iguais a 'i'. De 'i->prox' até 'fim', todos têm 
          notas menores. Resumidamente:                              
                                                                     
                (ini->...)->nota >= i->nota > (..->fim)->nota        
        ------------------------------------------------------------*/
        
    /** LIBERAÇÃO DE MEMÓRIA ******************************************/
        free(cab); cab = NULL; j = NULL; ini = NULL;
    
    return i;
}
Пример #24
0
Link initializeList() {
    Link head = (Link)mallocSafe(sizeof(Node));
    head->total = 0;
    head->next = NULL;
    return head;
}
Пример #25
0
int main(){
  char *pcwd;
  char *arg[ARG_MAX];
  pid_t childPid;
  char *entrada = mallocSafe(NUM_MAX_CARAC_A_LER * sizeof(char));
  char *str;
  int i, ii; /* Iterador */

  while(1){
    /* 1. Imprimir o diretório */
    pcwd = getcwd(NULL, 0);
    printf("[%s] ", pcwd);
    
    /* 2. Ler entrada do usuário */
    leLinha(entrada, NUM_MAX_CARAC_A_LER, stdin); /* le ateh NUM_MAX_CARAC_A_LER - 1 caracteres,
                                                     jogando fora os demais caracteres */
    
    /* 3. Parsear entrada */
    i = 0;
    str = strtok(entrada, " \n");
    while(str && i < ARG_MAX - 1){
      arg[i++] = str;
      str = strtok(NULL, " \n");
    }
    
    arg[i] = NULL;

    /* neste ponto, vale
     * arg[0] == comando ou binario, arg[1] == primeiro argumento, ..., 
     * arg[i-1] == (i-1)-esimo argumento, ..., arg[i] == NULL
     */

    /* 4. Executar comando/binario */
    /* 4.1 Comando cd */
    if(!strcmp("cd", arg[0])) {
      /* TESTE COMECA 
      printf("Executa cd ");
      for(ii = 0; ii < i; ii++)
        printf("%s ", args[ii]);
      printf("\n");
      TESTE TERMINA */
      chdir(arg[1]);
    }

    /* 4.2 Comando pwd */
    else if(!strcmp("pwd", arg[0])) {
      printf("%s\n", pcwd);
    }

    /* 4.3 Binario (/bin/ls ou ./ep1) */
    else {
      switch (childPid = fork()){
        case -1:
          perror("fork falhou");
          exit(1);
          break;
        case 0: /* Processo filho */
          /* 4.3.1 Binario /bin/ls -1 */
          if(!strcmp("/bin/ls", arg[0]) && !strcmp("-1", arg[1])){ 
            printf("vou executar /bin/ls com o seguinte arg:");
            for(ii = 0; ii <= i; ii++) {
              printf("%s,", arg[ii]);
            }
            printf("\n");
            execve(arg[0], arg, 0);
            perror("execve");
            exit(EXIT_FAILURE);
          }
          /* 4.3.2 Binario ./ep1 */
          else if(!strcmp("./ep1", arg[0])){ // TODO: Interpretação do ./ep1
            /* TESTE COMECA 
            printf("Executa ep1 ");
            for(ii = 0; ii < i; ii++)
              printf("%s ", args[ii]);
            printf("\n");
            TESTE TERMINA */
          }
          exit(0); /* nao achamos o que executar, entao nos matamos */
          break;
        default:
          /* Processo pai */
          free(entrada);
          wait(NULL);
          break;
      }
    }
  }
  return 0;
}
Пример #26
0
int *distancias(int n, int **A, int c)
	/*	Recebe o número de cidades,
		uma matriz com os caminhos e
		a cidade a ser analisada (c).
		Devolve um vetor com as dis-
		tâncias até todas as cidades */
{
	int *d = mallocSafe(n*sizeof(int));
		/* Matriz das distâncias */
	int j;	/* contador */
	
	queueInit(n);
	/*	Criamos a fila */
	for(j = 0; j < n; j++)
		d[j] = n;
	/* 	Inicializa a matriz das distân-
		cias com 'n' - o número de ci-
		dades, que representa a dis-
		tância "infinita" */
	d[c] = 0;
	/* 	A cidade a ser analisada tem 
		distância dela a ela mesma 
		com 0. */
	queuePut(c);
	/* 	O primeiro elemento da fila,
		que será analisada, é a ci-
		dade passada como parâmetro. */
	 
	while(!queueEmpty())
		/*	Este laço é feito no MÁXIMO
			'n' vezes, pois cada cidade 
			é colocada na fila, para ter
			as distâncias analisadas, uma
			vez apenas */
	{
		int i = queueGet();
		/* 	Pegamos o primeiro elemento 
			da fila */
		for(j = 0; j < n; j++)
			/* 	Executamos este laço 'n' 
				vezes no MÁXIMO, pois 
				este é o número d checa-
				gens para os caminhos que
				faremos na matriz. */
			if(s[i][j] == 1 && d[j] == n) {
				/* 	Se já tiver sido posto,
					no passado, é porque 
					já houve um caminho mais
					curto até lá. Caso con-
					trário, se houver liga-
					ção (s[i][j] == 1) e 
					não tiver sido posto ain-
					da (d[j] == n), fazemos
					as operações abaixo */
				d[j] = d[i] + 1;
				/*	A distância da cidade
					será a distância até
					a cidade atual (d[j])
					somada de 1. */
				queuePut(j);
				/*	Se não tiver entrado
					ainda, ele é colocado
					na fila para ser ana-
					lisado posteriormen-
					te. */
			} /* fim do if */
		} /* fim do for */
	} /* fim do while */
Пример #27
0
void leMondrian(char *nomeArquivo, int *altura, int *largura, Linha *cab)
{
  char aux[MAX_LINHA];
  int npars;
  FILE *entrada;
  int p, i, f;
  Linha *nova;
  int cont = 0;

  entrada = fopen(nomeArquivo, "r");
  if (entrada == NULL) 
    {
      fprintf(stderr, "ERRO!! Nao consegui abrir o arquivo %s\n", nomeArquivo);
      exit(-1);
    }
  fprintf(stdout, "Arquivo de entrada com a definicao do desenho: %s\n", 
	  nomeArquivo);

  while (fscanf(entrada, "%s", aux) != EOF) 
    {
      switch (aux[0]) {
      case '#':
	fgets(aux, MAX_LINHA, entrada);
	break;

      case 'r':
      case 'R':
	npars = fscanf(entrada, "%d %d", altura, largura);
	if (npars != 2) {
	  fprintf(stderr, "ERRO na leitura da dimensao da"
		  " imagem no arquivo de entrada %s\n", nomeArquivo);
	  exit (-1);
	}
	else {
	  fprintf(stdout, "Resolucao da Imagem: %d linhas x %d colunas \n",
		  *altura, *largura);
	}
	break;
	
      case 'H':
      case 'h':
	npars = fscanf(entrada, "%d %d %d", &p, &i, &f);
	if (npars != 3) {
	  fprintf(stderr, "ERRO na leitura de uma linha horizontal"
		  " no arquivo de entrada %s\n", nomeArquivo);
	  exit (-1);
	}
	else {
	  cont += 1;
	  nova = mallocSafe(sizeof(Linha));
	  nova->prox = cab->prox;
	  nova->tipo = TIPO_HORIZONTAL;
	  nova->pos = p;
	  nova->ini = i;
	  nova->fim = f;

	  cab->prox = nova;
	  fprintf(stdout, "Linha %3d: Tipo H com pos = %4d, "
		  "inicio = %4d e fim %4d\n", 
		  cont, p, i, f);
	}
	break;

      case 'V':
      case 'v':
	npars = fscanf(entrada, "%d %d %d", &p, &i, &f);
	if (npars != 3) {
	  fprintf(stderr, "ERRO na leitura de uma linha vertical no"
		  " arquivo de entrada %s\n", nomeArquivo);
	  exit (-1);
	}
	else {
	  cont += 1;
	  nova = mallocSafe(sizeof(Linha));
	  nova->prox = cab->prox;
	  nova->tipo = TIPO_VERTICAL;
	  nova->pos = p;
	  nova->ini = i;
	  nova->fim = f;

	  cab->prox = nova;
	  fprintf(stdout, "Linha %3d: Tipo V com pos = %4d, "
		  "inicio = %4d e fim %4d\n", cont, p, i, f);
	}
	break;

      default:
	fgets(aux, MAX_LINHA, entrada);
	break;
      }
    }
  fclose(entrada);
}
Пример #28
0
void mochilaInit()
{
	inventario = mallocSafe(sizeof (Mochila));
	inventario->prox = NULL;
	fim = inventario;
}