error: no match for ‘operator=’ (operand types are and double*') [RESOLVIDO]

1. error: no match for ‘operator=’ (operand types are and double*') [RESOLVIDO]

Lendel dos Santos Rodrigues
lendel

(usa Linux Mint)

Enviado em 17/09/2019 - 20:26h

Problemas para usar alocação dinamica em c++ em uma estrutura de dados

[humbra@x550l livro]$ g++ Exercicio18022.cpp Funcoes18022.cpp -o exp18022
Funcoes18022.cpp: In function ‘void Aloca(PONTO&, int)’:
Funcoes18022.cpp:23:20: error: no match for ‘operator=’ (operand types are ‘PONTO’ and ‘double*’)
p = new double[n];
^
In file included from Funcoes18022.cpp:4:
Funcoes18022.h:5:8: note: candidate: ‘constexpr PONTO& PONTO::operator=(const PONTO&)’
struct PONTO
^~~~~
Funcoes18022.h:5:8: note: no known conversion for argument 1 from ‘double*’ to ‘const PONTO&’
Funcoes18022.h:5:8: note: candidate: ‘constexpr PONTO& PONTO::operator=(PONTO&&)’
Funcoes18022.h:5:8: note: no known conversion for argument 1 from ‘double*’ to ‘PONTO&&’
Funcoes18022.cpp: In function ‘void Desaloca(PONTO&)’:
Funcoes18022.cpp:28:13: error: type ‘struct PONTO’ argument given to ‘delete’, expected pointer
delete []p;
O codigo do programa utilizado é

Arquivo .h

#ifndef PONTO_H
#define PONTO_H

const int MAX = 50;
struct PONTO
{
double x[MAX];
double y[MAX];
};
int quantidadepontos();
void Aloca(PONTO &p, int n);
void Desaloca(PONTO &p);
void ler(PONTO &p, int n);
void exibir(PONTO p, int n);
double distancia(PONTO p1, PONTO p2, int n);
#endif


a outra parte com cpp

#include <iostream>
#include <cmath>
#include <iomanip>
#include "Funcoes18022.h"

using namespace std;

int quantidadepontos()
{
int n;
// Ler dimensão do vetor
cout << "Tamanho = "; cin >> n;
while (n < 1 || n > MAX)
{
cout << "Valor invalido!\n";
cout << "Tamanho = "; cin >> n;
}
return n;
}

void Aloca(PONTO &p, int n)
{
p = new double[n];
//p.y = new double[n];
}
void Desaloca(PONTO &p)
{
delete []p;
//delete []p.y;
}
void ler(PONTO &p, int n)
{
cout << "Insira os valores do ponto x " << endl;
for(int i = 0; i < n; i++){
cout << "Insira o valor do p" << i+1 << " = ";
cin >> p.x[i];
}
cout << "Insira os valores do ponto y " << endl;
for(int j = 0; j < n; j ++){
cout << "Insira o valor do p" << j+1 << " = ";
cin >> p.y[j];
}
}
void exibir(PONTO p, int n)
{
cout << "Valores dos pontos px: " << endl;
for(int i = 0; i < n; i++){
cout << "p" << i+1 << " = " << p.x[i] << endl;
}
cout << "Valores dos pontos py: " << endl;
for(int j = 0; j < n; j++){
cout << "p" << j+1 << " = " << p.y[j] << endl;
}
}
double distancia(PONTO p1, PONTO p2, int n)
{
double d;
PONTO p;
ler(p,n);
exibir(p,n);

for(int i = 0; i < n; i++){ //transferência de vetores
p1.x[i] = p.x[i];
p2.y[i] = p.y[i];
}

double menor = sqrt(pow(p1.x[0], 2.0) + pow(p2.y[0], 2.0)); //Primeiro elemento
for(int i = 0; i < n; i++){ //Varia de 1 a n-1
if (sqrt(pow(p1.x[i], 2.0) + pow(p2.y[i], 2.0)) < menor)
menor = sqrt(pow(p1.x[i], 2.0) + pow(p2.y[i], 2.0)); // Determina menor
}

d = menor;
cout << "Valor da menor distância = " << setprecision (2) << fixed << d << " m " << endl;

return d;
}


arquivo main

#include <iostream>
#include "Funcoes18022.h"

using namespace std;

int main (int argc, char *argv[]){

cout << "Programa para calcular e exibir o ponto no plano cartesiano" << endl;
cout << "mais próximo da origem" << endl;
cout << endl;

PONTO p, p1, p2;

cout << "Insira a quantidade de pontos " << endl;
int n;
n = quantidadepontos();
Aloca(p,n); //Aloca memória para o vetor
cout << "Insira os pontos de x e y " << endl;
distancia(p1,p2,n);
Desaloca(p); //Libera memória alocada

return 0;
}



  


2. Re: error: no match for ‘operator=’ (operand types are and double*')

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/09/2019 - 20:38h

Se você está alocando um array de doubles, deve atruibuí-lo a um ponteiro para double, não a uma variável do tipo PONTO. Também não faz sentido usar delete ou delete[] com algo que não seja um ponteiro.

Por falar nisso, o restante do código, e em particular a modelagem dos seus dados, me parece muito estranho. O que o enunciado lhe pedia, e quais restrições ele impunha?


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


3. Re: error: no match for ‘operator=’ (operand types are and double*')

Lendel dos Santos Rodrigues
lendel

(usa Linux Mint)

Enviado em 21/09/2019 - 20:05h

paulo1205 escreveu:

Se você está alocando um array de doubles, deve atruibuí-lo a um ponteiro para double, não a uma variável do tipo PONTO. Também não faz sentido usar delete ou delete[] com algo que não seja um ponteiro.

Por falar nisso, o restante do código, e em particular a modelagem dos seus dados, me parece muito estranho. O que o enunciado lhe pedia, e quais restrições ele impunha?


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


Queria que me ajudasse. Bem o comando dessa questão é grande porque estou na questão 18. 22 mais ela começa na questão 18.20, sendo que essas ja resolvi.

18. 20 Elaborar um programa, organizado em unidades independentes, para manipular uma estrutura que representa um ponto no plano cartesiano:
criar a estrutura PONTO;
criar uma função para ler as coordenadas de um PONTO;
criar uma função para exibir as coordenadas de um PONTO;
criar uma função para calcular a distância entre dois PONTOs;
criar uma função "main" para testar as demais funções.
Utilizar o arquivo de cabeçalhos abaixo.

#ifndef PONTO_H
#define PONTO_H

struct PONTO
{
double x, y;
};
void ler(PONTO &p);
void exibir(PONTO p);
double distancia(PONTO p1, PONTO p2);
#endif


18.21 utilizando a estrutura PONTO criada no exercicio anterior, elaborar um programa:
criar um vetor estático de PONTOs, com capacidade para até 100 PONTOs;
ler a quantidade real de PONTOs do vetor;
ler as coordenadas de cada PONTO mais próximo da origem. Sugestão:
criar uma função para calcular a distância entre dois pontos.

18.22 repetir o exercicio anterior utilizando Alocação Dinâmica para o vetor.
Essa questão 18.22 que estou enrolado e não conseguindo fazer. Se puder ajudar agradeceria muito.


4. Re: error: no match for ‘operator=’ (operand types are and double*') [RESOLVIDO]

Lendel dos Santos Rodrigues
lendel

(usa Linux Mint)

Enviado em 03/10/2019 - 17:50h

paulo1205 escreveu:

Se você está alocando um array de diubles, deve atruibuí-lo a um ponteiro para double, não a uma variável do tipo PONTO. Também não faz sentido usar delete ou delete[] com algo que não seja um ponteiro.

Por falar nisso, o restante do código, e em particular a modelagem dos seus dados, me parece muito estranho. O que o enunciado lhe pedia, e quais restrições ele impunha?


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


ME AJUDE COM ESSA QUESTAÃO POR FAVOR, JA FIZ DE TUDO E NÃO DA CERTO, JA OLHEI EXEMPLOS NA NET E NADA.

CODIGO .h
ifndef PONTO_H
#define PONTO_H

//const int MAX = 100;
typedef struct PONTO
{
double x, y;
};
int quantidadepontos();
void ler(PONTO &p, int n);
void exibir(PONTO p, int n);
double distancia(PONTO p, int n);
#endif


CODIGO DE funções
#include <iostream>
#include <cmath>
#include <iomanip>
#include "Funcoes18021.h"

using namespace std;

int quantidadepontos()
{
int n;
// Ler dimensão do vetor
cout << "Tamanho = "; cin >> n;
while (n < 1 || n > 100)
{
cout << "Valor invalido!\n";
cout << "Tamanho = "; cin >> n;
}
return n;
}
void ler(PONTO &p, int n)
{
for(int i = 0; i < n; i++)
{
cout << "Insira os valores do ponto p" << i + 1 << endl;

cout << "x = "; cin >> p[i].x;
cout << "y = "; cin >> p[i].y;
}
}
void exibir(PONTO p, int n)
{
for(int i = 0; i < n; i++)
{
cout << "Valores do ponto p" << i + 1 << endl;

cout << "x = " << p[i].x << endl;
cout << "y = " << p[i].y << endl;
}
}
double distancia(PONTO p, int n)
{

double d;
ler(p,n);
exibir(p,n);

int ponto_mais_proximo = 0;
double menor_distancia = sqrt(pow(p[0].x, 2.0) + pow(p[0].y, 2.0)); //Primeiro elemento
for(int i = 0; i < n; i++){ //Varia de 0 a n-1
if (sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)) < menor_distancia){
ponto_mais_proximo = i;
menor_distancia = sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)); // Determina menor
}
}

d = menor_distancia;
cout << "O ponto mais próximo da origem = " << setprecision (2) << fixed
<< "(" << p[ponto_mais_proximo].x << "," << p[ponto_mais_proximo].y << ")" << endl;
return d;
}


CODIGO MAIN
#include <iostream>
#include "Funcoes18021.h"

using namespace std;

int main (int argc, char *argv[]){

cout << "Programa para calcular e exibir o ponto mais próximo da origem do plano cartesiano" << endl;
cout << endl;

int n;
PONTO p[100];
cout << "Insira a quantidade de pontos " << endl;
n = quantidadepontos();
distancia(p,n);

return 0;
}


esta aparecendo isso
[humbra@x550l livro]$ g++ Exercicio18021.cpp Funcoes18021.cpp -o exp18021
In file included from Exercicio18021.cpp:2:
Funcoes18021.h:5:1: warning: ‘typedef’ was ignored in this declaration
typedef struct PONTO
^~~~~~~
Exercicio18021.cpp: In function ‘int main(int, char**)’:
Exercicio18021.cpp:15:14: error: could not convert ‘(PONTO*)(& p)’ from ‘PONTO*’ to ‘PONTO’
distancia(p,n);
^
In file included from Funcoes18021.cpp:4:
Funcoes18021.h:5:1: warning: ‘typedef’ was ignored in this declaration
typedef struct PONTO
^~~~~~~
Funcoes18021.cpp: In function ‘void ler(PONTO&, int)’:
Funcoes18021.cpp:26:27: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
cout << "x = "; cin >> p[i].x;
^
Funcoes18021.cpp:27:27: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
cout << "y = "; cin >> p[i].y;
^
Funcoes18021.cpp: In function ‘void exibir(PONTO, int)’:
Funcoes18021.cpp:36:22: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
cout << "x = " << p[i].x << endl;
^
Funcoes18021.cpp:37:22: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
cout << "y = " << p[i].y << endl;
^
Funcoes18021.cpp: In function ‘double distancia(PONTO, int)’:
Funcoes18021.cpp:48:37: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
double menor_distancia = sqrt(pow(p[0].x, 2.0) + pow(p[0].y, 2.0)); //Primeiro elemento
^
Funcoes18021.cpp:48:56: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
double menor_distancia = sqrt(pow(p[0].x, 2.0) + pow(p[0].y, 2.0)); //Primeiro elemento
^
Funcoes18021.cpp:50:23: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
if (sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)) < menor_distancia){
^
Funcoes18021.cpp:50:42: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
if (sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)) < menor_distancia){
^
Funcoes18021.cpp:52:38: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
menor_distancia = sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)); // Determina menor
^
Funcoes18021.cpp:52:57: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
menor_distancia = sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)); // Determina menor
^
Funcoes18021.cpp:58:18: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
<< "(" << p[ponto_mais_proximo].x << "," << p[ponto_mais_proximo].y << ")" << endl;
^
Funcoes18021.cpp:58:52: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
<< "(" << p[ponto_mais_proximo].x << "," << p[ponto_mais_proximo].y << ")" << endl;



