Ir ao conteúdo

Posts recomendados

Postado
#include <stdio.h>
 
int main(){
    
    int N[10], i, val;
    
    printf("Entre com um valor: ");
    scanf("%d", &val);
    int *vet = N;
    
    for(i=0; i<=9; i++){
        N[i]=val;
        printf("N[%d] = %d\n",vet,*vet);
        
        vet*=2;
    }
    
    return 0;
}

 

Olá, estou com este seguinte exercício para ser realizado: Leia um valor e faça um programa que coloque o valor lido na primeira posição de um vetor N[10]. Em cada posição subsequente, coloque o dobro do valor da posição anterior. Por exemplo, se o valor lido for 1, os valores do vetor devem ser 1,2,4,8 e assim sucessivamente. Mostre o vetor em seguida.

 

Porém meu professor pediu para eu usar ponteiros na hora da execução. Eu até realizei, e ele está rodando e mostrando o que eu quero. Mas ele apresenta um erro que não estou intendendo:

 

invalid operands to binary * (have ‘int *’ and ‘int’)

 

Se alguém puder me dizer o por que e como corrigir, ou até mesmo dar dicas sobre como melhorar o código, agradeceria!

 

 

 

  • Amei 1
Postado

@Victor Hugo Barbosa Silva    para apontar para o vetor vet , precisa informar a primeira posição do vetor , e denyro do loop somar a variavel que tem o valor , e seu ficou assim :

#define _CRT_SECURE_NO_WARNINGS /// para usar scanf e outras funções no visual studio
#include <stdio.h>
int main() 
{
    int N[10], i, val;                 /// criou variaveis
    printf("Entre com um valor: ");    /// msg
    scanf("%d", &val);                 /// input valor
    int* vet = &N[0];                  /// ponteiro precisa do & e a posição 
    for ( i=0; i <10; i++)             /// da memória onde inicia o vetor para 
    {                                  /// apontar para a variavel
        N[i] = val;                    /// coloca o valor no vetor
        printf("N[%d] = %d\n", i, vet[i]); /// precisa informar a posição no vetor
        val *= 2;                      /// incremnta a variavel
    }
    return 0;
}

 

Postado

@Victor Hugo Barbosa Silva    e como sempre tem vários modos de fazer o código , e de outro modo  ficaria assim  :

#include <stdio.h>
int main()
{
    int N[10], i, val;
    printf("Entre com um valor: ");
    scanf("%d", &val);
    int *vet = N;
    for(i=0; i<10; i++)                    /// aqui pode ser  < 10
    {
        *vet = val;
        printf("\tN[ %d ] = %d\n",i,*vet); /// posição do vetor é a variaveL  i
        val  = *vet;                       /// val recebe o conteudo do vetor
        val *= 2;                          /// multiplica o val por dois
        vet += 4;                          /// apontar para proxima posicao do vetor
    }                                      /// um int ocupa 4 bytes
    printf("\n\n");
    vet = N;                               /// aponta para o inicio do vetor
    for(i=0;i<10; i++)
    {
        printf("\tN[ %d ] = %d\n",i,*vet);
        vet += 4;
    }
    return 0;
}

 

  • Curtir 1
Postado
12 horas atrás, Victor Hugo Barbosa Silva disse:
vet*=2;

Assim está tentando multiplicar o endereço do ponteiro vet (não o valor da variável apontada por ele) e essa operação não é permitida, para endereços só é possível efetuar soma e adição. Outra forma de resolver poderia ser assim,

 

#include <stdio.h>
 
int main(){
    int N[10];
    int *vet = N;
    
    printf("Entre com um valor: ");
    scanf("%d", &N[0]);

    for(int i = 0; i < 10; i += 1){
        printf("N[%d] = %d\n",i, *vet);
        vet += 1;
        *vet = *(vet - 1) * 2;
    }
    return 0;
}

 

E com alocação dinâmica,

Spoiler
#include <stdio.h>
#include <stdlib.h>

int main(){
    int *n = (int *)malloc(sizeof(int) * 10);
    int *vet = n;

    printf("Entre com um valor: ");
    scanf("%d", n);

    for(int i = 0; i < 10; i += 1){
        printf("N[%d] = %d\n",i, *vet);
        vet += 1;
        *vet = *(vet - 1) * 2;
    }
    free(n);
    return 0;
}

 

 

  • Curtir 2
Postado

Acho que já sabe onde está errado:
 

        vet*=2;

 

vet é int*

 

E não é isso o que quer fazer.

 

Escreva em torno dos dados. Não precisa de val para ler o valor. Está bem claro:
 

Em 29/06/2021 às 20:04, Victor Hugo Barbosa Silva disse:

 Leia um valor e faça um programa que coloque o valor lido na primeira posição de um vetor N[10]

 

Então porque não lê direto no local? Para que outra variável?

  • Declare a variável de controle do loop DENTRO do for. 
  • Nunca deixe uma variável global com um nome ingênuo como i
  • não declare mais de uma variável por linha
  • não precisa de um outro ponteiro
  • está claro que basta duplicar o valor anterior do vetor, a partir do segundo porque o primeiro foi lido, então faça o simples
  • teste o retorno de scanf(). Qual o sentido de seguir se não ler nada?
  • o enunciado diz claramente N[10]. Não parece ser o caso de usar alocação dinâmica.

Um exemplo simples
 

#include <stdio.h> 
int main(void)
{
    int N[10];    
    printf("Entre com o valor inicial: ");
    if ( scanf("%d", &N[0]) != 1) return -1; // não leu nada
    printf( "Vetor: %d ", N[0]);
    for(int i=1; i<=9; i+=1)
    {
        N[i] = N[i-1] + N[i-1];
        printf("%d ", N[i]);
    }
    printf("\n");    
    return 0;
}

 

Outro exemplo usando apenas ponteiros

 

#include <stdio.h> 
int main(void)
{
    int N[10];    
    printf("Entre com o valor inicial: ");
    if ( scanf("%d", N) != 1) return -1; // não leu nada
    printf( "Vetor: %d ", *N);
    for(int i=1; i<=9; i+=1)
    {
        *(N+i) = *(N+i-1) + *(N+i-1);
        printf("%d ", *(N+i) );
    }
    printf("\n");    
    return 0;
}

 

Note que:

  • não precisa de outras variáveis, apenas o vetor e o índice.
  • Claro que é a+a é muito mais rápido que 2 * a.

 

Os dois claro tem o mesmo efeito.
 

clube> gcc -o tst -Wall x0704.c  
clube> ./tst
Entre com o valor inicial: -8
Vetor: -8 -16 -32 -64 -128 -256 -512 -1024 -2048 -4096     
clube> 

 

  • Curtir 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!