何もかもが初心者ですが

プログラミングもアウトプットもブログも初心者ですが、初心者なりに成長するためにブログを書こうと思います

PHPもやってみよう 8月25日 Part2

PHP言語(Rubyにはない)

switch文

複雑な条件分岐をシンプルにする

  • if文を使用した場合
if($door  == 0){
echo "ドアを開ける";
}elseif($door == 1){
echo "ドアを閉める";
}else{
echo "エラー"
}
  • switch文を使用した場合
switch($door){
case 0:
  echo "ドアを開ける";
  break;
case 1:
  echo "ドアを閉める";
  break;
default:
  echo "エラー";
  break;
}

break命令
現在のブロックから抜け出すための命令 break命令を忘れてしまうと、ブロックから抜け出せず、次のブロックも実行される

ちょっと今のところ謎部分を記載します

break命令文を忘れると実行されるべき部分を実行した後、その後も実行してしまうらしい
下の場合だと、表示されるのは
"ドアを開けるドアを閉める"
になるとのこと

条件式未達成なのになんで??
break命令文がないと、「又は」になるのかな??

//$door == 0
switch($door){
case 0:
  echo "ドアを開ける";

case 1:
  echo "ドアを閉める";
  break;
default:
  echo "エラー";
  break;
}


*私的注意点
case 0 : この「:」が忘れそうで注意

参考  PHP | プログラミングの入門なら基礎から学べるProgate[プロゲート]

PHPもやってみよう 8月25日

PHPRubyで違うなと感じたところ Part2

  • 文字列の連結

Rubyの場合
プラス(+)を使用して連結する

puts "あいう"+"えお" # => あいうえお
n = "あいう"
m = "えお"
puts n+m # => あいうえお

PHPの場合
ドット(.)を使用して連結する 連結にも省略が可能らしい

"あいう"."えお"; //=> あいうえお
$n = "あいう";
$m = "えお";
echo $n.$m; // => あいうえお

$name = "山田";
$name.= "太郎"; // => $name."太郎"
echo $name; // => 山田太郎
  • 変数展開 Rubyだと式展開かなと思います。
    PHPだとこの展開が変数しかできないから変数展開なのかな?
data = "アンケートデータ"
puts  "#{data}を見せてください"
$data = "アンケートデータ";
echo  "{$data}を見せてください";
  • if文
    Rubyはif~endで済むけれど、PHPは囲みがいるらしい
    例:変数xが100より大きい場合"100より大きい"と返す

Rubyの場合

x = 101
if x>100
  puts "100より大きい"
end

PHPの場合

x = 101
if (x>100){
  puts "100より大きい";
}

PHPにはelseif文、else文などを使う場合がある
Rubyに似ている!!

注意点
Rubyーelsif,else
PHPーelseif,else

if(条件式){
trueの場合
}else{
falseの場合
}
  • 条件否定の場合
    もし、「〜でない場合は〇〇を表示」という場合は「!」を使う
if !(条件式){
条件式否定時の処理
}

参考  PHP | プログラミングの入門なら基礎から学べるProgate[プロゲート]

Cherry本勉強中 8月25日

文字列について

文字列はシングルクオート('')、ダブルクオート("")だけではなく、%記法でも作ることが可能
cherry本でこれを読んで、最初はシングル・ダブルクオートだけで良いのでは?と考えたけども、文字列内にシングル・ダブルクオートを表示したい場合などに有効だなと考え直しました。

%q! !/ %Q! ! /%! !

%q! ! => シングルクオートと同じ

puts %q!私は'これは何?'と言った!

%Q! ! => ダブルクオートと同じ %! ! => ダブルクオートと同じ

data = "りんご"
puts %Q!この果物は#{data}ですか?!
puts %!この#{data}はここで育ったものですか?!

ここで使用した! !ですがこれは? ?や^ ^でもOKです。また( )、[ ]、{ }なども使えます

ヒアドキュメント

puts "line1,
line2"
line1,
line2

しかし、このような形は長文には適さないので、もっとスッキリする形を使う

<<識別子
1行目
2行目
3行目
識別子

<利用例>

a = <<text
これは利用例です。
こういう形式は
複数行に渡る長い文字列を作成する時に便利です。
text

puts a
これは利用例です。
こういう形式は
複数行に渡る長い文字列を作成する時に便利です。
  • <<-を使うと最後の識別子をインデントさせることができる
def test
  <<-text
これは利用例です。
<<-を使用すると最後の識別子をインデントできます。
  text
end 

puts test
これは利用例です。
<<-を使用すると最後の識別子(text)をインデントできます。

ちなみにこうするとエラーになります (<<-を使用していないからインデントが通用していない為です)

def test
  <<text
これは利用例です。
使用しないとエラーになります
  text
end 

puts test

<<~を使うと内部文字のインデントが無視されます