5. Re: error: no match for ‘operator=’ (operand types are and double*')

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/10/2019 - 20:37h

lendel escreveu:

ME AJUDE COM ESSA QUESTAÃO POR FAVOR, JA FIZ DE TUDO E NÃO DA CERTO, JA OLHEI EXEMPLOS NA NET E NADA.


Prezado, boa noite.

Parece que você está com algumas lacunas importantes no seu aprendizado do C++. Que material você está usando para aprender?

As mensagens que o compilador está mostrando são bastante claras acerca dos erros (quase todos por um mesmo motivo). São erros bobos, mas por isso mesmo sugerem que não conseguiu assimilar alguns conceitos fundamentais.

Eu não vou corrigir seu programa para você porque entendo (e creio que a maioria dos usuários da comunidade também) que seria desonesto fazer o seu trabalho no seu lugar. Mas eu vou comentar o seu código (o que seria desnecessário, já que vou repetir um bocado das informações que estão nas mensagens de erro do compilador), na esperança de que você mesmo consiga fazer os consertos necessários.

CODIGO .h
ifndef PONTO_H 


Faltou um sinal “#” antes da palavra “ifdef”, mas pode ter sido apenas erro de transcrição.

#define PONTO_H

//const int MAX = 100;
typedef struct PONTO
{
double x, y;
};


Conforme lhe alertou o compilador, você está usando typedef de um modo inócuo, pois não está dizendo qual o apelido a usar para seu tipo “struct PONTO”.

Porém, como você está usando C++, e não C, provavelmente é desnecessário usar typedef, pois a simples definição de uma estrutura (struct) ou classe (class) já coloca o rótulo da respectiva estrutura ou classe como um nome de tipo no namespace em que ele for declarado. Compare as diferentes formas de fazer entre o C e o C++.

/* Modo C */
typedef struct rotulo_da_estrutura {
double x, y;
} apelido_do_tipo;

struct rotulo_da_estrutura a;
apelido_do_tipo b;

/* a e b têm o mesmo tipo, pois o apelido é exatamente isso: um apelido. */[code]

[code]// Modo C++.
struct rotulo_da_estrutura {
double x, y;
};

struct rotulo_da_estrutura a; // NENHUM PROGRAMADOR C++ USA ESSA FORMA, (mas ela é permitida para algumas situações excepcionais).
rotulo_da_estrutura b; // Não é necessária a palavra-chave “struct”.

// a e b têm o mesmo tipo.


int quantidadepontos();
void ler(PONTO &p, int n);


Note que você declara a função ler() para receber apenas um PONTO, usando passagem por referência.

void exibir(PONTO p, int n);
double distancia(PONTO p, int n);


E essas duas funções também só recebem um PONTO, mas por (cópia de) valor, em vez de por referência.

#endif 


CODIGO DE funções
#include <iostream>
#include <cmath>
#include <iomanip>
#include "Funcoes18021.h"

using namespace std;

int quantidadepontos()
{
int n;
// Ler dimensão do vetor
cout << "Tamanho = "; cin >> n;
while (n < 1 || n > 100)
{
cout << "Valor invalido!\n";
cout << "Tamanho = "; cin >> n;
}
return n;
}
void ler(PONTO &p, int n)
{
for(int i = 0; i < n; i++)
{
cout << "Insira os valores do ponto p" << i + 1 << endl;

cout << "x = "; cin >> p[i].x;
cout << "y = "; cin >> p[i].y;


Nas duas linhas acima, você tentou usar p como se fosse um array de PONTOs, mas repare bem que você disse que o tipo do argumento é uma referência para apenas um PONTO. Você não pode tratar um valor escalar único como se fosse um array ou ponteiro.

Será que esse argumento não deveria ter sido declarado como ponteiro para PONTO, em lugar de referência para PONTO?

Erro semelhante acontece com as outras duas funções abaixo, com a diferença de que o único PONTO é passado por valor, em vez de por referência.

	}
}
void exibir(PONTO p, int n)
{
for(int i = 0; i < n; i++)
{
cout << "Valores do ponto p" << i + 1 << endl;

cout << "x = " << p[i].x << endl;
cout << "y = " << p[i].y << endl;
}
}
double distancia(PONTO p, int n)
{

double d;
ler(p,n);
exibir(p,n);

int ponto_mais_proximo = 0;
double menor_distancia = sqrt(pow(p[0].x, 2.0) + pow(p[0].y, 2.0)); //Primeiro elemento
for(int i = 0; i < n; i++){ //Varia de 0 a n-1


Se p designasse um array de PONTOs, você já teria calculado a distância de p[0], então o laço de repetição não precisa de começar com 0, mas sim em 1.

	  		   if (sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)) < menor_distancia){
ponto_mais_proximo = i;
menor_distancia = sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)); // Determina menor


