Micomprocedure Wiki
Inner/役職ソート/プログラミング/2013プログラミング講習会/第2回
をテンプレートにして作成
開始行:
#contents
* 前回の補足 [#q38db916]
前回導入して頂いたVisualStudioは、コードを書くための様々な道具がひとつになった「IDE(Integrated Development Environment、統合開発環境)」と呼ばれるものです。
C++のコードをコンピュータが読めるもの(機械語)に変換してくれる''「コンパイラ」''や、バグ(プログラムの間違い)を治す(デバッグ)手助けをしてくれる''「デバッガ」''などが含まれています。
* 変数とは [#q046b893]
変数とは、よく入門書とかで「箱」に例えられる、「何らかの数値などを保存しておく場所(メモリ空間)」です。
#code(cpp){{
int x;
char c;
const double hogeHoge;
}}
のように、使う前にあらかじめ
''「(修飾子)「型」(修飾子)「名前」(=初期値)」''
の形で宣言しておく必要があります。
名前は「英数字と'_'と'-'」「先頭に数字は置けない」「プログラムで使うためにあらかじめ決められたいくつかの単語(予約語)は使えない」などの制限はあるものの、概ね好き勝手に付けることができます。大文字と小文字は区別されます。
修飾子については必要になったらその都度紹介します。
「=初期値」で初期化できるのは、後述する関数内など特定の場所で宣言する場合に限られます。
変数は基本的に同一スコープ({ から} まで)でしか有効ではありません。
例:
#code(cpp,highlight[2.5]){{
void func(){
int a=42;
}
void func2(){
a=31337; //エラー!
}
}}
** 型とは [#v33c51b4]
型とは、厳密な定義については色々と議論のあるところのようですが、簡単かつ乱暴に言ってしまえば
「その変数が整数なのか?実数なのか?文字なのか?」を定義する識別子
と言うことができるでしょう。
同じ「1」でも、整数の1なのか、小数を含む1.000…なのか、文字としての「1」なのかを、C/C++では区別します。また、それぞれの型によってメモリ空間に占める大きさが異なります。
C/C++における「基本型」はだいたい以下のとおりです。
*** 整数: int [#bfff754a]
整数を扱います。
一般的に4バイト(32ビット)のメモリ長で扱われ、 -2,147,483,648から2,147,483,647までの整数を扱うことができます。
*** 実数: float, double [#s853cef6]
実数を扱います。
正確には「浮動小数点型」と呼ばれる実数の近似を扱うため、誤差が生まれることもあります。(先輩が書いて頂いた[[浮動小数点と誤差]]を参照。)
floatは「単精度」とも呼ばれ、一般的に4バイト(32ビット)のメモリ長で扱われ、6桁の有効精度が保証されます。
doubleは「倍精度」とも呼ばれ、一般的に8バイト(64ビット)のメモリ長で扱われ、15桁の有効精度が保証されます。
最近のコンピュータでは迷わずdoubleを使って下さい。コンピュータ内部では全てdouble もしくはより精度の高いlong doubleに変換されて計算されるため、floatでは実行速度が遅くなってしまうことがあります。
*** 文字: char [#u5a2c316]
char型1つで1文字を表します。
文字はコンピュータ内部では数値として扱われ、「文字コード」と呼ばれる決められた対応表によって我々が認識できる文字として表示されます。
1バイト(8ビット)のメモリ長で扱われ、-127から127までの整数を扱うことができます。
(整数を扱うといっても、「普通の」整数を扱う場合はintを使って下さい。内部では全てintに変換されて計算されるため、charは逆に遅くなってしまうことがあります。)
*** 真偽値(ブーリアン): bool [#sa6fd6a4]
真(true)か偽(false)かを扱います。
C++から実装された型のため、Cでは使えません。
メモリ長は環境依存です。
*** 空集合: void [#a6bd6f22]
「何もない」ことを表します。
変数ではほとんど使いません。
後述する関数の戻り値が何もないことを表す場合によく用いられます。
** 覚えておくと便利な修飾子 [#n2e8c5c6]
- unsigned
その変数が0以上の正の値であることを表します。符号が付かない分、より大きな数(約2倍)を扱うことができます。
- signed
unsignedの逆で、負の値も取りうることを表します。何も書かない場合はデフォルトでこっちです。
- long
intやdoubleに用いることができ、倍のメモリ長を確保することでより大きな数を扱うことができます。更に大きなlong longも使うことができます。
- const
その変数が定数であることを表します。
* 関数とは [#p0869e00]
関数とは、0個以上の入力に対して1つの出力を持つデータ型です。
数学の関数(例えば&tex($f(x)=x^2$);とか)を思い浮かべて頂ければイメージしやすいかと。
イメージとしては
ここに3つのint型があるじゃろ?
( ^ω^)
⊃(int)(int)(int)⊂
これを
( ^ω^)
⊃)()()()(⊂
こうして…
( ^ω^)
≡⊃⊂≡
こうじゃ…
( ^ω^)
⊃(int)⊂
みたいな。
この入力を''「引数(ひきすう)」''と言い、出力を''「戻り値」''や''「返り値」''と言います。
入力と出力以外に影響をおよぼすこと(外部の変数を書き換えたり画面に文字を表示したりとか)もでき、これを関数の''「副作用」''と呼びます。
関数の名前も、変数の場合と同じく比較的好き勝手に付けることができます。
では、実際に書いてみましょう。
「2つの整数型の引数x,yを取り、それを足して返す」という関数AddFunctionの場合、
#code(cpp){{
int AddFunction(int x, int y){
return x + y;
}
}}
となります。
なお、プログラム全体の中で「main」という関数が最初に実行されます。
* 代表的な演算子 [#of819fbb]
** 四則演算 [#bf4f88c4]
+, -, *, /, ()
×は*、÷は/になるので注意。
数学と同じく、+や-よりも*や/の方が優先順位が高いので注意。+を先に計算したい場合は()で囲いましょう。詳しくは先輩が書いて頂いた[[演算子の優先順位]]を参照して下さい。
** 剰余(モジュロ) [#s4b51ee2]
%
割った余りを求めます。
** インクリメント、デクリメント [#c154fc46]
++, --
整数型の変数に対して++を付けると1増え、--を付けると1減ります。
変数の前につける(前置)か後につける(後置)かで処理が異なり、
前に付けた場合は、値が加算(減算)''されてから''使われ
後に付けた場合は使われた''後に''加算(減算)されます。
** 代入 [#x656874c]
=
数学の=とややニュアンスが異なってくるので注意。
** 比較 [#n95776f8]
==, !=, <, >, <=, >=
==を=と書き間違えるミスはよくやります(´・ω・`)
** 論理AND, OR [#k17b2845]
&&, ||
「かつ」または「または」を表します。
他にもキャスト(型同士の変換)やビット演算などがありますが、今回は省略。時間があったらそのうち扱います。([[ビット演算]]に関しては先輩が書いて頂きました)
* 代表的な構文 [#oce9b4a0]
** コメント [#c597517e]
プログラムは(人間に読みやすいように工夫されているにしろ)人間には理解し難い部分も多いため、人間に理解しやすい注釈や説明などを加える必要があります。
/*
と
*/
で囲われた部分はコメントとなり、コンパイラからは無視されます。
また、C++では
//
と書いた箇所から行末までもコメントとなります。
例:
#code(cpp){{
/*
コ
メ
ン
ト
*/
//コメント
int a; //普通の文の行末にも書けます
}}
** if [#td5e4d5a]
その名の通り、「もし〜なら、こうする」という構文です。
例:
#code(cpp){{
int a = 42;
if(a == 0){
//aが0の時の処理
}else if(a % 2 == 0){
//aが偶数の時の処理
}else{
//それ以外
}
}}
このコードでは、
#code(cpp,first-line:5){{
//aが偶数の時の処理
}}
が実行されます。
** while [#i9cf2994]
「〜の間、これを繰り返す」というループ構文です。
例
#code(cpp){{
int i = 0;
while(i < 10){
i++;
}
//aは10になっている
}}
条件の判定をあとで行いたい場合、
#code(cpp){{
do{
//なんちゃら
}while(条件);
}}
と書きます。
** for [#ybc00d00]
「〜回繰り返す」という構文です。
for(変数=初期値;ループする条件;各ループごとに実行される文)
と書きます。
#code(cpp){{
for(int i=0;i<10;i++){
//なんちゃら
}
}}
* プログラムを書く際の心得 [#b615448f]
** 他人に見せるつもりでコードを書こう! [#u7ce55f7]
たとえ一人で書くプログラムでも、他人に見せる・理解してもらうつもりで綺麗なコードを書くよう心がけましょう。「3日後の自分は他人」ともよく言われます。
「コーディング規約」や「コーディング標準」「コーディングスタイル」などと呼ばれる、「書き方のルール」を決めるのもオススメです。
有名なものでは、書籍
>Effective C++ 第3版−プログラムとデザインを改良するための55項目("Effective C++, Third Edition"、Scott Meyers著)
(これは部室にあるので、C++がある程度書けるようになったら是非読んでね!難しいけど!)
ウェブサイト
>[[Google C++スタイルガイド 日本語訳:http://www.textdrop.net/google-styleguide-ja/cppguide.xml#%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87]]
などがあります。
** 変数名/関数名などは分かりやすい名前を! [#ve36921b]
一目見て、何をする変数・関数etcなのか?が分かるようにしましょう。
例えば、「敵の攻撃状態を保持する変数」に「onakasuita」とか「i_like_sushi」とかそういう変数名が付いてたら、何をする変数か全くわかりませんよね?それよりは「enemy_attack_status」とか、長いと思ったら「enmAtkStatus」とか判りやすく付けましょう。
また、名前は英語でつけるのが一般的です。もし英語がわからなければ、無理せずローマ字で付けるのもありかもしれません。
ドイツ語とかフランス語とかラテン語とかでつけるとカッコいいかもしれませんが、他人が読んだ時にわからないので止めたほうが無難かと思います(´・ω・`)
上記のコーディング規約にも関係あるのですが、「変数名は小文字で始める」「関数名は大文字で始め、なるべく英単語を省略しない」みたいなルールを決めておくと分かりやすいです。
** コメントはこまめにつけよう! [#yb19e438]
コメントは面倒臭いですが、こまめに付ける癖をつけましょう。他人が読んで分かりやすいですし、自分が見返した時に流れを把握しやすいです。
** 「無駄」な苦労を避ける事を考えよう! [#b1d65192]
「どうすれば短く・簡単にやりたいことを実現できるか?」を考えるのも大事です。
誰かプロセの先輩がすでに同じコードを書いてるかもしれませんし、ネットを探せばライブラリの形で誰かが公開しているかもしれません。
また、自分でコードを書く場合でも、今より効率のいい方法があるかもしれません。
ただし許可を得ないで他人のコードをパクるのは厳禁ですので、その辺は徹底しましょう。
** 技術に貪欲になろう! [#m2b88c39]
自分が書いたコードに満足せずに、「更により良い方法はないか?」を考えましょう。それが自分の技術力向上につながります。
また、プログラミングは大変奥が深く、日々進化しています。それを常に貪欲に追いかけることも大切です。今自分が持っている技術は、近い将来必ず過去のものになり、よりよい技術が生まれるのですから。
長々と偉そうに書きましたが、こういう心得って自分も守れてないことが多いんだよね…。でも大事なことだと思います。
#comment
終了行:
#contents
* 前回の補足 [#q38db916]
前回導入して頂いたVisualStudioは、コードを書くための様々な道具がひとつになった「IDE(Integrated Development Environment、統合開発環境)」と呼ばれるものです。
C++のコードをコンピュータが読めるもの(機械語)に変換してくれる''「コンパイラ」''や、バグ(プログラムの間違い)を治す(デバッグ)手助けをしてくれる''「デバッガ」''などが含まれています。
* 変数とは [#q046b893]
変数とは、よく入門書とかで「箱」に例えられる、「何らかの数値などを保存しておく場所(メモリ空間)」です。
#code(cpp){{
int x;
char c;
const double hogeHoge;
}}
のように、使う前にあらかじめ
''「(修飾子)「型」(修飾子)「名前」(=初期値)」''
の形で宣言しておく必要があります。
名前は「英数字と'_'と'-'」「先頭に数字は置けない」「プログラムで使うためにあらかじめ決められたいくつかの単語(予約語)は使えない」などの制限はあるものの、概ね好き勝手に付けることができます。大文字と小文字は区別されます。
修飾子については必要になったらその都度紹介します。
「=初期値」で初期化できるのは、後述する関数内など特定の場所で宣言する場合に限られます。
変数は基本的に同一スコープ({ から} まで)でしか有効ではありません。
例:
#code(cpp,highlight[2.5]){{
void func(){
int a=42;
}
void func2(){
a=31337; //エラー!
}
}}
** 型とは [#v33c51b4]
型とは、厳密な定義については色々と議論のあるところのようですが、簡単かつ乱暴に言ってしまえば
「その変数が整数なのか?実数なのか?文字なのか?」を定義する識別子
と言うことができるでしょう。
同じ「1」でも、整数の1なのか、小数を含む1.000…なのか、文字としての「1」なのかを、C/C++では区別します。また、それぞれの型によってメモリ空間に占める大きさが異なります。
C/C++における「基本型」はだいたい以下のとおりです。
*** 整数: int [#bfff754a]
整数を扱います。
一般的に4バイト(32ビット)のメモリ長で扱われ、 -2,147,483,648から2,147,483,647までの整数を扱うことができます。
*** 実数: float, double [#s853cef6]
実数を扱います。
正確には「浮動小数点型」と呼ばれる実数の近似を扱うため、誤差が生まれることもあります。(先輩が書いて頂いた[[浮動小数点と誤差]]を参照。)
floatは「単精度」とも呼ばれ、一般的に4バイト(32ビット)のメモリ長で扱われ、6桁の有効精度が保証されます。
doubleは「倍精度」とも呼ばれ、一般的に8バイト(64ビット)のメモリ長で扱われ、15桁の有効精度が保証されます。
最近のコンピュータでは迷わずdoubleを使って下さい。コンピュータ内部では全てdouble もしくはより精度の高いlong doubleに変換されて計算されるため、floatでは実行速度が遅くなってしまうことがあります。
*** 文字: char [#u5a2c316]
char型1つで1文字を表します。
文字はコンピュータ内部では数値として扱われ、「文字コード」と呼ばれる決められた対応表によって我々が認識できる文字として表示されます。
1バイト(8ビット)のメモリ長で扱われ、-127から127までの整数を扱うことができます。
(整数を扱うといっても、「普通の」整数を扱う場合はintを使って下さい。内部では全てintに変換されて計算されるため、charは逆に遅くなってしまうことがあります。)
*** 真偽値(ブーリアン): bool [#sa6fd6a4]
真(true)か偽(false)かを扱います。
C++から実装された型のため、Cでは使えません。
メモリ長は環境依存です。
*** 空集合: void [#a6bd6f22]
「何もない」ことを表します。
変数ではほとんど使いません。
後述する関数の戻り値が何もないことを表す場合によく用いられます。
** 覚えておくと便利な修飾子 [#n2e8c5c6]
- unsigned
その変数が0以上の正の値であることを表します。符号が付かない分、より大きな数(約2倍)を扱うことができます。
- signed
unsignedの逆で、負の値も取りうることを表します。何も書かない場合はデフォルトでこっちです。
- long
intやdoubleに用いることができ、倍のメモリ長を確保することでより大きな数を扱うことができます。更に大きなlong longも使うことができます。
- const
その変数が定数であることを表します。
* 関数とは [#p0869e00]
関数とは、0個以上の入力に対して1つの出力を持つデータ型です。
数学の関数(例えば&tex($f(x)=x^2$);とか)を思い浮かべて頂ければイメージしやすいかと。
イメージとしては
ここに3つのint型があるじゃろ?
( ^ω^)
⊃(int)(int)(int)⊂
これを
( ^ω^)
⊃)()()()(⊂
こうして…
( ^ω^)
≡⊃⊂≡
こうじゃ…
( ^ω^)
⊃(int)⊂
みたいな。
この入力を''「引数(ひきすう)」''と言い、出力を''「戻り値」''や''「返り値」''と言います。
入力と出力以外に影響をおよぼすこと(外部の変数を書き換えたり画面に文字を表示したりとか)もでき、これを関数の''「副作用」''と呼びます。
関数の名前も、変数の場合と同じく比較的好き勝手に付けることができます。
では、実際に書いてみましょう。
「2つの整数型の引数x,yを取り、それを足して返す」という関数AddFunctionの場合、
#code(cpp){{
int AddFunction(int x, int y){
return x + y;
}
}}
となります。
なお、プログラム全体の中で「main」という関数が最初に実行されます。
* 代表的な演算子 [#of819fbb]
** 四則演算 [#bf4f88c4]
+, -, *, /, ()
×は*、÷は/になるので注意。
数学と同じく、+や-よりも*や/の方が優先順位が高いので注意。+を先に計算したい場合は()で囲いましょう。詳しくは先輩が書いて頂いた[[演算子の優先順位]]を参照して下さい。
** 剰余(モジュロ) [#s4b51ee2]
%
割った余りを求めます。
** インクリメント、デクリメント [#c154fc46]
++, --
整数型の変数に対して++を付けると1増え、--を付けると1減ります。
変数の前につける(前置)か後につける(後置)かで処理が異なり、
前に付けた場合は、値が加算(減算)''されてから''使われ
後に付けた場合は使われた''後に''加算(減算)されます。
** 代入 [#x656874c]
=
数学の=とややニュアンスが異なってくるので注意。
** 比較 [#n95776f8]
==, !=, <, >, <=, >=
==を=と書き間違えるミスはよくやります(´・ω・`)
** 論理AND, OR [#k17b2845]
&&, ||
「かつ」または「または」を表します。
他にもキャスト(型同士の変換)やビット演算などがありますが、今回は省略。時間があったらそのうち扱います。([[ビット演算]]に関しては先輩が書いて頂きました)
* 代表的な構文 [#oce9b4a0]
** コメント [#c597517e]
プログラムは(人間に読みやすいように工夫されているにしろ)人間には理解し難い部分も多いため、人間に理解しやすい注釈や説明などを加える必要があります。
/*
と
*/
で囲われた部分はコメントとなり、コンパイラからは無視されます。
また、C++では
//
と書いた箇所から行末までもコメントとなります。
例:
#code(cpp){{
/*
コ
メ
ン
ト
*/
//コメント
int a; //普通の文の行末にも書けます
}}
** if [#td5e4d5a]
その名の通り、「もし〜なら、こうする」という構文です。
例:
#code(cpp){{
int a = 42;
if(a == 0){
//aが0の時の処理
}else if(a % 2 == 0){
//aが偶数の時の処理
}else{
//それ以外
}
}}
このコードでは、
#code(cpp,first-line:5){{
//aが偶数の時の処理
}}
が実行されます。
** while [#i9cf2994]
「〜の間、これを繰り返す」というループ構文です。
例
#code(cpp){{
int i = 0;
while(i < 10){
i++;
}
//aは10になっている
}}
条件の判定をあとで行いたい場合、
#code(cpp){{
do{
//なんちゃら
}while(条件);
}}
と書きます。
** for [#ybc00d00]
「〜回繰り返す」という構文です。
for(変数=初期値;ループする条件;各ループごとに実行される文)
と書きます。
#code(cpp){{
for(int i=0;i<10;i++){
//なんちゃら
}
}}
* プログラムを書く際の心得 [#b615448f]
** 他人に見せるつもりでコードを書こう! [#u7ce55f7]
たとえ一人で書くプログラムでも、他人に見せる・理解してもらうつもりで綺麗なコードを書くよう心がけましょう。「3日後の自分は他人」ともよく言われます。
「コーディング規約」や「コーディング標準」「コーディングスタイル」などと呼ばれる、「書き方のルール」を決めるのもオススメです。
有名なものでは、書籍
>Effective C++ 第3版−プログラムとデザインを改良するための55項目("Effective C++, Third Edition"、Scott Meyers著)
(これは部室にあるので、C++がある程度書けるようになったら是非読んでね!難しいけど!)
ウェブサイト
>[[Google C++スタイルガイド 日本語訳:http://www.textdrop.net/google-styleguide-ja/cppguide.xml#%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87]]
などがあります。
** 変数名/関数名などは分かりやすい名前を! [#ve36921b]
一目見て、何をする変数・関数etcなのか?が分かるようにしましょう。
例えば、「敵の攻撃状態を保持する変数」に「onakasuita」とか「i_like_sushi」とかそういう変数名が付いてたら、何をする変数か全くわかりませんよね?それよりは「enemy_attack_status」とか、長いと思ったら「enmAtkStatus」とか判りやすく付けましょう。
また、名前は英語でつけるのが一般的です。もし英語がわからなければ、無理せずローマ字で付けるのもありかもしれません。
ドイツ語とかフランス語とかラテン語とかでつけるとカッコいいかもしれませんが、他人が読んだ時にわからないので止めたほうが無難かと思います(´・ω・`)
上記のコーディング規約にも関係あるのですが、「変数名は小文字で始める」「関数名は大文字で始め、なるべく英単語を省略しない」みたいなルールを決めておくと分かりやすいです。
** コメントはこまめにつけよう! [#yb19e438]
コメントは面倒臭いですが、こまめに付ける癖をつけましょう。他人が読んで分かりやすいですし、自分が見返した時に流れを把握しやすいです。
** 「無駄」な苦労を避ける事を考えよう! [#b1d65192]
「どうすれば短く・簡単にやりたいことを実現できるか?」を考えるのも大事です。
誰かプロセの先輩がすでに同じコードを書いてるかもしれませんし、ネットを探せばライブラリの形で誰かが公開しているかもしれません。
また、自分でコードを書く場合でも、今より効率のいい方法があるかもしれません。
ただし許可を得ないで他人のコードをパクるのは厳禁ですので、その辺は徹底しましょう。
** 技術に貪欲になろう! [#m2b88c39]
自分が書いたコードに満足せずに、「更により良い方法はないか?」を考えましょう。それが自分の技術力向上につながります。
また、プログラミングは大変奥が深く、日々進化しています。それを常に貪欲に追いかけることも大切です。今自分が持っている技術は、近い将来必ず過去のものになり、よりよい技術が生まれるのですから。
長々と偉そうに書きましたが、こういう心得って自分も守れてないことが多いんだよね…。でも大事なことだと思います。
#comment
ページ名:
サイト内を検索
AND検索
OR検索
操作メニュー
サークル情報
†
名称
東北大学文化部登録団体
東北大学マイコンプロシージャ
部室
川内北キャンパス内
川内サークル部室棟 4階
416号室
設立
1979年4月1日
(45年前)
活動内容
ゲームの制作・発表等
(
詳細
)
連絡先
こちら
↑
Twitter
†
@micom_procedure からのツイート
このウェブページについて
ここを編集
コンテンツ
†
トップページ
マイコンプロシージャとは?
公開中の作品
その他の作品
資料室
情報室
リンク
部内向けページトップ
最新の20件
2023年05月25日
ContactUs
2022年11月03日
公開中の作品/2021年度新入生プロジェクト/Gravity-Lost
公開中の作品/2021年度新入生プロジェクト/はるさがし
2021年12月13日
公開中の作品/2021年度新入生プロジェクト/落単・タイム・アタック!
公開中の作品/2021年度新入生プロジェクト/神社からの脱出
RecentDeleted
公開中の作品/2021年度新入生プロジェクト/THE Unexpected Fighting Operation
公開中の作品/2021年度新入生プロジェクト
2021年12月03日
公開中の作品/2020年度新入生プロジェクト/城熊
公開中の作品/2020年度新入生プロジェクト
2021年07月18日
公開中の作品
ProcGameJam9
Inneer/C++_const
2021年04月18日
公開中の作品/2020年度新入生プロジェクト/CrossFade
2021年04月17日
2021年度新歓情報
公開中の作品/2020年度新入生プロジェクト/TeamC no game
2021年04月07日
ようこそ
公開中の作品/2020年度新入生プロジェクト/トキノカダイ
2021年04月04日
2020年度新歓情報
2020年09月15日
ProcGameJam10
ここを編集