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;
}
請刪除不必要的代碼部分,並專注於您認爲可能導致問題的部分 – Tempux
順便說一句,沒有[pow'函數的整數版本。](http://en.cppreference .COM/W/CPP /數字/數學/ POW)。他們都返回浮點數。 –
也在您最喜愛的C++參考中研究術語「整數除法」。整數除法導致截斷。 –