Ir ao conteúdo
  • Cadastre-se

C Problema com struct iniciante


Kurini

Posts recomendados

Sou iniciante em programação e tenho que criar um algoritmo que use um vetor de structs para armazenar as coordenadas de determinado pontos e calcule a norma deles.

 

Exemplo: 

ENTRADA

//receber dois vetores de entrada 

2

//os pontos

1   1     5    2  

2   -1   3      0.2

 

SAÍDA

Vetor: (1.00, 1.00, 5.00, 2.00) Norma: 5.57

Vetor: (2.00, -1.00, 3.00, 0.20) Norma: 3.75

 

Esboço do algoritmo que eu fiz

 

#include <stdio.h>
#include <math.h>

typedef struct vetor{

    float u, x, y, z;
    float norma;
    
}v[30];

int main(){
    
    int n, i;
    
    scanf("%d", &n);
    
    for(i=0; i<n; i++){
    
    scanf("%f %f %f %f", &v.u, &v.x, &v.y, &v.z);

    v.norma = sqrt(u*u+x*x+y*y+z*z);
    printf("Vetor: (%f, %f, %f, %f) Norma: %f\n",v.u, v.x, v.y, v.z, v.norma);
    
    }

return 0;
}

 

 

O problema é, no momento de compilar não do certo, como esse é um dos primeiros exercícios de structs que faço, não entendo meu erro. 

 

Quem poder me ajudar gradeço....

 

 

Link para o comentário
Compartilhar em outros sites

typedef struct {
    float u, x, y, z;
    float norma;
} vetor;

Define um novo tipo chamador vetor, composto por uma struct contendo 5 variáveis float (u, x, y, z e norma).

 

 

Agora que tempos esse novo tipo podemos usá-lo como faríamos com qualquer variável.

vetor v[30];

Cria um array do tipo vetor, com 30 posições, chamado v.

 

 

Para acessar as posições de arrays é necessário colocar o número da posição entre colchetes após o nome do array. Por exemplo v[0] acessa a primeira posição do array v, logo, para acessar a coordenada u da primeira posição de v fazemos v[0].u .

 

Sabendo disso tente corrigir seu código. Se não conseguir e/ou se tiver dúvidas é só postar o que conseguiu fazer e onde está tendo problemas, e tentaremos te ajudar.

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

  • Membro VIP

Olá.

 

@isrnick, apenas sugeriria mudar essa nomenclatura... para algo como ponto.

 

Ficaria com algo como:

typedef struct {
    float u, x, y, z;
    float norma;
} Ponto;

e

Ponto v[30];

ou

Ponto pontos[30];

etc

 

 

Ou seja, a struct tem informações de um ponto, certo?... daí, o programa estaria usando um "vetor de pontos" (que tem coordenadas e norma).... o vetor surge depois... da outra forma que tá, para mim ficou "sugerindo" que tem um "vetor de vetores". Entende?

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

@Simon Viegas Acredito que isso seria um vetor mesmo, visto que estamos obtendo norma e não "distância da origem".

 

E u, x, y e z não são coordenadas de um ponto, mais sim os comprimentos das projeções do vetor sobre os eixos ortogonais em um espaço vetorial ortonormal de dimensão 4. (Que coincide numericamente com as coordenadas de um ponto localizado na "ponta" do vetor se consideramos a origem na "base"/"rabo" do vetor.)

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

Apenas a título de observação:

 

Se assumíssemos que as respostas dadas como exemplo de saída do programa estão erradas, e na verdade os 4 números digitados para cada vetor são 2 conjuntos de coordenadas (x, y) de pontos no plano x-y ( R2 ), que indicam os pontos no início e no fim do vetor, teríamos outra situação.

 

Poderíamos definir uma struct ponto contendo coordenadas x e y, e uma struct vetor contendo 2 pontos (início e fim) e a norma.

 

Aí o exercício seria calcular a norma do vetor, dadas as coordenadas dos 2 pontos.

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

  • Membro VIP

