初心者ぬまよの一流エンジニアへの道

初心者ぬまよの一流エンジニアへの道

どーもぬまよです! 初心者が電子工作やゲーム開発を通して一流エンジニアに成長していく様を、初心者目線でブログにしています。

C言語の参考書一冊終わらせただけの男が競技プログラミングで奮闘する話

f:id:tonkichi_factory:20200702165540j:plain

どーもぬまよです。


最近「AtCoder」という競技プログラミングを初めました!! 今回は初心者が競技プログラミングやってみた感想などを話そうと思います。  

 

 

競技プログラミングってなに?

そもそも競技プログラミングって知っていますか?


正直僕もよくわかってませんでした。笑
「戦うんやろなー」「プログラミングするんやろなー」ぐらいの認識でしたね。
まあ間違ってはないんですけども。

ざっくり言うと、〇〇を実現するプログラムをできるだけ速く、正確に書いてくださいといったものです!


例えば、a + b を計算するプログラム作りなさいとかですね。 さすがにもっと難しいのがでますが、、、。


ここで難しいのが、ただコードを書くだけじゃなくて、処理時間も気にして書かなくてはいけません!
「できたー!」と思っても計算回数が多すぎると処理時間が長くなりすぎて不正解になってしまいます。
そう言う時は工夫したコードを書かなくてはいけません。


つまりどのようにして指定されたプログラムも書くかという頭の柔らかさが求められるのが競技プログラミングです。

AtCoder

現在僕がやっているのはAtCoderです。
AtCoderは国内最大の競技プログラミングサイトです。(いつもお世話になってます)

atcoder.jp

なんと登録さえすれば無料でできます!
太っ腹!
毎週土日(多分)にコンテストが開催されていて好きな時にボタンひとつで参加できます。
時間はいつも21時スタートが多いイメージです。


レベルの高い人が参加するコンテストや初心者向けのコンテストなどいろいろなコンテストがあって自分に合ったものを選ぶことができます。
コンテストは数問を解くことになるのですが、初心者向けのコンテストでも後の方の問題はゴリゴリにむずいです。。。


また、成績によってレートが変動する仕組みになってます!
オンラインゲームみたいな感じですね。
そういえば昔「動物タワーバトル」というアプリが流行りましたが、レート順位でとんきちは160位になったことがあります。孫ができても自慢します。


さらにさらに、コードを書くプログラム言語はどんなものにも対応しています! 「私Javaしかできない、、、。」ってひとでも大丈夫!

なぜ競技プログラミング始めようと思ったの?

一言で言うと自分のスキルを証明するものになりそうだと思ったからです。
それとスキルアップにもつながるなと思いました。 いつか転職する時にも有利かも、、、?


あとは単純にプログラミングが面白いってのもありますね。
昔から数学の試行錯誤して答えにたどり着く謎解きっぽい感じが好きで、プログラミングにもそれと似たようなものを感じます。

競技プログラミングは初心者には難しい?

何を隠そう私はそんなゴリゴリにプログラミングやってたわけではありません。
大学まではパソコンで「面白フラッシュ倉庫」しか見たことがありませんでしたし、最近C言語の参考書を一冊終わらせたぐらいの実力です。
そんな僕でも競技プログラミングなんかできるのか気になりません?


実際にやってみると案外いけちゃうもんなんです!
こんな僕でも!


競技プログラミングってどちらかというとプログラミングの知識よりも頭の柔らかさが求められます。
なので最低限の知識さえあれば問題に立ち向かうことはできます。
しかもサイト内ではC++の基礎を教えてくれているので初めてプログラミングをするという方でも大丈夫だと思います!


ただ逆に言うと、プログラミングの知識があっても頭の柔らかくない人は難しい問題は解けません、、、。
まあそこは問題をこなしていってレベルをあげるしかないしそれが楽しいんですけどね!
なので考えるのがあんまり好きじゃない人にはおすすめしませんが、数学とか考えることが好きだけどプログラミングがわかんないって人は全然心配せずに競技プログラミング始めてみるといいですよ!

