Ir ao conteúdo
  • Cadastre-se

johnsigma

Membro Júnior
  • Posts

    18
  • Cadastrado em

  • Última visita

Reputação

9
  1. @devair1010 Lista.c: #include <stdio.h> #include <stdlib.h> #include "lista.h" #define max 10 struct lista{ int no[max]; int fim; }; Lista cria_lista(){ Lista lst; lst = (Lista) malloc(sizeof(struct lista)); if(lst != NULL){ lst->fim = 0; } return lst; } int lista_vazia(Lista lst){ if(lst->fim==0) return 1; //lista vazia else return 0; //lista NÃO vazia } int lista_cheia(Lista lst){ if(lst->fim==max) return 1; //lista cheia else return 0; //lista NÃO cheia } int insere_elem(Lista lst, int elem){ if(lst == NULL || lista_cheia(lst) == 1) return 0; //falha lst->no[lst->fim]=elem; //insere o elemento lst->fim++; //avança o fim return 1; //sucesso } int remove_elem(Lista lst, int elem){ if(lst==NULL || lista_vazia(lst)==1) return 0; //falha int i, Aux=0; while(Aux<lst->fim && lst->no[Aux]!=elem) Aux++; if(Aux==lst->fim) //percorreu a lista inteira return 0; //falha, o elemento não está na lista //se chegou aqui é porque o elemento está na lista for(i=Aux+1; i<lst->fim; i++) lst->no[i-1]=lst->no[i]; lst->fim--; return 1; //sucesso na remoção } Lista imprime_lista(Lista lst){ int i; if(lst->fim==0) printf("Lista vazia!\n\n"); else{ printf("Lista: "); for(i=0;i<lst->fim;i++){ printf("%d ", lst->no[i]); } printf("\n\n"); } } int menor_elem(Lista lst){ if(lst==NULL || lista_vazia(lst)==1) return 0; int menor, aux; for(aux=0;aux<lst->fim;aux++){ if(aux==0) menor=lst->no[aux]; else if(lst->no[aux]<menor) menor=lst->no[aux]; } remove_elem(lst,menor); return 1; } int tamanho(Lista lst){ return printf("A lista tem %d elementos!\n", lst->fim); } int insere_inicio(Lista lst, int elem){ if(lst==NULL || lista_cheia(lst)) return 0; int i; for(i=lst->fim;i>0;i--) lst->no[i]=lst->no[i-1]; lst->fim=lst->fim+1; lst->no[0]=elem; return 1; } int remove_todos(Lista lst, int elem){ if(lst==NULL || lista_vazia(lst)==1) return 0; //falha int i, Aux=0; while(Aux<=lst->fim){ if(lst->no[Aux]==elem){ for(i=Aux+1;i<lst->fim;i++) lst->no[i-1]=lst->no[i]; lst->fim--; } Aux++; } return 1; //sucesso na remoção } Lista concatenar(Lista lst1, Lista lst2){ Lista lst3 = (Lista) malloc(sizeof(Lista)); int i,j; for(i=0;i<lst1->fim;i++){ lst3->no[i]=lst1->no[i]; } j=lst3->fim; for(i=0;i<lst2->fim;i++){ lst3->no[j+1]=lst2->no[i]; } return lst3; } lista.h: typedef struct lista *Lista; Lista cria_lista(); int lista_vazia(Lista lst); int lista_cheia(Lista lst); int insere_elem(Lista lst, int elem); int remove_elem(Lista lst, int elem); Lista imprime_lista(Lista lst); int menor_elem(Lista lst); int tamanho(Lista lst); int insere_inicio(Lista lst, int elem); int remove_todos(Lista lst, int elem); Lista concatenar(Lista lst1, Lista lst2); user.c: #include <stdio.h> #include <stdlib.h> #include "lista.h" int main(){ Lista lista1,lst1,lst2,lst3; lista1=cria_lista(); lst1=cria_lista(); lst2=cria_lista(); tamanho(lista1); imprime_lista(lista1); insere_elem(lista1,4); insere_elem(lista1,0); insere_elem(lista1,2); insere_elem(lista1,10); insere_elem(lista1,21); insere_elem(lista1,7); insere_elem(lista1,3); tamanho(lista1); imprime_lista(lista1); remove_elem(lista1,2); tamanho(lista1); imprime_lista(lista1); insere_inicio(lista1,15); tamanho(lista1); imprime_lista(lista1); remove_elem(lista1,21); tamanho(lista1); imprime_lista(lista1); insere_inicio(lista1,16); tamanho(lista1); imprime_lista(lista1); remove_elem(lista1,15); tamanho(lista1); imprime_lista(lista1); menor_elem(lista1); tamanho(lista1); imprime_lista(lista1); insere_elem(lista1,7); insere_elem(lista1,7); tamanho(lista1); imprime_lista(lista1); tamanho(lista1); imprime_lista(lista1); insere_inicio(lista1,7); tamanho(lista1); imprime_lista(lista1); remove_todos(lista1,7); tamanho(lista1); imprime_lista(lista1); printf("\n"); insere_elem(lst1,4); insere_elem(lst1,12); insere_elem(lst1,0); insere_elem(lst2,11); insere_elem(lst2,18); insere_elem(lst2,25); lst3=concatenar(lst1,lst2); imprime_lista(lst3); return 0; } Obs: a função concatenar também não está funcionando, se conseguirem me ajudar nela também!
  2. Não entendi, poderia especificar mais ou até deixar um código?
  3. @devair1010 Não deu certo, ele não remove o elemento. Acho que não dá pra fazer esse exercício percorrendo apenas uma vez, pois como a lista não é ordenada então sempre tem que percorrê-la inteira para tentar achar o elem.
  4. Estou com dificuldade em remover o menor elemento em uma lista estática/sequencial, fiz uma maneira onde eu acho o menor valor em uma unção e nela mesmo eu chamo uma função de remover passando o menor valor para remover, desse forma está funcionando mas minha professora quer que a função percorra a lista apenas uma vez e dessa forma iria percorrer duas. Vou deixar o código e espero que me ajudem. Obs: se alguém quiser ajudar também com esse mesmo problema mas na lista dinâmica/encadeada com cabeçalho, também ajudaria. Obs2: a função remove_elem funciona normal, mas preciso remover o menor sem chamar ela. int menor_elem(Lista lst){ if(lst==NULL || lista_vazia(lst)==1) return 0; //falha int menor, aux; for(aux=0;aux<lst->fim;aux++){ if(aux==0) menor=lst->no[aux]; else if(lst->no[aux]<menor) menor=lst->no[aux]; } remove_elem(lst,menor); return 1; //sucesso }
  5. Olá, estou com um exercício da faculdade que não consegui resolver, é um exercício onde preciso utilizar ponteiro para ponteiro em uma struct mas estou muito perdido na sintaxe. o exercício é o seguinte: Faça uma struct com dois campos, uma string para nome e um int para armazenar um número inteiro. Na main peça para o usuário digitar o tamanho do array da struct. Crie uma função para alocar dinamicamente esse array de struct e ler os dados digitados pelo usuário. Faça uma função que verifica os números pares digitados pelo usuário na struct e se o número for par dentro do if se chama outra função para manipular esse número par passando toda a struct, essa função deve receber a struct mas manipular apenas o número par dela e dividi-lo por 2 alterando a struct original. No final o programa deve imprimir na main o array dos números. Eu consegui fazer alocando na própria main, mas dessa forma com uma função separada não consegui. Vou deixar meu código, que deve ter vários erros mas serve pra ilustrar bem o que o exercício pede. #include <stdio.h> #include <stdlib.h> #include <locale.h> struct dados{ char nome[5]; int num; }; typedef struct dados dado; void manipula_um_par(dado **q){ **q.num=**q.num/2; } void manipula_pares(dado **q,int *x){ int i; for(i=0;i<*x;i++){ if(*(*q[i]).num%2==0){ manipula_um_par(&q[i]); } } } void define_structs(int *n, dado *q){ dado *p; int i; p = (dado *) malloc(*n*sizeof(dado)); printf("\n"); for(i=0;i<*n;i++){ printf("Digite o %dº nome: ",i+1); gets(p[i].nome); setbuf(stdin,NULL); printf("Digite o %dº número: ",i+1); scanf("%d", &p[i].num); setbuf(stdin,NULL); printf("\n"); } q=&p; } int main(){ setlocale(LC_ALL, "Portuguese_Brazil"); int n, i; dado **q; printf("Digite o tamanho do vetor de struct: "); scanf("%d",&n); setbuf(stdin,NULL); q = (dado *) malloc(n*sizeof(dado)); define_structs(&n,q); manipula_pares(q,&n); for(i=0;i<n;i++){ printf("%d\n", **q[i].num); } printf("\n"); return 0; }
  6. #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <string.h> #include <math.h> struct endereco{ char rua[20]; char num[6]; char bairro[20]; char cep[15]; char cidade[20]; char estado[35]; }; struct data{ char dia[3]; char mes[25]; char ano[5]; }; struct funcionario{ char nome[50]; struct data d; struct endereco e; float salario; }; void dados(int *x, struct funcionario *j){ int i; for(i=0;i<*x;i++){ printf("%dº funcionário:\n",i+1); printf("Nome: "); gets(j[i].nome); setbuf(stdin,NULL); printf("Dia do nascimento: "); gets(j[i].d.dia); setbuf(stdin,NULL); printf("Mês do nascimento: "); gets(j[i].d.mes); setbuf(stdin,NULL); printf("Ano do nascimento: "); gets(j[i].d.ano); setbuf(stdin,NULL); printf("Rua: "); fgets(j[i].e.rua,20,stdin); setbuf(stdin,NULL); printf("Número: "); fgets(j[i].e.num,6,stdin); setbuf(stdin,NULL); printf("Bairro: "); fgets(j[i].e.bairro,20,stdin); printf("CEP: "); fgets(j[i].e.cep,15,stdin); printf("Cidade: "); fgets(j[i].e.cidade,20,stdin); printf("Estado: "); fgets(j[i].e.estado,35,stdin); printf("Salário: "); scanf("%f",&j[i].salario); setbuf(stdin,NULL); printf("\n"); } } void compara_salario(int *x, struct funcionario *j){ int i; float *ms; char nomem[50]; for(i=0;i<*x;i++){ if(i==0){ ms=&j[i].salario; strcpy(nomem,j[i].nome); } else{ if(*ms<j[i].salario){ ms=&j[i].salario; strcpy(nomem,j[i].nome); } } } printf("Funcionário com o maior salário: %s",nomem); } int main(){ setlocale(LC_ALL, "Portuguese_Brazil"); int n,i,*k; printf("Digite a quantidade de funcionários: "); scanf("%d",&n); printf("\n"); setbuf(stdin,NULL); struct funcionario *f; f=(struct funcionario*) malloc(n*sizeof(f)); k=&n; dados(k,f); compara_salario(k,f); return 0; } Esse é o código, tá funcionando, mas ele exibe apenas um nome pois não sei como fazer para aparecer mais de um se os os funcionário tiverem o mesmo salário e esse salário seja o máximo
  7. É que o meu ficou assim: struct cadastro *c; c=(struct cadastro*) malloc(n*sizeof(c)); E não assim: struct cadastro *c; c=(struct cadastro*) malloc(n*sizeof(cadastro)); O problema é mais simples ainda. Vou anexar um print do problema. Não estou conseguindo fazer a segunda função pois se 2(ou mais) funcionários tiverem o mesmo salário(e esse salário seja o máximo) eu tenho que exibir o nome dos dois. Eu sei fazer apenas com 1, e nesse caso o programa iria ignorar um(ou mais) dos funcionários com maior salário!
  8. valeu demais, deu certo aqui. Mas ali no caso quando eu criei o vetor de dados eu tive que colocar o nome do ponteiro da struct. Então no seu exemplo ficaria: lista=(dados*) malloc(n*sizeof(lista)); Outra dúvida: Tenho um exercício que tenho que criar uma função para exibir os funcionário de maior salário(se tiver mais de 1 funcionário com salários iguais e esses forem os maiores). Como eu faço pra fazer essa função e ela retornar os funcionários com os maiores salário independente de quantos funcionários tem? Consigo fazer apenas com um, e se houver mais de 1 funcionário com salário igual ao do maior ele exibe apenas 1 deles!
  9. Tenho esse algoritmo pra fazer: Codifique, compile e execute um programa em C que declare na função principal uma estrutura para o cadastro de alunos de uma academia. a) Para cada aluno armazenar: nome, sobrenome (apenas um), ano de nascimento e um vetor de 6 posições indicando quais dias da semana o aluno frequenta a academia. Lembrando que a academia funciona de segunda a sábado; b) Ao iniciar o programa, o usuário deverá informar o número de alunos que serão armazenados; c) O programa deverá alocar dinamicamente a quantidade necessária de memória para armazenar os registros dos alunos; d) O programa deverá pedir ao usuário que entre com as informações dos alunos; e) Ao final, o programa deve exibir na tela os dados armazenados e liberar a memória alocada. Não esqueça de usar funções para estruturar o seu código. Consegui fazê-lo rodar mas sem o uso de ponteiro e creio que estou confundindo o conceito de ponteiro e alocação dinâmica. Então gostaria que avaliassem meu código e dissessem o que estou fazendo de errado. Código: #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <string.h> #include <math.h> int main(){ setlocale(LC_ALL, "Portuguese_Brazil"); struct cadastro{ char nome[20]; char sobrenome[30]; char ano[10]; int dias[6]; }; int n,i,j,*p; printf("Digite quantos alunos cadastrar: "); scanf("%d",&n); setbuf(stdin,NULL); printf("\n"); p=(int *) malloc(n*sizeof(int)); struct cadastro c[*p]; for(i=0;i<n;i++){ printf("%dº aluno para cadastrar:\n\n",i+1); printf("Nome: "); fgets(c[p[i]].nome,20,stdin); setbuf(stdin,NULL); printf("Sobrenome (apenas um): "); gets(c[p[i]].sobrenome); setbuf(stdin,NULL); printf("Ano de nascimento: "); gets(c[p[i]].ano); setbuf(stdin,NULL); printf("\nDias na semana que frequenta a academia (0 para não; 1 para sim):\n"); setbuf(stdin,NULL); for(j=0;j<6;j++){ printf("Dia %d: ",j+1); scanf("%d",&c[p[i]].dias[j]); setbuf(stdin,NULL); } printf("\n\n"); } printf("\n\nDados cadastrados dos alunos: \n\n"); for(i=0;i<n;i++){ printf("%dº aluno: \n",i+1); printf("Nome: %s",c[p[i]].nome); printf("Sobrenome: %s\n",c[p[i]].sobrenome); printf("Ano de nascimento: %s\n",c[p[i]].ano); printf("O aluno foi na academia nos seguintes dias:\n"); if(c[p[i]].dias[0]==1) printf("Segunda, "); if(c[p[i]].dias[1]==1) printf("Terça, "); if(c[p[i]].dias[2]==1) printf("Quarta, "); if(c[p[i]].dias[3]==1) printf("Quinta, "); if(c[p[i]].dias[4]==1) printf("Sexta, "); if(c[p[i]].dias[5]==1) printf("Sábado"); printf("\n\n\n"); } free(p); return 0; }
  10. Tem alguma outra forma de comparar String sem usar a função Strcmp? Uma forma mais manual?
  11. Fiz um programa com o seguinte comando: "Ler nome, sexo e idade. Se sexo for feminino e idade menor que 25, imprime o nome da pessoa e a palavra “ACEITA”, caso contrario imprimir “NÃO ACEITA”.". Fiz o programa porém quando digito sexo 'feminino' e idade abaixo de 25 ele retorna "Não aceito" ao invés de "Aceito". O que pode tá errado no meu código? Código: #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <string.h> int main(){ setlocale(LC_ALL, "Portuguese_Brazil"); char nome[200]; int idade; char sexo[50]; setbuf(stdin, NULL); printf("Digite seu nome: "); gets(nome); printf("Digite seu sexo: "); gets(sexo); printf("Digite sua idade: "); scanf("%d",&idade); if(sexo=="feminino" && idade<25){ printf("\\n%s\\n",nome); printf("Situação: Aceita.\\n"); }else{ printf("\\n%s\\n",nome); printf("Situação: Não aceita.\\n"); } return 0; } OBS: Não quero apenas outra forma de escrever o programa(mas se quiser pode colocar), quero saber porque esse código está dando errado!
  12. @grievous Ok, vou tentar aqui e te falo se funcionou!
  13. @grievous O programa é confiável, foi inclusive uma indicação de um membro daqui, sempre utilizo ele e nunca tive problema, acredito que a tela azul não seja o programa.
  14. Eae galera, é o seguinte, toda vez que eu conecto algum dispositivo na porta USB 3.0 do meu notebook ele dá tela azul e reinicia, não sei por que está acontecendo, isso está ocorrendo de umas 2-1 semana atrás, não acredito que seja o Hardware pois ele nunca sofreu uma queda. Passei o Drivers Booster nele e atualizei todos os drivers, se alguém tem alguma opinião que possa me ajudar agradeceria muito, uso o Windows 7 Ultimate 64bits. Se precisarem de mais informações sobre o PC me perguntem!
  15. @DiF Baixei o programa que você recomendou, e o erro persiste quando tento abri-lo. Mas mesmo assim obrigado!

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...