「C-test-2009-01-15」の編集履歴(バックアップ)一覧はこちら

C-test-2009-01-15」(2009/02/12 (木) 16:16:04) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*1月15日のラピッドプログラミング **問題1 #codehighlight(c){{ #include<stdio.h> #include<stdlib.h> #define MAX_LENGTH 256 /* The Calculation Function */ void calculateNextLine(int *line, int length) { int tmp_line[MAX_LENGTH]; int i; for(i=0; i<length; ++i) { tmp_line[i] = line[i]; } line[0] = line[++length] = 1; //length here is a little tricky //length is the length of "last" line, not "current" line for(i=1; i<length; ++i) { line[i] = tmp_line[i-1] + tmp_line[i]; } } /* Print Function */ void printLine(int *line, int length) { int i; for(i=0; i < length; i++) { printf("%d ", line[i]); } printf("\n"); } /* Main Function */ int main(int argc, char *argv[]) { int n; int line[MAX_LENGTH] = {1}; int length = 1; if(argc < 2) return 0; n = atoi(argv[1]); printLine( line, length ); for( ;length <= n; ) { calculateNextLine( line, length++ ); printLine( line, length ); } } }} C++で記述すると次のようになる。 #codehighlight(c++){{ #include <iostream> #include <iomanip> #include <deque> #include <cstdlib> int digit(int n, int base=10) { int x=1; while( n /= base) ++x; return x; } class CPyramid { private: std::deque<std::deque<int> > pyramid; public: CPyramid(int length); void push(int index); friend std::ostream &operator<<(std::ostream &stream, CPyramid &obj); }; CPyramid::CPyramid(int length) { std::deque<int> tmp; tmp.push_back(1); pyramid.push_back(tmp); for(int i=1; i<length; ++i) push(i); } void CPyramid::push(int index) { // index:nのとき、個数はn+1個 std::deque<int> tmp; tmp.push_back(1); for(int i=1; i<index; ++i) { tmp.push_back(pyramid.back().at(i-1) + pyramid.back().at(i)); } tmp.push_back(1); pyramid.push_back(tmp); } std::ostream &operator<<(std::ostream &stream, CPyramid &obj) { const int size = 1 + digit(obj.pyramid.back().at(obj.pyramid.back().size()/2)); const int length = obj.pyramid.size(); int counter=0; for(std::deque<std::deque<int> >::iterator i = obj.pyramid.begin(); i != obj.pyramid.end(); ++i, ++counter) { stream << std::setw((length-counter)*size/2) << ' '; for(std::deque<int>::iterator j = i->begin(); j != i->end(); ++j) { stream << std::setw(size) << *j; } stream << std::endl; } return stream; } int main(int argc, char* argv[]) { const int len = (argc < 2) ? 10 : atoi(argv[1]); if(argc < 2) std::cerr << "argument error." << std::endl; CPyramid pyrmd(len); std::cout << pyrmd; return 0; } }} **問題2 **問題3 #codehighlight(c){{// There are some little changes #include <stdio.h> void init_array(int array[], int index, int num, int length); void init_array_left(int array[], int index, int num); void init_array_right(int array[], int index, int num, const int length); const int LENGTH = 15; int main(void) { int array[LENGTH]; int i; init_array( array, LENGTH/2, 0, LENGTH ); for(i=0; i<LENGTH; ++i) { printf( "%d ", array[i] ); } printf( "\n" ); return 0; } void init_array(int array[], int index, int num, int length) { array[index] = num; init_array_left(array, index-1, num+1 ); /* Move left */ init_array_right(array, index+1, num+1, length ); /* Move right */ } void init_array_left(int array[], int index, int num) { //fill branks array[index] = num; if(index) init_array_left(array, --index, ++num); } /* Function to move right */ void init_array_right(int array[], int index, int num, const int length) { //fill branks array[index] = num; if(index <= length) init_array_right(array, ++index, ++num, length); } }}
*1月15日のラピッドプログラミング **問題1 #codehighlight(c){{ #include<stdio.h> #include<stdlib.h> #define MAX_LENGTH 256 /* The Calculation Function */ void calculateNextLine(int *line, int length) { int tmp_line[MAX_LENGTH]; int i; for(i=0; i<length; ++i) { tmp_line[i] = line[i]; } line[0] = line[++length] = 1; //length here is a little tricky //length is the length of "last" line, not "current" line for(i=1; i<length; ++i) { line[i] = tmp_line[i-1] + tmp_line[i]; } } /* Print Function */ void printLine(int *line, int length) { int i; for(i=0; i < length; i++) { printf("%d ", line[i]); } printf("\n"); } /* Main Function */ int main(int argc, char *argv[]) { int n; int line[MAX_LENGTH] = {1}; int length = 1; if(argc < 2) return 0; n = atoi(argv[1]); printLine( line, length ); for( ;length <= n; ) { calculateNextLine( line, length++ ); printLine( line, length ); } } }} C++で記述すると次のようになる。 #codehighlight(c++){{ #include <iostream> #include <iomanip> #include <deque> #include <cstdlib> int digit(int n, int base=10) { int x=1; while( n /= base) ++x; return x; } class CPyramid { private: std::deque<std::deque<int> > pyramid; public: CPyramid(int length); void push(int index); friend std::ostream &operator<<(std::ostream &stream, CPyramid &obj); }; CPyramid::CPyramid(int length) { std::deque<int> tmp; tmp.push_back(1); pyramid.push_back(tmp); for(int i=1; i<length; ++i) push(i); } void CPyramid::push(int index) { // index:nのとき、個数はn+1個 std::deque<int> tmp; tmp.push_back(1); for(int i=1; i<index; ++i) { tmp.push_back(pyramid.back().at(i-1) + pyramid.back().at(i)); } tmp.push_back(1); pyramid.push_back(tmp); } std::ostream &operator<<(std::ostream &stream, CPyramid &obj) { const int size = 1 + digit(obj.pyramid.back().at(obj.pyramid.back().size()/2)); const int length = obj.pyramid.size(); int counter=0; for(std::deque<std::deque<int> >::iterator i = obj.pyramid.begin(); i != obj.pyramid.end(); ++i, ++counter) { stream << std::setw((length-counter)*size/2) << ' '; for(std::deque<int>::iterator j = i->begin(); j != i->end(); ++j) { stream << std::setw(size) << *j; } stream << std::endl; } return stream; } int main(int argc, char* argv[]) { const int len = (argc < 2) ? 10 : atoi(argv[1]); if(argc < 2) std::cerr << "argument error." << std::endl; CPyramid pyrmd(len); std::cout << pyrmd; return 0; } }} **問題2 **問題3 #codehighlight(c){{// There are some little changes #include <stdio.h> void init_array(int array[], int index, int num, int length); void init_array_left(int array[], int index, int num); void init_array_right(int array[], int index, int num, const int length); const int LENGTH = 15; int main(void) { int array[LENGTH]; int i; init_array( array, LENGTH/2, 0, LENGTH ); for(i=0; i<LENGTH; ++i) { printf( "%d ", array[i] ); } printf( "\n" ); return 0; } void init_array(int array[], int index, int num, int length) { array[index] = num; init_array_left(array, index-1, num+1 ); /* Move left */ init_array_right(array, index+1, num+1, length ); /* Move right */ } void init_array_left(int array[], int index, int num) { //fill branks array[index] = num; if(index) init_array_left(array, --index, ++num); } /* Function to move right */ void init_array_right(int array[], int index, int num, const int length) { //fill branks array[index] = num; if(index <= length) init_array_right(array, ++index, ++num, length); } }}

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー