Podział na pliki źródłowe

0

Zacznijmy od tego, że jestem totalnie zielona. Mam problem z podziałem programu na pliki źródłowe. Sama baza danych działa jak trzeba, ale jak muszę ją podzielić, wyskakuje masa błędów i tu pojawia się błąd logiczny, ponieważ przykłady z internetu wydają się łatwe, ale jak u siebie mam int, masę ifów i wszystkiego, to wychodzi jakieś masło. Przykładowo, jak to rozdzielić na plik .hpp i .cpp?

if(i==3)
{
    fstream pacj_file;
    cout<<"\n\nWpisz nazwisko pacjenta: ";
    cin.ignore();
    gets(fname);
    system("cls");
	pacj_file.open(fname, ios::in);
		if(!pacj_file)
		{
		cout<<"\nError while opening the file\n";goto b;
		}
		else
		{
		    cout<<"\n\n\n\n\t\t\t\t....... Pelna historia medyczna pacjenta o nazwisku  "<<fname<<" ......\n\n\n\n";
		    string info;
			while(pacj_file.good())
			{
			getline(pacj_file,info);
			cout<<info<<"\n";
			}
			cout<<"\n";
        }
        system("pause");
        system("cls");
        goto b;
}


3

Żeby rozdzielić na pliki i pliki nagłówkowe to musisz mieć jakieś klasy i metody. Żeby rozdzielić na klasy wydziel sobie na przykład logikę interakcji z użytkownikiem i prezentacji (czyli wszelki cin i couty) od logiki aplikacji (czyli na przykład czytania z pliku). Tutaj za dużo tej logiki nie ma więc będzie to trochę na siłę, właściwie można tu jedynie zrobić jakiś wrapper na fstream. Będzie miał więcej sensu gdy nie będziesz czytać z pliku stringa tylko jakąś strukturę.

  1. Nie używaj goto, gdybyś opakowała to w funkcje to nie musiałabyś skakać w losowe miejsca kodu i byłby bardziej uporządkowany, ale tutaj nawet nie widzę etykiety "b"
  2. "masło"? raczej mówi się spaghetti
0

@Marcelina.7252: Żeby wydzielić coś do osobnego pliku to coś musi być modularne, nie widzę abyś posiadała tu jakiekolwiek funkcje/klasy, których wydzielenie byłoby możliwe.
Poza tym twój kod to jakaś dziwna mieszanina C i C++, którego w końcu języka chcesz użyć w projekcie?

0
Eldorad O. napisał(a):

@Marcelina.7252: Żeby wydzielić coś do osobnego pliku to coś musi być modularne, nie widzę abyś posiadała tu jakiekolwiek funkcje/klasy, których wydzielenie byłoby możliwe.
Poza tym twój kod to jakaś dziwna mieszanina C i C++, którego w końcu języka chcesz użyć w projekcie?

Może wstawię cały kod, jaki mam, to będzie łatwiej zrozumieć o co chodzi. A co do mieszaniny C z C++ to cóż, na zajęciach na studiach wygląda to dokładnie tak samo.

0

zrób se chociażby klasę pacjent - już masz co wydzielać

moja propozycja

plik pacjent.h

class Pacjent
{
public:
  Pacjent();
  
  void setImie(string &imie);
  void setNazwisko(string &nazwisko);
  void setWiek(int &wiek);
  void setPlec(char &plec);
  
  string imie();
  string nazwisko();
  int wiek();
  char plec();
  
private:
  string imie;
  string nazwisko;
  int wiek;
  char plec;

  //dodaj se co tu chcesz
}

plik pacjent.cpp

Pacjent::Pacjent()
{
  this->imie=string();
  this->nazwisko=string();
  this->wiek=0;
  this->plec='';
}

void Pacjent::setImie(string &imie)
{
  //costam
}

//reszta metod
0
zkubinski napisał(a):

zrób se chociażby klasę pacjent - już masz co wydzielać

moja propozycja

plik pacjent.h

class Pacjent
{
public:
  Pacjent();
  
  void setImie(string &imie);
  void setNazwisko(string &nazwisko);
  void setWiek(int &wiek);
  void setPlec(char &plec);
  
  string imie();
  string nazwisko();
  int wiek();
  char plec();
  
private:
  string imie;
  string nazwisko;
  int wiek;
  char plec;

  //dodaj se co tu chcesz
}

Dobra, a bez tworzenia klas da się z tego coś sensownie wydzielić? Problem polega na tym, że to pierwsza część projektu, więc ma być prosta, a drugim projektem jest dopiero przekształcenie go i dodanie klas itd, dlatego cały program jest napisany jak dla głupiego.

1

I kazali to rozdzielić na pliki przed podziałem na klasy? No cóż, chyba można to zrobić - masz osobne funkcje a to już coś, więc możesz niektóre przenieść do innych plików i potem je includować

0
obscurity napisał(a):

I kazali to rozdzielić na pliki przed podziałem na klasy? No cóż, chyba można to zrobić - masz osobne funkcje a to już coś, więc możesz niektóre przenieść do innych plików i potem je includować

Czy mógłbyś w takim razie nakierować mnie, jak to zrobić? Nie mam pewności które momenty mam "powycinać" do plików.

0
obscurity napisał(a):

https://learn.microsoft.com/pl-pl/cpp/cpp/declarations-and-definitions-cpp?view=msvc-170
do hpp ładujesz deklaracje, do cpp definicje

A jak powinien być rozdzielony ten kawałek? If(==1) zostaje w main.cpp?