O cálculo da distância, que é não trivial, está repetido. Se o compilador for esperto, ele pode tentar reaproveitar o valor calculado na primeira vez também na segunda vez, mas eu acho que pode ser um pouco difícil de garantir isso. Seria melhor ter uma variável para guardar o valor calculado, e usá-la tanto na comparação quanto na atribuição.

Outra coisa que pode ser útil, porque talvez favoreça o desempenho, é usar algo como “x*x” em lugar de “pow(x, 2.0)”.

		 	     }
}

d = menor_distancia;
cout << "O ponto mais próximo da origem = " << setprecision (2) << fixed
<< "(" << p[ponto_mais_proximo].x << "," << p[ponto_mais_proximo].y << ")" << endl;
return d;
}


CODIGO MAIN
#include <iostream>
#include "Funcoes18021.h"

using namespace std;

int main (int argc, char *argv[]){

cout << "Programa para calcular e exibir o ponto mais próximo da origem do plano cartesiano" << endl;
cout << endl;

int n;
PONTO p[100];
cout << "Insira a quantidade de pontos " << endl;
n = quantidadepontos();
distancia(p,n);

return 0;
}


esta aparecendo isso
[humbra@x550l livro]$ g++ Exercicio18021.cpp Funcoes18021.cpp -o exp18021
In file included from Exercicio18021.cpp:2:
Funcoes18021.h:5:1: warning: ‘typedef’ was ignored in this declaration
typedef struct PONTO
^~~~~~~
Exercicio18021.cpp: In function ‘int main(int, char**)’:
Exercicio18021.cpp:15:14: error: could not convert ‘(PONTO*)(& p)’ from ‘PONTO*’ to ‘PONTO’
distancia(p,n);
^
In file included from Funcoes18021.cpp:4:
Funcoes18021.h:5:1: warning: ‘typedef’ was ignored in this declaration
typedef struct PONTO
^~~~~~~
Funcoes18021.cpp: In function ‘void ler(PONTO&, int)’:
Funcoes18021.cpp:26:27: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
cout << "x = "; cin >> p[i].x;
^
Funcoes18021.cpp:27:27: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
cout << "y = "; cin >> p[i].y;
^
Funcoes18021.cpp: In function ‘void exibir(PONTO, int)’:
Funcoes18021.cpp:36:22: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
cout << "x = " << p[i].x << endl;
^
Funcoes18021.cpp:37:22: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
cout << "y = " << p[i].y << endl;
^
Funcoes18021.cpp: In function ‘double distancia(PONTO, int)’:
Funcoes18021.cpp:48:37: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
double menor_distancia = sqrt(pow(p[0].x, 2.0) + pow(p[0].y, 2.0)); //Primeiro elemento
^
Funcoes18021.cpp:48:56: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
double menor_distancia = sqrt(pow(p[0].x, 2.0) + pow(p[0].y, 2.0)); //Primeiro elemento
^
Funcoes18021.cpp:50:23: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
if (sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)) < menor_distancia){
^
Funcoes18021.cpp:50:42: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
if (sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)) < menor_distancia){
^
Funcoes18021.cpp:52:38: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
menor_distancia = sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)); // Determina menor
^
Funcoes18021.cpp:52:57: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
menor_distancia = sqrt(pow(p[i].x, 2.0) + pow(p[i].y, 2.0)); // Determina menor
^
Funcoes18021.cpp:58:18: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
<< "(" << p[ponto_mais_proximo].x << "," << p[ponto_mais_proximo].y << ")" << endl;
^
Funcoes18021.cpp:58:52: error: no match for ‘operator[]’ (operand types are ‘PONTO’ and ‘int’)
<< "(" << p[ponto_mais_proximo].x << "," << p[ponto_mais_proximo].y << ")" << endl;


