2010年8月24日

For SyntaxHighlighter test


#include "stdio.h"
int main()
{
printf("hello");
return 0;
}

2010年8月23日

居然花了一個禮拜寫merge sort

服替代役有很多無聊的時間,所以我就在公家電腦灌了cygwin練習用gnu提供的工具(e.g. g++, make等) 來寫程式。一開始挑戰的是我大一的時候寫不出來的merge sort,讀入random.txt並且排列出來,最多排列1024個數字。

merge_sort.cpp

#include "function.h"

int main()

{
fstream fstr;
int i=0;
int rand[1024];
int temp[1024];
int randn;

cout<<"unsorted:";
fstr.open("random.txt", ios::in);
while(fstr>>rand[i]){

cout<<rand[i]<<setw(2);
i++;
}

cout<<" # of rands:"<<i<<endl;
randn=i;

merge_sort(rand, randn, temp);

cout<<"sorted list: ";
for(i=0; i<randn; i++)
cout<<rand[i]<<" ";

fstr.close();

return 0;

}


function.cpp

#include "function.h"

void merge_sort(int* unsorted, int size, int* sorted)

//sort the unsorted array
{
int mid;
int *left, *right;
int i;

if(size<2) return;

mid=(size+1)/2;
left=unsorted;

right=unsorted+mid;

//printf("[%d, %d]\n", *left, *right);

merge_sort(left, mid, sorted);
merge_sort(right, size-mid, sorted);

for(i=0; i<size; i++) printf("%d,", unsorted[i]);
printf(" | ");
merge(left, mid, right, size-mid, sorted);
for(i=0; i<size; i++) printf("%d,", unsorted[i]);
printf("\n");


}

void merge(int* left, int sizel, int* right, int sizer, int* sorted)

{
//printf("left=%d, right=%d, sizel=%d, sizer=%d ", *left, *right, sizel, sizer);
int i=0, j=0, k=0;
while(i<sizel && j<sizer)

{
if(*(left+i)<*(right+j)) {

sorted[k]=*(left+i);
i++;
}

else{
sorted[k]=*(right+j);

j++;
}
k++;

}

if(i==sizel)
memcpy(sorted+k, right+j, sizeof(int)*(sizer-j));
if(j==sizer)

memcpy(sorted+k, left+i, sizeof(int)*(sizel-i));

memcpy(left, sorted, sizeof(int)*(sizel+sizer));

//for(i=0; i<sizel+sizer; i++) printf("%d,", sorted[i]);

//printf("\n");
}

function.h

#ifndef FUNCTION_H
#define FUNCTION_H

#include <iostream>
#include <iomanip>

#include <fstream>
using namespace std;
#include <string.h>


void merge_sort(int* unsorted, int size, int* sorted);

void merge(int* left, int sizel, int* right, int sizer, int* sorted);


#endif

2010年8月16日

fstream::eof() 不能亂用

最近重新練習 fstream 的用法,用到一半發現eof() 真的不能亂用。

eof() 是用來檢查是否已經超過檔案結尾的函式,但是他不能用來做讀入檔案的判別條件,像下面這樣用是會錯誤的:
while(!fstr.eof()){
fstr>>rand[i];
i++;
}

因為eof() 是用來判別是否超過檔案結尾的函式,所以正常讀檔當讀到eof的時候,結果仍然會是true,就會多讀一次。要讀檔還是要像下面這樣:
while(fstr>>rand[i];){
i++;
}
if (!fstr.eof()) throw std::runtime_error("Invalid data from file");

直接用fstream本身來確定有沒有讀到東西,再用eof() 判別fstr之後是否有無用的資料,有的話就throw 一個例外。