2015-11-24 21 views
0

我想我的問題很微不足道,但不幸的是(可能是因爲我真的很累),我自己找不到解決方案。那麼,我的程序會生成我想寫入文本文件連續行的結果,因爲我需要從它們創建一個圖。不幸的是,就我而言,通過刪除以前的結果將每個結果保存在同一行中。你能幫我改進這個代碼嗎?謝謝。將結果寫入文件時,我無法過渡到新行

#include <iostream> 
#include <cstring> 
#include <ctime> 
#include <cstdlib> 
#include <cmath> 
#include <vector> 
#include <fstream> 

using namespace std; 

int fp(int x, int y) 
{ 
    return (x<=y); 
} 

void sort_shell(int *tablica, int ilosc) 
{ 
    int licznik=0; 
    int h; 
    int i; 
    int temp; 
    int c=1; 
    fstream plik; 
    for (h=1; h<=ilosc/9; h=ilosc/pow(2,h)); 
    c++; 

    for(; h>0; h /= 3) 
    { 
     for (i=h; i<ilosc; i++) 
     { 
      int j; 
      temp = tablica[i]; 
      for (j = i-h ; j>=0; j -=h) 
      { 
       if (temp <=tablica[j]) 
       { 
        tablica[j+h] = tablica[j]; 
        licznik++; 
       } 
       else 
        break; 
      } 
      tablica[j+h] = temp; 
     } 
    } 


    /*cout << "\nPo sortowaniu Shellem." << endl; 
    for(i=0; i<ilosc; i++) 
    { 
     cout << tablica[i] << "\t"; 
    }*/ 
    plik.open("shell.txt", std::ios::in | std::ios::out); 
    if(plik.good() == true) 
    { 
     plik << licznik << "\n"; 

     plik.close(); 
    } 

    //cout << "\nIlosc operacji :" << licznik << "\n"; 
} 

void sort_hibbard(int x[], int n) 
{ 
    int i, j,k, increment, temp,licznik=0; 
    long swp=0, comp=0; 
    int val; 
    fstream plik; 
    val=log(n+1)/log(2); 
    increment =pow(2,val)-1; 
    while (increment > 0) 
    { 
     for (i=0; i<increment; i++) 
     { 
      for(j=0; j<n; j+=increment) 
      { 
       temp=x[j]; 
       for(k=j-increment; k>=0&&temp<x[k]; k-=increment) 
       { 
        comp++; 
        swp++; 
        x[k+increment]=x[k]; 
        licznik++; 
       } 
       x[k+increment]=temp; 
       swp++; 
       licznik++; 
      } 
     } 
     comp++; 
     val--; 
     if(increment!=1) 
      increment=pow(2,val)-1; 
     else 
      increment = 0; 
    } 
    /*cout << "\nPo sortowaniu Hibbardem." << endl; 
    for(i=0; i<n; i++) 
    { 
     cout << x[i] << "\t"; 
    }*/ 
    plik.open("hibbard.txt", std::ios::in | std::ios::out); 
    if(plik.good() == true) 
    { 
     plik << licznik << "\n"; 
     plik.close(); 
    } 

    //cout << "\nIlosc operacji :" << licznik << "\n"; 
} 


void sort_sedgewick(int *tablica, int ilosc) 
{ 
    int h = 0, i, g, t, j; 
    int c = 1; 
    int licznik = 0; 
    int temp; 
    fstream plik; 
    vector <int> tmp; 
    tmp.push_back(h); 
    do 
    { 
     h = (pow(4,c) + (3 * pow(2,c-1)) + 1); // funkcja z wikipedi O(N^4/3) 
     tmp.push_back(h); 
     if(h < ilosc) c++; 
    }while(h < ilosc); 
    for(g=ilosc/c;g>0;g/=c) 
    { 
     for(i=ilosc-g-1;i>=0;i--) 
     { 
      t = tablica[i]; 
      for(j=i+g;(j<ilosc)&&!fp(t,tablica[j]);j+=g) 
      { 
       tablica[j-g] = tablica[j]; 
       licznik++; 
      } 
      tablica[j-g] = t; 
      licznik++; 
     } 
    } 
    /*cout << "\nPo sortowaniu SEDGEWICKiem." << endl; 
    for(i=0;i<ilosc;i++) 
    { 
     cout << tablica[i] << "\t"; 
    }*/ 
    plik.open("sedgewick.txt", std::ios::in | std::ios::out); 
    if(plik.good() == true) 
    { 
     plik << licznik << "\n"; 
     plik.close(); 
    } 

    //cout << "\nIlosc operacji :" << licznik << "\n"; 
} 

int main() 
{ 
    int i, n; 
    //cout << "Podaj rozmiar tablicy (W tablicy znajda sie liczby od 1 do 100): "; 
    //cin >> n; 
    for(n=1000;n<=100000;n+=1000) 
    { 
    cout << n << "\n"; 
    int zbior[n]; 
    int prawy = 200; 
    srand(time(NULL)); 
    //cout << "Przed sortowaniem." << endl; 
    for (int i = 0; i < n; i++) 
    { 
     if (i%2 == 0) 
     { 
      zbior[i] = rand()%prawy; 
      //cout << zbior[i] << "\t"; 
     } 
     else 
     { 
      zbior[i] = rand()%prawy+200; 
      //cout << zbior[i] << "\t"; 
     } 
    } 
    cout << endl; 
    sort_shell(zbior, n); 
    sort_hibbard(zbior, n); 
    sort_sedgewick(zbior, n); 
    } 
    return 0; 
} 
+0

請刪除不必要的代碼部分,並專注於您認爲可能導致問題的部分 – Tempux

+0

順便說一句,沒有[pow'函數的整數版本。](http://en.cppreference .COM/W/CPP /數字/數學/ POW)。他們都返回浮點數。 –

+0

也在您最喜愛的C++參考中研究術語「整數除法」。整數除法導致截斷。 –

回答

0

您需要使用std::ios::app將數據追加到文件。您還應該在報告期間保持這些文件的打開狀態;你似乎在每次迭代中重新打開它們。