przekątna prostokąta

0
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

class klasa{
public:
	double a;
	klasa(double a){                                  //1 funkcja & konstruktor
		do{	
			cout << "Podaj bok prostokata: ";
			cin >> a;
			if(a<=0)
				cout << "podaj liczbe dodatnia!" << endl;
		}
		while(a<=0);
	}
	klasa(klasa&wzor){
		wzor.a=a;
	}	
};

int main() {
	klasa bok(bok.a);
	klasa bo2(bok);
	cout << bok.a;
	cin.ignore();
	getchar();
	return 0;
}

Dlaczego program mi zapisuje inną liczbę niż wpisałem?

0
  1. Załóż jeszcze ze 3 takie same tematy.
  2. Naucz się programować, bo ten potworek co go tu wstawiłeś to do poprawnego programu nawet podobny nie jest.
0
tomcio1243 napisał(a):
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

class klasa{
public:
	double a;
	klasa(double a){                                  //1 funkcja & konstruktor
		do{	
			cout << "Podaj bok prostokata: ";
			cin >> a;
			if(a<=0)
				cout << "podaj liczbe dodatnia!" << endl;
		}
		while(a<=0);
	}
	klasa(klasa&wzor){
		wzor.a=a;
	}	
};

int main() {
	klasa bok(bok.a);
	klasa bo2(bok);
	cout << bok.a;
	cin.ignore();
	getchar();
	return 0;
}

Dlaczego program mi zapisuje inną liczbę niż wpisałem?

Hmmm, shalom niestety ma racje. Nie mówię tego po to żeby Cię obrazić, ale ten kod nie ma sensu.
1.cin.ignore() jest w ogóle nie potrzebne.
2.getchar() nic nie robisz z wynikiem
3.Nie tworzysz 1 konstruktora i 1 funkcji tylko 2 konstuktory. Jeśli chcesz mieć funkcję musisz mieć typ zwracany, i funkcja musi nazywać się inaczej niż sama klasa. Do tego argument tej "funkcji" jest nie z tego świata.
4.W konstruktorze nie wiem po co masz argument a jeśli i tak pytasz użytkownika o liczbę.
5.Nie powinieneś pytać o liczbę w konstruktorze.
6.Twój argument w konstruktorze powinien nazywać się inaczej niż pole twojej klasy(double a), lub przynajmniej używaj this.a.
7.klasa bok(bok.a), hmm, boje się zacząć nad tym myśleć bo mi głowa eksploduje.

Moje porady:
1.Poczytaj trochę kodu pisanego przez innych.
2.Zanim zaczniesz pisać program, rozrysuj sobie na kartce co i jak ma robić.

0
  1. Czemu cin.ignore nie jest potrzebne skoro używamy cin?
  2. czemu nie powinienem pytać użytkownika o liczbę w konstruktorze?
  3. Konstruktor nie jest funkcją/metodą?
    gdy napisze tak:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
 
class klasa{
public:
        double a;
        klasa(double _a){                                  //1 funkcja & konstruktor
                do{        
                        cout << "Podaj bok prostokata: ";
                        cin >> _a;
                        if(a<0)
                                cout << "podaj liczbe dodatnia!" << endl;
                }
                while(a<=0);
                a=_a;
        }        
};
 
int main() {
        klasa bok(bok.a);
        cout << bok.a;
        cin.ignore();
        getchar();
        return 0;
}

wtedy mi program dziala. Wiem że może wyszedłem na głupka ale muszę szybko to skończyć a jak na razie uczyłem się strukturalnie i obiektowy jest dla mnie nowy.

0
tomcio1243 napisał(a):
  1. Czemu cin.ignore nie jest potrzebne skoro używamy cin?
  2. czemu nie powinienem pytać użytkownika o liczbę w konstruktorze?
  3. Konstruktor nie jest funkcją/metodą?
    gdy napisze tak:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
 
class klasa{
public:
        double a;
        klasa(double _a){                                  //1 funkcja & konstruktor
                do{        
                        cout << "Podaj bok prostokata: ";
                        cin >> _a;
                        if(a<0)
                                cout << "podaj liczbe dodatnia!" << endl;
                }
                while(a<=0);
                a=_a;
        }        
};
 
int main() {
        klasa bok(bok.a);
        cout << bok.a;
        cin.ignore();
        getchar();
        return 0;
}

wtedy mi program dziala. Wiem że może wyszedłem na głupka ale muszę szybko to skończyć a jak na razie uczyłem się strukturalnie i obiektowy jest dla mnie nowy.

klasy z reguły mają być tylko strukturami danych, używanych do różnych rzeczy. Wkładając tam pytanie o liczbę rujnujesz te opcje. W klasie najlepiej tylko zarządzać jej polami/funkcjami, a poza nią pytać o dane i odpowiednie je do klasy wysyłać. Tak w ogóle to myślę że klasa w tym wypadku jest zbędna, mi to wygląda na perfekcyjnego kandydata na funkcję.

