Ir para conteúdo
Dougg_Ghost

Ajuda em Ponteiros e funções

Recommended Posts

Basicamente, tenho esse exercício (que foi passado em duas provas de C na faculdade), e nas duas acabei deixando em branco por não ter ideia de como fazer (nem como começar), não queria pedir resolução, mas sim explicação e se possível uma ajuda com código.
Realmente não tenho ideia do que fazer por isso não coloquei meu código.

Segue enunciado:

Escreva uma função remove_dup(floatv[],int n) que receba o vetor e verifique a existência de elementos duplicados. Caso não existam elementos duplicados retorne 0. Caso existam, remova estes elementos (deixando apenas um) e retorne o número de elementos removidos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

os parametros da função são o vetor e o numero de elementos nele.

dentro da função vc percorre o vetor olhando de repete algum. Se não repetir nenhum retorna 0, se repetir é meio complicado, mas vc desenrola um algoritmo para "remover" os repetidos. consegue fazer?

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

explica uma coisa, suponhamos o seguinte vetor:

1 | 2 | 2 | 3 | 4

 

a função vai mexer nesse segundo dois. Mas é para o vetor ficar assim:

 

1 | 2 | | 3 | 4

 

ou assim?

 

1 | 2 | 3 | 4

 

se sua duvida for na hora da passar o vetor, na hora de chamar a função:

 

funcaoRomover(nomeDoVetor, tamanhoDoVetor); "o nome do vetor é sem colchete mesmo"

 

dentro da função você trabalha normal com o vetor como trabalharia dentro da main

Compartilhar este post


Link para o post
Compartilhar em outros sites

explica uma coisa, suponhamos o seguinte vetor:

1 | 2 | 2 | 3 | 4

 

a função vai mexer nesse segundo dois. Mas é para o vetor ficar assim:

 

1 | 2 | | 3 | 4

 

ou assim?

 

1 | 2 | 3 | 4

 

se sua duvida for na hora da passar o vetor, na hora de chamar a função:

 

funcaoRomover(nomeDoVetor, tamanhoDoVetor); "o nome do vetor é sem colchete mesmo"

 

dentro da função você trabalha normal com o vetor como trabalharia dentro da main

 

Então, se eu entendi bem, a função ficaria 1|2|3|4.

Sou iniciante em ponteiro e.e, por isso to com tantas dúvidas

Compartilhar este post


Link para o post
Compartilhar em outros sites
remover(int vet[], int n)
{
    int i, j;
    for(i=1; i<n; i++)
    {
        for(j=0; j<i; j++)
        {

            if(vet[i]==vet[j])
            {
                vet[i]=-1;
            }
        }
    }

}

olha, essa função coloca o valor -1 no lugar dos repetidos, foi o que eu consegui pensar, mas se vc quiser "espremer" os valores, tenta fazer uma que percorra o vetor e quando encontrar -1, substitua o valor pelo proximo numero

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
remover(int vet[], int n)
{
    int i, j;
    for(i=1; i<n; i++)
    {
        for(j=0; j<i; j++)
        {

            if(vet[i]==vet[j])
            {
                vet[i]=-1;
            }
        }
    }

}

olha, essa função coloca o valor -1 no lugar dos repetidos, foi o que eu consegui pensar, mas se você quiser "espremer" os valores, tenta fazer uma que percorra o vetor e quando encontrar -1, substitua o valor pelo proximo numero

 

Cara, muito obrigado mesmo!! :D

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 28/06/2016 at 13:23, agness disse:

olha, essa função coloca o valor -1 no lugar dos repetidos, foi o que eu consegui pensar, mas se você quiser "espremer" os valores, tenta fazer uma que percorra o vetor e quando encontrar -1, substitua o valor pelo proximo numero

Apenas colocar o valor -1 no lugar dos elementos duplicados não resolve o problema pois esses elementos continuarão existindo lá no vetor sem ser removidos e seu valor somente será alterado para outro.

Você deve pegar os elementos duplicados do vetor e arrastar para o lugar deles os não duplicados, substituindo-os e ao mesmo tempo incrementar um contador de elementos substituídos para depois retornar esse contador que automaticamente já irá ser 0 caso não exista algum número que esteja duplicado: 

 

int remove_dup(float v[], int n);

void arrasta_proximos(float v[], int n, int posicao);

