Nauka c++ co można poprawić

wazer | 2021-02-17 10:25:21 UTC | #1

co można zrobić lepiej?
czemu nie działa przestrzeń nazw, którą chciałem użyć w obliczenia.h>
dlaczego program najpierw pyta o liczba 2, a nie odwrotnie
opcja:1
Podaj liczbe: 2:5.4
Podaj liczbe: 1:2.5
main.cpp:

//c++ 20
#include <iostream>
#include "obliczenia.h"

using namespace std;

int main() {
    //constexpr string szMessage {"Podaj liczbe:"};
    //constexpr char szMessage[] = {"Podaj liczbe:"};
    const string szMessage{"Podaj liczbe:"};
    while (true) {
        switch (iGetInteger("1.prostokat0.wyjdz\nopcja:")) {
            case 1:
                switch (iGetInteger("1.obwod \n2.pole \nopcja:")) {
                    case 1:
                        cout << (dblObwodProstokat(dblGetDouble(szMessage + " 1:"), dblGetDouble(szMessage + " 2:")))
                             << endl;
                        break;
                    case 2:
                        cout << (dblPoleProstokat(dblGetDouble(szMessage + " 1:"), dblGetDouble(szMessage + " 2:")))
                             << endl;
                        break;
                    default:
                        cout << "nie znaleziono takiej opcji";
                        break;
                }
                break;
            case 0:
                return 0;
                break;
            default:
                cout << "nie znaleziono takiej opcji";
                break;
        }
    }
}

obliczenia.cpp:
#include

using namespace std;

int iGetInteger(const string &szMessage) {
    int iNumber;
    cout << szMessage;
    cin >> iNumber;
    return iNumber;
}

double dblGetDouble(const string &szMessage) {
    double dblNumber;
    cout << szMessage;
    cin >> dblNumber;
    return dblNumber;
}

double dblObwodProstokat(double dblNumber1, double dblNumber2 = 898766.0) {
    if(dblNumber2==898766.0)dblNumber2=dblNumber1;
    if (dblNumber1 > 0.0 && dblNumber2 > 0.0) {
        return 2 * dblNumber1 + 2 * dblNumber2;
    }
    return 0;
}

double dblPoleProstokat(double dblNumber1, double dblNumber2) {
    if (dblNumber1 > 0 && dblNumber2 > 0) {
        return dblNumber1 * dblNumber2;
    }
    return 0;
}

obliczenia.h:

#include
using namespace std;

ifndef UNTITLEDOBLICZENIAH

define UNTITLEDOBLICZENIAH

//namespace obliczenia {
int iGetInteger(const string &szMessage);

double dblGetDouble(const string &szMessage);

double dblObwodProstokat(double dblNumber1, double dblNumber2 = 898766.0);

double dblPoleProstokat(double dblNumber1, double dblNumber2);
//}

endif //UNTITLEDOBLICZENIAH


wazer | 2020-11-09 19:56:58 UTC | #3

link do pobrania
projekt.7z


KrEdEnS | 2020-11-09 19:59:14 UTC | #4

@wazer Jeżeli możesz wrzuć w temat pliki:

image|227x79

image|133x76

image|690x293


wazer | 2020-11-09 20:05:38 UTC | #5

nie da się
pisało że nie mogę


mloskot | 2020-11-12 11:04:28 UTC | #6

Ponieważ w obliczenia.cpp nie definiujesz niczego w przestrzeni obliczenia.
‘Opakuj’ wszystkie definicje w namespace obliczenia { oraz } podobnie jak to zrobiłeś w nagłówku obliczenia.h.

Dodatkowo, w plikach nagłówkowych unikaj using namespace std importujące definicje z std do globalnej przestrzeni.


wazer | 2020-11-11 16:35:27 UTC | #7

[quote=”wazer, post:1, topic:16669”]
rw pyta o liczba 2, a nie odwrotnie
[/quote]
Umieściłem definicje w przestrzeni nazw obliczenia, tak jak pisałeś i działa :slight_smile:
mam jeszcze trzy dodatkowe pytanie
Dlaczego w linii 9 main.cpp zmienna szMessage nie może być constexpr?

Usunąłem using namespace std z pliku nagłówkowego obliczenia.h i dodałem do stringów std::, wszystko działa :+1:

Spróbowałem usunąć dyrektywe #include z obliczenia.h i wszystko działa bez problemu
Dlaczego po usunięciu dyrektywy include z pliku nagłówkowego wszystkie deklaracje funkcji z argumentami string działają bez problemu?

Dlaczego jak usunę #include z main.cpp to w pliku obliczenia.h deklaracje stringów już nie działają ?
Spodziewałem się że plik main.cpp nie będzie miał wpływu na obliczenia.h i nie będzie działał tylko plik main.cpp


mloskot | 2020-11-12 11:04:28 UTC | #8

[quote=”wazer, post:7, topic:16669, full:true”]
Dlaczego w linii 9 main.cpp zmienna szMessage nie może być constexpr?
[/quote]

Może być, zobacz tu https://godbolt.org/z/P99eaq

Może używasz kompilatora bez wsparcia C++11 lub kompilujesz bez odpowiedniej opcji (e.g. -std=c++11).

[quote=”wazer, post:7, topic:16669, full:true”]
Spróbowałem usunąć dyrektywe #include z obliczenia.h i wszystko działa bez problemu
Dlaczego po usunięciu dyrektywy include z pliku nagłówkowego wszystkie deklaracje funkcji z argumentami string działają bez problemu?
Dlaczego jak usunę #include z main.cpp to w pliku obliczenia.h deklaracje stringów już nie działają ?
[/quote]

Ponieważ w main.cpp masz #include <iostream> przed swoim nagłówkiem:

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

a <iostream> sam dołącza <string>.


system | 2021-02-17 10:31:44 UTC | #9

Ten temat został automatycznie zamknięty 32 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.