-
Posts
176 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que UmPrograma postou
-
@AnsiC A struct que inicia o codigo e obrigatoria no exercicio bem como o retirar elemento. Em relação ao seu codigo, achei muita mais difícil. Nao sei se pelos nome que voce usou. e sobre o adicionar a lista, no caso seu já vem pronto. Eu queria que o usuario escrevesse seu numero. O que concertou no meu codigo? Realmente nao entendi sua funcao adicionar, e ele ainda é do tipo bool. Não sei o que é isso. Nao sei o que é isso de volatile. Porque?Porque? adicionado 12 minutos depois @Igor Vargas Realmente sua função inserir está muito mais fácil, até de entender. Aí no caso a variável valor iria passar para a lista e função a valor que foi digitado no main. Pois quero que o usuário digite o valor, e não já esteja pré-definido. Mas e o resto da função, tudo certo ou tem algum erro? Sobre a dica de desenhar, acho que vou segui-lá pois realmente não estou entendendo esse tanto de função para ler somente uma variável. adicionado 16 minutos depois /////////////////////////////////////////////////////////////////////////////////////////////// Uma coisa que realmente não entendo é isso de na hora de fazer o novo apontar para o proximo elemento da lista seguir o seguinte modelo: novo->prox = l ; Para mim parece que o "novo" está recebendo tudo o que tem no 'l' , e dessa forma parece que o "novo->info" perde o valor que eu coloquei. Não é intuitivo entender essa matéria.
-
@AnsiC Você conseguiu rodar e deu tudo certo? Na verdade peguei uns programas parecidos e tentei analisa-los e tentei fazer o meu, que nao funcionou direito, so que ainda nao entendo isso de uma estrutura cabeça e um monte de estruturas que fazem uso dela. (nao sei se da para entender, mas no codigo por exemplo a Lista l e a Lista novo vem da lista Lista, não consigo compreender muito bem isso.) Aqui no meu compilador nao deu para rodar nao, so no site https://repl.it/repls/BlueSilverShell . Ainda me perco com essas Listas, pois a Lista l parece ser mais importante por ser o nó, mas é na Lista novo que as informações estão e a nó parece que serve apenas para ligar. Nao sei..... Aí funcionou??? adicionado 17 minutos depois Tem uma funcao que um monte de codigo usa que e a seguinte. int vazia(Lista *node){ if(node->prox==NULL){ return 1; } else return 0; } Tentei substituui-la pelo if (l!=NULL), nao sei se e a mesma coisa. Julguei ser esse o motivo do meu problema de o codigo nao rodar. To muito perdido.
-
Uai porque nao estou conseguindo fazer o programa rodar no code blocks, parece esta demorando mais do que o necessario (demorando como nas funcoes recursivas kkkk), mas no site Repl.it esta funcionando o código. Se alguem puder me dar uma luz. (E uma leve explicacao. Esse conteudo confunde muito.)
-
Olá, boa tarde pessoal. Estava tentando resolver um exercício em de lista encadeada aqui, mas estou com muita duvida ainda. Principalmente que parece para a resolução dão problema a gente deve ir criando varias outras struct's. No exercício proposto pelo professor ele pede que seja retirado o ultimo elemento da lista. No entanto não estou conseguindo resolver o problema. (Estou buscando ajuda em um livro que tenho aqui( de Waldemar Celes, introdução a estrutura de dados) e pela própria Internet. Mas confesso que esta muita difícil assimilar algo.) Caso possam, olhem o o meu código. #include <stdio.h> #include <stdlib.h> /// o l é o nó, que liga as cadeias. struct lista{ int info; struct lista* prox; }; typedef struct lista Lista; void inserir(Lista *l){ Lista* novo= (Lista*)malloc(sizeof(Lista)); if(!novo){ printf("SEM MEMORIA!\n"); exit(1); } printf("\nInforme um valor: "); scanf("%d", &novo->info); if(l!=NULL){ l->prox=novo; } else{ Lista *aux = l-> prox; while(aux->prox!= NULL){ aux=aux->prox; } aux->prox=novo; } } Lista *retira_ultimo(Lista *l){ if(l!=NULL){ printf("Lista vazia.\n"); return NULL; } else{ Lista *ultimo = l->prox, *penultimo = l->prox; while(ultimo->prox!=NULL){ penultimo=ultimo; ultimo=ultimo->prox; } penultimo->prox=NULL; return ultimo; } } main(){ int op=1; Lista *l= (Lista*)malloc(sizeof(Lista)); l ->prox = NULL; Lista* novo= (Lista*)malloc(sizeof(Lista)); inserir(l); while(op==1){ printf("Inserir novo elemento: 1 <sim> outro valor <nao> : ");scanf("%d", &op); if (op==1) inserir(l); } retira_ultimo(l); printf("\n\nA lista depois de retirar o ultimo numero digitado e o seguinte.\n\n"); if(l!=NULL){ printf("Lista vazia.\n"); } Lista *aux = l->prox; while(aux!=NULL){ printf("%d\n", aux->info); aux=aux->prox; } return 0; } Tenho muita dificuldade na estrutura "cabeça" e na necessidade de se criar um monte de struct a partir dela.
-
@AnsiC Entao nao precisa se o codifo todo de forma recursiva nao né? Essa é a minha maior dificuldade. Fiz a funcao da seguinte forma: return vet[n-1]/(float)j + media(vet, n-1,j); adicionado 14 minutos depois @AnsiC Não sei porque, mas nao estou conseguindo fazer o somatório dos valores do vetor. Da seguinte forma esta muito errado? (depois disso eu dividiria a soma pela quantidade de números) somar=somar+media(j,vet[j+1], n); Tem alguma aritmetica de ponteiros? Pois quando tento fazer dentro da recursao mostra erro o tempo todo. Aí estou tentando somar os valores pelo indice, mas nao esta dando certo.
-
@AnsiC Na verdade eu queria somar tudo primeiro e depois dividir pela quantidade. Mas nao estava dando certo. Queria que ficasse igual ao codigo comentado. Ai decidir dividir cada termo e depois somar, mas nem assim deu certo.
-
Olá, bom dia. Poderiam dá uma olhada no meu código de um exercício que calcule a media. Eu normalmente tento fazer com uma função normal, e depois passar para a função recursiva, mas não estou conseguindo essa ultima etapa. Segue o codigo: /*46) Faça uma função recursiva que permita calcular a média um vetor de tamanho N.*/ #include <stdio.h> #include <stdlib.h> #include <locale.h> int entrada(int *vet, int n); void imprimir(int *vet, int n); float media(int *vet, int n,int ); main(){ int *vet, n, j=0; float md; setlocale(LC_ALL, "Portuguese"); printf("Informe o tamanho do vetor: "); scanf("%d", &n); vet = (int *)malloc(n*sizeof(int)); if(!vet){ printf("Problemas com a alocação de memória.\n"); exit(1); } entrada(vet, n); imprimir(vet,n); md=media(vet, n, j); printf("\n\nA media do vetor e de %f.", md); } int entrada(int *vet, int n){ int i; printf("Entre com os valores do vetor.\n"); for(i=0;i<n;i++){ printf("Vetor [%d]: ", i); scanf("%d", &vet[i]); } } void imprimir(int *vet, int n){ printf("\n\nO vetor é o seguinte.\n"); int i; for(i=0;i<n;i++){ printf("Vetor [%d]: %d.\n", i, vet[i]); } } float media(int *vet, int n , int j){ float somar=0, i=0; /*for(i=0;i<n;i++){ somar += (*vet)++; } somar=somar/n; return somar;*/ if(n==1){ return vet[0]/n; } else{ return (media(vet, n-1,j+1)+vet[j]/n); } } adicionado 22 minutos depois Consegui.... ...
-
C Interpretando o enunciado de um problema. Recursão.
UmPrograma respondeu ao tópico de UmPrograma em C/C#/C++
@AnsiC Para ter um subconjundo nao deveria ter dois vetor, e um esta "dentro" do outro.? adicionado 4 minutos depois Alias, isso de conjunto potencia, nao entendi bem.... -
C Interpretando o enunciado de um problema. Recursão.
UmPrograma respondeu ao tópico de UmPrograma em C/C#/C++
@Foxwalt Não quero a resposta pronta nao amigo. Entendo sim que a pessoas que fazem/pedem isso aqui, o que quero é que alguem me clarei o que o exercicio quer exatamente. Num sei se é para criar varias variaveis e elevalas ao mesmo expoente. -
Boa tarde, como vão? Estou a resolver um exercício de recursividade. Ainda encontro dificuldades com funções recursivas, mas estamos indo. Nesse exercício em específico não consegui entender o que estava sendo pedido. Segue o enunciado: Escreva um algoritmo recursivo capaz de gerar todos os elementos do conjunto potência dado um conjunto formado por letras. PARA FICAR CLARO! NÃO PRECISO QUE RESOLVAM PARA MIM, APENAS ME DIGAM O QUE O EXERCICIO QUER EXATAMENTE. De primeira achei que era para criar varias variaveis e elevalas ao mesmo expoente, mas acho que nao seria isso. Sobre elavar ao expoente usando recursao eu ja fiz, mas esse exercicio nao ficou claro exatamente o que ele esta querendo. (Professor nao soube me explicar)
-
Nessa parte , o vetor 3 será preenchido depois ja esta ter sido totalmente preenchido com o vetor 1. Ai o i1 tem o valor do vetor 1, e na hora de preenchar o vetor 3 comecar daí em diante. É isso? (O meu tava bem diferente, hein!?!, Ia da certo nunca (talvez desse). Estava tentando seguir a mesma logica de quando é sem recursão) Valeu!
-
@AnsiCSim, é isso. Acho que seria juntar os dois vetore em um só, que no caso seria o vetor 3. E no exercicio pede para desconsiderar a existencia de numeros reperidos no vetor. Que facilita a vida. Mas estou tendo problemas de lixo de memoria em algumas posições.
-
Olá, bom dia. Estava a resolver um exercicio proposto pelo professor (na verdade como comecamos a materia agora ele iria resolver para nos ensinar, so que ele nao conseguiu encontrar o erro que tinha no seu codigo, aliás nem rodou). Pois bem, eu tentei resolver o problema da mesma forma que resolveria se nao pedisse recursividade, a diferença seria que no caso teria dois if, porém nao da certo quando faco dessa forma. Entao, tentei fazer num if apenas, porém está apresentando problemas na hora de unir os vetores. Não sei bem o que esta acontecendo, sei que algumas posições do vetor é preenchido por lixo na memoria. (Se puderem me ajudar no que eu coloco no primeiro if , agradeceria. Fico na dúvida no que ponho pois sem recursividade não precisamos testar nada) Segue o código: #include <stdio.h> #include <stdlib.h> int unir(int *vet1, int *vet2, int *vet3, int tam1, int tam2, int l, int m); main(){ int tam1, tam2, i; printf("Qual o tamanho do vetor 1: ");scanf("%d", &tam1); printf("Qual o tamanho do vetor 2: ");scanf("%d", &tam2); int *vet1, *vet2, *vet3; vet1 = (int *) malloc(tam1*sizeof(int *)); vet2 = (int *) malloc(tam2*sizeof(int *)); vet3 = (int *) malloc((tam1+tam2) * sizeof(int *)); printf("\nPrencha agora o vetor 1.\n"); for(i=0;i<tam1;i++){ printf("Vetor [%d]: ",i); scanf("%d", &vet1[i]); } printf("\nPrencha agora o vetor 2.\n"); for(i=0;i<tam2;i++){ printf("Vetor [%d]: ",i); scanf("%d", &vet2[i]); } int l,m; l=0,m=tam1-1; unir(vet1, vet2, vet3, tam1-1, tam2-1, l,m); printf("\nAgora serao impressos o vetor 3.\n"); for(i=0;i<tam2+tam1;i++){ printf("Vetor [%d]: %d.\n",i,vet3[i]); } } int unir(int *vet1, int *vet2, int *vet3, int tam1, int tam2, int l, int m){ int i, a=tam2, b=tam1, j=0; if(i==0){ /// O QUE EU PONHO AQUI?????, coloquei i == 0, pois sei que é falso. Pelo menos assim esta rodando, o que /// nao acontece se eu colocasse tam1==0 && tam2==0. } /*else if(tam1>0){ vet3[l]=vet1[l]; //vet3[tam2]=vet2[tam2]; vet3[m]=vet2[l]; return unir(vet1, vet2, vet3, tam1, tam2, l+1, m+1); /// A um erro Aqui }*/ else if(tam1!=0){ vet3[l] = vet1[l]; vet3[m] = vet2[l]; unir(vet1, vet2, vet3, tam1, tam2, l+1, m+1); } }
-
@isrnick Isso é para o lixo de memoria?
-
@isrnick Foi isso que achei massa da funcao, é que de inicio me perdi um pouco. Agora colocando para rodar o programa , nao rodou não. Mas de qualquer forma, obrigado a todos aí.....
-
Para mim era mais intuitivo trabalhar usando ponteiro para ponteiro pois estavos fazendo algo similar (ponteiro para inteiro) no vetor. @AnsiC Por isso que não estava entendendo o link que voce enviou, pois lá, se me recordo, não falava sobre criar dinamicamente diretamente. Fora nas pesquisas que fiz encontrei somente usando de ponteiro para ponteiro. Sobre a funcao libera eu cheguei a modificar o meu aqui. Colocando num for, so que parece que liberaria so a segunda dimensao, baseando no codigo do @giu_d @isrnick Nome de funcao estranha, ainda mais com esses paranteses separando ele do seu tipo. Parece uma matriz, ainda mais com esses colchetes no final. E aqui embaixo voce não colocou o igual lá em cima (sem o * e o parenteses). São tantas nuances. MAS LEGAL SABER DESSA POSSIBILIDADE.
-
C Programa que multiplica a potência de uma matriz em C
UmPrograma respondeu ao tópico de Darlan.007 em C/C#/C++
@devair1010 Quando se eleva uma matriz a pontecia nao seria multiplicar ela por ela mesma ate a pontencia desejada? -
@iHollyZinhO Nunca precisei usar a tabela Ascii, mas me tira uma dúvida. Quando a usamos precisamos declarar uma biblioteca ou bastaria apenas somar os valores como voce fez ai .(claro, tendo o conhecimento da mesma)?
-
C Faça um programa que leia 2 valores...
UmPrograma respondeu ao tópico de Lucas Tezolini Herler em C/C#/C++
@Lucas Tezolini Herler Boa tarde. Pois bem, para resolver o problema bastaria uma funcao. Nessa única funcao voce vai passar as variaveis a e b por referencia, ou seja, usando o &. Dentro da funcao foi cria uma variavel temporia e pronto. main(){ int a,b; .... /// Desenvolve o seu codigo aqui, lendo as variaveis void troca(int *a, int *b); troca(&a,&b); } void troca(int *a, int *b){ int tem; tem= *b; *b=*a; *a=tem; } -
@AnsiC Acho que entendi. No caso um ponteiro aponta apenas para o primeiro elemento da matriz, ai teria que faze-lo apontar para a matriz inteira. * (* (arr + i) + j) = e a funcao malloc......ou calloc... adicionado 6 minutos depois Entao eu estava alocando parte a parte, e não diretamente.
-
@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.
-
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); }
-
C Criar vetor dinamicamente, Liberar. Tudo em funções.
UmPrograma respondeu ao tópico de UmPrograma em C/C#/C++
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 . -
C Criar vetor dinamicamente, Liberar. Tudo em funções.
UmPrograma respondeu ao tópico de UmPrograma em C/C#/C++
@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) -
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.
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