int main(){
  int i,conta_removidos;
  float vetor_de_floats[10];
  vetor_de_floats[0]=2;
  vetor_de_floats[1]=2;
  vetor_de_floats[2]=4;
  vetor_de_floats[3]=5;
  vetor_de_floats[4]=6;
  vetor_de_floats[5]=6;
  vetor_de_floats[6]=8;
  vetor_de_floats[7]=9;	
  vetor_de_floats[8]=10;
  vetor_de_floats[9]=11;
  printf("Vetor com valores duplicados:");
  for(i=0;i<10;i++)
    printf("%f\n",vetor_de_floats[i]);
  conta_removidos=remove_dup(vetor_de_floats,9);
  printf("\nVetor apos a remocao dos duplicados:");
  for(i=0;i<(10-conta_removidos);i++)
    printf("%f\n",vetor_de_floats[i]);
  printf("\nO numero de elementos duplicados e: %d",conta_removidos);
  system("pause");    
}

int remove_dup(float v[], int n){
  int i,j,conta_dup=0;
  for(i=0;i<n;i++)
    for(j=i+1;j<=n;j++)
      if (v[i]==v[j]){
        conta_dup++;        
        arrasta_proximos(v, n, i);        
        n--;        
      } 
  return conta_dup;
}
  //Vai arrastar os proximos elementos do vetor uma posicao atras no lugar do que esta sendo removido
void arrasta_proximos(float v[], int n, int posicao){
  int i,j;
  float temp;  
  i=posicao;
    for(j=posicao+1;j<n;j++){      
      v[i]=v[j];      
      v[j]=v[j+1];
      i++;
  }
  if(j==n){
    v[i]=v[j];
  }
}
 
