忍者ブログ
Since 14.Jan.2009:08:29 プログラミングと絵のブログ
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


Twitterはメールで投稿できんのかな
PR

うちの会社目標管理とかで
入社三年間は学習目標とか立てるんだけど

先輩が自分より低レベルだと
お前らこそやれよ
と思う

使えん先輩ばっかの職場はツラいわ
指摘することも出来んし


基本的な関数群の覚え書き

(int *)malloc(sizeof(int))
メモリを指定したサイズ分確保する関数
特徴は動的に確保するところ
ツリー構造やリスト構造などを作るときに使うらしい

(int *)がキャスト部分で、
今はintのポインタ型にキャストしている
(void *)とすると型を決めずにそのままメモリ確保だけする

malloc本体に渡すのが確保するサイズ
今はsizeof関数でint型用のサイズ(2バイト)を確保

使った後はfree関数で解放

free(xxx)
mallocで確保したメモリを解放する
引数はmallocで取ったメモリを代入したポインタ変数

strcpy(p, "xxx")
String Copyの略
char配列に文字列を代入する
pの部分には文字列の先頭アドレスが入る

stringの扱い方的に通常の代入では駄目らしい

strcmp("a", "b")
String Cmpressの略
つまり文字列比較の関数
==で比較しようとするとアドレスを比較するだけになっちゃうし
もしくは一文字ずつ地道に値を取り出して比較したりが必要

一致したら0を返して、あとは文字の文字コード順や文字サイズで、
aが大きかったら1以上, bが大きかったら-1以下を返す

strlen("xxx")
String Lengthの略
文字列の長さを取得

atoi("xxx")
Array to Integerの略
Stringを数字に直せたらIntegerに直す
"123abc45"のように変換できない文字を渡すと
変換できるとこまで変換して 123 が返ってくる
1文字目で変換できなかったら0

clock()
ストップウォッチのような関数
たぶん内部でstatic変数を使ってて
一度目に呼ばれたときは0を返してストップウォッチを開始する
次からは最初に呼ばれたときから経過した時間を返す

精度は10ms - 1msくらい
環境によって異なる

time(&t)
同じくストップウォッチ
精度が1秒くらいな代わりに実時間に近い値が計れる
代入したい変数のポインタを渡すのがちょっと特殊
あとはclock()と似たようなもん

最後に参照渡しのやり方の例
void swap(int *px, int *py)
{
int tmp;

tmp = *px;
*px = *py;
*py = tmp;
}

RubyのCで書かれたライブラリとか
猫でもわかるプログラミングに書かれたノウハウとか
SQLite3のソースコードとかが読みたくてCの勉強中

昔はポインタとか分かんなかったけど
Rubyとかオブジェクト指向系の言語やったあとだと
ほとんど理解できる

staticグローバル変数はクラス変数に似てる
関数内のstaticローカル変数はインスタンス変数とクラス変数の中間くらい
構造体structはプロパティだけのクラス
ポインタは汎用性が高すぎる参照渡し
あとは

ポインタ型:
宣言: *p, 値: *p, アドレス: p

通常の型
宣言: data, 値: data, アドレス: &data

の形に合わせて使い分けるだけだし

一日で結構進んだ
やっぱり関数型に比べればかなりマシだなーw

会社でUWSCというツールの使い方を習ったんで総括
基本的にGUIのマクロツール

マクロはUWSCスクリプトというDSLを使って作ることも出来る
スクリプトはVBScriptと比べると、

良:
・関数の引数が省略できる(デフォルト値で)
・値を返すのが「result = 」なので少しマシ
・continueが使える
・構文が少し短い
・ファイルオープン時にファイルが無かったら自動生成
・Ole使うのにsetが不要


悪:
・関数名が省略形使いすぎで分かりにくい
・組み込み関数が異常に少ない(特に文字列、配列、ファイル)
・関数とサブルーチンを区別する(関数は値を返さないとエラー)
・複数行のif文はifbを使って区別する
・手続き型
・正規表現


複数行のif文でわざわざifbが必要だったりしてインタプリタの構文解析力が低いのではないかと
それに〆文字もfendとかnext色々あるし。
endに統一してほしい
でも関数周りの定義は少し楽かな

手続き型なのは基本的にマクロ用だから別に気にならないか
ファイルと配列使うのが面倒かな?

正規表現とファイルはOleのを使えば何とかなるけど
文字列、配列の関数が最低限しか定義されてない

基本的にどうしても必要な時以外はUWSC使わないのが一番だなあ
処理も遅いし

今日は珍しくVBScriptネタ
大嫌いだけど会社で使うのでしょうがない

主にクラスの使い方と擬似的な継承について

class SampleModel
private xxx

private sub Class_Initialize
set xxx = new Parent
end sub

