return文の謎
だいぶ前にreturn文について生地を書いた気がしますが、
また、return文に苦しめられています。
class Point attr_accessor :x,:y # アクセスメソッドを定義する protected :x=,:y= # x=とy=をprotectedにする def initialize(x=0.0,y=0.0) @x,@y = x,y end def swap(other) # x,yの値を入れ換えるメソッド tmp_x,tmp_y = @x,@y @x,@y = other.x,other.y other.x,other.y = tmp_x,tmp_y # 同一クラス内では # 呼び出すことが出来る return self end end p0 = Point.new p1 = Point.new(1.0,2.0) p [p0.x,p0.y] p [p1.x,p1.y] p0.swap(p1) p [p0.x,p0.y] p [p1.x,p1.y] p0.x = 10.0
メソッドのアクセス権限を試すプログラムなんですが、
swapメソッドの定義中にreturn文をつける意味がよくわかりません。
これなくても動きますし、return文って必要ですかね・・・
return文はなんだか苦手というかなんというか・・・
ちゃんと勉強しなくては。
()
Rubyのprintメソッド、()を省略できるらしいですが、省略した時とつけたときで、挙動が違って、
どういうこっちゃーってなってます。
def hello(name) print ("Hello, ", name,".\n") end hello("Ruby")
上のコードをhello_with_name.rbとして保存して、
ruby hello_with_name.rbとすると
hello_with_name.rb:2: syntax error, unexpected ',', expecting ')' print ("Hello, ", name,".\n") ^ hello_with_name.rb:2: syntax error, unexpected ')', expecting tCOLON2 or '[' or '.' hello_with_name.rb:5: syntax error, unexpected $end, expecting keyword_end
シンタックスエラーが出てきます。
上のコードは参考書にそのまま載ってたものなので、動くはずなんですが、動かない・・・
使ってるRubyのバージョンによる仕様の違いですかね。
とりあえず、()を外して、それ以外はそのままにして
def hello(name) print "Hello, ", name,".\n" end hello("Ruby")
で保存して、ruby hello_with_name.rbをしてみると
Hello, Ruby.
と普通に表示されます。
んー、なんでしょうかね、これは。
文字列と変数を区切って、ひとつのprintで出力させようとすると()をつけるとシンタックスエラーが出てくるみたいです。
原因がよくわかりませんが、()外したら、ちゃんと出力されるので、
文字列と変数をひとつのprintで出力したいときは、()は付けないようにしようと思います。
やりたいこと
長く辛いテストが終わりました。
結果的に、無事に3月いっぱいの春休みを手に入れることができました。
しかし、部活などで自由に使える時間は割りと限られてしまいます。
そのため、ちゃんと今やりたいと思っていることをまとめて、
やる気をキープしようと思います。
まず、一番したいことはAP合格。
受けるからには受かりたいですし、これを受からないと次のステップへと進めないので、
こんなところで立ち止まっている場合じゃないと思います。
そして、プログラミング。
プログラミングとおおまかに言ってもダメだと思うので、具体的にあげると、
RubyかC言語、どちらかをもっと深く勉強して、ちゃんと理解する。
今まで作ってきたものを改善する。
プログラミングでしたいと思っているのはこの3つです。
今やりたいと思っていることは大きく分けると2つです。
そのうち、APは一回落ちると半年ぐらい待たないと二回目が受けられないので、
今回で絶対に受かりたいと思います。
だから、APの勉強をメインでやって、その合間にプログラミングというような形で行こうと思います。
モチベーションをキープするために、春休み中もブログを更新していくと思います。
よろしくお願いします。
関数
main関数で、やりたいこと色々やるより、したい事をする関数を作って、
main関数では、作った関数を使うだけ。ってほうがスマートになるんじゃないかと、
関数を勉強して思ったんですが、どっちがいいんですかね。
関数を勉強して、stdio.hの中身とかも見てみたいなって思ったんですが、どうやってみるんでしょうか。
素因数分解2
やっぱり、関数作ったほうがいい気がしました。
#include<stdio.h> #include<stdlib.h> void primef(int); int main(void) { int x; printf("数字を入力してください:"); scanf("%d",&x); if(x==1){ printf("1は素因数分解できません。\n"); return 0; } primef(x); return 0; } void primef(int x) { int i,j,k,n,m,l,re; int *primen,*remain,*factor; k = 0; l = x; primen = (int *)calloc(x+1,sizeof(int)); remain = (int *)malloc(sizeof(int)*x); factor = (int *)calloc(x,sizeof(int)); for(i=0 ; i<x ; i++){ remain[i] = 1; } do{ for(i=0 ; i<=l ; i++){ primen[i]=0; } primen[0] = 2; for(i=3 ; i<=l ; i++){ for(j=0 ; primen[j]>0 ; j++){ remain[j] = i % primen[j]; } m = 0; for(n=0 ; n<j ; n++){ if(remain[n]==0){ m = 1; } } if(m==0){ primen[j]=i; } } for(i=0 ; primen[i]>0 ; i++){ re = l % primen[i]; if(re==0){ l = l / primen[i]; factor[k] = primen[i]; k++; break; } } }while(primen[1]>0); free(remain); free(primen); printf("%dを素因数分解すると:\n",x); for(i=0 ; i<k ; i++){ printf("%d ",factor[i]); } if(l!=1){ printf("%d\n",l); }else{ printf("\n"); } free(factor); }
素因数分解
素因数分解するプログラム作ってみました。
#include<stdio.h> #include<stdlib.h> int main(void) { int i,j,k,n,m,l,x,re; int *primen,*remain,*factor; k = 0; printf("数字を入力してください:"); scanf("%d",&x); if(x==1){ printf("1は素因数分解できません。\n"); return 0; } l = x; primen = (int *)calloc(x+1,sizeof(int)); remain = (int *)malloc(sizeof(int)*x); factor = (int *)calloc(x,sizeof(int)); for(i=0 ; i<x ; i++){ remain[i] = 1; } do{ for(i=0 ; i<=l ; i++){ primen[i]=0; } primen[0] = 2; for(i=3 ; i<=l ; i++){ for(j=0 ; primen[j]>0 ; j++){ remain[j] = i % primen[j]; } m = 0; for(n=0 ; n<j ; n++){ if(remain[n]==0){ m = 1; } } if(m==0){ primen[j]=i; } } for(i=0 ; primen[i]>0 ; i++){ re = l % primen[i]; if(re==0){ l = l / primen[i]; factor[k] = primen[i]; k++; break; } } }while(primen[1]>0); free(remain); free(primen); printf("%dを素因数分解すると:\n",x); for(i=0 ; i<k ; i++){ printf("%d ",factor[i]); } if(l!=1){ printf("%d\n",l); }else{ printf("\n"); } free(factor); return 0; }