Ir ao conteúdo
  • Cadastre-se

UmPrograma

Membro Pleno
  • Posts

    182
  • Cadastrado em

  • Última visita

Tudo que UmPrograma postou

  1. @AnsiC Na verdade não (Em parte, somente). Não entendi muito bem o que voce quis dizer. voce se referia a mat que é aritmetica de ponteiros? E sobre essa de arranjo ser diferente de ponteiro para ponteiro, não sei. No caso teria que resolver usando ponteiro para ponteiro não? Que seria um arranjo. Esse ponterio nao vai apontar para um bloco e desse bloco cada pedaco (ponteiro) apontara para uma linha da matriz? Usei o seguinte site -> https://www.pucsp.br/~so-comp/cursoc/aulas/ca70.html , e conseguir resolver meu problema, eu acho. A parte que mudei. A diferenca que declarei o ponteiro para ponteiro na funcao. E usei calloc. mat = (int **) calloc (m, sizeof(int *)); for ( i = 0; i < m; i++ ) { mat[i] = (int*) calloc (n, sizeof(int)); /* m vetores de n floats */ if (mat[i] == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } } voce poderia me tirar outra duvida. Qual a diferenca e malloc e calloc, alem do prototico. Pois parece que fazem a mesma coisa. So que o calloc zera quando aloca alguma coisa.
  2. Bom dia. Como vão? Estava a resolver um exercício de alocação dinamica, so que dessa vez de matriz. Mas o conceito não entrou muito bem não. No vetor criamos um ponteiro que ira apontar para um espaço, e entao alocamos certa quantidade desse espaço usando o malloc (e sizeof). Já na matriz fariamos como? Eu seguindo um video aqui do youtube entendi que deve ser declarado um ponteiro para ponteiro, e que apontará para um espaço de memoria, como num vetor, e desse cada espaço apontará para uma certa quantidade. Não sei se deu para entender. (Não sei se pode deixar o link do video aqui, mas so pesquisa alocação de matriz.) Acredito que o conceito nao seja exatamente esse. Deixarei o codigo abaixo, se puderem olhar. Nele funciona normalmente quando é colocado um numero diferente de 1 na coluna ou na linha, (isso depende de como eu fiz o segundo malloc, ESTARÁ COMENTADO ESSA PARTE NO CODIGO). #include <stdio.h> #include <stdlib.h> /**3. Construa um programa (main) que aloque em tempo de execução (dinamicamente) uma matriz de ordem m x n(linha por coluna), usando 1+m chamadas a função malloc. Agora, aproveite este programa para construir uma função que recebendo os parametros m e n aloque uma matriz de ordem m x n e retorne um ponteiro para esta matriz alocada. Crie ainda uma função para liberar a área de memória alocada pela matriz. Finalmente, crie um novo programa (main) que teste/use as duas funções criadas acima.*/ /// Protóticos das funções. int **aloca_matriz(int **mat,int m, int n); void libera_matriz(int **mat); main(){ int **mat = NULL, m, n, i, j; printf("Quantas linhas a matriz tera? "); scanf("%d", &m); printf("Quantas colunas a matriz tera? "); scanf("%d", &n); mat=aloca_matriz(mat,m, n); ///Preenchendo a matriz. for(i=0;i<m;i++){ for(j=0;j<n;j++){ printf("Matriz [%d][%d]: ", i,j); scanf("%d", &mat[i][j]); } } ///Imprimir na tela o resultado!!! printf("\n\nAgora sera impresso na tela o resultado.\n"); for(i=0;i<m;i++){ for(j=0;j<n;j++){ printf("Matriz [%d][%d]: %d.\n", i,j,mat[i][j]); } } ///Liberando o espaco usado pela matriz alocada. libera_matriz(mat); /*printf("\n\nAgora sera impresso na tela o resultado apos libera-los.\n"); for(i=0;i<m;i++){ for(j=0;j<n;j++){ printf("Matriz [%d][%d]: %d.\n", i,j,mat[i][j]); } }*/ return 0; } int **aloca_matriz(int **mat,int m, int n){ int i,j; ///Aloco vetor principal mat = (int **) malloc(m * sizeof(sizeof(int *))); ///Aloca matriz for(i=0;i<n;i++){ //for(j=0;j<n;j++){ mat[i] = (int *) malloc(n * sizeof(int)); /// AQUI JÁ APARECE ERRO POR NAO CONSEGUIR COLOCAR 1 NA COLUNA. AQUI SE MUDAR O n * sizeof , POR M * ... APARECE PROBLEMA SE EU COLOCAR 1 NA LINHA, //} } return mat; } void libera_matriz(int **mat) { free(mat); }
  3. Eu tinha para mim que vetor sempre era um ponteiro, então sempre ia retornar ponteiro. ( Mas nem passou na minha cabeca isso de colocar a função como int *, interessante isso, pensave que na ora do return que eu mudaria a forma que seria retornado, colocando * ou & , ,,,,,cada coisa.) Quando estava aprendendo sobre funcao, no inicio eu fazia isso. Alias, quase isso, pois eu colocava so o nome da funcao e deixava o paranteses sem nada . kkkk (mas nunca deu problemas em rodar os exercicios, hoje sei que esta errado) Foi mal o tanto de pergunta ai, é que nao sabia mesmo. rsrsrs Muito obrigado, @giu_d . Esta me ajudando muito .
  4. @giu_d Porque que nessa parte não está igual como na função, com os nomes das variaves? Toda vez que for criar uma funcao que aloca dinamicamente uma vetor ela tem que ter o '*' nela? adicionado 4 minutos depois Pensei tambem que quando alocava uma variavel seguia esse padrão: variavel = (tipo *) malloc (tamanho * sizeof (tipo); No caso você não usou o primeiro parenteses acima adicionado 15 minutos depois @isrnick Porque que multiplica pelo vetor direto (logo apos o sizeof), e não o tipo? (esse retorno eu teria que atribuir a outra variavel para poder usar,ne)
  5. Bom dia, como vão? (Vou bem) Estou com dificuldades para criar um vetor, dinamicamente no caso, dentro de uma função. Segue o codigo e apos ele algumas observacoes que percebi. /**Faça uma função que receba um valor n e crie dinamicamente um vetor de n elementos e retorne um ponteiro. Crie uma função que receba um ponteiro para um vetor e um valor n e imprima os n elementos desse vetor. Construa também uma função que receba um ponteiro para um vetor e libere esta área de memória. Ao final, crie uma função principal que leia um valor n e chame a função criada acima. Depois, a função principal deve ler os n elementos desse vetor. Então, a função principal deve chamar a função de impressão dos n elementos do vetor criado e, finalmente, liberar a memória alocada através da função criada para liberação.*/ #include <stdio.h> #include <stdlib.h> main(){ int n,*vet, i; printf("Informe o tamanho do vetor: "); scanf("%d", &n); int criar(int *vet, int n); criar(vet,n); printf("\nPreencha o vetor agora.\n"); for(i=0;i<n;i++){ printf("Vetor [%d]: ",i); scanf("%d", &vet[i]); } void imprima(int *vet, int n); imprima(vet, n); void libera(int *vet); libera(vet); printf("\nO vetor depois de liberar.\n"); for(i=0;i<n;i++){ printf("Vetor [%d]: %d\n", i,vet[i]); } } int criar(int *vet, int n){ vet =(int *) malloc(n * sizeof(int)); return *vet; } void imprima(int *vet, int n){ int i; printf("\nO vetor ficou da seguinte forma.\n"); for(i=0;i<n;i++){ printf("Vetor [%d]: %d\n", i,vet[i]); } } void libera(int *vet){ free(vet); } Pois bem, se na funcao principal eu criar um vetor de forma normal, e não um ponteiro para depois ser criado um vetor dinamicamente, vai funcionar perfeitamente. So que no caso acredito que assim não seja possivel criar de forma dinamica.. A forma abaixo é o vetor criado normalmente e que funciona no exercicio. main(){ int n=2, vet[n],i; .... } So que depois de char a a função liberar, que faz uso do free(), continua a mostrar os mesmos valores, como se nao ouvesse sido liberada. E na primeira forma (a que nao da certo) eu não consigo nem ler o vetor na funcão principal.
  6. @giu_d Valeu. Deu para entender sim. So uma coisa o formatador de saída não é o -> %p , para o endereco de memoria ? Obs: no incio achei que o meu estava errado, pois so anulava o dois primeiro numero, e o resto se repetia igual.
  7. @AnsiC @giu_d Deixe-me ver então. QUer dizer que depois de usar o free, a variavel não é anulada. Quando perguntamos porque não estava dando certo a ele, ele simplesmente não respondeu, e olha que ninguem na sala conseguiu. Estavamos fazendo exercicios simples depois de cada pequena parte que ele explicava. Que no caso eram sobre alocação (malloc, calloc, realloc, free). O free não deve ser usado depois que alocar algo dinamicamente, para liberar memoria (ou algo assim).??????? So sei que ele disse que não deveria mostrar nada, que daria erro. Mas, em algum momento, ele disse sobre zerar. Acredito que deveria mostrar lixo na memoria, que é o que o porgrama esta fazendo ( EU ACHO), mas não sei se esta certo (alias nem dos programas que fiz de alocação kkkkk , perguntei a professor como era para ser a resposta dos outros programas e ele disse : Se você fez tudo certo,então esta certo, chato isso pois não sei se estou indo pro caminho certo)
  8. Boa noite, como estão? O professor estava a explicar sobre alocação dinamica de memoria, no entanto quando ele propos um exercicio com o uso da funcao free que quando resolvermos ele não librerou a memoria como deveria ter sido feito segundo o professor. No caso perguntamos porque nao deu certo e ele nao respondeu (ate onde vi todos falaram que nao deu certo). Era para aparecer 0 (zero) segundo o professor. Segue o codigo,, se puderem olhar e apontar o erro. #include <stdio.h> #include <stdlib.h> // NECESSARIA !!!! main(){ int a, *p, i; printf("Digite valor de a: "); scanf("%d", &a); p = (int *)malloc(a*sizeof(int)); if(!p){ printf("ERRO: MEMORIA INSUFICIENTE!"); exit; } for(i=0;i<a;i++){ p[i]=i*i; } for(i=0;i<a;i++){ printf("Vetor p[%d]: %d\n", i, p[i]); } printf("\n\nAhora depois de deixar de apontar para o p.\n"); free(p); for(i=0;i<a;i++){ printf("Vetor p[%d]: %d\n", i, p[i]); /// ERA AQUI QUE ERA PARA MOSTRAR ZERO, SEGUNDO O TEACHER. } return 0; } OBS: Ele me disse que o free nao apaga, mas faz com que o ponteiro deixe de apontar para ele (a variavel que ele apontava).
  9. @AnsiC @woocsith Valeu pela ajuda. Muito obrigado....
  10. @AnsiC O unico problema que achei maior foi o return, pois ele esta retornando o vetor que nao estou usando. O return nao serviu para nada ai, ja que estou usando ponteiro.
  11. @AnsiC Mas o meu codigo fugiu do que foi pedido. Pois ora acho que esta certo , ora não. @woocsith Porque de usar o pre incremento, isso nao vai pular o indice 0.
  12. Olá pessoal, boa noite. Estou tendo dificuldade para resolver um exercicio de ponteiros aqui. na verdade, não estou conseguindo fazer com que retorne um vetor de inteiro. No caso iria retornar so a primeira posicao do vetor, pois para retornar ele inteiro acho que o return teria que esta dentro de um for (nao sei bem). Segue o codigo. /**1 1 )Escreva uma função que recebe uma string de caracteres e uma ltra e devolve um vetor de inteiros contendo asposições (índices no vetor dastring) onde a letra foi encontrada) e um inteiro contendo o tamanho do vetor criado (total de letras iguais encontradas). Utilize o retorno de um vetor para retornar os índices e um ponteiro para guardar o tamanho do vetor.*/ #include <stdio.h> #include <string.h> main (){ int tam, tamV, i, v[15]; char letra[2], str[15]; printf("Informe a string: "); scanf("%s", &str); printf("Informe a letra: "); scanf("%s", &letra); tam=strlen(str); int retorno( char *str, char *letra, int tam, int *tamV, int *v); //retorno(str, letra, tam, &tamV); retorno(str, letra, tam, &tamV, v); for(i=0;i<tamV;i++){ printf("Vetor [%d]: %d.\n", i, v[i]++); } printf("O tamanho do vetor criado e de %d posições.\n", tamV); } int retorno(char *str, char *letra, int tam, int *tamV, int *v){ int a=0, vet[a], i; for(i=0;i<tam;i++){ if(letra[0]==str[i]){ vet[a]=i; v[a]=i; a++; } } *tamV=a; return v[0]; } OBS : O EXERCICIO ESTA RODANDO TUDO CERTO, SO QUE NAO RETORNA UM VETOR COMO PEDE. MAS FUNCIONA ( ); Como conseguiria fazer ele retornar o vetor??. Adendo: No caso aí, eu cheguei a criar um vetor dentro da funcao, pois inicialmente pensei em retornar ele, mas se é retornar acho que tem que esta nao funcao principal (resolvir deixar ele ai). E no return, esta devolvendo somente a primeira posicao. Ai pensei em passar o endereco da primeira posicao e fazer rodar as posições seguintes no MAIN, so que nao da muito certo e so mostra o primeiro valor do vetor;
  13. Nao poderia usar o strcmp? Ou for , utilizando operador == ?
  14. @isrnick Conseguir encontrar o erro aqui. Era porque saque e des sao parametros do tipo float e estava declarado do tipo int, na ultima funcao.
  15. @isrnick Verdade, esqueci de atribuir o valor da operacao a algo. So uma coisa, pode usar float em struct (sei que sim), é porque quando uso nunca da certo. Nesse caso por exemplo, mesmo apos as mudancas nao aperece os resultados, acho que esta aperecendo lixo de memoria, numeros aleatorios. Em outro exercicio tive que mudar de float para int pois so assim que estava funcionando.
  16. Olá, boa noite. Estava a resolver um exercicio aqui que pedia para criarmos uma contas de banco, nela teriamos que permitir saque e retiradas. Conseguir fazer até certa parte, so que na parte que ira sacar ou depositar valores não da certo, parece que a operacao nao realiza. Segue o codigo. /*4. Escreva um programa que simule contas bancárias, com as seguintes especificações: • Ao iniciar o programa vamos criar contas bancárias para três clientes. o Cada conta terá o nome e o CPF do cliente associado a ela. o No ato da criação da conta o cliente precisará fazer um depósito inicial. • Após as contas serem criadas, o sistema deverá possibilitar realizações de saques ou depósitos nas contas. o Sempre que uma operação de saque ou depósito seja realizada, o sistema deverá imprimir o nome do titular e o saldo final da conta.*/ #include <stdio.h> struct conta{ char nome[15]; int cpf; float saldo; }banco; main (){ int pes, res;; struct conta banco[3]; void preencher(struct conta *banco); preencher(banco); printf("Deseja realizar um saque (1) ou deposito (2): "); scanf("%d", &res); if(res==1 || res == 2){ printf("Digite o CPF para a pesquisa: "); scanf("%d", &pes); } else{ printf("Bye!!!"); return 0; } void mexer(int pes, int res, struct conta *banco); mexer(pes, res, banco); } void preencher(struct conta *banco){ int i; for(i=0;i<3;i++){ printf("Informe o seu nome: "); scanf("%s%*c", &banco[i].nome); printf("Informe o seu CPF: "); scanf("%d%*c", &banco[i].cpf); printf("Entre com o seu saldo: "); scanf("%f%*c", &banco[i].saldo); printf("\n\n"); } } void mexer(int pes, int res, struct conta *banco){ int i, saque, dep, num; if(res==1){ printf("Informe o quanto sera retirado: "); scanf("%f", &saque); for(i=0;i<3;i++){ if(pes==banco[i].cpf){ banco[i].saldo - saque; num=i; } } } if (res==2){ printf("Informe o quanto sera depositado: "); scanf("%f", &dep); //for(i=0;i<3;i++){ for(i=0;i<3;i++){ if(pes==banco[i].cpf){ banco[i].saldo + dep; num=i; } } //} } printf("Nome: %s\n", banco[num].nome); printf("De CPF: %d\n", banco[num].cpf); printf("Seu novo saldo: %f",banco[num].saldo); }
  17. Entendi agora. No que eu tinha feito la em cima de exemplo de uma soma de numeros "infinitos" coloquei diretamente a media dentro do laço para que voce impresso em seguida da leitura. Ai no caso acima, atende melhor o exercicio pedia. GENIAL,
  18. Mas se esta acumulando, acredito que nao tenha como o numero ficar negativo. Não sei bem, mas acho isso meio estranho. Seria o caso realmente utilizar de algum caracter para sair do loop., como disso o @AnsiC .
  19. @isrnick Foi isso que eu pensei. é...... @AnsiC Mas na hora do for, ficaria como? Deixaria em branco na condicao de parada. Fiz um codigo a parte aqui usando while. Exemplo: #include <stdio.h> int main(void) { int num,i=1,j=0, soma=0; float media; while(i==1){ printf("Digite um numero: "); scanf("%d", &num); j++; soma=soma+num; media=soma/j; printf("\nA media e %f\n", media); } } (interessante a forma como voce ver o problema, no inicio em ate cheguei a pensar que estava faltando algo, pois como o prof vai verificar se o programa nunca acaba, ai fiz no vetor)
  20. @AnsiC Como assim limitar as entradas?
  21. @AnsiC Sim eu poderia ir lendo os valores e ja somando, para depois realizar a media. Evitaria realmente a criacao de mais variaveis. Muito inteligente e Muito bom. Obrigado. @isrnick Consegui aqui, ainda mantive a ordem, entretanto eu tive que colocar um valor para a variavel 'A' de inicio, mesmo que depois acaba sendo escrito outro valor por "cima" . Pois sem um valor de inicio nao rodava. (estranho, ja que a sua leitura era logo em seguida) Obs: Eu normalmente quando passo o vetor para uma funcao em faco da seguinte forma: void qualquerFuncao (int *vet); Interessante a forma como você passou. Muito legal.
  22. Hey, guys. Estava resolvendo o exercicio de media, simples. No entanto, a função criada esta lendo o dobro do que deveira. Segue o codigo. Obs: O erro, possivelmente, esta na funcao ja que a leitura se dar dentro dela. (acredito) /**17. Faça uma função que leia um número não determinado de valores positivos e retorna a média aritmética dos mesmos.*/ #include <stdio.h> main (){ int a; printf("Informe quantos numeros serao lidos: "); scanf("%d", &a); float media(int a); media(a); printf("A media da quantidade de numeros digitados e de %f.\n", media(a)); } float media (int a){ int i; float vet[a]; float q=0; for(i=0;i<a;i++){ do{ printf("Numero %d: ", i); scanf("%f", &vet[i]); }while(vet[i]<0); } for(i=0;i<a;i++){ q+=vet[i]; } return q/(a); } Agradecido por ajudar....
  23. Ah sim, verdade. Mudei meu codigo aqui. Valeu......
  24. @alecounter O que que voce mexeu, para me situar? Alem do : Sobre o ponteiro, eu ia utilizar ele, ai vi que nao era necessario e que tava esquentando cabeca à toa.

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!