function SampleMethod1(a, b)
SampleMethod1 = xxx.SampleMethod1(a, b)
end function
end class


基本的にこんな感じ
Class_Initializeというメソッドがコンストラクタ
VBScriptはコンストラクタに引数付けれないっていう腐った言語

まぁそれは置いといて、コンストラクタで
親扱いしたいクラスをインスタンス変数にset
VBScriptはオブジェクトの代入にsetを付けないといけない腐った言語

あとは同名のメソッドを定義して、
その中で継承したいメソッドに引数渡して実行結果をreturn
メソッドに代入する謎な方法でreturn
値を返しても処理は続く
VBScriptはreturnに相当する命令がない腐った言語

これで擬似継承ができた
てかこれ継承?
継承ってのは明示しなくても親のメソッド使えるのが普通だよ

で、これを

dim Sample
set Sample = new SampleModel


として別名でset
何故ならVBScriptはクラスメソッドが使えない腐った言語

こうして別名を付けないとSample.SampleMethod1みたいに使えない
せめてStatic宣言くらい実装しとけよ・・・
もしくはRubyみたいにself.methodとか
Me.MethodもThis.MethodもSelf.Methodも試したけど駄目だった

クラスメソッドは全部この方法でインタフェースみたいに実装して、
別に分けておくのがコツかな
インスタンスメソッドは普通に使えるから、
インスタンスを生成するやつに擬似継承でクラスメソッドも埋め込む感じ

Rubyに比べたら何十、何百倍も大変だけど



ピクフェス行ってきた
面白いけど
原宿ってのが疲れるな

竹下通り人多すぎ




*
そういえば*って配列に変えるんじゃなくて
引数を多重代入するための表記か。

p *3..5 == p(3, 4, 5)
p [3, 4, 5] == p([3, 4, 5])

なんだね
まぁ解決してよかった

今日は初めてるびまゴルフに挑戦してみた

問題はるびまゴルフ第6回から、


seq という Unix コマンドがあります。このコマンドを使うと、数値を2つ引数にして、その間にある数を出力することができます。例えば 3 と 5 を引数として実行すると

% seq 3 5
3
4
5
というような実行結果になります。

今回はこのコマンドを実装してみて下さい。入力はコンマで区切られて標準入力から与えられるものとします。例えば

3,5
という入力に対して

3
4
5
と出力するようにして下さい。例えば

a,b=gets.split(',').map{|v|v.to_i}
a.upto(b){|i|puts i}
というようなコードと同じ出力が得られるようにして下さい。パーは 50Bytes とします。

また余力があれば、入力が

3 5
と空白区切りで与えられる場合、 seq のように引数として与えられる場合、つまり ARGV を使う場合も考えてみて下さい。





自分の解答


  1. gets=~/,/;puts ($`.to_i..$'.to_i).to_a #38Bytes

  2. gets=~/\s/;puts ($`.to_i..$'.to_i).to_a #39Bytes

  3. a,b=$*;puts (a..b).to_a #23Bytes



この3つ。
とりあえず1時間くらい頑張ってみたけどここまでだった。
とりあえずパーはクリアしたけど



添削タイム

終わった後、他の人のを見てみると、
(a..b).to_a => *a..b
にすると、3問とも6Bytes減らせるらしい。

あと1,2番はなんかうまく動かないからto_iメソッド使ってたんだけど、
getsで受け取ったら"3,5\n"になって、改行が入るみたい。
gets.chopで改行を取り除くとto_iがいらなくなって、

gets.chop=~/,/;puts *$`..$'
の27Bytes。
空白区切りなら28Bytes。

修正は↓の人を参考
http://rubyist.g.hatena.ne.jp/edvakf/20090702/1246522250

最後の詰めが甘かったw
方向性は合ってたんだけどなぁ・・・
次回はもっとがんばります。

evalとか使ってる人もいた。


  1. p *(eval"Range.new "+gets)

  2. eval"p *%d..%d"%gets.split



両方とも26Bytes。
evalは未だに良く分からん
文字列を動的にプログラムとして認識するんだっけか

てか何で
p [3,4,5]
#=> [3,4,5]
なのに、
p *3..5
#=> 3
4
5
なんだ。謎すぐる・・・
*はto_aとは微妙に違うということか・・・

[1] [2] [3] [4] [5] [6] [7
«  Back :   HOME   : Next  »
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
ブログ内検索
プロフィール
HN:
uguisu_an
年齢:
35
性別:
男性
誕生日:
1989/08/20
自己紹介:
基本的にテキトー
最新コメント
[10/01 くゆる]
[09/21 uguisu_an]
[09/17 mayigo]
[07/17 uguisu_an]
[07/15 shinh]
最新トラックバック
アクセス解析
フリーエリア
P R
忍者ブログ [PR]