[C++] Losowanie punktów i odległość

kubdex
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 20 mar 2014, o 10:50
Płeć: Mężczyzna
Lokalizacja: Wrocław

[C++] Losowanie punktów i odległość

Post autor: kubdex »

Witam,
Zaczynam dopiero nauke programowania obiektowego, a niestety nie trafiłem na najlepszych prowadzących, ksiazki czy inne fora tez mi sie srednio pomagają. Jeżeli znalazłby się ktoś kto by mi poprawił ten program tak jak powinno bym wiedział co mam źle a to już bardzo dużo

pierwotny program miał losować 10 punktów i sprawdzać który z nich jest najbliżej punktu (0,0), jednak ze nie potrafię skonstruować dobrze konstruktora to skróciłem do wylosowania 2 punktów, obliczenia odległości od środka układu i wyświetlenia go.

Kod: Zaznacz cały

#include "iostream"
#include <ctime>
#include <cstdlib>
#include <math.h>
using namespace std;

class Punkt
{
	int x,y;
	public:
		punkt(int a, int b);
		odl();
		losuj(int a, int b);
};

Punkt::losuj(int a, int b)
{
	a=rand()%100-50;
	b=rand()%100-50;
	return a,b;
};

Punkt::punkt()
{
	a=x;
	b=y;
	return x,y;
	
};


Punkt::odl()
{
	int o;
	o=pow(x*x+y*y,0.5)
	return o;	
};

int main()
{
	srand(time(NULL));
	Punkt a;
	Punkt::losuj();
	Punkt::punkt();
	Punkt::odl();
	cout<<o;
	getch();
	
		
}
Z góry bardzo dziękuje !
Ostatnio zmieniony 20 mar 2014, o 13:15 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
norwimaj
Użytkownik
Użytkownik
Posty: 5101
Rejestracja: 11 mar 2011, o 16:31
Płeć: Mężczyzna
Lokalizacja: 52°16'37''N 20°52'45''E
Podziękował: 4 razy
Pomógł: 1001 razy

[C++] Losowanie punktów i odległość

Post autor: norwimaj »

Szybciej będzie napisać ten program od nowa, niż to poprawiać. Konstruktor powinien się nazywać tak samo jak klasa, czyli Punkt a nie punkt. Zechciej też łaskawie przeczytać, co na temat tego kodu twierdzi kompilator. Takie rzeczy, jak brak średnika w linii \(\displaystyle{ 35}\), możesz sam poprawić.
kubdex
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 20 mar 2014, o 10:50
Płeć: Mężczyzna
Lokalizacja: Wrocław

[C++] Losowanie punktów i odległość

Post autor: kubdex »

Jak mówiłem dopiero się ucze i zależy mi na takich podstawowych wskazówkach, także dzieki za wytknięcie kilku błędów Wydaje mi się ze już jest lepiej jednak i tak nie chce sie skompliować, siedze juz nad tym chwile i kompletnie nie wiem co może być nie tak, rzuci ktoś okiem ?

ps.zadanie miało być na użycie konstruktorów, jakaś rada gdzie i co z nim bym mogł zrobic ?

Kod: Zaznacz cały

#include "iostream"
#include <ctime>
#include <cstdlib>
#include <math.h>
using namespace std;

class Punkt
{
	private:
		int x;
		int y;
	public:
	
	
	
	
int losuj(int x, int y)
{
	x=rand()%100-50;
	y=rand()%100-50;
	cout<<"Wylosowane liczby to "<<x<<","<<y<<endl;
	return x,y;
}





int odl(int x, int y)
{
	int odl;
	odl=pow(x*x+y*y,0.5);
	cout<<"Prosta do podanego punkty ma dlugosc "<<odl<<endl;
	return odl;
}

	};

int main()
{
	srand (time(NULL));
	Punkt p1;
	p1.losuj();
	p1.odl();
	
	system("PAUSE");
}
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++] Losowanie punktów i odległość

Post autor: Ser Cubus »

funkcja losuj zwraca 2 inty,a może zwrócić tylko jednego

poza tym, gdzie masz kontruktor?
norwimaj
Użytkownik
Użytkownik
Posty: 5101
Rejestracja: 11 mar 2011, o 16:31
Płeć: Mężczyzna
Lokalizacja: 52°16'37''N 20°52'45''E
Podziękował: 4 razy
Pomógł: 1001 razy

[C++] Losowanie punktów i odległość

Post autor: norwimaj »

Kod: Zaznacz cały

punkt1.cc: In member function ‘int Punkt::losuj(int, int)’:
punkt1.cc:22:13: warning: left operand of comma operator has no effect [-Wunused-value]
    return x,y;
             ^
Zamiast x,y, równie dobrze można napisać samo y. Jeśli program ma obliczyć wartość wyrażenia x,y, to liczy wartość x, następnie ją ignoruje i liczy wartość y.

Od siebie dodam, że Twoja funkcja przyjmuje jakieś argumenty, ale zupełnie je ignoruje. Po co więc one są?