{

  ofstream pacj_file;
  char fname[20];
  cout<<"\n\n\n\n Wpisz nazwisko pacjenta: ";
  gets(fname);
  pacj_file.open(fname);
  		if(!fname)
		{
		cout<<"\n Blad podczas otwierania\n";goto b;
		}
		else
		{
                        struct pacj_info
                        {
                            char imie[20];
                            char nazwisko[100];
                            char numer[10];
                            char wiek[5];
                            char plec[8];
                            char grupa_krwi[5];
                            char PESEL[15];
                        };

            pacj_info ak;
            cout<<"\n********************************************************************\n";pacj_file<<"\n********************************************************************\n\n";//fn1353 st
            cout<<"\nImie: ";pacj_file<<"Imie: ";gets(ak.imie);pacj_file<<ak.imie<<"\n";
            cout<<"\nNazwisko: "; pacj_file<<"Nazwisko: ";gets(ak.nazwisko);pacj_file<<ak.nazwisko<<"\n";
            cout<<"\nNumer telefonu: ";pacj_file<<"Numer telefonu: ";gets(ak.numer);pacj_file<<ak.numer<<"\n";
            cout<<"\nWiek: ";pacj_file<<"Wiek: ";gets(ak.wiek);pacj_file<<ak.wiek<<"\n";
            cout<<"\nPlec: ";pacj_file<<"Plec: ";gets(ak.plec);pacj_file<<ak.plec<<"\n";
            cout<<"\nGrupa: ";pacj_file<<"Grupa krwi: ";gets(ak.grupa_krwi);pacj_file<<ak.grupa_krwi<<"\n";
            cout<<"\nPESEL: ";pacj_file<<"PESEL: ";gets(ak.PESEL);pacj_file<<ak.PESEL<<"\n";
            cout<<"\n********************************************************************\n";pacj_file<<"\n********************************************************************\n\n";
            cout<<"\nInformacje zapisano pomyslnie\n";
            }
  system("pause");
  system("cls");
  goto b;

}

1

Ja bym zaczął od czegoś takiego:

struct pacj_info {
    char imie[20];
    char nazwisko[100];
    char numer[10];
    char wiek[5];
    char plec[8];
    char grupa_krwi[5];
    char PESEL[15];
};

void read_pacjent(pacj_info *info) {
    cout << "\n********************************************************************\n";
    cout << "\nImie: ";
    gets(ak->imie);
    cout << "\nNazwisko: ";
    gets(ak->nazwisko);
    cout << "\nNumer telefonu: ";
    gets(ak->numer);
    cout << "\nWiek: ";
    gets(ak->wiek);
    cout << "\nPlec: ";
    gets(ak->plec);
    cout << "\nGrupa: ";
    gets(ak->grupa_krwi);
    cout << "\nPESEL: ";
    gets(ak->PESEL);
    cout << "\n********************************************************************\n";
}

void save_pacjent(pacj_info *info, ofstream &pacj_file) {
    pacj_file << "Imie: " << ak->imie << "\n";
    pacj_file << "Nazwisko: " << ak->nazwisko << "\n";
    pacj_file << "Numer telefonu: " << ak->numer << "\n";
    pacj_file << "Wiek: " << ak->wiek << "\n";
    pacj_file << "Plec: " << ak->plec << "\n";
    pacj_file << "Grupa krwi: " << ak->grupa_krwi << "\n";
    pacj_file << "PESEL: " << ak->PESEL << "\n";
    pacj_file << "\n********************************************************************\n\n";
}
void wait_for_click_and_clear() {
    system("pause");
    system("cls");
}

// A to dopiero w środku maina
{
    char fname[20];
    cout << "\n\n\n\n Wpisz nazwisko pacjenta: ";
    gets(fname);
    ofstream pacj_file(fname);
    if (!fname) {
        cout << "\n Blad podczas otwierania\n";
        goto b;
    } else {
        pacj_info ak;
        read_pacjent(&ak);
        save_pacjent(&ak, pacj_file);
        cout << "\nInformacje zapisano pomyslnie\n";
    }
    wait_for_click_and_clear();
    goto b;
}

Dodałbym, że całkiem prawdobodobne, że dasz radę pozbyć się tych goto. No ale to musisz przedstawić cały kod.

0

@Marcelina.7252:

specjalnie dla ciebie podział funkcji na pliki

taki mały przykład

plik test.h

void funkcja();

struct foo{
    int z;
};

plik test.hpp

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

using namespace std;

void funkcja()
{
    foo zmienna;
    zmienna.z=98;

    std::cout << "funkcja z zewnatrz ma zmienna " << zmienna.z << std::endl;
}


plik main.cpp

#include "test.h"

using namespace std;

int main()
{
    funkcja();
}
1
zkubinski napisał(a):

plik test.cpp

#include <iostream> //żeby nie waliło błędami - może być i bez tego

void funkcja()
{
    std::cout << "funkcja z zewnatrz" << std::endl;
}

plik main.cpp

#include "test.cpp"

using namespace std;

void funkcja();

int main()
{
    funkcja();
}
  1. Po kiego ci void funkcja(); skoro wcześniej załączyłeś całą funkcję za pomocą #include "test.cpp"
  2. Rozważ dwa dodatkowe pliki testA.cpp z funkcją funkcjaA() która coś wypisuje a potem wywołuję funkcja() z test.cpp oraz testB.cpp z funkcją funkcjaB() która coś wypisuje a potem wywołuję funkcja() z test.cpp chcę zobaczyć jak ty to zepniesz, podpowiem że da się za pomocą chamskich #include "cos_tam.cpp" ale jak zobaczysz co tracisz zaś co zyskujesz to zrozumiesz czemu @enedil mówi usunąć to. Zaś jak nie dasz rady tego spiąć tak aby się kompilowało to weź to usuń! (jak dasz rady to sam zechcesz usunąć :D )

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