SlideShare a Scribd company logo
1 of 18
C言語入門
~ 読みやすいコードを書く ~
本日の目標
• 読みやすい(可読性の高い)コードを書け
るようになる
• 1ヶ月後に見返しても、すぐ理解できるよ
うなコードを書けるようになる
(「1ヶ月前に書いたコードは他人が書いたコード」といわれる)
1
読みやすいコードは
永遠のテーマ
なぜ可読性の高いコードを
書く必要があるのか?
コードが汚いと…
• 理解するのに時間がかかる
• バグが紛れ込みやすい
• 修正・改修が困難になる
• 「一緒に仕事したくない」と思われる
4
汚いコードとは?
• 記述が統一されていない
• 命名(変数名、関数名など)が不適切
• コメントで補足しないと意味が伝わらない
• ひとつの関数の処理が長い
• 冗長的な処理が多い
などなど・・・
5
可読性の高いコードとは?
可読性の高いコードとは?
• プログラマのワーキングメモリを浪費させない
• インデント・スペース・改行が適切に使われてお
り、構造的にわかりやすい
• 記述が統一されており、処理を予測できる
• 変数名・関数名などに意味を持たせている
• 理解を阻むノイズ(冗長)がない(短い)
7
インデントをつかう 8
#include <stdio.h>
int main(void){
int a;
printf("西暦を入力してください。¥n");
printf("西暦 :");
scanf(“%d”,&a);
// 入力値を判定して「うるう年」、「平年」を表示する
if(0==a%400){
puts ("うるう年です。");
}else if(a%100==0){
printf("平年です。¥n");
}else if(0==a%4){
puts(“うるう年です。");
}else{
printf("平年です。¥n");
}
return 0;
}
#include <stdio.h>
int main(void){
int a;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”,&a);
// 入力値を判定して「うるう年」、「平年」を表示する
if(0==a%400){
puts(“うるう年です。");
}else if(a%100==0){
printf("平年です。¥n");
}else if(0==a%4){
puts(“うるう年です。”);
}else{
printf("平年です。¥n");
}
return 0;
}
インデントがないコード インデントをつかったコード
中括弧 {} がでてきたら
インデントをつける
スペースをつかう 9
#include <stdio.h>
int main(void){
int a;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”,&a);
// 入力値を判定して「うるう年」、「平年」を表示する
if(0==a%400){
puts("うるう年です。");
}else if(a%100==0){
printf("平年です。¥n");
}else if(0==a%4){
puts(“うるう年です。”);
}else{
printf("平年です。¥n");
}
return 0;
}
#include <stdio.h>
int main(void){
int a;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”, &a);
// 入力値を判定して「うるう年」、「平年」を表示する
if (0 == a % 400) {
puts("うるう年です。");
} else if (a % 100 == 0) {
printf("平年です。¥n");
} else if (0 == a % 4) {
puts(“うるう年です。”);
} else {
printf("平年です。¥n");
}
return 0;
}
スペースがないコード スペースをつかったコード
キーワードや式などの間に
スペースをいれる
※関数名と()の間にはスペース
を入れない
改行をつかう 10
#include <stdio.h>
int main(void){
int a;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”, &a);
// 入力値を判定して「うるう年」、「平年」を表示する
if (0 == a % 400) {
puts("うるう年です。");
} else if (a % 100 == 0) {
printf("平年です。¥n");
} else if (0 == a % 4) {
puts(“うるう年です。”);
} else {
printf("平年です。¥n");
}
return 0;
}
#include <stdio.h>
int main(void){
int a;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”, &a);
// 入力値を判定して「うるう年」、「平年」を表示する
if (0 == a % 400) {
puts(“うるう年です。”);
} else if (a % 100 == 0) {
printf("平年です。¥n");
} else if (0 == a % 4) {
puts(“うるう年です。”);
} else {
printf("平年です。¥n");
}
return 0;
}
改行がないコード 改行をつかったコード
処理のグループごとに改行で区切る
※ このコードを例にとると
1. 変数の宣言
2. 数値の入力
3. 判定処理
記述を統一する 11
#include <stdio.h>
int main(void){
int a;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”, &a);
// 入力値を判定して「うるう年」、「平年」を表示する
if (0 == a % 400) {
puts(“うるう年です。”);
} else if (a % 100 == 0) {
printf("平年です。¥n");
} else if (0 == a % 4) {
puts(“うるう年です。”);
} else {
printf("平年です。¥n");
}
return 0;
}
#include <stdio.h>
int main(void){
int a;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”, &a);
// 入力値を判定して「うるう年」、「平年」を表示する
if (a % 400 == 0) {
printf("うるう年です。¥n");
} else if (a % 100 == 0) {
printf("平年です。¥n");
} else if (a % 4 == 0) {
printf(“うるう年です。¥n”);
} else {
printf("平年です。¥n");
}
return 0;
}
統一されていないコード 統一されているコード
if文の条件は、
式を伴なう比較は、左辺に式を書く
不等号なら「左辺 < 右辺」
などなど
適切な変数名をつける 12
#include <stdio.h>
int main(void){
int a;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”, &a);
// 入力値を判定して「うるう年」、「平年」を表示する
if (a % 400 == 0) {
printf("うるう年です。¥n");
} else if (a % 100 == 0) {
printf("平年です。¥n");
} else if (a % 4 == 0) {
printf(“うるう年です。¥n”);
} else {
printf("平年です。¥n");
}
return 0;
}
#include <stdio.h>
int main(void){
int year;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”, &year);
// 入力値を判定して「うるう年」、「平年」を表示する
if (year % 400 == 0) {
printf("うるう年です。¥n");
} else if (year % 100 == 0) {
printf("平年です。¥n");
} else if (year % 4 == 0) {
printf(“うるう年です。¥n”);
} else {
printf("平年です。¥n");
}
return 0;
}
意味のない変数名のコード 意味のある変数名のコード
yearなら変数に「年(西暦)」が
入っていることがわかる
コメントを使わず伝える 13
#include <stdio.h>
int main(void){
int year;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”, &year);
// 入力値を判定して「うるう年」、「平年」を表示する
if (year % 400 == 0) {
printf("うるう年です。¥n");
} else if (year % 100 == 0) {
printf("平年です。¥n");
} else if (year % 4 == 0) {
printf(“うるう年です。¥n”);
} else {
printf("平年です。¥n");
}
return 0;
}
#include <stdio.h>
int isLeapYear(int year) {
if (year % 400 == 0) {
return 1;
} else if (year % 100 == 0) {
return 0;
} else if (year % 4 == 0) {
return 1;
} else {
return 0;
}
}
int main(void){
int year;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”, &year);
if (isLeapYear(year)) {
printf("うるう年です。¥n");
} else {
printf("平年です。¥n");
}
return 0;
}
コメントがあるコード コメントを使わず伝えるコード
main処理に注目すると、
1. if(isLeapYear)だけでうるう年の
判定だとわかる
2. うるう年の判定条件を考えなくてよい
冗長的な処理を削除する 14
#include <stdio.h>
int isLeapYear(int year) {
if (year % 400 == 0) {
return 1;
} else if (year % 100 == 0) {
return 0;
} else if (year % 4 == 0) {
return 1;
} else {
return 0;
}
}
int main(void){
int year;
printf(“西暦を入力してください。¥n”);
printf("西暦 :");
scanf(“%d”, &year);
if (isLeapYear(year)) {
printf("うるう年です。¥n");
} else {
printf("平年です。¥n");
}
return 0;
}
#include <stdio.h>
int isLeapYear(int year) {
if (year % 400 == 0
|| (year % 4 == 0 && year % 100 != 0)) {
return 1;
} else {
return 0;
}
}
int main(void){
int year;
printf("西暦を入力してください。¥n");
printf("西暦 :");
scanf("%d", &year);
if (isLeapYear(year)) {
printf("うるう年です。¥n");
} else {
printf("平年です。¥n");
}
return 0;
}
冗長的なコード 冗長を排除したコード
isLeapYear のreturnが
シンプルになる
※ 冗長させたほうが分かりやすい
場合は、そのままにしておく
修正前後のコードの比較 15
#include <stdio.h>
int main(void){
int a;
printf("西暦を入力してください。¥n");
printf("西暦 :");
scanf(“%d”,&a);
// 入力値を判定して「うるう年」、「平年」を表示する
if(0==a%400){
puts ("うるう年です。");
}else if(a%100==0){
printf("平年です。¥n");
}else if(0==a%4){
puts(“うるう年です。");
}else{
printf("平年です。¥n");
}
return 0;
}
#include <stdio.h>
int isLeapYear(int year) {
if (year % 400 == 0
|| (year % 4 == 0 && year % 100 != 0)) {
return 1;
} else {
return 0;
}
}
int main(void){
int year;
printf("西暦を入力してください。¥n");
printf("西暦 :");
scanf("%d", &year);
if (isLeapYear(year)) {
printf("うるう年です。¥n");
} else {
printf("平年です。¥n");
}
return 0;
}
修正前のコード 修正後のコード
これが正解とは限らない
「読みやすさ」を意識して
プログラミングしてください

More Related Content

Viewers also liked

8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)bc_rikko
 
