Niewypisywanie wyniku do pliku .txt

0

Nie wypisuje się wynik w Out.txt. Pliki oczywiście istnieją. Czy moglibyście zweryfikować kod?

#include <iostream>
#include <fstream>
#include <list>
#include <sstream>
using namespace std;

class Edge
{
public:
    int weight;
    int p1,p2;
    Edge()
    {
        weight=0;
        p1=0;
        p2=0;
    }
    Edge(int _weight , int _p1, int _p2)
    {
        weight=_weight;
        p1=_p1;
        p2=_p2;
    }

    void wypisz()
    {
        cout  << "waga="<< weight << " p1=" <<p1 << " p2="<< p2 <<" " << endl;
    }
};

Edge *pom;

void scal(Edge tab[], int lewy, int srodek, int prawy)
{
    int i = lewy, j = srodek + 1;
    for(int i = lewy;i<=prawy; i++)
        pom[i] = tab[i];
    for(int k=lewy;k<=prawy;k++)
        if(i<=srodek)
            if(j <= prawy)
                if(pom[j].weight<pom[i].weight)
                    tab[k] = pom[j++];
                else
                    tab[k] = pom[i++];
            else
                tab[k] = pom[i++];
        else
            tab[k] = pom[j++];
}

void sortowanie_przez_scalanie(Edge tab[],int lewy, int prawy)
{
    if(prawy<=lewy) return;
    int srodek = (prawy+lewy)/2;
    sortowanie_przez_scalanie(tab, lewy, srodek);
    sortowanie_przez_scalanie(tab, srodek+1, prawy);
    scal(tab, lewy, srodek, prawy);
}

class Kruskal
{
public:
    Edge * wynik;
    int sumaD=0;
    Kruskal (Edge *tab, int w,int m)
    {
        int * zbiory = new int  [w+1];
        wynik = new Edge [w-1];
        int wierzcholek=0;

        for(int x=0; x<w+1; x++) {
            cout << zbiory[x] << endl;
        }

        for (int i = 0 ; i < m;i++ )
        {
            if (wierzcholek == w-1)
            {
                break;
            }
            if(zbiory[tab[i].p1] == 0 || zbiory[tab[i].p1] != zbiory[tab[i].p2])
            {
                wynik[wierzcholek] = tab[i];
                sumaD += tab[i].weight;
                wierzcholek++;
                if(zbiory[tab[i].p1] !=0 || zbiory[tab[i].p2] !=0)
                {
                    int zbior1 = zbiory[tab[i].p1];
                    int zbior2 = zbiory[tab[i].p2];
                    for (int j = 0 ; j< w; j ++)
                    {
                        if(zbiory[j] != 0 &&(zbiory[j] == zbior1 || zbiory[j] == zbior2))
                        {
                            zbiory[j]=wierzcholek;
                        }
                    }
                }
                zbiory[tab[i].p1]=wierzcholek;
                zbiory[tab[i].p2]=wierzcholek;
            }
        }
    }
};
int main()
{
    fstream plik;
    plik.open("In.txt",ios::in);
    if(plik.good()== false)
    {
        cout << "nie otwiera sie plik " ;
        return 1;
    }
    int n,m;
    plik >> n >> m;
    Edge * Krawedzie = new Edge [2*m];
    string buffor;
    int liczba1,liczba2,licz=0;
    char b;
    for (int i =0 ; i <= n; i++)
    {
        getline(plik,buffor);
        istringstream zmienna(buffor);
        cout << buffor<< endl;
        while (zmienna >> liczba1)
        {
            zmienna >> liczba2;
            zmienna >> b;
            Krawedzie[licz].weight = liczba2;
            Krawedzie[licz].p1 = i;
            Krawedzie[licz].p2 = liczba1;
            licz++;
        }
    }
    pom = new Edge [2*m];
    sortowanie_przez_scalanie(Krawedzie,0,(2*m)-1);
    for (int i = 0 ; i < 2*m ;i++)
    {
        Krawedzie[i].wypisz();
    }
    delete [] pom ;
    plik.close();
    plik.open("Out.txt",ios::out);
    if(plik.good()== false)
    {
        cout << "nie otwiera sie plik " ;
        return 1;
    }
    Kruskal kru(Krawedzie,n,2*m);
    plik << kru.sumaD << endl;
    for (int i = 0 ; i < n-1 ; i++)
    {
        plik << kru.wynik[i].p1 << " " <<  kru.wynik[i].p2 << " [" << kru.wynik[i].weight << "],";
    }
    plik.close();
    return 0;
}

5
  1. main ma być prosty tak konstrukcja cepa. Np wywołąnie 3 fuknci: wczytajDane, wyznaczMinimalneDrzewo, zapiszMinimalneDrzewo. Jeśli main ma coś bardziej skomplikowanego, to nie da się tego przetestować.
  2. Jak będziesz miał takie małe funkcje, będzie można napisać testy sprawdzające ich postawność.
  3. Twój kod wczytujący dane nie pokrywa się z treścią zadania. W treści nie ma nic o tym, że liczba krawędzi jest podana jawnie (twój kod to zakłada). Mało tego, dalsze wczytywanie danych też, nie ma też nic wspólnego z treścią, bo z lini wczytujesz trójki liczb, zamiast par.
  4. użycie gerline zaraz po operatorze strumieniowym >> prowadzi do wielu nieporozumień. Ten błąd, ukryty jest przez błąd z punktu 3.

I jeszcze przykład jest niespójny.
W kilku linijkach (pierwsze 4) są przecinki, w innych (pozostałych) nie ma. W treści nie ma nic na ten temat.

https://godbolt.org/z/vdE8n7nhe

1

Dobra dziś dzień z toolami

  1. Wrzuciłem twój kod do cppcheck
    cppcheck --enable=all --suppress=missingIncludeSystem 4p.cpp
    widzę ciekawe rzeczy np.
    4p.cpp21: error: Memory is allocated but not initialized: zbiory [uninitdata]
    cout << zbiory[x] << endl;
    4p.cpp9: note: Shadowed declaration
    int i = lewy, j = srodek + 1;

puść sobie ten kod przez cppcheck tak jak pokazałem.

  1. puść to przez debbuger i krok po kroku nie wiem czego tam używasz ale szukaj w ide nazwy debbuger i na google.

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