cin.ignore() robi coś innego niż myślisz. Jeśli masz wątpliwości użyj google, tam znajdziesz stroche cplusplus.com, a na niej wytłumaczone wszystkieg funkcje standardowych bibliotek(chyba).

Kod działa Ci dlatego że wcześniej kompilator nie wiedział o które a ci chodzi, czy o pole z klasy, czy o argument konstruktora.

0

Dobre sobie. Czy ty w ogóle rozumiesz co tu w tym kodzie robisz? Szczerze wątpię.
Nazwanie klasy "klasa" to aż szkoda gadać.
Konstruktor który przyjmuje argument a potem nic z nim nie robi (tzn używa go jako zmiennej lokalnej) -> WTF?
Wczytywanie wartości do zmiennej _a a potem porównywanie INNEJ zmiennej (pola obiektu klasy, który NIE MA nadanej wartości) -> WTF?
Podawanie jako argumentu konstruktora pola właśnie konstruowanego obiektu -> WTF?

0
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

class liczba{
public:
	double a, b;
	liczba (){
		cout << "Konstruktor na zyczenie" << endl;           //konstruktor
	}
	liczba(liczba&wzor){
		cout << "Konstruktor kopiujacy na zyczenie" << endl; //konstruktor
		a=wzor.a;                                            //poczatkowy
		b=wzor.b;
	}
	void dodatnia(double &a){                              //1 metoda
		do{
			cout << "wpisz bok: ";
			cin >> a;
			if(a<=0)
				cout << "podaj liczbe dodatnia!" << endl;
		}
		while (a<=0);
	}
	double oblicz(double a, double b){                       //2 metoda
		return sqrt(a*a+b*b);
	}
	void wypisz(double a, double b){                         //3 metoda
		cout << "przekatna: " << oblicz(a,b);
	}
};

int main() {
	liczba bok;
	bok.dodatnia(bok.a);
	bok.dodatnia(bok.b);
	liczba bok2 (bok);
	bok.wypisz(bok2.a,bok.b);
	cin.ignore();
	getchar();
	return 0;
}

teraz dobrze?

0
tomcio1243 napisał(a):
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

class liczba{
public:
	double a, b;
	liczba (){
		cout << "Konstruktor na zyczenie" << endl;           //konstruktor
	}
	liczba(liczba&wzor){
		cout << "Konstruktor kopiujacy na zyczenie" << endl; //konstruktor
		a=wzor.a;                                            //poczatkowy
		b=wzor.b;
	}
	void dodatnia(double &a){                              //1 metoda
		do{
			cout << "wpisz bok: ";
			cin >> a;
			if(a<=0)
				cout << "podaj liczbe dodatnia!" << endl;
		}
		while (a<=0);
	}
	double oblicz(double a, double b){                       //2 metoda
		return sqrt(a*a+b*b);
	}
	void wypisz(double a, double b){                         //3 metoda
		cout << "przekatna: " << oblicz(a,b);
	}
};

int main() {
	liczba bok;
	bok.dodatnia(bok.a);
	bok.dodatnia(bok.b);
	liczba bok2 (bok);
	bok.wypisz(bok2.a,bok.b);
	cin.ignore();
	getchar();
	return 0;
}

teraz dobrze?

Nadal nie masz pojecia co robisz.
Tworzysz obiekt bok, ktory w swoich skladowych zawiera smieci, nastepnie uzywasz tych smieci do tworzenia innych obiektow. Sam konstruktor kopiujacy jest w miare poprawny, ale kontruktor zwykly sluzy do inicjalizacji zmiennych czy to wartoscia stala czasu kompilacji czy podana przez uzytkownika. Metoda wypisz nie powinna przyjmowac zadnych argumentow bo to bezsensu. Powinna natomiast wypisywac wynik dzialania na skladowych klasy. Metoda oblicz jest uzywana jedynie w innych skladowych klasa, wiec powinna byc prywytna. Metoda dodatnia to jakis potworek i nie mam pojecia co chcesz osiagnac tworzac ja. Mam nieodparte wrazenie, ze kiepsko sobie radzisz z samymi zmiennymi, czy warto Od razu sie rzucac na klasy?

1

Aż mi słabo jak widzę ten kod

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

class Rectangle{

private:
        double a;
        double b;
public:
        Rectangle (double a, double b){
                this->a = a;
                this->b = b;
        }
        Rectangle(Rectangle& pattern){
                a=pattern.a;
                b=pattern.b;
        }
        void setA(double a){
            this->a=a;
        }
        void setB(double b){
            this->b =b;
        }
        double getDiagonal(){
                return sqrt(a*a+b*b);
        }
        void print(){
                cout<<a<<" "<<b<<endl;
        }
};

int main() {
        double x,y;
        cin>>x>>y;
        Rectangle r1(x,y);
        Rectangle r2(r1);
        r1.print();
        r2.print();
        cout<<r1.getDiagonal()<<" "<<r2.getDiagonal();
        cin.ignore();
        cin.get();
        return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1