Kod: Zaznacz cały

punkt1.cc: In function ‘int main()’:
punkt1.cc:43:13: error: no matching function for call to ‘Punkt::losuj()’
    p1.losuj();
             ^
punkt1.cc:43:13: note: candidate is:
punkt1.cc:17:5: note: int Punkt::losuj(int, int)
 int losuj(int x, int y)
     ^
punkt1.cc:17:5: note:   candidate expects 2 arguments, 0 provided
Jeśli zdefiniowałeś funkcję przyjmującą dwa argumenty, to nie możesz jej używać bez argumentów.

Kod: Zaznacz cały

punkt1.cc:44:11: error: no matching function for call to ‘Punkt::odl()’
    p1.odl();
           ^
punkt1.cc:44:11: note: candidate is:
punkt1.cc:29:5: note: int Punkt::odl(int, int)
 int odl(int x, int y)
     ^
punkt1.cc:29:5: note:   candidate expects 2 arguments, 0 provided
j.w.
Ser Cubus pisze:funkcja losuj zwraca 2 inty,a może zwrócić tylko jednego
Nie zwraca dwóch intów. Wyrażenie x,y jest typu int.
kubdex
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 20 mar 2014, o 10:50
Płeć: Mężczyzna
Lokalizacja: Wrocław

[C++] Losowanie punktów i odległość

Post autor: kubdex »

I tutaj juz ostatnie pytanie, musze zmierzyc 10 takich odległosci i sprawdzic ktora jest najmniejsza, jednak ciagle pokazuje mi błąd...

Kod: Zaznacz cały

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <math.h>
using namespace std;

class Punkt
{

	private:
		int x;
		int y;
	public:
	
	
	
	
int losuj()
{
	x=rand()%100-50;
	y=rand()%100-50;
	cout<<"Wylosowane liczby to "<<x<<","<<y<<endl;

}





int odl()
{
	int odl;
	odl=pow(x*x+y*y,0.5);
	cout<<"Prosta do podanego punkty ma dlugosc "<<odl<<endl;
	
}

};

int main()
{
	srand (time(NULL));
	int min;
	for(int i=0;i<10;i++)
	{
		Punkt ai;
		ai.losuj();
		ai.odl();
	}
for(int i=0;i<10;i++)
{
a0.odl=min;
	
			if(ai.odl>min)
			{ 
				ai.odl=min;
			}
	
	}

	
	system("PAUSE");
}
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++] Losowanie punktów i odległość

Post autor: Ser Cubus »

Kod: Zaznacz cały

prog.cpp: In member function ‘int Punkt::losuj()’:
prog.cpp:24:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
prog.cpp: In member function ‘int Punkt::odl()’:
prog.cpp:36:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
prog.cpp: In function ‘int main()’:
prog.cpp:52:1: error: ‘a0’ was not declared in this scope
 a0.odl=min;
 ^
prog.cpp:54:13: error: ‘ai’ was not declared in this scope
          if(ai.odl>min)
             ^
czytasz w ogóle te komunikaty?

zadeklarowałeś, że funkcja losuj() zwraca jakąś wartość typu int, a nie dałeś tam nawet instrukcji return. To samo tyczy się funkcji odl().

O co chodzi z tym a0 to nie wiem, nie rozumiem co miałeś przez to na myśli, ale taka zmienna nie istnieje nigdzie w Twoim programie. Być może założyłeś, że ta pętla

Kod: Zaznacz cały

for(int i=0;i<10;i++)
   {
      Punkt ai;
      ai.losuj();
      ai.odl();
   }
stworzy Ci punkty o nazwie \(\displaystyle{ a_0, a_1 \ ... \ a_9}\), jeżeli tak to się pomyliłeś. Ta pętla tworzy punkt o nazwie ai, wywołuje dla niego obie zawarte tam funkcje, a następnie ulega zniszczeniu i tak 10 razy. Po skończeniu pętli żaden punkt nie zostaje zachowany.



Może chodziło Ci o coś takiego?

Kod: Zaznacz cały

Punkt tab_pkt[10];
for(int i=0;i<10;i++)
   {
      tab_pkt[i] = Punkt ai;
      ai.losuj();
      ai.odl();
   }
W takim wypadku wszytkie utworzone punkty zostaną zapisane do tablicy tab_pkt
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C++] Losowanie punktów i odległość

Post autor: Dasio11 »

Ser Cubus pisze:Może chodziło Ci o coś takiego?

Kod: Zaznacz cały

Punkt tab_pkt[10];
for(int i=0;i<10;i++)
   {
      tab_pkt[i] = Punkt ai;
      ai.losuj();
      ai.odl();
   }
W takim wypadku wszytkie utworzone punkty zostaną zapisane do tablicy tab_pkt
Próbowałeś to skompilować? Składnia tab_pkt[i] = Punkt ai; nie jest poprawna.
Jeśli bardzo chcecie korzystać z nazwy ai, to można zdefiniować referencję:

Kod: Zaznacz cały