ぬまよはどれぐらいのレベルなの?

ここは飛ばしときますね😀
けしてしょぼいから逃げたわけじゃないよ?
ヒントを言うとC問題(A,B, C, D, E, Fといった感じでだんだん難しくなる)が解けたり解けなかったりぐらいのレベルです。。。

まとめ

競技プログラミングはそんなにプログラミングに自信がない人でも十分楽しめるものでした!
なんか敷居が高いと感じてる人は是非思い切ってやってみてください!
僕と一緒に最強レート目指しましょう👍

C言語の参考書一冊終わらせました

f:id:tonkichi_factory:20200605220029j:plain

どーもぬまよです。
今回はC言語の参考書一冊終えての感想はなしてこーと思います。


いやー、やっと終わった!!!!褒めて!!!


学生時代に勉強していたとはいえやはり一冊終わらせるのは根気がいりますね。
まだ基礎の部分だけですがスキルは身についたんじゃないかなと思います。
勉強に使った本はこちらですね。

新・明解C言語 入門編 (明解シリーズ)

新・明解C言語 入門編 (明解シリーズ)

  • 作者:柴田 望洋
  • 発売日: 2014/08/09
  • メディア: 単行本
 

学んだ内容を全てブログに書くのを断念したおかげで、割とすいすいっと取り組めました!結果としてはよかったかな〜。


せっかくなので特に難しかったポイントをご紹介しようと思います。
やはり「ポインタ」の理解には少し苦労しましたね。
学生の時に勉強してた時もここの部分で挫折してしまいました、、、。


ただですね、学生の頃勉強してたよりも苦労はしませんでした。
僕的には「基本情報技術者」の勉強をしてたからだと思います!
学生の頃はコンピュータの仕組みもわかってなかったし、メモリとか言われてもちんぷんかんぷんだったんですけど、そこ部分の知識があると「ポインタ」の理解はしやすくなると感じました。


知識って身につけていけばいくほど、他の知識の習得にも役立ってくれるんですよね〜。
ということで知識はいっぱい持っておきましょう!!


さて、C言語の勉強が終わって次は何を始めているかというと、「AtCoder」という競技プログラミングのサイトを始めています!次回はそれについて記事書こうかな。


ということでだいぶ適当に書いた記事で申し訳ないですが今日はここまで!
またね!

ブログに勉強した内容をまとめていて気づいたこと

f:id:tonkichi_factory:20200513112830j:plain

どーもぬまよです。
今回は僕の悩みの話です。


このブログには僕の学んだ内容を書いています。
最近だとC言語の参考書をやってそれについて記事を書いていました。自分の知識をフィードバックすることで知識が定着しやすいかなと思って始めたんですがなんだか逆効果な気がしてきています。


というのもブログを書くのもなかなかに時間がかかります。慣れていない僕だと1時間は最低でもかかりますね。
これをずっと続けていくととんでもない時間を使うことになってしまうのではないかなと最近思うようになりました。ブログを書く時間を勉強に回してしまった方が捗るのではないかと。実際勉強を進めるとブログを書かないといけないからなーとC言語の勉強から最近遠ざかってしまっていました。


なので、これからは本当にみなさんに発信したいものに記事を絞る方がいいのかなと思っています。自分で作ったものを発信するなどです。
そっちの方が興味も持ってもらえるし自分のモチベーションもあがる気がしてます。 実際に自分がやりたいことは自分の作ったものを世に広めることですからね。


このことについて意見がある方はコメントしていただけると嬉しいです!他の方はどのようにしているのか気になります、、、。

1日で100英単語以上覚えることができた自分なりの暗記法

f:id:tonkichi_factory:20200506033035j:plain

どーもぬまよです。


