#include "stdio.h"
int main()
{
printf("hello");
return 0;
}
2010年8月24日
2010年8月23日
居然花了一個禮拜寫merge sort
Labels:
c/c++,
Computer Science
服替代役有很多無聊的時間,所以我就在公家電腦灌了cygwin練習用gnu提供的工具(e.g. g++, make等) 來寫程式。一開始挑戰的是我大一的時候寫不出來的merge sort,讀入random.txt並且排列出來,最多排列1024個數字。
merge_sort.cpp
function.cpp
function.h
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() 不能亂用
Labels:
c/c++
最近重新練習 fstream 的用法,用到一半發現eof() 真的不能亂用。
eof() 是用來檢查是否已經超過檔案結尾的函式,但是他不能用來做讀入檔案的判別條件,像下面這樣用是會錯誤的:
因為eof() 是用來判別是否超過檔案結尾的函式,所以正常讀檔當讀到eof的時候,結果仍然會是true,就會多讀一次。要讀檔還是要像下面這樣:
直接用fstream本身來確定有沒有讀到東西,再用eof() 判別fstr之後是否有無用的資料,有的話就throw 一個例外。
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 一個例外。
訂閱:
文章 (Atom)