Editado por Wilkyn Fernandes Taborda
Apenas agora noto que há a opção para inserir códigos-fonte de computadores diferente de texto comum.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por janir.matheus
      Bom dia, não tenho muita prática com JavaScript (tive contato apenas durante um período no CEDERJ). Ocorre que agora preciso do bendito, e não estou conseguindo sair de uma situação. Vou postar o código:
      <script language="JavaScript"> coordenadas = ""; //Defini essa variável segundo meus conhecimentos, por ter omitido a palavra 'var' ela é global function sucesso(posicao) { coordenadas = posicao.coords.latitude; //document.write(coordenadas); //Aqui dentro ela escreve o valor da latitude } if('geolocation' in navigator) { navigator.geolocation.getCurrentPosition(sucesso); } else { alert("Navegador incompatível com esse recurso"); } document.write(coordenadas); //Aqui eu NÃO consigo pegar o valor </script> Basicamente eu quero salvar os valores de Latitude, Longitude e Timestamp em variáveis para poder usa-las posteriormente. Conto com a vossa ajuda. 
      Obrigado.
    • Por Millena Oliveira
      Oiii gente, boa noite. Estou estudando ainda e me deram um desafio para desenvolver um programa que imprimisse na tela somente os números primos segundo o valor que o usuário colocasse na execução. Utilizei o readLine para isso. Usei um objeto para que repetisse a execução e salvei todos os números numa array. O problema é, quando faço o teste colocando um número qualquer, retorna uma array vazia. Poderia me dar uma ajuda? Segue abaixo todo o código.
      Obrigada :)
       
      var readline = require("readline"); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); function desafioPrimos() { var primos = []; rl.question("Digite um número: ", function (num) { console.log(primos); numero = parseInt(num); numerosPrimos: for (var x = 2; x <= num; x++) { for (var y = 2; y < x; y++) { if (x % y === 0) continue numerosPrimos; }; primos.push(x); rl.close(); }; }); }; desafioPrimos();  
    • Por jeredy
      Tenho um trabalho da faculdade e não consigo fazer rodar o programa corretamente.
      Quando eu coloco o cpf, na hora de imprimir sai um número aleatório. Creio que possa ser por falta de memória pois se coloco um número menor ele sai certo, porém não consigo adicionar memória em cpf.
       
      Obs: ainda não fiz a parte dos menores e da medial do grupo e a parte de imprimir em tabela pois não consegui fazer funcionar nem um básico mas se alguém souber essa parte também e puder me ajudar agradeço!!
       
      #include <stdio.h> #include <stdlib.h> main(){ struct funcionarios{ int *cpf; char nome[30]; int nascimento; float salario; }; int aux=0; //para testar se for 0 antes de armazenar o cpf struct funcionarios *func; int qtdLeitura=0, i=0, cont=0; func = ((struct funcionarios *) (malloc(sizeof(struct funcionarios) * 1))); while(1){ printf("Digite o cpf %d: ", i+1); scanf("%d", &aux); if(aux!= 0){ func.cpf = aux; fflush(stdin); } else{ break; } if(func != NULL){ qtdLeitura++; func = ((struct funcionarios *) realloc(func, sizeof(struct funcionarios) *(qtdLeitura+1))); } printf("Digite o nome %d: ", i+1); scanf("%s", func.nome); printf("Digite o nascimento %d: ",i+1); scanf("%d", &func.nascimento); printf("Digite o salario %d: ",i+1); scanf("%f", &func.salario); cont++; i++; } printf("\n\n"); for(i=0;i<cont;i++){ printf("Cpf %d:%d \n",i+1, func.cpf); printf("Nome %d: %s\n",i+1, func.nome); printf("Nascimento %d: %d\n",i+1, func.nascimento); printf("Salario %d: %.2f\n",i+1, func.salario); } }
       

    • Por reberthkss
      Bom dia!
       
      Eu tenho um programa escrito em C e nele estou utilizando funções, e para ter boa prática, eu quero separar as funções do programa principal.
      Então to querendo criar uma header e outro arquivo .c para colocar as funções. Ai eu fico com:
       
      Arquivo .h "Funcoes.h"; Arquivo .c "Funcoes.c" Arquivo .c "main.c"  
      Eu tentei fazer o esquema acima, mas quando compilo o arquivo main.c o compilador me retorna um erro (Anexo I);
       
       

      Na minha opinião era pra dar certo, pois fiz igual um exemplo que eu tenho aqui (o exemplo tá em c++)...
       
      o que eu to deixando passar pra não ter dado certo?
      // FUNCOES.H #pragma once #include <stdio.h> #include <math.h> extern int assentoC[23]; extern int assentoJ[23]; extern float valort; void limpavetor(int *v1,int*v2); //FUNCOES.C #include "funcoes.h" void limparvetor(int *v1,int *v2){ int i; for(i=0;i<23;i++){ *(v1+i)=0; *(v2+i)=0; } } //MAIN.C #include<stdio.h> #include<math.h> #include <string.h> #include "funcoes.h" int assentoC[23]; int assentoJ[23]; float valort=0; char* verStatusAss(int *assento) {if(*assento>0) return "OCUPADO"; else return "DISPONIVEL"; } void comprar() { int i; int opt=0; int qt=0; int ass[23]; int confirma=0; int menu=0; int contDJ=1; int contDC=1; int destino=0; int cont=0; float valor1=28.0,valor2=159.0,valor3=188.0; printf("\t\t MENU\n"); printf("Destino: [1] Sao Paulo [2] Curitiba [3] Florianopolis: "); scanf("%i",&destino); printf("\n"); printf("voce quer comprar assentos em/ou: \n\n"); for(i=0;i<23;i++){ if(assentoC[i]==0){ contDC=0; } } for(i=0;i<23;i++){ if(assentoJ[i]==0){ contDJ=0; } } printf("ASSENTO DISPONIVEIS EM\n"); if(contDJ==0) printf("\n1 - Janela\n\n"); if(contDC==0) printf("2 - Corredor\n"); printf("\n\n\n3 - Voltar para menu principal\n"); scanf("%i",&opt); switch(opt){ case 1: printf("[JANELA] Quantos assentos?:"); scanf("%i",&qt); printf("\n"); printf("[JANELA] Qual/Quais assento?: "); for(i=0;i<qt;i++){ cont=0; while(cont<1){ printf("[JANELA] Bilhete: %i. Assento: ",i+1); scanf("%i",&ass[i]); printf("\n"); if(assentoJ[ass[i]]!=0){ printf("Assento OCUPADO. Escolha outro assento! "); }else { cont++; } } } printf("\t\t RESUMO\n"); printf("Posicao: JANELA \n"); for(i=0;i<qt;i++){ printf("Bilhete: %i.\t Assento: %i\n",i+1,ass[i]); } printf("CONFIRMA?? "); printf("[1] SIM [0] NAO:"); scanf("%i",&confirma); if(confirma!=0){ for(i=0;i<qt;i++) { assentoJ[ass[i]]=1; switch(destino) { case 1: valort=valort+(qt*valor1); break; case 2: valort=valort+(qt*valor2); break; case 3: valort=valort+(qt*valor3); break; } } } else { printf("VENDA NAO EFETUADA! VOLTANDO AO MENU PRINCIPAL..."); } break; case 2: printf("[CORREDOR] Quantos assentos?:"); scanf("%i",&qt); printf("\n"); printf("[CORREDOR] Qual/Quais assento?: "); for(i=0;i<qt;i++){ printf("[CORREDOR] Bilhete: %i. Assento: ",i+1); scanf("%i",&ass[i]); printf("\n"); } printf("\t\t RESUMO\n"); printf("Posicao: CORREDOR \n"); for(i=0;i<qt;i++){ printf("Bilhete: %i.\t Assento: %i\n",i+1,ass[i]); } printf("CONFIRMA?? "); printf("[1] SIM [0] NAO:"); scanf("%i",&confirma); if(confirma!=0){ for(i=0;i<qt;i++) { assentoJ[ass[i]]=1; } } else { printf("VENDA NAO EFETUADA! VOLTANDO AO MENU PRINCIPAL..."); } break; case 3: break; } } int menuprincipal() { int opt=0; printf("\t\t MENU PRINCIPAL\n\n"); printf("\t\t 1 - COMPRAR ASSENTO\n"); printf("\t\t 2 - VERIFICAR ASSENTOS\n"); printf("\t\t 3 - VER MAPA DO TRAJETO\n"); printf("\t\t 4 - VER LUCRO\n"); printf("\t\t 5 - SAIR\n"); printf("\t\t Digite uma opcao: "); scanf("%i",&opt); return opt; } int menusecundario() { int opt=0; printf("1 - COMPRAR ASSENTO // "); printf("2 - VERIFICAR ASSENTOS \n"); printf("3 - VER MAPA DO TRAJETO // "); printf("4 - VER LUCRO // "); printf("5 - VOLTAR PARA MENU PRINCIPAL\n"); printf("6 - SAIR \n"); printf("Digite uma opcao: "); scanf("%i",&opt); return opt; } void verAss() { int i; int opt=0; printf("\t\t MENU\n"); printf("voce quer ver assentos em/ou: \n"); printf("1 - Janela\n"); printf("2 - Corredor\n"); printf("3 - Todos\n"); printf("Digite uma opcao: "); scanf("%i",&opt); printf("\n"); for(i=0;i<23;i++) { switch(opt){ case 1: printf("[JANELA] Assento %i. STATUS: %s \n",i, verStatusAss(&assentoJ[i])); break; case 2: printf("[CORREDOR] Assento %i. STATUS: %s \n",i,verStatusAss(&assentoC[i])); break; case 3: printf("[JANELA] Assento %i. STATUS: %s \t [CORREDOR] Assento %i. STATUS: %s\n",i,verStatusAss(&assentoJ[i]),i,verStatusAss(&assentoC[i])); break; } } } int voltarMenuP(int *menu) { int menu2; printf("APERTE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL"); scanf("%i",&menu2); if(menu2!=0) *menu=1; return menu; } int acao(int opt,int * gameover) { int menu=0; while(!menu){ switch(opt){ case 1: comprar(); voltarMenuP(&menu); break; // VERIFICAR ASSENTOS case 2: verAss(); voltarMenuP(&menu); break; // verMap() case 3: printf("\t\t\MAPA\n"); printf("SJC\t->\t Sao Paulo\t->\t Curitiba\t->\t Florianopolis\n"); voltarMenuP(&menu); break; // verLuc() case 4: printf("Valor total: %.2f\n",valort); voltarMenuP(&menu); break; // exit() case 5: *gameover=1; return *gameover; break; } } } int main(){ int gameover=0; int opt; int i=0; limparvetor(&assentoC,&assentoJ); while(!gameover){ // MENU PRINCIPAL // -- func menuprincipal() acao(opt=menuprincipal(),&gameover); } return 0; }  
    • Por edvaldo joviano de paula
      Prezados, boa tarde!
      Preciso de uma ajuda sendo possível:
       
      Tenho o seguinte cenário em uma consulta ( formação de kits de produtos tendo como produto principal um valor igual, ex: produto 1 é formado pelos produtos 2 e 3)
      select codkit, produtos from kit where codkit = 1
      ---   ----
      1    2
      1    3
      Percebem que o resultado traz o codigo do kit (1) e os produtos que compoem este kit (2,3), porem o produto 2 tambem faz parte do kit 4 junto com o produto 10 e produto 3 faz parte do kit 5 junto com o produto 11 sendo:
      kit 1 (2,3)
      kit 4 (2,10)
      kit 5 (3,11).
       
      Eu preciso de uma ajuda sobre alguma função que ao comprar os produtos 2 e 3 e estes estando na mesma nota fiscal (select produtos from notafiscal = x) traga o resultado do kit que estes dois produtos juntos formam, exemplo, ao pesquisar (select produtos from notafiscal = x) nesta nota existir os produtos 2 e 3 traga o resultado 1, se na nota existir os produtos 2 e 10 traga o resultado 4 e se existir na consulta dos itens da nota os itens 3 e 11 o resultado seja 5. Caso na pesquisa eventualmente existir por exemplo 10 unidades do item 2, 5 unidades do item 3 e 5 unidades do item 10, o resultado deve ser 1 e 4 pois 5 unidades do 2+5 unidades do 3 forma o kit 1 e 5 unidades do 2+ 5 unidades do 10 formam o kit 4.
       
      Espero ter explicado de forma a ser entendido e agradeço a ajuda.
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.