Sobre:

2 horas atrás, isrnick disse:

@Simon Viegas Acredito que isso seria um vetor mesmo, visto que estamos obtendo norma e não "distância da origem".

 

Hum! Entendi!!! Quando respondi, estava associando o termo vetor com "variáveis" (uma matriz de uma coordenada no C).

 

Tava por fora do assunto em si...

 

 

 

Então sobre que eu comentei está certo:

4 horas atrás, Simon Viegas disse:

da outra forma que tá, para mim ficou "sugerindo" que tem um "vetor de vetores". Entende?

 

No caso, "vetor" seria no sentido de C/C++... e "vetores" no sentido da "geometria. :)

 

 

 

Sobre:

2 horas atrás, isrnick disse:

Apenas a título de observação:

 

Se assumíssemos que as respostas dadas como exemplo de saída do programa estão erradas, e na verdade os 4 números digitados para cada vetor são 2 conjuntos de coordenadas (x, y) de pontos no plano x-y ( R2 ), que indicam os pontos no início e no fim do vetor, teríamos outra situação.

 

Poderíamos definir uma struct ponto contendo coordenadas x e y, e uma struct vetor contendo 2 pontos (início e fim) e a norma.

 

Aí o exercício seria calcular a norma do vetor, dadas as coordenadas dos 2 pontos.

 

Creio que sejam 4 coordenadas para um vetor mesmo... pelo menos a resposta está batendo.

 

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

7 minutos atrás, Simon Viegas disse:

Hum! Entendi!!! Quando respondi, estava associando o termo vetor com "variáveis" (uma matriz de uma coordenada no C).

 

Tava por fora do assunto em si...

Por isso usei a palavra array na minha explicação inicial quando me referindo aos vetores da linguagem C, e a palavra vetor para o geométrico, assim evita confundir um com o outro.

(C++ tem std::vector e std::array, além do clássico do C, aí complica a nomenclatura totalmente. :lol:)

 

 

12 minutos atrás, Simon Viegas disse:

No caso, "vetor" seria no sentido de C/C++... e "vetores" no sentido da "geometria. :)

Exato. :thumbsup:

 

 

15 minutos atrás, Simon Viegas disse:

Creio que sejam 4 coordenadas para um vetor mesmo... pelo menos a resposta está batendo.

Sim, foi a conclusão em que cheguei também, considerando que as respostas batem. Só coloquei isso como algo extra mesmo.

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

Fiz as mudanças que entendi com base no que sugeriu, mas ainda está dando erro quando compila, o que falta corrigir? 

 

#include <stdio.h>
#include <math.h>

typedef struct{

	float u, x, y, z;
	float norma;

}vet[6];

int main(){

	vet v[6];
	
	int n, i, nrm=0;

	scanf("%d", &n);
	
	for(i=0; i<n; i++){
	
	scanf("%f %f %f %f", &v[i].u,
						 &v[i].x, 
						 &v[i].y, 
						 &v[i].z);
	
	v[i].norma = sqrt(u*u+x*x+y*y+z*z);
	
	printf("Vetor: (%.2f, %.2f, %.2f, %.2f) Norma: %.2f\n"
	,v[i].u, v[i].x, v[i].y, v[i].z, v[i].norma);
	}
	
return 0;
}

 

 

Link para o comentário
Compartilhar em outros sites

No nome do tipo definido no typedef você colocou vet[6], retire os colchetes e deixe apenas vet.

 

typedef struct{
	float u, x, y, z;
	float norma;
} vet;

 

Fora isso você esqueceu de colocar os v[ i ]. nas multiplicações de u, x, y e z nessa linha:

v[i].norma = sqrt(u*u+x*x+y*y+z*z);

O correto seria:

v[i].norma = sqrt(v[i].u*v[i].u + v[i].x*v[i].x + v[i].y*v[i].y + v[i].z*v[i].z);

 

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