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で出力したいときは、()は付けないようにしようと思います。

macでmikutter

作りたいものが明確になり、それに向けてRubyがんばろうって思ったら、
気づいたらmikutterインストールしてました。

でも、なかなかうまくいきません。

起動と日本語入力まではできるようになったんですが、起動用のアイコンが作成できないのと、表示が色々とおかしいのが気になります。

こんなかんじになってタイトルバーがないのと設定の位置がおかしいのと、
あと、設定開いたらおかしくなります。

あ、ちゃんとツイートは表示できます。
消してるだけです。

これはどうしたものか。

ここでmikutterは諦めて、ちゃんとRubyの勉強しなさいという天のお告げなのでしょうかね。

やりたいこと

長く辛いテストが終わりました。

結果的に、無事に3月いっぱいの春休みを手に入れることができました。

しかし、部活などで自由に使える時間は割りと限られてしまいます。

そのため、ちゃんと今やりたいと思っていることをまとめて、

やる気をキープしようと思います。

まず、一番したいことはAP合格。

受けるからには受かりたいですし、これを受からないと次のステップへと進めないので、
こんなところで立ち止まっている場合じゃないと思います。

そして、プログラミング。

プログラミングとおおまかに言ってもダメだと思うので、具体的にあげると、

RubyC言語、どちらかをもっと深く勉強して、ちゃんと理解する。

今まで作ってきたものを改善する。

素数判定、素因数分解ができる電卓を、1から作ってみる。

プログラミングでしたいと思っているのはこの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;
}