Ir ao conteúdo
  • Cadastre-se

C função com vetores e ponteiros.


felipe0706

Posts recomendados

Boa tarde, estou tentando fazer a seguinte questão de uma lista da faculdade mas estou tropeçando em algum dos laços for(acredito que no da função) aonde teria que copiar os valores do primeiro vetor invertido para o segundo, está anexado o print do programa no compilador e o teste dele aonde aparece os endereços de memoria quando tento printar os vetores, enfim segue abaixo a questão completa, agradeço desde já a atenção:

 

5. Crie um programa para manipular vetores. O seu programa deve implementar uma função chamada inverte_vetor, que recebe como parâmetro dois vetores V1 e V2, ambos de tamanho N. A função deve copiar os elementos de V1 para V2 na ordem inversa. Ou seja, se a função receber V1 = {1,2,3,4,5}, a função deve copiar os elementos para V2 na seguinte ordem: V2 = {5,4,3,2,1}. Além disso, a função também deve retornar o maior valor encontrado em V1. A função deve obedecer ao seguinte protótipo:

int inverte_vetor(int *v1, int *v2, int n);

 

 

++.PNG

ex.PNG

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

27 minutos atrás, felipe0706 disse:

for(i=0;i<n;i++){
        printf("elemento na posicao %d: ", i+1);
        scanf("%d", &v1);
    }

O vetor `v1` está sendo inicializado de maneira errada, somente o primeiro elemento recebe valor. O certo seria:

for (i = 0; i < n ;i++) {
	printf("elemento na posicao %d: ", i);
	scanf("%d", &v1[i]);
}

 

27 minutos atrás, felipe0706 disse:

