Ir ao conteúdo
  • Cadastre-se

Lipeco

Membro Pleno
  • Posts

    107
  • Cadastrado em

  • Última visita

Tudo que Lipeco postou

  1. #include <stdio.h> #include <stdlib.h> #include "pilha.h" int main(){ char exp[50]; No *pPos = NULL; No *pTemp = NULL; printf("\tDigite um expressao: "); scanf("%49[^\n]", exp); //Digita no máximo 49 caractere sendo que um é para identificar o final da string até que p usuário aperte Enter verificaExpressao(exp); expressaoInfixa(&pPos, &pTemp); //Passa posFixa como null e i temporário também printf( "\tEXPRESSAO POSFIXA: " ); imprimePosfixo( pPos ); printf("\n\n"); } pilha.c #include <stdio.h> #include <stdlib.h> #include "pilha.h" typedef struct no{ char expressao; //A expressão é caractere float valor; struct no *proximo; }No; No* empilhar(No *pilha, char valor){ //Empilhar na pilha No *novo = malloc(sizeof(No)); if(novo){ //Verifica se a alocação está correta novo->expressao = valor; //Valor é empilhado novo->proximo = pilha; //Coloca no Topo da Pilha return novo; } else printf("\tERRO AO ALOCAR memória!\n"); return NULL; } No* desempilhar(No **pilha){ No *remover = NULL; if(*pilha){ //Se o conteúdo apontado por esse ponteiro for diferente de Nulo remover = *pilha; //Recebe o topo da pilha *pilha = remover->proximo; //Remove do topo da pilha } else printf("\tPILHAVAZIA\n"); return remover; } void imprimir(No *pilha){ //USADO PARA OBSERVAR SE O PARENTESE FOI EMPILHADO while(pilha){ printf("\tCONTEM NA PILHA: %c\n\n", pilha->expressao); pilha = pilha->proximo; } } int verificaParentese(char fechaP, char desempilhado){ //Verifica se o parentese foi colocado corretamente switch(fechaP){ case ')': if(desempilhado == '(') //Caso o parentese fechado for igual a sua abertura - Expressão correta return 1; //Expressao correta else return 0; //Expressao incorreta } } int verificaExpressao(char expressao[]){ //Empilha se for parentese, ou desempilha o mesmo int i = 0; No *remover, *pilha = NULL; while(expressao[i] != '\0'){ //Enquanto for diferente do fim da pilha if(expressao[i] == '(' ){ //Empilha "(" pilha = empilhar(pilha, expressao[i]); imprimir(pilha); //TESTAR PARA VER SE OS CARACTERES SÂO GUARDADOS NA PILHA } else if(expressao[i] == ')'){ remover = desempilhar(&pilha); if(verificaParentese(expressao[i], remover->expressao) == 0){ printf("\tEXPRESSAO ESCRITA INCORRETAMENTE!\n"); return 1; //Retorna 1 para quando estiver errada } free(remover); } i++; } imprimir(pilha); //TESTAR PARA VER SE OS CARACTERES foram REMOVIDOS dA PILHA if(pilha){ printf("\tExpressao Incorreta!!!\n"); return 1; // QUando estiver expressao incorreta } else{ printf("\tEXPRESSAO ESCRITA CORRETAMENTE !!!\n"); // DAQUI TEM QUE IR PARA CONVERTER ESSA EXPRESSAO return 0; } } //TESTES DE CONVERSAO void imprimePosfixo(No *posFixo) //Imprime conversão da expressão INFIXO para POSFIXO { if(posFixo) { imprimePosfixo(posFixo->proximo); printf("%c", posFixo -> expressao); } } void temporarioPos( No **pPos, No **pTemp, No *aux ) { aux = (*pTemp)->proximo; (*pTemp)->proximo = *pPos; *pPos = *pTemp; *pTemp = aux; } void alocaCharNaPilha(No **pilha, No *aux, char expressao) { aux = ( No *) malloc( sizeof( No ) ); aux -> expressao = expressao; aux -> proximo = *pilha; *pilha = aux; } void expressaoInfixa(No **pPos, No **pTemp ) { char expressao; No *aux; printf("\n\tTESTANDO DIGITE EXPRESSAO NOVAMENTE: "); //AQUI GOSTARIA DE CHAMAR O VALOR QUE FOI DIGITADO NO INICIO, AO invés DE EU TER QUE DIGITAR NOVAMENTE, JÁ TENTEI DE TUDO E DÁ ERRO. gets(&expressao); //TENHO QUE ESCREVER A EXPRESSÃO NOVAMENTE while( expressao != '\n' ) { switch( expressao ) { case '+': case '-': while((*pTemp) && ((*pTemp) -> expressao != '(' )) { temporarioPos(&(*pPos), &(*pTemp), aux); } alocaCharNaPilha(&( *pTemp ), aux, expressao); break; case '*': case '/': while((*pTemp) && ((*pTemp) -> expressao != '+' && (*pTemp) -> expressao != '-' && (*pTemp) -> expressao != '(' )) { temporarioPos(&(*pPos), &(*pTemp), aux); } alocaCharNaPilha(&(*pTemp), aux, expressao); break; case ')': while((*pTemp) && ((*pTemp) -> expressao != '(' )) { temporarioPos(&(*pPos), &(*pTemp), aux); } if( (*pTemp) && (*pTemp) -> expressao == '(') { aux = *pTemp; *pTemp = (*pTemp) -> proximo; free(aux); } break; case '(': alocaCharNaPilha(&( *pTemp), aux, expressao); break; default: alocaCharNaPilha(&(*pPos), aux, expressao); break; } scanf("%c", &expressao); } while(*pTemp ) { temporarioPos(&(*pPos), &(*pTemp), aux); } } pilha.h typedef struct no No; No* empilhar(No* pilha, char valor); No* desempilhar(No**pilha); void imprimir(No* pilha); int verificaParentese(char fecha, char desempilhado);//Verifica se o parentese foi colocado corretamente int verificaExpressao(char exp[]); //Empilha se for parentese, ou desempilha o mesmo void imprimePosfixo( No *posFixo ); void temporarioPos( No **pPos, No **pTemp, No *aux ); void alocaCharNaPilha( No **pilha, No *aux, char op ); void expressaoInfixa( No **pPos, No **pTemp); Eu estou com dificuldade de na hora da conversao, pegar a expressão digitada inicialmente automaticamente. Eu faço o seguinte , primeiro digito a expressão = a*(b+c)*(d-g)*h, utilizo ela como exemplo, digito a Infixa, aí o programa me diz se está escrito corretamente , abrindo e fechando os parenteses.. Mas o problema começa quando eu vou converter, não consigo pegar essa expressão, eu tenho que digita-la de novo a*(b+c)*(d-g)*h, aí quando eu digito ela converte certinho para abc+*dg-*h*, utilizo essa expressão como teste. Deixei anotado no código, se alguém puder dar uma ajuda, agradeço.
  2. @mauro_b Mandei incompleto. Estou lendo sobre infixa Para Posfixa tentando entender para aplicar no exercicio em anexo.
  3. Bom dia gostaria de algumas dicas sobre como fazer um exercício sobre pilhas. Exercício pede para que eu escreva uma expressão e logo após mostrar o resultado. Exemplo: Digito a expressão: (5-2)*(9+1) Imprime Resultado: 30. Regras do exercício: Iniciar com pilha vazia; Realizar uma varredura na expressão para cada caractere caso seja um operador (Enquanto a pilha não estiver vazia e houver no seu topo um símbolo com prioridade maior ou igual ao encontrado, desempilhe o operador e copie-o na saída). Empilhe o operador encontrado. Se for "(", empilhe. Se for um operando, copie para saída. Se for ")" desempilhar e copiar na saída, até que seja desempilhado o parêntese de abertura correspondente. Ao final, esvaziar a pilha e mover simbolos desempilhados para a saída. Prioridades: "(" prioridade 1; "-" ou "+" prioridade 2; "/" ou "*" prioridade 3; No final o resultado da expressão estará ao topo da pilha.
  4. @arfneto Vou postar por inteiro aqui
  5. Coloquei em anexo tudo explicado, o programa está com erro nesse primeiro procedimento. TESTE.zip
  6. @mauro_b Consegui já meu amigo, muito obrigado. Agora estou indo para outro exercício. Agradeço demais a todosD
  7. @mauro_b Opa irmão, então consegui falar com a professora agora pouco. Realmente é um exercício de imaginação, para ter noção de como funciona a memória e tudo mais.
  8. @arfneto Devo ter feito besteira
  9. @arfneto Entendi amigo. Passa esse como inicio int i; int *ptr_b; int *ptr_a; int **ptr_p; int val = 55; ptr_a = (int*)malloc(4*sizeof(int)); ptr_b = &ptr_a[1]; ptr_p = &ptr_b; printf("\n\t--- VALORES INCIAIS ---\n\n"); for(i=0; i<4;i++) { ptr_a[i] = 2*i+1; printf(" ptr_a [%i]:\t%d\n",i,ptr_a[i]); } val = ptr_b[1]; printf("\n ptr_a:\t%6X\n", ptr_a); printf(" ptr_b:\t%6X\n", ptr_b); printf(" ptr_p:\t%6X\n\n", ptr_p); A partir daí fazer as expressões. Fiz um desenho pra não me perder.
  10. @arfneto Amigo esse é o início do exercício, não pede mais nada, passa apenas o início do programa, almoçando ptra, e passando as variáveis semente, tem a segunda parte, mas a segunda parte pede outra coisa, apenas pra fazer expressões equivalentes a essa com o mesmo resultado. Acho que é o que você disse, que eu faça e coloque a mensagem de acordo.
  11. Esse exercício pede isso, eu fiz da seguinte forma: #include <stdio.h> #include <stdlib.h> #include <locale.h> void exibeExpressao(int *ptra, int *ptrb, int **ptrp, int val) { printf("\n\t---EXIBIR EXPRESSÕES---\n\n"); printf(" A) ptrp[0][2] :\t [%6X]\n", ptrp[0][2]); //APONTA PARA O ENDEREÇO DE PTRB E A "COLUNA" COMO NÃO FOI DECLARADA, TEM LIXO NA MEMÓRIA. printf(" B) ptra[4] :\t [%6X]\n",ptra[4]); //TRATAR MEMORIA NÃO INSERIDA printf(" C) **ptrp + 3 :\t %i \n", **ptrp + 3); //CONTEUDO APONTADO POR PTRP = (CONTEUDO DO ENREÇO DE PTRB) VAI VALER 6 printf(" D) *(ptrb + 1) + val :\t %i \n", *(ptrb + 1) + val); //VAL = 5; PTBR[1] = 5; Conteúdo de PTRB[1] passa a valer 10. printf(" E) ptrp[0] :\t %6X \n", ptrp[0]);//APONTA PARA O ENDEREÇO DO PTBR printf(" F) ++(*ptrb) :\t %i \n", ++(*ptrb));//INCREMENTA 1 NO CONTEÚDO DE PTRB[0] == PTRA[1] que é 3, PASSA A VALER 4. printf(" G) *(ptrp - 1) :\t %i \n", *(ptrp - 1)); //NÂO USAR INDICE NEGATIVO. printf(" H) *(ptrb + 1) * 2 :\t %i \n", *(ptrb + 1) * 2); //CONTEÚDO DE PTRB[1] que é 5, passa a valer 10. printf(" I) &(*ptrp) :\t %6X \n", &(*ptrp)); //endereço DO PONTEIRO PTRP. printf(" J) *(&ptrb[1] - 2) + 3 :\t %i \n", *(&ptrb[1] - 2) + 3); //PTRB[-1] TEM UM VALOR 1 e +3, FICA 4- INDICE NEGATIVO. if(ptrb[1] == *(ptra+1)) { printf(" K) ptrb[1] == *(ptra+1) : SÃO IGUAIS \n"); //PTRB[0] É IGUAL AO CONTEÚDO DE PTBRA[1] }else{ printf(" K) ptrb[1] == *(ptra+1) : NÃO SÃO IGUAIS \n"); } printf(" L) *(ptrp-(*ptrb-6) :\t %i \n", *(ptrp-(*ptrb-6)));//ACESSA MEMÓRIA NÂO ALOCADA printf(" M) val**ptrb :\t %i \n", val**ptrb);//VAL = 5 & PTRB = 4 printf(" N) ptrb + ptra[1] - 5 :\t %6X \n", ptrb + ptra[1] - 5); //ENDEREÇO printf(" O) **(&ptrb+1) :\t %6X \n\n", **(&ptrb+1)); system("\tpause"); } int main() { setlocale(LC_ALL, "Portuguese"); int i; int *ptr_b; int *ptr_a; int **ptr_p; int val = 55; ptr_a = (int*)malloc(4*sizeof(int)); ptr_b = &ptr_a[1]; ptr_p = &ptr_b; printf("\n\t--- VALORES INCIAIS ---\n\n"); for(i=0; i<4;i++) { ptr_a[i] = 2*i+1; printf(" ptr_a [%i]:\t%d\n",i,ptr_a[i]); } val = ptr_b[1]; printf("\n ptr_a:\t%6X\n", ptr_a); printf(" ptr_b:\t%6X\n", ptr_b); printf(" ptr_p:\t%6X\n\n", ptr_p); printf("---------------------------------------\n\n"); system("pause"); exibeExpressao(ptr_a,ptr_b,ptr_p,val); free(ptr_a); return 0; } Só que eu não entendi a parte para de imprimir a palavra erro. Por isso eu queria fazer algo daquele jeito quer eu disse. Porém eu consigo saber de cabeça onde cada um vai acessar uma memória não alocada. Mas Essa parte de imprimir erro na região de memória não permitida que eu estou confuso. Existe região de memória não permitida ? Como saber se tal variável está tentando acessá-la?
  12. @Luciano Spindola Irmão, aconselho colocar mais 8Gb de Ram também.
  13. Coloca 2000 mesmo, caso alguém chore o preço, Te aconselharia abaixar no máximo até 1800. Mas inicia com 2000, acho que consegue vender rápido.
  14. Irmão, esses dias aconteceu a mesma coisa comigo, mas eu limpei o contato da placa de vídeo também, com borracha e as memórias também, não ligava, aí comprei álcool Isopropilico, aí limpei os sockets, aí funcionou de boa. Acredito que seja algum contato aí que deve ter algum resíduo de sujeira. Ah, você pode passar álcool Isopropilico na memória e no contato da placa de vídeo também pra limpar bem.
  15. Cara pode ser várias coisas, fonte, processador aquecendo demais e fazendo com que seu pc desligue, já trocou a pasta térmica ? Seria uma boa. Tem que ir testando, testa trocar a pasta térmica e fica de olho na temperatura do processador.
  16. Boa noite irmão. Cara pelo o que você disse, você não limpou as memórias e nem a placa de vídeo, passa uma borracha nas memórias, geralmente quando não dá vídeo é a memória RAM, você limpando já vai melhorar, passa uma borracha na placa de vídeo também, de leve nada agressivo, depois tira os resíduos da borracha com um pincel de leve.
  17. @arfneto Mas eu posso criar um IF, caso o ponteiro X acessar um limite não disponível, eu colocar um printf? Por exemplo, se o B = ptr1[6]; Eu crio um if, caso ptr[i] ultrapassar 5, eu imprimo algo na tela. Seria bacana?
  18. Por exemplo, tenho como exercício, com esses valores setados, eu tenho que exibir depois uma lista de expressões, como abaixo: #include <stdio.h> #include <stdlib.h> int main() { int i; int *ponteiro1; int *ponteiro2; int **ponteirodePonteiro; int valor = 10; ponteiro1 = (int*)malloc(5*sizeof(int)); ponteiro2 = &ponteiro1[1]; ponteirodePonteiro = &ponteiro2; for(i=0; i<5;i++) { ponteiro1[i] = i; printf("Ponteiro1[ %i ] = %i\n",i,ponteiro1[i]); } valor = ponteiro2[1]; //Esse valor passa a receber o ponteiro2 na posicao 1. exibeExpressao(ponteiro1,ponteiro2,ponteiro3,valor); } Aí criei uma função para exibir as expressões: void exibeExpressao(int *ptr1, int *ptr2, int **ptr3, int valor) { system("cls"); printf("\n\tEXIBIR EXPRESSÕES:\n\n"); int a = ptr3[0][2]; int b = ptr1[4]; int c = **ptr3 + 3; int d = ptr2 + ptr1[1] - 5; printf(" A) ponteiro3[0][2]:\t[%i][%i]\n", a);// printf(" B) ponteiro1[4]:\t[%i]\n", b); // TRATAR MEMORIA não INSERIDA printf(" C) **ponteiro3 + 3 =\t %i \n", **ptrp + 3); printf(" D) %X \n", d); free(ptra); system("\tpause"); } Essa lista eu tenho que exibí-la com seus resultados, porém nos casos da expressão acessar uma memória não alocada, eu tenho que imprimir uma mensagem dizendo o erro. Na expressão b por exemplo, o ponteiro1 está acessando o índice 4, nesse caso seria memória não alocada, certo? Alguma dica de como fazer esse exemplo? No exemplo d, seria um print de endereço, está correto?
  19. @Lucca Rodrigues Entendi, no caso seria pra dar printf no ponteirodePonteiro[0][3], mas nem tem como, pois nem inicializei ele.
  20. #include <stdio.h> #include <stdlib.h> int main() { int i; int *ponteiro1; int *ponteiro2; int **ponteirodePonteiro; ponteiro1 = (int*)malloc(5*sizeof(int)); ponteiro2 = &ponteiro1[1]; ponteirodePonteiro = &ponteiro2; for(i=0; i<5;i++) { ponteiro1[i] = i; printf("Ponteiro1[ %i ] = %i\n",i,ponteiro1[i]); } //EXPRESSÃO ponteirodePonteiro[0][3]; //Essa expressão está correta? Esse ponteiro aponta para o endereço do ponteiro2 que aponta para o endereço do ponteiro1 //Como eu faria para exibir essa expressão? return 0; } Caso tenha alguns exemplos, eu agradeceria.
  21. @arfneto Então, tenho que fazer as repetições ainda, estou só testando algumas coisas, mas vou seguir sua dica. Esse é o exercício pede o seguinte: Uma tabela de dispersão com 13 endereços base (índices de 0 a 12) e empregue a função de dispersão h(x) = x mod 13, em que x representa a chave do elemento cujo endereço-base deve ser calculado. Se a chave x for igual a 27, por exemplo, a função de dispersão retornará o valor 1, indicando o local onde esse elemento deverá ser armazenado. Se a mesma aplicação considerar a inserção da chave 92, o cálculo retornará o mesmo valor 1, ocorrendo nesse caso uma colisão. Técnicas de tratamento de colisões são utilizadas para resolver os conflitos nos casos em que mais de uma chave é mapeada para um mesmo endereço-base da tabela. Um tratamento bem simples é associar a cada endereço-base uma lista de elementos e fazer o acesso em duas etapas, primeiro determinando o endereço-base com a função hash e depois percorrendo a lista associada para encontrar o local de armazenamento. Crie um programa que implemente uma demonstração de funcionamento de uma tabela Hash simples com 13 endereços-chave, considerando chave inteira e valor real, e utilizando a função hash e o tratamento de conflitos apresentados acima. O programa deverá possibilitar que o usuário insira e remova elementos [chave;valor] e possa observar o conteúdo da tabela. Pede-se utilizar um vetor de estruturas Linha_hash, cuja definição é apresentada abaixo. typedef struct _elem { int chave; float valor; } Elemento; typedef struct _hash { Elemento vet[10]; //vetor de elementos int num_elem; //número de elementos armazenados } Linha_hash;
  22. @arfneto Então, consegui evoluir um pouco com meu exercício. Agora estou com problema para remover um valor do meu vetor. Estou fazendo um exercício da função Hash. Estou com dificuldade de remover o valor, exemplo, digito a Chave 27, e Valor qualquer, digito a chave 97 e um valor qualquer, 27 e o 92 vão para o endereço 1, aí o 27 vai para o indice 0 do vetor e o 92 vai para o indice 1 do vetor. Para remover eu escolho a chave, porém está sempre removendo o indice 0. #include <stdio.h> #include <stdlib.h> typedef struct _elem{ int chave; float valor; }Elemento; typedef struct _hash{ Elemento vet[10]; int num_elem;//tamanho da lista }Linha_hash; Linha_hash endereco[13]; void imprimeEndereco(){ int i; Linha_hash *end; printf("\n\tEndereço\t\t\tElementos ---- [CHAVE; VALOR]\n\n"); for(i=0;i<13; i++){ end = &endereco[i]; printf("\t | %.2d |",i); imprimeElemento(end); printf("\n"); } } void imprimeElemento(Linha_hash *endereco){ int i; Elemento *l; for(i=0;i<10; i++){ l= &endereco->vet[i]; if(l->chave == NULL){ printf(" "); }else { printf(" [%i ; %.2f]",l->chave,l->valor); } } } int funcaoHash(int chave){ return chave % 13; } int inserir(int posicaoEndereco, int vChave, float valor){ int i = 0; Elemento *elem; Linha_hash *end; end = &endereco[posicaoEndereco]; elem= &end->vet[i]; do { if(elem->chave == NULL) { elem->chave = vChave; elem->valor = valor; i = 10; } else { elem = &end->vet[++i]; } }while(i<10); } int remover(int valorChaveRemov, int valorchave, int chaveRemov){ int i = 0; Elemento *elem; Linha_hash *end; end = &endereco[chaveRemov]; elem= &end->vet[i]; printf("\nO valor %i está no indice %i", elem->chave, i); elem->chave = valorchave; do { if(valorChaveRemov == valorchave) { printf("Iguais\n"); elem->chave = 0; // elem->valor = valor; i = 10; } else { printf("Diferentes"); elem = &end->vet[++i]; } }while(i<10); } int main (){ setlocale(LC_ALL, "Portuguese"); int opcao,chave,valorchave,valorchaveRemov, chaveRemov, cont =0; float valor; imprimeEndereco(); printf("\n\n"); do{ printf("\tQual a chave deseja inserir?\n"); scanf("%i", &chave); valorchave= chave; chave = funcaoHash(chave); printf("\tQual o valor deseja inserir?\n"); scanf("%f", &valor); inserir(chave,valorchave,valor); imprimeEndereco(); cont++; }while(cont < 2); printf("\n\n"); printf("\tQual a chave deseja remover?\n"); scanf("%i", &chaveRemov); valorchaveRemov= chaveRemov; chaveRemov = funcaoHash(chave); remover(valorchaveRemov, valorchave, chaveRemov); printf("\n\n"); imprimeEndereco(); return 0; }
  23. @devair1010 Consegui, eu estava totalmente errado mesmo.
  24. #include <stdio.h> #include <stdlib.h> #include <locale.h> typedef struct lin { int valor; }Linha; typedef struct col { Linha vetor[5]; int qtd; //Quantidade de valores dentro do indice do vetor }Coluna; void imprimeCol(Coluna *col[10]){ int i,vet, val; for(i=0;i<10; i++){ col = i; printf("\t%d",col); imprimeLinha(vet); printf("\n"); } } void imprimeLinha(Linha *vetor, int valor){ int i; vetor = (int *) malloc(5 * sizeof(int)); for(i=0;i<5; i++){ vetor = NULL; printf("\t[ %d ]",vetor); } } int inserirnoVetor(Linha *vetor, int valor){ Linha *aux = vetor->valor; } int main() { setlocale(LC_ALL, "Portuguese"); int col,vet,valor,coluna; imprimeCol(col); printf("Digite um valor: "); scanf("%d", &valor); printf("Digite um valor: "); scanf("%d", &coluna); //vet = vetor[0]; // printf("\n\n%d", vet); return 0; } Estou com duvidas em como usar o vetor dentro da struct, gostaria de fazer como a imagem, digitar um valor e qual coluna eu quero inserir, a partir daí, sempre escolher a partir do primeiro indice, se caso eu repetir essa ação, se o primeiro indice tiver ocupado, partir para o próximo. Não fiz as repetições ainda, porque estou com dificuldades de usar o vetor da struct. Alguém poderia me dar alguma dica?
  25. @kgin Vou seguir sua dica, assim que eu conseguir atualizo aqui. Muito obrigado pela dica irmão.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!