Um comentário final é que você não está explorando os recursos que o C++ lhe dá. Seu programa têm mais cara de programa em C, com a única diferença de usar entrada e saída usando std::istream::operator>>() e std::ostream::operator<<(), mas mesmo assim apenas para tipos fundamentais. Isso não chega a ser um erro, mas não é o que se costuma esperar.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


6. Obrigado paulo Consegui

Lendel dos Santos Rodrigues
lendel

(usa Linux Mint)

Enviado em 05/10/2019 - 09:05h

fiz as correções que me falou, realmente era um erro bobo...veja como ficou
encotrei o erro no codigo .h
como estava fazendo para um unico ponto, criei um typedef PONTO para poder criar um array. O erro somente era esse.

#ifndef PONTO_H
#define PONTO_H

struct PONTO {
double x;
double y;
};
typedef PONTO ponto[100]; //
int quantidadepontos();
void ler(ponto &p, int n);
void exibir(ponto &p, int n);
void distancia(ponto &p, int n);
#endif


codigo das funçoes.cpp
#include <iostream>
#include <cmath>
#include "Funcoes18021.h"

using namespace std;

int quantidadepontos()
{
int n;
// Ler dimensão do vetor
cout << "Tamanho = "; cin >> n;
while (n < 1 || n > 100)
{
cout << "Valor invalido!\n";
cout << "Tamanho = "; cin >> n;
}
return n;
}
void ler(ponto &p, int n)
{
for(int i = 0; i < n; i++)
{
cout << "Informe as coordenadas dos Pontos p" << i + 1 << ":" << endl;

cout << "x = "; cin >> p[i].x;
cout << "y = "; cin >> p[i].y;
cout << endl;
}
}
void exibir(ponto &p, int n)
{
for(int i = 0; i < n; i++)
{
cout << "Valores do ponto p" << i + 1 << ":" << endl;

cout << "x = " << p[i].x << endl;
cout << "y = " << p[i].y << endl;
cout << endl;
}
}
void distancia(ponto &p, int n)
{

int ponto_mais_proximo = 0;
double menor = sqrt(pow(p[0].x,2.0) + pow(p[0].y, 2.0));

for(int i=0; i < n; i++){
double d = sqrt(pow(p[i].x,2.0) + pow(p[i].y, 2.0));
if(d < menor){
ponto_mais_proximo = i;
}
}

cout << "Ponto mais proximo: (" <<
p[ponto_mais_proximo].x << "," << p[ponto_mais_proximo].y << ")" << endl;

}