def test_2
  <<~text
  これは利用例です。
  <<~を使用するとインデントを無視します
    text
end 
  
puts test_2
  
これは利用例です。
<<~を使用するとインデントを無視します

ちなみにこれを<<-にするとどうなるか

def test_2
  <<-text
  これは利用例です。
  <<~を使用するとインデントを無視します
    text
end 
  
puts test_2
  これは利用例です。
  <<~を使用するとインデントを無視します

↑こちらはインデントされているのがわかるでしょうか?

ヒアドキュメントには式展開が有効!

fruit = "りんご"
f = <<text
いらっしゃいませ、お客様!
本日のオススメフルーツは#{fruit}です!
text

puts f
いらっしゃいませ、お客様!
本日のオススメフルーツはりんごです!

ちなみに式展開を無効にするには↓のようにします

fruit = "りんご"
f = <<'text'
いらっしゃいませ、お客様!
本日のオススメフルーツは#{fruit}です!
text

puts f
いらっしゃいませ、お客様!
本日のオススメフルーツは#{fruit}です!

ヒアドキュメントは引数になる

a = ""
# prependは渡された文字列を先頭に追加するメソッド
a.prepend(<<text)
いち

さん
よん
text

puts a
いち
に
さん
よん
ご

<<識別子に対してメソッドを呼び出せる

#作成した文字列に、直接upcase(文字列を全て大文字にするメソッド)を呼び出す
b = <<text.upcase
abc
def
text

puts b
ABC
DEF

とりあえず、ここまでにしたいと思います。 ちょっと眠いので(笑)

参考 「プロを目指す人のためのRuby入門」 参照 ヒアドキュメント - Wikipedia

Cherry本勉強中 8月23日 

 FizzBuzz問題

下記条件をクリアした、fizz_buzzメソッドを作成する

  • 3で割り切れる数値を引数に渡すと"Fizz"を返す
  • 5で割り切れる数値を引数に渡すと"Buzz"を返す
  • 15で割り切れる数値を引数に渡すと"Fizz Buzz"を返す
def fizz_buzz(n)
  if n%15 == 0
    "Fizz Buzz"
  elsif n%3 == 0
    "Fizz"
  elsif n%5 == 0
    "Buzz"
  else
    n.to_s
  end
end

puts fizz_buzz(1)
puts fizz_buzz(2)
puts fizz_buzz(3)
puts fizz_buzz(4)
puts fizz_buzz(5)
puts fizz_buzz(6)
puts fizz_buzz(15)

cherry本はここまででしたが、プログラミングスクールでのカリキュラムには繰り返しも載っていたので、「どんなだっけ」と思ってやってみました。

def fizz_buzz(n)
  if n%15 == 0
    "Fizz Buzz"
  elsif n%3 == 0
    "Fizz"
  elsif n%5 == 0
    "Buzz"
  else
    n.to_s
  end
end

n = 1
while n <= 100 do
  puts fizz_buzz(n)
  n += 1
end
# 1~100まで繰り返す

whileのことちょっと忘れててショックでした(笑)

参考 「プロを目指す人のためのRuby入門」

Cherry本勉強中 8月22日 Part2

真偽値と条件分岐

Rubyの真偽値

  • falseまたはnilであれば偽
  • 上記以外は全てtrue
    注意点 falseは勿論ですが、nilも偽に入ることを頭に入れておく
    他の言語だとnilは偽に入らないらしい
    どう違うのか
    例えば、データがあるかないかの確認をする場合
    他の言語だとif文を使用して、nilかそうでないかを条件分岐する
    Rubyだとデータがtrueかtrueじゃないかを表す
data = "test_data"
if data != nil
  puts "データあります"
else
  puts "データありません"
end

#上下どちらも"データあります"がコンソールに表示される 

data = "test_data"
if data
  puts "データあります"
else
  puts "データありません"
end

つまり、nilかどうか確認しなくても、trueを確認できる

論理演算子

論理演算子とはプログラミング言語などに用意された、論理演算を表す記号や符号などのこと。
真(true)と偽(false)の二値からなる真偽値(真理値/ブール値)に対して演算を行うことができる

論理演算子を使用することで、複数の条件を1つにまとめることができる && => かつ || => または

ちなみに&&と||の場合、&&の方が優先順位が高いそうです 私全く知りませんでした(笑)

  • おまけ !演算子を使うと真偽が逆になる ()に!を使用すると()の中の真偽も逆になります
t1 = true
t2 = true
f1 = false
f2 = false

!(t1 && f1) # ture

if文

if文を使って下記のような代入ができることを初めて知ったので、記載したいと思います。

country = "italy"

greeting = 
  if country == "japan"
    "こんにちは"
  elsif country == "us"
    "Hello"
  elsif country == "italy"
    "ciao"
  end

puts greeting 