7_C言語入門 - 型変換について
7_C言語入門 - 型変換について7_C言語入門 - 型変換について
7_C言語入門 - 型変換についてbc_rikko
 
5_C言語入門 - 変数について
5_C言語入門 - 変数について5_C言語入門 - 変数について
5_C言語入門 - 変数についてbc_rikko
 
6_C言語入門 - 式と演算子について
6_C言語入門 - 式と演算子について6_C言語入門 - 式と演算子について
6_C言語入門 - 式と演算子についてbc_rikko
 
2_C言語入門 - VisualStudioについて
2_C言語入門 - VisualStudioについて2_C言語入門 - VisualStudioについて
2_C言語入門 - VisualStudioについてbc_rikko
 
やさしく知りたいC言語
やさしく知りたいC言語やさしく知りたいC言語
やさしく知りたいC言語uru nru
 
コードゴルフのススメ(C言語)
コードゴルフのススメ(C言語)コードゴルフのススメ(C言語)
コードゴルフのススメ(C言語)Fumihito Yokoyama
 
オペレーティングシステム 第2回-公開用
オペレーティングシステム 第2回-公開用オペレーティングシステム 第2回-公開用
オペレーティングシステム 第2回-公開用Ruo Ando
 
第三回ネットワークチーム講座資料
第三回ネットワークチーム講座資料第三回ネットワークチーム講座資料
第三回ネットワークチーム講座資料densan_teacher
 