for(i=0;i<n;i++){

    if(v1>maior){
     maior=v1;
    }

Nesta parte também há problemas com os índices do vetor.

for(i = 0; i < n; i++){
	if (v1[i] > maior)
		maior = v1;
}

 

27 minutos atrás, felipe0706 disse:

 for(i=n;i>0;i--){

    v2=v1
    }

O mesmo acontece na troca dos índices do vetor

int j;
for(i = 0, j = n - 1; i < n; i++, j--){
	v2[i] = v1[j];
}

Não entendi a necessidade da inclusão da biblioteca conio, já que esta é obsoleta e não faz parte das bibliotecas padronizadas do C.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Davi Silva Santos da uma olhada no print do código fazendo favor, pois ali aonde colei o programa feito de fato não colou os indices junto , vou tenta ajeitar isso ali e em relação à bi biblioteca conio.h eu achava que era pra usar o getch, por padrão na minha faculdade desde o inicio adicionamos essas duas bibliotecas. mas obrigado pela informação, de repente nao precisa das duas... 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Para postar Código de Programação no fórum use o botão < > (Code) localizado na barra de ferramentas no topo do campo onde você digita a resposta, assim evita que o fórum faça alterações nele como aconteceu com seu código (para o fórum [ i ] sem espaços é a tag para deixar o texto em itálico).

  • Curtir 3
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

12 minutos atrás, felipe0706 disse:

@Davi Silva Santos da uma olhada no print do código fazendo favor, pois ali aonde colei o programa feito de fato não colou os indices junto , vou tenta ajeitar isso ali e em relação à bi biblioteca conio.h eu achava que era pra usar o getch, por padrão na minha faculdade desde o inicio adicionamos essas duas bibliotecas. mas obrigado pela informação, de repente nao precisa das duas... 

As correções continuam válidas, a confusão que aconteceu foi com os índices dos vetores.

Link para o comentário
Compartilhar em outros sites

#include<conio.h>

int inverte_vetor(int *v1, int *v2, int n);

main(){
	int n;
	
	printf("tamanho do vetor: ");
	scanf("%d", &n);
	int i, v1[n], v2[n], maior;
	
	for(i=0;i<n;i++){
		
		printf("elemento na posicao %d: ", i+1);
		scanf("%d", &v1[i]);
	
		
	}
	
	maior=inverte_vetor(v1, v2, n);
	printf("vetor 1: %d\nvetor 2: %d ", *v1, *v2);
	printf("\nmaior numero do vetor: %d ", maior);
	getch();
}
int inverte_vetor(int *v1, int *v2, int n){
	
	int i ,maior=v1[0];
	
	
	for(i=0;i<n;i++){

	if(v1[i]>maior){
	 maior=v1[i];
	}
		
	}
	int j;
	for(i=0,j=n;i<n,j>0;i++,j--){

	v2[i]=v1[j];
    
   
	
	}
	
	return maior;
	
	
}

fiz as seguintes alterações , o maior numero deu certo somente na hora de imprimir o vetor não esta dando certo. segue a imagem da execução. 

++.PNG

adicionado 34 minutos depois

@Davi Silva Santos

Link para o comentário
Compartilhar em outros sites

@felipe0706 Olá. Fiz o exercício d uma forma um pouco diferente da sugestão dada pelo @Davi Silva Santos

Dá uma olhada para ver se é isso q você quer:

 

#include <stdio.h>

int inverte_vetor(int *v1, int *v2, int n);
void limpa_linha();

void limpa_linha() {

    scanf("%*[^\n]");
    scanf("%*c");
}


int main() {

    int n, i, maior;

    printf("tamanho do vetor: ");
    scanf("%d", &n);
    limpa_linha();

    int v1[n];
    int v2[n];

    for (i = 0; i < n; i++) {
        printf("elemento na posicao %d: ", i + 1);
        scanf("%d", &v1[i]);
        limpa_linha();
    }

    // imprime os valores de v1
    printf("\nVetor 1:\n\n");
    for (i = 0; i < n; i++) {
        printf("%d ", v1[i]);
    }

    maior = inverte_vetor(v1, v2, n);

    // imprime os valores de v2
    printf("\n\nVetor 2:\n\n");
    for (i = 0; i < n; i++) {
        printf("%d ", v2[i]);
    }

    printf("\n\nMaior numero do vetor 1: %d\n\n", maior);

    return 0;
}


int inverte_vetor(int *v1, int *v2, int n) {

    int i, maior, temp;

    // define o maior número de v1
    maior = v1[0];
    for (i = 0; i < n; i++) {
        if (v1[i] > maior) {
            maior = v1[i];
        }
    }

    int j;

    // inverte os valores de v1
    for (i = 0; i < n; i++) {
        for (j = 0; j < i; j++) {
            temp = v1[i];
            v1[i] = v1[j];
            v1[j] = temp;
        }
    }

    // copia para v2 os valores de v1
    for (i = 0; i < n; i++)
        v2[i] = v1[i];

    return maior;
}

 

Link para o comentário
Compartilhar em outros sites

@giu_d Como está sua função inverte_vetor acaba com ambos v1 e v2 invertidos...

 

Segue uma versão que não modifica v1:

int inverte_vetor(int *v1, int *v2, int n){
    int i, maior;
    
    maior = v1[0];
    for(i = 0; i < n; i++) {
        if (v1[i] > maior) {
            maior = v1[i];
        }
        v2[n-1-i] = v1[i];
    }
    
    return maior;
}

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@isrnick Verdade. Mas de acordo com o enunciado do exercício não é inválido inverter os valores de v1 e depois copiar esses valores para v2. Tanto que se não tiver o for onde copio para v2 os valores de v1 não vai :confused:

Link para o comentário
Compartilhar em outros sites

agora, giu_d disse:

@isrnick Verdade. Mas de acordo com o enunciado do exercício não é inválido inverter os valores de v1 e depois copiar esses valores para v2. Tanto que se não tiver o for onde copio para v2 os valores de v1 não vai :confused:

Está implícito que v1 deve ser mantido, do contrário os parâmetros da função poderia ser apenas:

int inverte_vetor(int *v1, int n){

Para inverter dentro do próprio v1 e não precisaria do v2.

Link para o comentário
Compartilhar em outros sites

@isrnick É verdade, mas calma! Estamos inda aprendendo hehe. Se Deus permitir a gente chega lá

adicionado 5 minutos depois

Rapaz! Não ando acertando muito ultimamente :(

adicionado 6 minutos depois

Creio q é hora de dar um break aqui no fórum

Link para o comentário
Compartilhar em outros sites

@giu_d Claro, todo mundo aprende aos poucos, por isso tem que exercitar bastante. :thumbsup:

 

Ver e aprender métodos diferentes de fazer a mesma coisa também ajuda muito. Com esse intuito segue também uma função usando o seu método que consegue preservar o v1:

int inverte_vetor(int *v1, int *v2, int n) {

    int i, maior, temp;

    // define o maior número de v1
    maior = v1[0];
    for (i = 0; i < n; i++) {
        if (v1[i] > maior) {
            maior = v1[i];
        }
    }

    // copia para v2 os valores de v1
    for (i = 0; i < n; i++)
        v2[i] = v1[i];

    int j;

    // inverte os valores de v2
    for (i = 0; i < n; i++) {
        for (j = 0; j < i; j++) {
            temp = v2[i];
            v2[i] = v2[j];
            v2[j] = temp;
        }
    }

    return maior;
}

A única diferença é copia v1 para v2 antes de inverter, e aí só inverte o v2.

Link para o comentário
Compartilhar em outros sites

@isrnick

23 minutos atrás, isrnick disse:

Está implícito que v1 deve ser mantido, do contrário os parâmetros da função poderia ser apenas:


int inverte_vetor(int *v1, int n){

Para inverter dentro do próprio v1 e não precisaria do v2.

 

Mas se eu não passar v2 como parâmetro da função como eu iria copiar para v2 os valores de v1 para mostrar no main os valores de v2?

adicionado 5 minutos depois

:confused:

 

Link para o comentário
Compartilhar em outros sites

1 minuto atrás, giu_d disse:

@isrnick

 

Mas se eu não passar v2 como parâmetro da função como eu iria copiar para v2 os valores de v1?

Exatamente, a função não copiaria, e o enunciado inteiro não faria sentido, logo está implícito que v1 não será invertido...

Ou o enunciado teria que ser diferente para falar que a função inverte v1 dentro dele mesmo.

Link para o comentário
Compartilhar em outros sites

#include<stdio.h>
#include<conio.h>

int inverte_vetor(int *v1, int *v2, int n);

main(){
	int n;
	
	printf("tamanho do vetor: ");
	scanf("%d", &n);
	int i, v1[n], v2[n], maior;
	
	for(i=0;i<n;i++){
		
		printf("elemento na posicao %d: ", i+1);
		scanf("%d", &v1[i]);
	}
	
	maior=inverte_vetor(v1, v2, n);

for(i=0;i<n;i++){
		
		
		printf("vetor 1, posicao [%d]: \t%d\n",i+1, v1[i]);
	}
	printf("\n\n");
		for(i=0;i<n;i++){
		
		
		printf("vetor 2, posicao [%d]: \t%d\n", i+1,v2[i]);
	}
printf("\n");
printf("maior elemento dos vetores: %d", maior);
	getch();
}

int inverte_vetor(int *v1, int *v2, int n){
	
	int i , j=n-1, maior=v1[0];
	
	
	for(i=0;i<n;i++){

	if(v1[i]>maior){
	 maior=v1[i];
	}
		
	}
	
	
	for(i=0;i<n;i++){

	v2[j]=v1[i];
    j--;
   
	
	}
	
	return maior;
	
	
}

Desculpa nao ter retornado antes, obrigado a todos, acima a solução do exercício.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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

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