Punkt tab_pkt[10];
for( int i = 0; i < 10; i++ )
{
    Punkt& ai = tab_pkt[i];
    ai.losuj();
    ai.odl();
}
kubdex
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 20 mar 2014, o 10:50
Płeć: Mężczyzna
Lokalizacja: Wrocław

[C++] Losowanie punktów i odległość

Post autor: kubdex »

Dobra, to wszystko rozumiem już, jednak jeżeli byście mogli to powiedzcie gdzie jest tutaj konstruktor, a jezeli go nie ma to gdzie ja go mam wsadzić ? Zadanie jest z konstruktorów i to ich powinem użyc ale nie do konca je rozumiem...
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++] Losowanie punktów i odległość

Post autor: Ser Cubus »

Dasio11, troszkę się zapędziłem, kontrukacja obiektu miała być przed wpisaniem go do tablicy


kubdex, wpisz w googlach 'cpp klasa' lub 'cpp kontruktor'. Nie ma sensu mówić co masz zrobić jeżeli nie masz podstaw
kubdex
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 20 mar 2014, o 10:50
Płeć: Mężczyzna
Lokalizacja: Wrocław

[C++] Losowanie punktów i odległość

Post autor: kubdex »

Zgodnie z radami posiedziałem troche nad tym i gdy myślałem ze wszystko wiem to pojawił sie kolejny problem ktorego nie umiem rozwiązać. Losuje liczby jednak one są przez cały czas takie same (pomimo sranda) i nie niektóre z kosmosu... pewnie jest to jakiś podstawowy błąd, jednak dopiero się ucze i nie mogę dotrzeć co to jest... z góry dziekuje za odpowiedz

Kod: Zaznacz cały

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <math.h>
#include <ctime>
using namespace std;

class Punkt
{

   public:
    int x;
    int y;
   
   
   
Punkt()
{
   x=rand()%101-50;
   y=rand()%101-50;

}



int odl()
{
   int odl;
   odl=sqrt(x*x+y*y);
   return odl;
}

};

int main()
{
   srand(time(NULL));
   int odl[10];
   
   for(int i=0;i<10;i++)
   {
   
    cout<<"Odleglosc "<<i+1<<" punktu od (0,0) wynosi : "<<odl[i]<<endl;      
   }
   
   return 0;
   system("PAUSE");
}
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C++] Losowanie punktów i odległość

Post autor: Dasio11 »

kubdex pisze:

Kod: Zaznacz cały

int main()
{
    srand(time(NULL));
    int odl[10];
 
    for(int i=0;i<10;i++)
    {
        cout<<"Odleglosc "<<i+1<<" punktu od (0,0) wynosi : "<<odl[i]<<endl;      
    }

    return 0;
    system("PAUSE");
}
Najpierw deklarujesz tablicę int odl[10], w której wstępnie są śmieci. Potem w pętli wypisujesz te śmieci. W ogóle nie używasz klasy Punkt, więc między innymi nic nie losujesz.
kubdex
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 20 mar 2014, o 10:50
Płeć: Mężczyzna
Lokalizacja: Wrocław

[C++] Losowanie punktów i odległość

Post autor: kubdex »

Nie rozumiem za bardzo jak mam to zmienić, zamiast int wstawić Punkt odl[10], czy bezposrednio w klasie zadeklarować tablice ?
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C++] Losowanie punktów i odległość

Post autor: Dasio11 »

Zamiast int odl[10]; wstaw Punkt p[10];, a w pętli

cout << "Odleglosc " << i+1 << " punktu od (0,0) wynosi : " << p.odl() << endl;

zamiast tego poprzedniego.
Gouranga
Użytkownik
Użytkownik
Posty: 1592
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 246 razy

[C++] Losowanie punktów i odległość

Post autor: Gouranga »

Nie prościej byłoby to napisać w czystym C bez obiektów?

-- 28 mar 2014, o 13:39 --

Pisane z palca, mam nadzieję, że bez błędów

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define ILE 10

typedef struct Point {
  int x, y;
} Point;

Point *newPoint(){
  Point *p = (Point*)malloc(sizeof(Point*));
  p->x = (int)malloc(sizeof(int));
  p->y = (int)malloc(sizeof(int));
  p->x = rand()%100 - 50;
  p->y = rand()%100 - 50;
  return p;
}

double dist(Point *p){
  return sqrt( p->x * p->x + p->y * p->y );
}

int main(void){
  Point **tab = (Point**)malloc(sizeof(Point*)*ILE);
  int i;
  Point *m;
  double max = 0.0;
  for (i=0; i<ILE; i++){
    tab[i] = newPoint();
    if (dist(tab[i]) > max) {
      max = dist(tab[i]);
      m = tab[i];
    }
  }
return 0;
}
potem w m masz wskaźnik na ten najdalszy punkt a w max jego odległość.-- 28 mar 2014, o 14:17 --nie mam pod tamtym postem opcji edycji więc napiszę tak, tam 3 linie trzeba wyrzucić, te 3 z malloc dla wnętrza struktury
ODPOWIEDZ