勉強といえば暗記と言っても過言ではありません。
特に社会人になっても必須スキルといえる英語ですが、英単語の暗記が鍵になってきます。自分も大学受験のときには英単語に苦しめられ、何回英単語帳を見て覚えようとしても覚えられないまま2年間半を費やしました。しかし、今から教えるやり方でやったところ約2時間で100単語以上を覚えられるようになったんです!しかもちゃんと次の日でも忘れてない!


それではそのやり方見ていきましょー、Let`s go!

 

 

英単語カード

英単語カードを用意

みなさん英単語記憶には是非英単語カードを使ってください!
ただし悪い英単語カードといい英単語カードが存在します。


悪い英単語カードは、表裏が真っ白で自分で書き込んで作るタイプのやつです。
あれは書き込むのに時間がかかるというのと、書き込むことで勉強した気になってしまうのが悪いところです。できればそのタイプは使わないようにしましょう。


いい英単語カードはすでに書き込みがされているものです。なかなか市販されているものは少ないかもしれませんが、、、。
例えばこんなものがAmazonにあったので参考程度に。

50枚ほど取ってさらに10枚に分ける

まずは用意した英単語カードから、今日覚えたいなって思った量の英単語カードをとりましょう。おすすめは1日に50〜100単語ぐらいですかね。最初のうちはもっと少なくてもいいかもしれません。多すぎるとやる気もなくなりますからね。


そしてそのあと、そのカードの中から10枚をとってきてください。この方法では10単語ずつ覚えていきます。10単語覚えては次の10単語、そしてまた10単語覚えてって感じで目標とする単語数を覚え切るわけです!

暗記のやり方

九九のように覚える

さあ10枚の英単語カードが手元にありますね?
よくあるのは「覚えれるまでじっくり眺める」というやり方ですが、このやり方は正直おすすめできません。時間がかかるわりにはすぐ忘れてしまうので時間がもったいないです!僕のやり方では九九のように覚えます。


まずは1枚の英単語カードを見ます。例えば「apple」と書かれていたとしましょう。その時は「アップルりんご」と発声してください。そしてすぐに日本語訳が合っているか裏面を見て確認してください。合っていたら次の英単語カードを見ましょう。例えば「attend」と書かれていて、5秒考えても意味がわからなかったとします。その時は裏面の日本語訳をすぐに見ましょう。attendは「出席する」という意味なので「アテンド出席する、アテンド出席する、アテンド出席する、アテンド出席する、アテンド出席する」と5回ほど発声してください。


九九のように覚えるとはどういうことかというと、「さんし?」と言われたら「12」と何も考えずに出てきてしまいますよね。それと一緒で音声で覚えてしまうのです。「attend」と言ったら何も考えずに「出席する」という言葉が浮かんでくるのが理想です。

間違えたものは何度でも

日本語訳がわからなかったり間違えたものは一箇所にまとめましょう!
おそらく最初の方は10枚中10枚わからないとかも全然あると思います。そして、そこでわからなかったものは上に書いた方法でもう一度やりましょう。わかったものは置いておいて大丈夫です。そしてわからなかったものはまた一箇所にまとめ、また同じことをする。それを10枚全部わかるようになるまで、繰り返し繰り返し何度も何度もやるんです。すると不思議なことに、単語の意味がわかるようになってくるんです!10枚で何周も何周もまわしてたら同じ単語を何回も見ることになりますからね。嫌でも覚えます。


わからない単語がなくなったら、とってきた10枚全部でもう一度同じことをやってみましょう。覚えたものもまた忘れてしまっているかもしれませんからね。そこでわからなかったものはもう一度、、、。(笑)
10枚が終わったら次の10枚をとってきて、最初に用意した全てのカードが終わるまで同じことを繰り返してください。

暗記で大事なのは見た回数

暗記の上で大事なのは単語を見た時間ではなく、単語を見た回数です。
上でも言いましたが一回で物事を覚え切ることはほぼ不可能です。仮にその場では覚えれたとしてもすぐに忘れてしまいます。歌の歌詞も一回で必死になって覚えるのではなくて、何回も聴いていたら自然に覚えていますよね?わりと単純なことですがこのことに気づいていない人は多くいます。僕は塾講師をしていましたがその時にもこのことに気づいていない人は多くいました。
なので見る回数を増やすために、日本語訳がわからない時は粘らずにすぐに答えを見て次にいきましょう。暗記も一回一回に時間を取りすぎない。スピードが命!

復習も大事

新しい単語を覚えていくだけではなく覚えた単語も時々復習してあげてください。
例えば僕の場合は毎日覚えた単語の中からランダムで100枚程度カードをとってきて、新しい単語を覚えるやり方と同じ方法で復習していました。
このやり方はかなりスピードが速いので復習もすぐ終わります。僕は最終的にだいたい10分ぐらいで終わらしてました。何回も見た単語は意外と次の日になっても覚えているのでスラスラいけるんです!
この単語は毎回間違えるなってやつはまとめておいて、そこを重点的に復習するようにするなんてやり方もいいかもしれませんね!

なるべく声に出した方がいい

みなさん学校で音読やったことない人いないですよね?某有名塾の有名英語教師も「5回10回音読したらもう頭の中に入ってるから」とCMで言っていました。
僕は正直音読なんか意味ないだろって思ってた派なんですけど、騙されたと思って音読でやってみるとかなり効果がありました。頭の中に残りやすい。また歌の例をだすんですけど、カラオケで一回歌ってみると歌詞を覚えれたって経験も多いんですよねー。
音読はやらせるだけあってかなり効果があります!みなさんもできれば音読しましょう!
最悪声が出せない場所でやる場合は頭の中で音読してください。

リラックスしてるときに覚えた内容を思い返してみる

お風呂に入っている時などに、「attendは出席するだったな」というようにやった内容を思い返してみてください。僕的にはこれはとてもおすすめです! 記憶が定着しやすくなります。 そして、「この英単語今日やったけどなんだったけな、、、」ってなったらすぐ確認してください。
この方法は英単語の暗記に限らずいろんな場面で役立てきたのでみなさんも是非。

まとめ

自分なりの英単語の暗記法を伝授しました。ただやってみないと効果はわからないと思うので是非これからTOEICとかテストとか頑張ろうと思ってるよって方はやってみてください!効果は僕が保証します!
英単語の暗記だけではなく他のことの暗記にも役立つことをたくさん書いたのでみなさんの助けになれば幸いです。

【C言語 #4】入力した数字を使う

どーもぬまよです。


C言語 #2」と「C言語 #3」では整数や実数を表示するやり方を勉強しました。
ただこう思いませんでしたか?
「これができて意味ある?」って(笑)
「xに入力されているのは3です。」とか「xとyの和は5です。」とかって表示されてもねえ、、、。
電卓みたいに数字を入力して計算結果を出してくれるみたいな方が使い勝手がいいわけです!
他にも自分の身長を入力したら理想的な彼氏の身長を教えてくれるとかね。


ということで数字を入力できるようにしましょう!
下のコードをみてください。

#include <stdio.h>

int main(void) {
    
    //整数型のxを用意
    int x;

    //文字を表示
    printf("整数を入力してください:");
    //整数を入力させる
    scanf("%d", &x);
    
    //文字を表示
    printf("あなたは%dと入力しましたね?\nお見通しですよ?\n", x);
    
    return 0;
}

さあ今回重要になってくるのは「scanf」です!
今までは「int x = 3」という感じであらかじめ書いておいてたんですが今回は入力した数字を代入するので最初は何も代入しません。
そして「scanf("%d", &x)」と書くと「x」に入力した整数が代入されます。「&」をつけるのをお忘れなく。なんでつくかはそういうものだと今は思いましょう。
整数のときは「scanf」の「" "」の中身は「%d」としてください!
「printf」でも整数を表すのは「%d」でしたもんね。
ということで実行した結果がこちら!

整数を入力してください:

というように入力を求められます。
適当に4と入力してあげましょう。
するとこうなります。

整数を入力してください:4
あなたは4と入力しましたね?
お見通しですよ?

というようになります!
今更ですがコードは上から順番に進んでいくので、最初に「printf("整数を入力してください:")」が実行されます。
そして「scanf("%d", &x)」が来るので入力待ちですね。
「scanf」を使って入力が終わると勝手に改行されます。なので「\n」は書かなくて大丈夫です。
そして入力が終わると「printf("あなたは%dと入力しましたね?\nお見通しですよ?\n", x)」が実行されます。
「x」には入力した4が入っているので上の実行結果のように表示されます。


ふう、、、。 これで整数は入力できるようになりました!
実数の入力もやっちゃいましょう!
下のコードをみてねー。

#include <stdio.h>

int main(void) {
    
    //実数型のxを用意
    double x;

    //文字を表示
    printf("実数を入力してください:");
    //実数を入力させる
    scanf("%lf", &x);
    
    //文字を表示
    printf("あなたは%fと入力しましたね?\n何度やっても結果は同じです。\n", x);
    
    return 0;
}

整数の時との違いは、まず入力した実数を入れるためのものが必要なので「int x」ではなく「double x」にしてください。
そして「scanf」の「" "」の中には「%lf」と書いてください。

ん?

整数の時は「printf」の時と一緒の「%d」だったのに実数は「printf」の時と一緒の「%f」じゃないんかい。
ややこしい。誰やこれ決めたん。絶対適当に決めたやろ。
あと最後の「printf」のところは「%f」にしておかないと「x」がdouble型なのでエラーになります。
さて、ややこしい気持ちは置いといて実行結果をみてみましょう。

実数を入力してください:

適当に実数の6.0って入力しましょうかね。
ここで整数の6って入力しても勝手にdouble型に変更してくれるので問題ないです。

実数を入力してください:6.0
あなたは6.000000と入力しましたね?
何度やっても結果は同じです。

となるわけですね。


さあ、これを使ってちょっとお遊びをしましょうか。
どうやら女性は彼氏との身長差は15cmが一番いいというデータがあるそうです。
なのでこんなの作ってみました。

#include <stdio.h>

int main(void) {
    
    //整数型のxを用意
    int x;

    //文字を表示
    printf("あなたの身長を整数で入力してください:");
    //身長を入力させる
    scanf("%d", &x);
    
    //彼氏の理想の身長を表示
    printf("あなたの彼氏の理想の身長は%dcmです。\n", x + 15);
}

これを実行してみると

あなたの身長を整数で入力してください:160
あなたの彼氏の理想の身長は175cmです。

はい、いつでも理想の彼氏の身長を教えてくれます。
どうぞ役立ててください。


今回はここまでー。じゃーねー。

【C言語 #3】実数(小数)の計算結果を表示する

どーもぬまよです。


C言語 #2」では整数を「printf」で表示させるやり方を学びました。
次は実数のやり方を勉強しましょう!
整数と実数の違いはきちんとわかりますか?(ニヤリ)
ざっくり言うと整数は小数点がなくて実数は小数点があるです!
よくわからない人はネットで調べてみましょう。


実数と言ってもやり方はめちゃくちゃ簡単です!
整数とほぼ変わりませんから。
ということで早速コードを見ていきましょう!

#include <stdio.h>

int main(void) {
    //実数xに3を代入
    double x = 3.0;
    
    //文章に表示
    printf("xには%fが入力されている。\n", x);
    return 0;
}

整数の時と何が変わったかわかりますか?
「int→double」に「%d→%f」になっているんですね!
これを気づいたあなたはおそらくウォーリーを探せが上手いタイプですね?


さてこのコードを実行した結果がこちらでーす。

xには3.000000が入力されている。

見事に実数表示できてますね!


小数部分の桁数がやけに多くなっていますがここの部分は自分で調整することができます。
「%f」のところを「%.1f」にすると、、、

#include <stdio.h>

int main(void) {
    //実数xに3を代入
    double x = 3.0;
    
    //文章に表示
    printf("xには%.1fが入力されている。\n", x);
    return 0;
}
xには3.0が入力されている。

という風に小数部分が1桁だけになりました!
「%.2f」にすると2桁、「%.3f」にすると3桁という感じで、何も書かないとデフォルトで6桁になるようです。
他にも「%5.1f」みたいなやつとか「%05f」とかいろいろあるんですが書き出すとキリがないので今回は省略します!
気になる方は調べてみてください!


さて次は計算ですが計算もやり方一緒です。
コードと実行結果を見ていきましょう。

#include <stdio.h>

int main(void) {
    //実数xに3.0、実数yに2.0を代入
    double x = 3.0;
    double y = 2.0;

    //文章に表示
    printf("xとyの和は%fです。\n", x + y);
    return 0;
}
xとyの和は5.000000です。

はいできていますね!


ただここで一つの疑問が浮かび上がります。
整数(int)と実数(double)を計算させたらどうなるのか、、、。
ということで次の実験をしてみることにしました!

#include <stdio.h>

int main(void) {
    //実数xに3.0、整数yに2を代入
    double x = 3.0;
    int y = 2;

    //文章に表示
    printf("xとyの和は%fです。\n", x + y);
    return 0;
}

さあ、double型とint型の和はどうなるのか!
ドゥルドゥルドゥルドゥルドゥル、、、、、ジャン!

xとyの和は5.000000です。

正解は、実数で表示されるでした!!!
int型とdouble型で計算するとint型は勝手にdouble型に変換されてしまいます。
整数よりも実数の方が細かい表示ができるので空気を読んでそっちに合わせてくれるんですね。
ちなみにこの時に「%f」ではなく「%d」とやってしまうとエラーがおこります。
計算結果が実数になるんですもんね。


今回はこれで終わりまーす。 じゃーねー。

【C言語 #2】整数の計算結果を表示する

どーもぬまよです。
今回は計算した結果を文章で表示していこうと思います。


まずはコードをいきなり見ていきましょう。

#include <stdio.h>

int main(void) {
    //整数xに3を代入
    int x = 3;
    
    //文章に表示
    printf("xには%dが入力されている。\n", x);
    return 0;
}

「int」は整数ですよって意味です。
「int x = 3」で整数xに3を代入しますってことになります。
ちなみにどんな文にも最後は「;」をつけないとエラーになるのでお気をつけて。
あと「//」がついてるところはコードには反映されないので説明の文章を書くときに使います。 これを使うとあとで見返した時にわかりやすい!


printfの中に「%d」っていうのがありますが、これは整数を表示させるときに書くものです。
この「%d」には右側に書いてある「x」が入ります。
今回はxに3が代入されているので実行結果は下のようになりまーす。

xには3が入力されている。
Program ended with exit code: 0


はい!ということで整数を表示させることができるようになりました!
次は計算させていきましょう。

#include <stdio.h>

int main(void) {
    int x = 3;
    int y = 7;
    
    printf("3と7を足した結果は%dです。\n", x + y);
    return 0;
}

「%d」には右側に書いてある「x + y」の結果が入るので下のような結果になります。

3と7を足した結果は10です。
Program ended with exit code: 0

ちなみに

  • 足し算:+
  • 引き算:-
  • 掛け算:*
  • 割り算:/
  • あまり:%

って感じですね。


とりあえず今回はここまでにしときます!
あまり多く書いてもあれだし1記事に1項目って感じでやってきます!