[中1英語] 01_英語の勉強の仕方
[中1英語] 01_英語の勉強の仕方[中1英語] 01_英語の勉強の仕方
[中1英語] 01_英語の勉強の仕方curio-e
 
Scis2017 2007-01-27-02
Scis2017 2007-01-27-02Scis2017 2007-01-27-02
Scis2017 2007-01-27-02Ruo Ando
 
[C13] フラッシュドライブで挑むOracle超高速化と信頼性の両立 by Masashi Fukui
[C13] フラッシュドライブで挑むOracle超高速化と信頼性の両立 by Masashi Fukui[C13] フラッシュドライブで挑むOracle超高速化と信頼性の両立 by Masashi Fukui
[C13] フラッシュドライブで挑むOracle超高速化と信頼性の両立 by Masashi FukuiInsight Technology, Inc.
 
情報技術の基本と仮想化について
情報技術の基本と仮想化について情報技術の基本と仮想化について
情報技術の基本と仮想化についてrookwin
 
情報セキュリティと標準化I 第1回-公開用
情報セキュリティと標準化I 第1回-公開用情報セキュリティと標準化I 第1回-公開用
情報セキュリティと標準化I 第1回-公開用Ruo Ando
 
基本情報技術者試験 勉強会
基本情報技術者試験 勉強会基本情報技術者試験 勉強会
基本情報技術者試験 勉強会Yusuke Furuta
 
講演資料 201606 web公開版
講演資料 201606 web公開版講演資料 201606 web公開版
講演資料 201606 web公開版Ruo Ando
 
オペレーティングシステム 第1回-公開用
オペレーティングシステム 第1回-公開用オペレーティングシステム 第1回-公開用
オペレーティングシステム 第1回-公開用Ruo Ando
 

Viewers also liked (20)

8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)
 
7_C言語入門 - 型変換について
7_C言語入門 - 型変換について7_C言語入門 - 型変換について
7_C言語入門 - 型変換について
 