引用 論理演算子とは - IT用語辞典 e-Words

参考 「プロを目指す人のためのRuby入門」

PHPもやってみよう 8月22日

現在、cherry本でRuby学習を深めているところですが、PHPも気になるので、同時進行でPHPもやっていこうと思います。
混乱しないように気をつけます。
現在はprogateを使ってPHPをやってみています。
Rubyとの違いについてとかも、ブログに書いていけたらなと思います。

PHPRubyで違うなと感じたところ

  • HTML埋め込み式
    とりあえず、Rubyと違うなと思ったところ、いきなりHTMLに記述させるところですかね
    まだ、始めたばかりなので、これから変わるのかもしれませんが、HTMLに埋め込み式だとは思いませんでした。
    RubyもHTMLに出せますが、別のファイルで処理したものを表示って形だったので...
    これから学んでいけば変わるのかな...?

  • セミコロン(;)
    文末には必ずセミコロン(;)を付けて文を区切る
    セミコロンを忘れるとエラーが出る
    Rubyはこれがいらないので、間違いそう〜

  • 変数
    変数の表示の仕方に違いがありました

    Rubyはそのまま
data = "8月22日"
# これで、変数dataに"8月22日"が代入された形になります
puts data
# コンソールには"8月22日"と表示される

   PHPだと

$data = "8月22日";
// これで、変数dataに"8月22日"が代入された形になります
echo $data;
// コンソールには"8月22日"と表示される
  • PHPの変数名の付け方 単語か単語を2つ以上つける場合はキャメルケース(大文字区切り)をする
    良い例
    => $data => $firstDate

  • これ必要なんですか? PHPRubyは変数に数字を足す形はほぼ同じでした
    でも、PHPだけ違うところがありました

$x = 1;
$x += 1; ==> $x ++ ;
$x -= 1; ==> $x --;

足し算でも引き算でも1の場合は上記のような省略が可能だそうです。 また、下記のようなやり方もできるそうです。

$x = 1;
echo ++$x; //2が表示される
echo $x++;// 1が表示される(表示された後1が足されるとのこと。繰り返しとかに使うのかな?)


これをみた私の感想、1だけこれとかややこしくないのだろうか?でした(笑)

参考  PHP | プログラミングの入門なら基礎から学べるProgate[プロゲート]

Cherry本勉強中 8月22日

cherry本学習

to_◯メソッド

to_i => 文字列を数値に変換
to_f => 文字列を小数に変換
小数だとメソッド変わることを初めて知りました。

to_s => 数値を文字列に変換する

丸め誤差注意

  • 丸め誤差
    => コンピュータ内が10進数ではなく、2進数で計算するために生じる誤差でこれによってバグが生じる可能性がある
    =>この本を読んだ時は最初、小数点のもの全てがこのバグを生じるのかなと思いましたが、そういうわけでもないようです。コンソールを使って確認してみました。(この後記載するrを使用してますが比較のために載せているので、スルーしてください)
puts 0.1r * 3.0r #3/10
puts 0.1 * 3.0 #0.30000000000000004
puts 0.1r * 3.0r == 0.3 #true
puts 0.1 * 3.0 == 0.3 #false

puts 0.1r * 2.0r #1/5
puts 0.1 * 2.0 #0.2

puts 0.1r * 5.0r #1/2
puts 0.1 * 5.0 #0.5

puts 0.1r * 6.0r #3/5
puts 0.1 * 6.0 #0.6000000000000001

puts 0.1r * 7.0r #7/10
puts 0.1 * 7.0 #0.7000000000000001
誤差の回避方法

では、このようなバグの元となる誤差をどのように回避するのか
=> Rationalクラスの数値に変換する
=> Rationalクラス ー 有理数クラスのことで、有理数とはa/bと言った分数で表せる数のこと

  • 小数そのままの場合
    => 小数に"r"をつけることで、Rationalクラスの数値になる
0.1r # 1/10
3.0 # 3/1
0.1r * 3.0r #3/10
0.1r * 3.0r == 0.3 # true
  • 小数を変数に代入している場合
    rationalizeメソッドを使用する rationalizeメソッド => Rationalクラスの数値に変換する
a = 0.1
b = 3.0

puts a.rationalize * b.rationalize
  • Rational(有理数)から普通の小数に戻したい場合
    to_fメソッドを使用する
(0.1r * 3.0r ).to_f # 0.3

分数を計算したい場合

これはCherry本には載っていなかったのですが、気になって調べました 私下記の方法でいけると思っていたのですが、いけないんですね(笑)

(1/10)*(3/1) # 0

リファレンス確認しました

Rational(1,10) * Rational(3,1) #3/10

Rational(1,10) # 1/10
Rational(3,1) # 3/1

このようにすることで、分数の計算ができることがわかりました。

参考 「プロを目指す人のためのRuby入門」