e o codigo main continuou praticamente a mesma coisa
#include <iostream>
#include "Funcoes18021.h"

using namespace std;

int main (int argc, char *argv[]){

cout << "Programa para calcular e exibir o ponto mais próximo da origem do plano cartesiano" << endl;
cout << endl;

int n;
ponto p;
cout << "Insira a quantidade de pontos " << endl;
n = quantidadepontos();
ler(p,n);
exibir(p,n);
distancia(p,n);

return 0;


Agora executa. Muito obrigado


7. ALOCAÇÃO DINAMICA

Lendel dos Santos Rodrigues
lendel

(usa Linux Mint)

Enviado em 05/10/2019 - 10:02h

Tinha esquecido de ter colocado a alocação dinâmica no programa que é o exercicio que eu estava tentando resolver.

Para implementar a alocação dinâmica, foi inserido um ponteiro no lugar do vetor, evitando o erro de ter uma indicação de um ponteiro para ponteiro no bloco de função.
Exemplo

p = new double[n] 


coloquei um
p = new PONTO[n]; 


resultando em um codigo bem simples

codigo .h

#ifndef PONTO_H
#define PONTO_H

struct PONTO {
double x;
double y;
};
typedef PONTO *ponto;
int quantidadepontos();
void Aloca(ponto &p, int n);
void Desaloca(ponto &p);
void ler(ponto &p, int n);
void exibir(ponto &p, int n);
void distancia(ponto &p, int n);
#endif


no codigo das funcoes.cpp, praticamente so implementei duas funções, o de alocação dinâmica e o de desalocar
no caso:

void Aloca(ponto &p, int n) 

e depois

void Desaloca(ponto &p) 


dai segue o codigo de funções.cpp

#include <iostream>
#include <cmath>
#include "Funcoes18022.h"

using namespace std;

int quantidadepontos()
{
int n;
// Ler dimensão do vetor
cout << "Tamanho = "; cin >> n;
while (n < 1 || n > 100)
{
cout << "Valor invalido!\n";
cout << "Tamanho = "; cin >> n;
}
return n;
}

void Aloca(ponto &p, int n)
{
p = new PONTO[n];
}
void Desaloca(ponto &p)
{
delete []p;
}
void ler(ponto &p, int n)
{
for(int i = 0; i < n; i++)
{
cout << "Informe as coordenadas dos Pontos p" << i + 1 << ":" << endl;

cout << "x = "; cin >> p[i].x;
cout << "y = "; cin >> p[i].y;
cout << endl;
}
}
void exibir(ponto &p, int n)
{
for(int i = 0; i < n; i++)
{
cout << "Valores do ponto p" << i + 1 << ":" << endl;

cout << "x = " << p[i].x << endl;
cout << "y = " << p[i].y << endl;
cout << endl;
}
}
void distancia(ponto &p, int n)
{

int ponto_mais_proximo = 0;
double menor = sqrt(pow(p[0].x,2.0) + pow(p[0].y, 2.0));

for(int i=0; i < n; i++){
double d = sqrt(pow(p[i].x,2.0) + pow(p[i].y, 2.0));
if(d < menor){
ponto_mais_proximo = i;
}
}

cout << "Ponto mais proximo: (" <<
p[ponto_mais_proximo].x << "," << p[ponto_mais_proximo].y << ")" << endl;

}


na função main.cpp apenas chamo as duas funções

#include <iostream>
#include "Funcoes18022.h"

using namespace std;

int main (int argc, char *argv[]){

cout << "Programa para calcular e exibir o ponto mais próximo da origem do plano cartesiano" << endl;
cout << "Com alocação dinâmica" << endl;
cout << endl;

int n;
ponto p;
cout << "Insira a quantidade de pontos " << endl;
n = quantidadepontos();
Aloca(p,n); //Aloca memória para o vetor
ler(p,n);
exibir(p,n);
distancia(p,n);
Desaloca(p); //Libera memória alocada

return 0;
}


Resolvido. aff que sufoco

Cap 18, questão 18.22

O livro é "Aplicações Cientifícas em C++ Da programação estruturada à programação orientada a objetos", do Sergio V. D. Pamboukian






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts