1.00.1はじめに
気づき
-atcoderの問題は開業が必須
-phpのコードを書くときは <php? ?>
で囲む?>
は省略可
動いたコード
<?php
echo "Hello, world!\n";
1.00.2 プログラムの書き方とエラー
このセクションの問題では、エラー文が与らています。PHPでエラーを再現するのは大変なので回答は端折ります。
ポイント
エラーには3つの種類がある
- コンパイルエラー・・・文法的に間違いがあり、プログラムは一切動作しない
- 実行時エラー・・・内容で致命的なエラー(例)0で割り算をした時。実行時エラーが起きる直前までプログラムは動作するが、エラー以降は動かなくなる。
- 論理エラー・・・プログラムは動作するが想定どおりに動かないもの
- コンパイルエラー・・・文法的に間違いがあり、プログラムは一切動作しない
1.00.3 四則演算と優先順位
ポイント
- 算術演算子には、優先順位がある
- ()を用いて優先順位を操作
動いたコード
<?php
echo (string)((100+1)*100/2)."\n";
1.004.変数と型
ポイント
- 変数を用いることで汎用性が生まれる
- PHPは、型を宣言がない
- 文字列型(string), 整数型(integer), 浮動小数点数型(float)(double), 論理型(boolean), 配列型(array), オブジェクト型(object), リソース型(resource), NULL(null)
動いたコード
<?php
$seconds = 365 * 24 * 60 * 60;
echo (string)1*$seconds."\n";
echo (string)2*$seconds."\n";
echo (string)5*$seconds."\n";
echo (string)10*$seconds."\n";
1.005.実行順序と入力
ポイント
- 1文字ならfgets(STDIN)
- 1行で複数の値を入力として扱いたい時はfscanf()が便利
動いたコード
<?php
fscanf(STDIN,"%d %d ",$a,$b);
echo (string)$a+$b."\n";
1.00.6
ポイント
- if文を用いた条件分岐は、if,elseif,elseを組み合わせて作る。
- elseifが複数ありかつ複数の条件が満たされている時は、より上位のelseifが優先される。
EX6.電卓を作ろう
<?php
fscanf(STDIN,"%d %s %d ",$a,$op,$b);
if($op == "+"){
echo ($a+$b)."\n";
}elseif($op == "-"){
echo $a-$b."\n";
}elseif($op == "*"){
echo $a*$b."\n";
}elseif($op == "/" && $b != 0){
echo floor($a/$b)."\n";
}else{
echo "error\n";
}
つまずいた所
恒例の改行文字忘れ。
0で割り算することを許容してしまう。
少数の切り捨て忘れ。
関数 | 書式 | 用途 |
---|---|---|
floor | floor(数値) | 切り捨て |
ceil | ceil(数値) | 切り上げ |
round | round(数値,[,桁数]) | 四捨五入 |
1.007.条件式の結果とbool型
ポイント
- bool型はtrueとfalseのための型
- C++では、trueの代わりに1, falseの代わりに0を用いることもできるがPHPでは出来ない。
EX7.bool値パズル
<?php
$a = true;
$b = false;
$c = true;
if ($a) {
echo "At";
}
else {
echo "Yo";
}
if (!$a && $b) {
echo "Bo";
}
else if (!$b || $c) {
echo "Co";
}
if ($a && $b && $c) {
echo "foo!";
}
else if (true && false) {
echo "yeah!";
}
else if (!$a || $c) {
echo "der";
}
echo "\n";
1.008.変数のスコープ
ポイント
- { }で囲われた部分のところをブロックという
- 変数が使える範囲のことをスコープという
- 変数のスコープは「変数が宣言されてからそのブロックが終わるまで」
- スコープが重なっている場合は最も内側のブロックで宣言された変数が選ばれる
つまずいた所
-
{}
ブロックの外で変数定義($price=0; $text="";
)をしていないことによる、最後のecho(echo $text."!"."\n";
)で変数が定義されていないエラーが出る。 - fgets(STDIN)は改行文字が入るので注意。
EX8.たこ焼きセット
<?php
$p = fgets(STDIN);
$price=0;
$text="";
if($p==1) {
$price = fgets(STDIN);
}elseif($p==2){
// $text = fgets(STDIN);
fscanf(STDIN,"%s",$text);
$price = fgets(STDIN);
}
$N = fgets(STDIN);
if($p==2){
echo $text."!"."\n";
}
echo $price*$N."\n";
1.009.複合代入演算子
複合代入全くせずにといてしまいました。セクションの参考にはならないプログラムですw
ポイント
- $a = $a + $bを$a += $bに省略できる。
- PHPでは、$a .= $bで文字結合ができる。
EX9.複合代入演算子を使おう
<?php
fscanf(STDIN,"%d %d %d",$x,$a,$b);
echo ++$x."\n";
echo $x*($a+$b)."\n";
echo (($x*($a+$b))*($x*($a+$b)))."\n";
echo (($x*($a+$b))*($x*($a+$b))-1)."\n";
1.010. while文
ポイント
- 無限ループに陥るので、カウンタ変数のインクリメントし忘れに注意。
EX10 - 棒グラフの出力
<?php
fscanf(STDIN,"%d %d", $a,$b);
$i = 0;
echo "A:";
while($i<$a){
echo "]";
$i ++;
}
echo "\nB:";
$i=0;
while($i<$b){
echo "]";
$i ++;
}
echo "\n";
1.011.for文・break・continue
ポイント
EX11.電卓をつくろう2
<?php
fscanf(STDIN,"%d",$n);
// $ini = trim(fgetc(STDIN));
fscanf(STDIN,"%d",$ini);
$result = array();
$flag = false;
for($i=1;$i<=$n;$i++){
fscanf(STDIN,"%s %d", $cal, $value);
if($cal == "+"){
$ini += $value;
echo "${i}:".$ini."\n";
}elseif($cal == "-"){
$ini -= $value;
echo "${i}:".$ini."\n";
}elseif($cal == "*"){
$ini *= $value;
echo "${i}:".$ini."\n";
}elseif($cal == "/" && $value != 0){
$ini /= $value;
$ini = (int)$ini;
echo "${i}:".$ini."\n";
}else{
echo "error\n" ;
break;
}
$result[] = floor($ini);
}
1.012.文字列と文字
C++とPHPの比較
動作目標 | C++ | PHP |
---|---|---|
文字列の長さを取得 | 文字列変数.size() | strlen($str) |
i文字目にアクセス | 文字列変数.at(i) | 文字列[i] |
EX12.足したり引いたり
<?php
$S = trim(fgets(STDIN));
$result = 1;
for($i=1;$i<strlen($S);$i++){
if($S[$i] == "+"){
$result ++;
}elseif($S[$i] == "-"){
$result --;
}
}
echo $result."\n";
1.013.配列
C++とPHPの比較
動作目標 | C++ | PHP |
---|---|---|
配列の長さを取得 | 配列変数.size() | count(配列) |
配列のi番目にアクセス | 配列変数.at(i) | 配列[i] |
ポイント
- PHPで文字列を分割する方法
explode(区切り文字, 文字列)
- PHPで絶対値をとる方法
abs(数値)
EX13 - 平均との差
<?php
$N = trim(fgets(STDIN));
$A_n = trim(fgets(STDIN));
$scores = explode(" ", $A_n);
$sum_scores = 0;
#平均値を求める
for($i=0;$i<$N;$i++){
$sum_scores += $scores[$i];
}
$average_scores = (int)($sum_scores/$N);
for($i=0;$i<$N;$i++){
echo abs(($scores[$i]-$average_scores))."\n";
}
1.014.STLの関数
C++とPHPの比較
- C++が引数と戻り値の型を指定しないといけないが、PHPはその必要がない。
EX14.三人兄弟の身長差
<?php
fscanf(STDIN,"%d %d %d", $a, $b, $c);
echo (max($a,$b,$c)-min($a,$b,$c))."\n";
1.015.関数
C++とPHPの比較
- PHPの関数定義:
function 関数名(){ }
- 1.014でも記したが、C++とは異なり、PHPは引数と戻り値の方を指定しなくて良い。
EX15.三人兄弟へのプレゼント
<?php
$N = trim(fgets(STDIN));
$A = trim(fgets(STDIN));
$A_tests = explode(" ",$A);
$B = trim(fgets(STDIN));
$B_tests = explode(" ",$B);
$C = trim(fgets(STDIN));
$C_tests = explode(" ",$C);
function sum($n,$b_tests){
$sum_test = 0;
for($i=0;$i<$n;$i++){
$sum_test += $b_tests[$i];
}
return $sum_test;
}
function output($sum_a,$sum_b,$sum_c){
$sum_everyone = $sum_a*$sum_b*$sum_c;
echo $sum_everyone."\n";
}
$result_A = sum($N,$A_tests);
$result_B = sum($N,$B_tests);
$result_C = sum($N,$C_tests);