Ir ao conteúdo
  • Cadastre-se

Antônio da Silva

Membro Júnior
  • Posts

    19
  • Cadastrado em

  • Última visita

Reputação

0
  1. Tenho que fazer uma lista que recebe letras e números e retorne uma lista com as letras na ordem em que foram inseridas e os números na ordem inversa (não decente). No programa que fiz, eu digito primeiro a quantidade de caracteres que quero entrar, depois digito essa quantidade de caracteres (letras e números) e depois o programa para de funcionar. Não sei o que está errado. Por favor, me ajudem! #include <stdio.h> #include <stdlib.h> #include <math.h> #include <ctype.h> /*estabelecendo estrutura para receber um caractere*/ struct lista { char caractere; struct lista *prox; }; typedef struct lista list; /*função para inserir uma nova estrutura na lista*/ list *insere (list *l, char c) { list *novo = (list*)malloc(sizeof(list)); novo->caractere = c; novo->prox = l; return novo; } /*função para fazer a ordenação de caracteres utilizando um vetor*/ list *ordenar (list *L) { list *p; int cont_dig, cont_caract, cont; int i=0, j=0; for(p = L; p != NULL; p= p->prox) { if(isdigit(p->caractere)) cont_dig++; else cont_caract++; } char *vetor = (char*) malloc(cont_dig*sizeof(char)); /*Alocando espaço na memória para o vetor de digitos*/ char *vetor2 = (char*) malloc(cont_caract*sizeof(char)); /*Alocando espaço na memória para vetor de caracteres*/ for(p = L; p != NULL; p=p->prox) { if(isdigit(p->caractere)) { vetor[i]= p->caractere; i++; } else { vetor2[j]= p->caractere; j++; } } list *organizado; organizado = NULL; for (cont = 0; cont < i; cont++) { organizado = insere(organizado,vetor[cont]); } for (cont = 0; cont < j; cont++) { organizado = insere(organizado,vetor2[cont]); } return organizado; } /*função para imprimir*/ void imprime(list *L) { list *p = L; while(p!= NULL) { printf("%s",p->caractere); p= p->prox; } } int main () { char caractere; int i, numero; list *l; printf("Digite o numero de caracteres que voce deseja ordenar:\n"); scanf("%d", &numero); for(i = 0; i < numero; i++) { printf("Digite um caractere:\n"); scanf("%s", &caractere); l = insere(l, caractere); } l = ordenar(l); imprime(l); printf("\n"); system("pause"); }
  2. @Midori Muito obrigado pela paciência em me explicar! Agora eu entendi melhor. Já coloquei na função atribui o mesmo cálculo da acessa e corrigi o if da main. Agora o programa exibe "matriz simetrica". O que eu não entendi muito bem foi o valor 0,1 sendo comparado com 1,0. Sei que isso é para comparar se a triangular superior é igual à inferior. Se for, a mensagem "matriz simetrica" deve ser exibida. Senão, a mensagem do else deve ser exibida. Porém, como o programa vai comparar o valor da posição 0,1 da matriz com o valor 1,0 se eu só estou informando o valor 0,1 (atribui(mat, 0, 1, 2);)? Como o programa vai saber se o valor de 1,0 é ou igual ao valor 2 que eu estou passando para 0,1? Teria como me explicar isso, por gentileza? E se que quisesse criar uma situação na qual a mensagem exibida fosse a do else "matriz nao simetrica", quais valores eu deveria passar para atribui? E se eu quisesse que o usuário entrasse com a valores, como eu deveria fazer?
  3. @Midori Muito obrigado pelas correções! Eu fiz algumas mudanças na função atribui e coloquei a main como você falou e o código ficou assim: #include <stdio.h> #include <stdlib.h> struct mat { int dim; float* v; }; typedef struct mat MatrizSimetrica; MatrizSimetrica* cria (int n) { int s = n*(n+1)/2; MatrizSimetrica* mat = (MatrizSimetrica*) malloc(sizeof(MatrizSimetrica)); mat->dim = n; mat->v = (float*) malloc(s*sizeof(float)); return mat; } void libera (MatrizSimetrica* mat) { free(mat->v); free(mat); } float acessa (MatrizSimetrica* mat, int i, int j) { int k; /* indice do elemento no vetor */ if (i<0 || i>=mat->dim || j<0 || j>=mat->dim) { printf("\nAcesso invalido.\n"); exit(1); } if (i>=j) k = i*(i+1)/2 + j; else k = j*(j+1)/2 + i; return mat->v[k]; } void atribui (MatrizSimetrica* mat, int i, int j, float v) { int k; if (i<0 || i>=mat->dim || j<0 || j>=mat->dim) { printf("\nAtribuicao invalida.\n"); exit(1); } k = i*(i+1)/2 + j; mat->v[k]; } int main() { MatrizSimetrica* mat = cria(2); atribui(mat, 0, 0, 1); atribui(mat, 0, 1, 2); atribui(mat, 1, 1, 4); if (acessa(mat, 0, 1) == mat->v[0]) { printf("matriz simetrica.\n"); } else { printf("matriz nao simetrica.\n"); } libera(mat); return 0; } Agora está exibindo "matriz nao simetrica". Eu fiquei um pouco confuso sobre n = 2 (no caso, com 4 elementos), mas eu só mandar 3 elementos para a função atribui. Não entendi direito isso de só alocar metade dos elementos + diagonal principal. Se no caso eu quisesse mandar mais elementos, como 8 por exemplo, qual deveria ser o valor de n? Poderia, por gentileza, explicar melhor e ver se agora meu código está correto?
  4. @Midori A minha professora deu pronto as funções "cria" e "acessa" e mandou a gente criar as funções "libera" e "atribui" e chamar todas na main. O objetivo é ver se a matriz é simétrica ou não (na matriz simétrica, os elementos acima da diagonal principal devem ser iguais aos elementos abaixo da diagonal principal). O código tem que ser com vetor simples e alocação dinâmica. Eu não sei como corrigir.
  5. Não sei o que está errado com o meu código. Não importa os valores que em entre na função atribui, o resultado sempre aparece "matriz simetrica". Preciso de ajuda! Me ajudem a corrigir essa código! Acho que a função atribui está errada, mas não sei corrigir. Também não sei se a função libera está correta. Por favor, me ajudem! Código: #include <stdio.h> #include <stdlib.h> struct mat { int dim; float* v; }; typedef struct mat MatrizSimetrica; MatrizSimetrica* cria (int n) { int s = n*(n+1)/2; MatrizSimetrica* mat = (MatrizSimetrica*) malloc(sizeof(MatrizSimetrica)); mat->dim = n; mat->v = (float*) malloc(s*sizeof(float)); return mat; } void libera (MatrizSimetrica* mat) { free(mat->v); free(mat); } float acessa (MatrizSimetrica* mat, int i, int j) { int k; /* indice do elemento no vetor */ if (i<0 || i>=mat->dim || j<0 || j>=mat->dim) { printf("\nAcesso invalido.\n"); exit(1); } if (i>=j) k = i*(i+1)/2 + j; else k = j*(j+1)/2 + i; return mat->v[k]; } void atribui (MatrizSimetrica* mat, int i, int j, float v) { int k; if (i<0 || i>=mat->dim || j<0 || j>=mat->dim) { printf("\nAtribuicao invalida.\n"); exit(1); } k = i*mat->dim+j; mat->v[k] = v; } int main() { int i, j, k; MatrizSimetrica* mat = cria(2); atribui(mat, i, j, 1); atribui(mat, i, j, 2); atribui(mat, i, j, 4); atribui(mat, i, j, 7); if (acessa(mat, i, j) == mat->v[k]) { printf("matriz simetrica.\n"); } else { printf("matriz nao simetrica.\n"); } libera(mat); return 0; }
  6. Eu preciso de ajuda para inserir e imprimir ordenadamente uma lista circular duplamente encadeada em c, mas não estou conseguindo. O meu código está inserindo e imprimindo a lista de maneira desordenada. Alguém pode me ajudar? Vou deixar abaixo o código: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> typedef struct mercadoria { char nome[20]; float preco; } Mercadoria; typedef Mercadoria Tipo; #define TRUE 1 #define FALSE 0 typedef struct node { Tipo c; struct node *prev; struct node *next; } Node; Node *corrente; int lcdeCreate() { corrente = NULL; return TRUE; } int lcdeDestroy() { while (corrente != NULL) { Tipo aux; lcdeRemove(&aux); printf("\n%s removido.\n", aux.nome); } return TRUE; } Node *encadeiaNovoElemento(Tipo c, Node *p1, Node *p2) { Node *aux; aux = (Node *) malloc (sizeof(Node)); aux->c = c; aux->next = aux->prev = NULL; if (p1 == NULL) { aux->next = aux; aux->prev = aux; return aux; } aux->prev = p1; aux->next = p2; p1->next = aux; p2->prev = aux; return aux; } int lcdeIn(Tipo c) { printf("\n[%s %f]\n", c.nome, c.preco); system("PAUSE"); Node *p1, *p2; //A inserção vai ocorrer entre p1 e p2 ou após o corrente - AQUI ESTÁ O ERRO!!! Preciso que a inserção seja ordenada! p1 = corrente; if (corrente != NULL) p2 = corrente->next; corrente = encadeiaNovoElemento(c, p1, p2); return TRUE; } int lcdeOut(Tipo *c) { if (corrente == NULL) { return FALSE; } *c = corrente->c; return TRUE; } int lcdeRemove(Tipo *c) { if (corrente == NULL) { return FALSE; } Node *aux = corrente; *c = aux->c; Node *p1 = aux->prev; Node *p2 = aux->next; if(aux == p2) { corrente = NULL; } else { p1->next = p2; p2->prev = p1; corrente = p2; } free(aux); return TRUE; } int lcdeNext() { return TRUE; } int lcdePrevious() { if (corrente == NULL) { return FALSE; } corrente = corrente->prev; return TRUE; } int lcdePrint() { if (corrente == NULL) { printf("\nLista vazia.\n"); return TRUE; } printf("->"); Node *aux = corrente; printf("[%s]->", corrente->c.nome); aux = corrente->next; while(aux != corrente) { printf("%s->", aux->c.nome); aux = aux->next; } return TRUE; } void menu() { system("cls"); printf("Lista Circular Mercadorias\n"); printf("i - insere mercadoria\n"); printf("d - delete corrente\n"); printf("p - próxima\n"); printf("a - anterior\n"); printf("s - sair\n"); lcdePrint(); } void leMercadoria() { Mercadoria m; printf("\nDigite o nome da mercadoria: "); scanf("%s", m.nome); printf("\nDigite o preço: "); scanf("%f", &m.preco); lcdeIn(m); } int main() { setlocale(LC_ALL,"portuguese"); lcdeCreate(); while (TRUE) { menu(); char letra = getch(); if (letra == 's') //exit(1); break; else if (letra == 'i') { leMercadoria(); } else if (letra == 'p') { lcdeNext(); } else if (letra == 'a') { lcdePrevious(); } else if (letra == 'd') { Tipo c; if (lcdeRemove(&c) == TRUE) printf("\nRemovido %s.\n", c.nome); else printf("\nNada a fazer.\n"); system("PAUSE"); } } lcdeDestroy(); return 0; } A propósito, também preciso fazer uma função de busca. Essa função recebe um valor e tem que buscar se esse valor é correspondente ao valor de alguma chave da lista circular e então exibir o nome dessa chave. Mas não sei fazer isso. Podem me ajudar, por favor? Desde já, obrigado!
  7. @arfneto Pois é, cara, eu ainda sou iniciante na programação e tenho muito o que aprender. Obrigado pelo comentário e pela atenção. Tem uma coisa que você disse que é justamente o que eu não estou conseguindo fazer: posicionar no fim e percorrer a lista pra trás. Pode me ajudar com isso?
  8. @arfneto struct NO { int info; struct NO *ant, *prox; }; typedef struct NO no; no *iniciar () { return NULL; } void *imprimir (no *l) { no *p = l; printf("\nOrdem crescente:\n"); for (p=l; p!=NULL; p=p->prox) { printf("%d\n", p->info); } printf("\nOrdem decrescente:\n"); for (p=l; p!=NULL; p=p->ant) { printf("%d\n", p->info); } } no *inserirLista (no *l, int x) { no *novo; int i=0, j=0; no *p = l, *aux = l; novo = (no*) malloc(sizeof(no)); novo->prox = NULL; novo->info = x; if (l == NULL) { novo->ant = NULL; l = novo; } else { while (p != NULL) { if (p->info <= x) { aux = p; j++; } p = p->prox; i++; } if (j == 0) { novo->ant = NULL; l->ant = novo; novo->prox = l; l = novo; } else if (j < i) { aux->prox->ant = novo; novo->prox = aux->prox; novo->ant = aux; aux->prox = novo; } else if (i == j) { aux->prox = novo; novo->ant = aux; } } return l; } int main () { int a; no *p = iniciar(); do { printf("Insira um valor na lista ou digite 0 para sair: "); scanf("%d", &a); p = inserirLista(p, a); } while (a != 0); imprimir(p); }
  9. @arfneto Na verdade, eu não expliquei direito. o que acontece é que eu criei uma função para ordenar em ordem crescente os elementos de uma lista duplamente encadeada. Usei dois ponteiros, um para frente (prox) e outro para trás (ant). E eu agora quero imprimir em ordem crescente (essa parte eu já consegui) e em ordem decrescente (essa é a parte que eu não sei fazer). Pensei que teria que mudar alguma coisa dentro do laço de impressão ou dentro da função de ordenação. Achei que seria mais fácil mudar a função de impressão... O máximo que consegui fazer foi isso, mas não está funcionando: for (p=l; p!=NULL; p=p->ant) { printf("%d\n", p->info); } ou: while (p != NULL) { printf("%d\n", p->info); p = p->ant; }
  10. Quero imprimir os valores de uma lista duplamente encadeada em ordem decrescente. Sei que para imprimir em ordem crescente é assim: for (p=l; p!=NULL; p=p->prox) { printf("%d\n", p->info); } ou assim: while (p != NULL) { printf("%d\n", p->info); p = p->prox; } Agora gostaria de saber como faço para imprimir em ordem decrescente. Alguém me ajude por favor!
  11. Preciso de ajuda com essa questão: Escreva a função ”???? insere_ordenado (????)” para uma lista duplamente encadeada. Já assisti várias video-aulas e não consigo resolver essa questão e meu professor não responde meus e-mails com dúvidas. Se alguém puder me ajudar eu agradeço. PRECISO MUITO!!!
  12. @arfneto Obrigado amigo, você é um amigo. Consegui corrigir o meu código graças a sua ajuda!! Muito obrigado mesmo!
  13. @arfneto Meu compilador não exibiu nenhuma mensagem e não estou conseguindo entender o que você disse, poderia ser mais claro por gentileza? Não consigo corrigir meu código! Preciso entregar para meu professor amanhã!
  14. @arfneto Consegui fazer isso aqui, mas não não está funcionando. Você pode me ajudar? preciso muito, é urgente!!!
  15. Faça uma função que recebe como parâmetro duas pilhas e 1 vetor de int e para cada um: Caso o número seja positivo, insira numa pilha; Caso o número seja negativo, insira noutra pilha; Caso o número seja zero, retire um elemento de cada pilha preciso de ajuda urgente com esse programa!!! não tenho ideia de por onde começar...alguém me dê uma luz por favor!!!

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!