5_C言語入門 - 変数について
5_C言語入門 - 変数について5_C言語入門 - 変数について
5_C言語入門 - 変数について
 
6_C言語入門 - 式と演算子について
6_C言語入門 - 式と演算子について6_C言語入門 - 式と演算子について
6_C言語入門 - 式と演算子について
 
2_C言語入門 - VisualStudioについて
2_C言語入門 - VisualStudioについて2_C言語入門 - VisualStudioについて
2_C言語入門 - VisualStudioについて
 
やさしく知りたいC言語
やさしく知りたいC言語やさしく知りたいC言語
やさしく知りたいC言語
 
コードゴルフのススメ(C言語)
コードゴルフのススメ(C言語)コードゴルフのススメ(C言語)
コードゴルフのススメ(C言語)
 
C言語超入門
C言語超入門C言語超入門
C言語超入門
 
C言語講習会1
C言語講習会1C言語講習会1
C言語講習会1
 
情報システム系
情報システム系情報システム系
情報システム系
 
オペレーティングシステム 第2回-公開用
オペレーティングシステム 第2回-公開用オペレーティングシステム 第2回-公開用
オペレーティングシステム 第2回-公開用
 
第三回ネットワークチーム講座資料
第三回ネットワークチーム講座資料第三回ネットワークチーム講座資料
第三回ネットワークチーム講座資料
 
[中1英語] 01_英語の勉強の仕方
[中1英語] 01_英語の勉強の仕方[中1英語] 01_英語の勉強の仕方
[中1英語] 01_英語の勉強の仕方
 
Scis2017 2007-01-27-02
Scis2017 2007-01-27-02Scis2017 2007-01-27-02
Scis2017 2007-01-27-02
 
[C13] フラッシュドライブで挑むOracle超高速化と信頼性の両立 by Masashi Fukui
[C13] フラッシュドライブで挑むOracle超高速化と信頼性の両立 by Masashi Fukui[C13] フラッシュドライブで挑むOracle超高速化と信頼性の両立 by Masashi Fukui
[C13] フラッシュドライブで挑むOracle超高速化と信頼性の両立 by Masashi Fukui
 
情報技術の基本と仮想化について
情報技術の基本と仮想化について情報技術の基本と仮想化について
情報技術の基本と仮想化について
 
情報セキュリティと標準化I 第1回-公開用
情報セキュリティと標準化I 第1回-公開用情報セキュリティと標準化I 第1回-公開用
情報セキュリティと標準化I 第1回-公開用
 
基本情報技術者試験 勉強会
基本情報技術者試験 勉強会基本情報技術者試験 勉強会
基本情報技術者試験 勉強会
 
講演資料 201606 web公開版
講演資料 201606 web公開版講演資料 201606 web公開版
講演資料 201606 web公開版
 
オペレーティングシステム 第1回-公開用
オペレーティングシステム 第1回-公開用オペレーティングシステム 第1回-公開用
オペレーティングシステム 第1回-公開用
 

Similar to 12_C言語入門 - 読みやすいソースコードを書く

C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話simotin13 Miyazaki
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方Shigenori Sagawa
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めMITSUNARI Shigeo
 
ji-4. 整数,浮動小数点数
ji-4. 整数,浮動小数点数ji-4. 整数,浮動小数点数
ji-4. 整数,浮動小数点数kunihikokaneko1
 
リーダブルコード 1.0'
リーダブルコード 1.0'リーダブルコード 1.0'
リーダブルコード 1.0'Yamamura Takashi
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talkmitamex4u
 

Similar to 12_C言語入門 - 読みやすいソースコードを書く (8)

C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
 
#5:プログラミングの基本
#5:プログラミングの基本#5:プログラミングの基本
#5:プログラミングの基本
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
 
ji-4. 整数,浮動小数点数
ji-4. 整数,浮動小数点数ji-4. 整数,浮動小数点数
ji-4. 整数,浮動小数点数
 
講座C入門
講座C入門講座C入門
講座C入門
 
リーダブルコード 1.0'
リーダブルコード 1.0'リーダブルコード 1.0'
リーダブルコード 1.0'
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
 

