Program sam coś wpisuje do pliku...

0

Może ktoś oświecić biednego Puchatka, dlaczego po wykonaniu programu, którego kod znajduje isę poniżej dla wartości zmiennej liczba = 10 i zawartości pliku tabela.txt
1
10

Zawartość tabeli.txt zmienia się na
11
10

Pierwsza liczba w pliku jest równa ilości wszystkich pozaostałych liczb, a pozostale liczby są uporządkowane w niemalejącym porządku. Program ma za zadanie tak wstawić liczbę liczba przy użyciu najmniejszej możliwej liczby porównań aby nie złamało to porządku szyku. Jeżeli liczba już występuje w zbiorze to ma on to napisać i nic nie zmieniać. I własnie tu jest problem. Całe przypiorządkowanie działa poprawnie, ale jeżeli liczba już jest w pliku, to dzieją się troche dziwne rzeczy jak np własnie zmiana z 1 /n 10 na 11 /n 10...
W programie jest dużo trochę niepotrzebnych linijek, które pomagały mi isę orientować w czasie pisania gdzie mogą być błędy.
Oto kod programu:

#include <iostream.h>
#include <fstream.h>

void wstawiaj(char* nazwa)
{
fstream plik ;
plik.open(nazwa, ios::in | ios::out | ios::ate) ;
plik.seekg(0) ;

float ilosc_liczb ;
plik >> ilosc_liczb ;
int i_liczb = int(ilosc_liczb) ;
double *tablica ;
tablica = new double[i_liczb] ;
//===========
// wczytanie liczb
//==========
for(int i = 0 ; i < i_liczb ; i++) // wczytanie wszystkich liczn
{
plik >> tablica[i] ;
cout << tablica[i] << endl ;
}

cout << "Tablica wczytana\n" ;
cout << "Ilosc liczb = " << ilosc_liczb << "\n" ;

plik.close() ;

int liczba ;
cin >> liczba ;

cout << "Wykreowanie i zapelnienie nowej tablicy\n" ;
//=============
// tworzenie potrzebne do odpowiedniej pracy talicy_a
//=============
int ilosc_liczb_a = i_liczb + 1 ;
double *tablica_a ;
tablica_a = new double[ilosc_liczb_a] ;
tablica_a[0] = 0 ;
for(int i = 1 ; i < ilosc_liczb_a ; i++)
{
tablica_a[i] = tablica[i-1] ;
cout << tablica_a[i] << endl ;
}
//===============
// właściwa operacja ustalania miejsca w szeregu dla liczby
//==============
int p ;
cin >> p ;
cout << "Zapisalem wszystko do nowet tablicy_a\n" ;
int przedzial ;
float pomocna_a = ilosc_liczb / 2 ;
int pomocna_b = (int)pomocna_a ;
if((pomocna_b + 0.5) == pomocna_a)
{
przedzial = int(pomocna_b) + 1 ;
}
else { przedzial = pomocna_b ; }
cout << "Przedzial = " << przedzial << "\n" ;
float zmienna = przedzial ;
int pomocnicza = (int)zmienna ;
int zaokroglona = (int)zmienna ;
enum akcja {
ustalam = 1 ,
ustalilem = 2 ,
mala_liczba = 3 ,
duza_liczba = 4 ,
taka_juz_jest = 5 } ;
akcja ustalona ;
ustalona = ustalam ;

while(ustalona == ustalam)
{     
        // w razie gdy zakroglona == 0, więc już ustalona pozycja.
            if(zaokroglona == 0 )
               {
                  cout << "Zaokroglona rowna jest 0, ustawiam ustalona na "
                            "ustalilem!\n" ;
                  ustalona = ustalilem ;
                  continue ;
               }
               
            if(liczba == tablica_a[przedzial])
            {
                            ustalona = taka_juz_jest ;
                            cout << "Ta liczba juz jest w zbiorze\n" ;
                            continue ;
            }
    // w razie gdzy liczba mniejsza od porównywanej
    if(liczba < tablica_a[przedzial])
    {               
            zmienna = zmienna / 2 ;
            pomocnicza = (int)zmienna ;
            if((pomocnicza + 0.5) <= zmienna)
            {
                            zaokroglona = (int)zmienna + 1 ;
            } else { zaokroglona = (int)zmienna ; }
            
            przedzial = przedzial - zaokroglona ;
            cout << "Zmniejszam przedzial o " << zaokroglona << "\n"
                 << "Przedzial rowny jest teraz " << przedzial << "\n" ;
            if(przedzial <= 0 ) { ustalona = mala_liczba ; continue ; }
    }
            // w razie gdzy liczba większa od porównywanej
            if(liczba > tablica_a[przedzial])
    {
            zmienna = zmienna / 2 ;
            pomocnicza = (int)zmienna ;
            if((pomocnicza + 0.5) <= zmienna)
            {
                            zaokroglona = (int)zmienna + 1 ;
            } else { zaokroglona = pomocnicza; }
            
            przedzial = przedzial + zaokroglona ;
            cout << "Zwiekszam przedzial o " << zaokroglona << "\n" 
                 << "Przedzial rowny jest teraz " << przedzial << "\n" ;                               
            if(przedzial > ilosc_liczb ) { ustalona = duza_liczba ; 
                                                           continue ; }
    if( (ilosc_liczb_a <= przedzial) && (liczba > tablica_a[przedzial]) )
            {
                            ustalona = duza_liczba ; continue ;
            }
            continue ;              
   }
}

//======================================
// liczba powinna mieć już ustalone miejsce w szeregu
//======================================
double *nowa_tablica ;
nowa_tablica = new double[ilosc_liczb_a] ;

if(ustalona == mala_liczba)
{
    nowa_tablica[0] = liczba ;
    for(int i = 1 ; i < ilosc_liczb_a ; i++)
    {
            nowa_tablica[i] = tablica[i-1] ;
    }    
}

if(ustalona == duza_liczba)
{
    for(int i = 0 ; i < i_liczb ; i++)
    {
            nowa_tablica[i] = tablica[i] ;
    }
    nowa_tablica[i_liczb] = liczba ;
}

// jeseli ustalona == ustalilem, to tablica_a[przedzial] jest najmniejszą
// liczbą większą od chcianej zmiennej 'liczba'
if(ustalona == ustalilem)
{
    for(int i = 0 ; i <= (przedzial - 1) ; i++)
    {
            nowa_tablica[i] = tablica[i] ;
    }
    nowa_tablica[przedzial] = liczba ;
    for(int i = (przedzial + 1) ; i < ilosc_liczb_a ; i++)
    {
            nowa_tablica[i] = tablica_a[i] ;
    }
    if(nowa_tablica[przedzial] < nowa_tablica[przedzial - 1])
    {
            double chwilowa = nowa_tablica[przedzial - 1] ;
            nowa_tablica[przedzial - 1] = nowa_tablica[przedzial] ;
            nowa_tablica[przedzial] = chwilowa ;
            
    }
}
    if(ustalona - taka_juz_jest)
    {
    fstream plik_b(nazwa, ios::out) ;
    plik_b << ilosc_liczb_a << endl ;
    for(int i = 0 ; i < ilosc_liczb_a ; i++)
        {
            cout << "Teraz wpisuje " << nowa_tablica[i] << endl ;
             plik_b << nowa_tablica[i] << endl ;
        }
    }         

delete tablica ;
delete tablica_a ;
delete nowa_tablica ;

int pb ;
cin >> pb ;

}

main()
{
wstawiaj("tabela.txt") ;
}

Chciałbym zwrócić uwagę, że w wypadku gdy ustawiona == taka_juz_jest to przeceiż jeden strumień jest zamknięty, adrugi nie utworzony, więc naprawdę nie wiem jak to się dzieje, że coś tm jest dopisywane.

LAST MINUTE - tak mi przyszlo do glowy, e moze to coś błędnego z przepisywaniem do tablicy, choć to by bylo dziwne i tak, a ponowne wpisywanie ( którego nie ma gdy ustawiona == taka_juz_jest ) to naprawia. Ale to by oznaczao, że program robi za moimi plecami rzeczy których mu nie kazałem. Cham jeden :p

0

eee... to nie wiesz co robi kod, który sam napisałeś? :|
użyj debugera, to się dowiesz co powoduje błąd, a nie wklejasz milion linijek z nadzieją, że ktoś je zrozumie lepiej od ciebie ;]

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