読んで欲しい人
・同じような問題を解く未来の私
・プログラミング詳しい方。(間違っていたら教えてください!)
・文字列の最後の文字を出力したい人
注意
・AtcoderのabcA - ∴ (Therefore)のネタバレが嫌な人
・編集中箇所もあるので読みにくいです。
解き方を1行でまとめると
入力される1〜3桁の整数を文字列(文字の配列)として受け取り、1の位の文字を判定する。
ACしたコード
#include <stdio.h>
int main(void)
{
char N[4];
scanf("%s",N);
// printf("%s\n",N);
int i;
for (i = 0; N[i] != '\0'; i++){
}
// printf("%c\n", N[i - 1]);
if(N[i - 1] == '2' || N[i - 1] == '4' ||
N[i - 1] == '5' || N[i - 1] == '7' ||
N[i - 1] == '9'){
printf("hon\n");
} else if(N[i - 1] == '0' || N[i - 1] == '1' ||
N[i - 1] == '6' || N[i - 1] == '8'){
printf("pon\n");
} else {
printf("bon\n");
}
return (0);
}
実行結果
//与えられる値(テスト1)
16
//テスト1の実行結果
pon
//与えられる値(テスト2)
2
//テスト2の実行結果
hon
//与えられる値(テスト3)
183
//テスト3の実行結果
bon
理解したポイント1
N[i - 1]
こう書くとNの配列の最後の文字を出力できる。
参考にした記事
#include <stdio.h>
int main(void)
{
char N[4];
scanf("%s",N);
printf("%s\n",N);
int i;
for (i = 0; N[i] != '\0'; i++){
}
printf("%c\n", N[i - 1]); //ここで一の位の文字出せた!!!!!!
【やりたい事】
テスト1〜3までの一の位を出力したい。
【実行結果】
//与えられる値(テスト1)
16
//テスト1の実行結果
6
//与えられる値(テスト2)
2
//テスト2の実行結果
2
//与えられる値(テスト3)
183
//テスト3の実行結果
3
理解したポイント2
条件分岐の比較対象をシングルクォーテーションで囲んでいなかった。
文字にした整数をシングルクォーテーションで囲まず、Nの最後の文字を整数として
比較すると、文字と整数を比較することになってしまうので条件分岐が判定されない。
間違えたコード
if(N[i - 1] == 2 || N[i - 1] == 4 ||
N[i - 1] == 5 || N[i - 1] == 7 ||
N[i - 1] == 9){ //数字にシングルクォーテーション付けるの忘れてた!
printf("hon\n");
} else if(N[i - 1] == 0 || N[i - 1] == 1 || N[i - 1] == 6 || N[i - 1] == '8'){
printf("pon\n");
} else {
printf("bon\n");
}
atcoderのいろんなコードまとめ
ランダムで10人くらい拝見しましたが上記の2パターンが占めてる。
人のコード見るの大事。
不安なところ && 教えて欲しいところ
・使ってる単語(配列の知識が浅いので間違ってるかも)
・char N[4];
って書いたけど、正確なメモリを書いてるかどうか理解していない。
なんで4と書いたかというと、与えられる値が3桁までの整数。
私はその3桁までの整数を文字列にしたいから終端文字(\0)を含めて
3文字 + 終端文字(\0) = 4
char型のバイト数は1バイトだから char N[4]; と書きました。
正しいかどうか、詳しい方いらしたら教えてください。
参考にした記事まとめ
N[i- 1]
文字列の最後の文字を出せた記事
Atcoderのいろいろなコード
余りを計算するver.
swichi文ver.
追記(先輩方に教えてもらったこと)1
この部分は strlen関数の方がfor文書くより早くかけるよって教えてもらった。
int i;
for (i = 0; N[i] != '\0'; i++){
}
// printf("%c\n", N[i - 1]);
書き直してみた
#include <string.h> //strlen関数を使うときに必要なライブラリ
#include <stdio.h>
int main(void)
{
char N[101];
scanf("%s",N);
// printf("%s\n",N);
int i;
int last = strlen(N) - 1;
printf("%c\n", N[last]);
return(0);
}
【やりたい事】
テスト1〜3までの一の位を出力したい。
【実行結果】
//与えられる値(テスト1)
16
//テスト1の実行結果
6
//与えられる値(テスト2)
2
//テスト2の実行結果
2
//与えられる値(テスト3)
183
//テスト3の実行結果
3
追記(先輩方に教えてもらったこと)2
N[i-1]をlastChar = N[i-1]のように代入して
自分が見返す時に思い出しやすいようにする && ケアレスミスを予防する。
(編集中)
この記事がランキング入りました!
教えてくださった方へ理解の報告したので自分が書いたコメント数も入ってるけど、
ランキングに入ったことは自分にとってとてもモチベーションが上がることなので
自分を褒めようと思います!笑
でもランキングに入れたことは教えてくださる先輩方のおかげだと思っているので
感謝で溢れています。
私も伝えられる側になりたいと思うので頑張るので、これからも教えてください!笑
記事を書いてみて思ったことは、書いて終わりと思っていたけど
記事は育てていく物なんだなぁと思いました。
Atcoderの問題を一問解くだけで、こんなに深掘りできると思わなかったし
自信もつけられなかったと思うのでいろんな記事を書きながらアップデートしていこうと思います!
あー、嬉しかった!