Recently uploaded

ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ssusere0a682
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドKen Fukui
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slidessusere0a682
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドKen Fukui
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドKen Fukui
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfyukisuga3
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドKen Fukui
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドKen Fukui
 

Recently uploaded (8)

ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdf
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
 

12_C言語入門 - 読みやすいソースコードを書く

  • 5. コードが汚いと… • 理解するのに時間がかかる • バグが紛れ込みやすい • 修正・改修が困難になる • 「一緒に仕事したくない」と思われる 4
  • 6. 汚いコードとは? • 記述が統一されていない • 命名(変数名、関数名など)が不適切 • コメントで補足しないと意味が伝わらない • ひとつの関数の処理が長い • 冗長的な処理が多い などなど・・・ 5
  • 8. 可読性の高いコードとは? • プログラマのワーキングメモリを浪費させない • インデント・スペース・改行が適切に使われてお り、構造的にわかりやすい • 記述が統一されており、処理を予測できる • 変数名・関数名などに意味を持たせている • 理解を阻むノイズ(冗長)がない(短い) 7
  • 9. インデントをつかう 8 #include <stdio.h> int main(void){ int a; printf("西暦を入力してください。¥n"); printf("西暦 :"); scanf(“%d”,&a); // 入力値を判定して「うるう年」、「平年」を表示する if(0==a%400){ puts ("うるう年です。"); }else if(a%100==0){ printf("平年です。¥n"); }else if(0==a%4){ puts(“うるう年です。"); }else{ printf("平年です。¥n"); } return 0; } #include <stdio.h> int main(void){ int a; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”,&a); // 入力値を判定して「うるう年」、「平年」を表示する if(0==a%400){ puts(“うるう年です。"); }else if(a%100==0){ printf("平年です。¥n"); }else if(0==a%4){ puts(“うるう年です。”); }else{ printf("平年です。¥n"); } return 0; } インデントがないコード インデントをつかったコード 中括弧 {} がでてきたら インデントをつける
  • 10. スペースをつかう 9 #include <stdio.h> int main(void){ int a; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”,&a); // 入力値を判定して「うるう年」、「平年」を表示する if(0==a%400){ puts("うるう年です。"); }else if(a%100==0){ printf("平年です。¥n"); }else if(0==a%4){ puts(“うるう年です。”); }else{ printf("平年です。¥n"); } return 0; } #include <stdio.h> int main(void){ int a; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”, &a); // 入力値を判定して「うるう年」、「平年」を表示する if (0 == a % 400) { puts("うるう年です。"); } else if (a % 100 == 0) { printf("平年です。¥n"); } else if (0 == a % 4) { puts(“うるう年です。”); } else { printf("平年です。¥n"); } return 0; } スペースがないコード スペースをつかったコード キーワードや式などの間に スペースをいれる ※関数名と()の間にはスペース を入れない
  • 11. 改行をつかう 10 #include <stdio.h> int main(void){ int a; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”, &a); // 入力値を判定して「うるう年」、「平年」を表示する if (0 == a % 400) { puts("うるう年です。"); } else if (a % 100 == 0) { printf("平年です。¥n"); } else if (0 == a % 4) { puts(“うるう年です。”); } else { printf("平年です。¥n"); } return 0; } #include <stdio.h> int main(void){ int a; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”, &a); // 入力値を判定して「うるう年」、「平年」を表示する if (0 == a % 400) { puts(“うるう年です。”); } else if (a % 100 == 0) { printf("平年です。¥n"); } else if (0 == a % 4) { puts(“うるう年です。”); } else { printf("平年です。¥n"); } return 0; } 改行がないコード 改行をつかったコード 処理のグループごとに改行で区切る ※ このコードを例にとると 1. 変数の宣言 2. 数値の入力 3. 判定処理
  • 12. 記述を統一する 11 #include <stdio.h> int main(void){ int a; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”, &a); // 入力値を判定して「うるう年」、「平年」を表示する if (0 == a % 400) { puts(“うるう年です。”); } else if (a % 100 == 0) { printf("平年です。¥n"); } else if (0 == a % 4) { puts(“うるう年です。”); } else { printf("平年です。¥n"); } return 0; } #include <stdio.h> int main(void){ int a; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”, &a); // 入力値を判定して「うるう年」、「平年」を表示する if (a % 400 == 0) { printf("うるう年です。¥n"); } else if (a % 100 == 0) { printf("平年です。¥n"); } else if (a % 4 == 0) { printf(“うるう年です。¥n”); } else { printf("平年です。¥n"); } return 0; } 統一されていないコード 統一されているコード if文の条件は、 式を伴なう比較は、左辺に式を書く 不等号なら「左辺 < 右辺」 などなど
  • 13. 適切な変数名をつける 12 #include <stdio.h> int main(void){ int a; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”, &a); // 入力値を判定して「うるう年」、「平年」を表示する if (a % 400 == 0) { printf("うるう年です。¥n"); } else if (a % 100 == 0) { printf("平年です。¥n"); } else if (a % 4 == 0) { printf(“うるう年です。¥n”); } else { printf("平年です。¥n"); } return 0; } #include <stdio.h> int main(void){ int year; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”, &year); // 入力値を判定して「うるう年」、「平年」を表示する if (year % 400 == 0) { printf("うるう年です。¥n"); } else if (year % 100 == 0) { printf("平年です。¥n"); } else if (year % 4 == 0) { printf(“うるう年です。¥n”); } else { printf("平年です。¥n"); } return 0; } 意味のない変数名のコード 意味のある変数名のコード yearなら変数に「年(西暦)」が 入っていることがわかる
  • 14. コメントを使わず伝える 13 #include <stdio.h> int main(void){ int year; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”, &year); // 入力値を判定して「うるう年」、「平年」を表示する if (year % 400 == 0) { printf("うるう年です。¥n"); } else if (year % 100 == 0) { printf("平年です。¥n"); } else if (year % 4 == 0) { printf(“うるう年です。¥n”); } else { printf("平年です。¥n"); } return 0; } #include <stdio.h> int isLeapYear(int year) { if (year % 400 == 0) { return 1; } else if (year % 100 == 0) { return 0; } else if (year % 4 == 0) { return 1; } else { return 0; } } int main(void){ int year; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”, &year); if (isLeapYear(year)) { printf("うるう年です。¥n"); } else { printf("平年です。¥n"); } return 0; } コメントがあるコード コメントを使わず伝えるコード main処理に注目すると、 1. if(isLeapYear)だけでうるう年の 判定だとわかる 2. うるう年の判定条件を考えなくてよい
  • 15. 冗長的な処理を削除する 14 #include <stdio.h> int isLeapYear(int year) { if (year % 400 == 0) { return 1; } else if (year % 100 == 0) { return 0; } else if (year % 4 == 0) { return 1; } else { return 0; } } int main(void){ int year; printf(“西暦を入力してください。¥n”); printf("西暦 :"); scanf(“%d”, &year); if (isLeapYear(year)) { printf("うるう年です。¥n"); } else { printf("平年です。¥n"); } return 0; } #include <stdio.h> int isLeapYear(int year) { if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { return 1; } else { return 0; } } int main(void){ int year; printf("西暦を入力してください。¥n"); printf("西暦 :"); scanf("%d", &year); if (isLeapYear(year)) { printf("うるう年です。¥n"); } else { printf("平年です。¥n"); } return 0; } 冗長的なコード 冗長を排除したコード isLeapYear のreturnが シンプルになる ※ 冗長させたほうが分かりやすい 場合は、そのままにしておく
  • 16. 修正前後のコードの比較 15 #include <stdio.h> int main(void){ int a; printf("西暦を入力してください。¥n"); printf("西暦 :"); scanf(“%d”,&a); // 入力値を判定して「うるう年」、「平年」を表示する if(0==a%400){ puts ("うるう年です。"); }else if(a%100==0){ printf("平年です。¥n"); }else if(0==a%4){ puts(“うるう年です。"); }else{ printf("平年です。¥n"); } return 0; } #include <stdio.h> int isLeapYear(int year) { if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { return 1; } else { return 0; } } int main(void){ int year; printf("西暦を入力してください。¥n"); printf("西暦 :"); scanf("%d", &year); if (isLeapYear(year)) { printf("うるう年です。¥n"); } else { printf("平年です。¥n"); } return 0; } 修正前のコード 修正後のコード