SlideShare a Scribd company logo
1 of 25
Download to read offline
C言語の課題を
(エクストリームに)解こう

    techno@Hirotaka Kawata
筑波大学 情報学群 情報科学類 1年
プログラミング入門1の課題

ここからみれます。
今回は、課題2 をやります。
  http://www.ialab.is.tsukuba.ac.jp/~maeda/class/prog1/
 
多分、みなさんなら、きっと簡単な課題でしょう!
僕には、むずかしすぎて...(笑

ちょっと、情報科学類1年生の内輪向けですが...
 
ここでやること。

プログラミング入門 1 の課題を、究極の形で、皆さんと一緒に解いて
きましょう。
 
条件:
  課題の本来の趣旨を守る
  無理しすぎない
  なるべく効率の良いコードを(?)
やってみよう。

そうしよう。
課題1

整数を入力し,入力された値が偶数か奇数かを判定して出力するプ
ログラムを作成しなさい.

よくありそうな、課題ですねー。
きっと頭にうかんだ演算子は...
%
    
 ですよね....
念のため、聞いておきます。

多分いちばん代表的なやり方は
 
if(i % 2) { 奇数 }
else { 偶数 }
 
% (あまりを求める演算子) 以外を使おうとした人。
いてほしい...
もし % が使えなかったら...

どうするおつもりですか?
 
偶数であるか奇数であるかを見分ける方法...
思いつきますか?

決して、ずっと / (割り算) していくなんてことはしませんよ。
例えばこんな例も...

0000 0001 -> 1
1111 1111 -> -1 (2の補数表現)

0000 0010 -> 2
1111 1110 -> -2 (2の補数表現)

0000 0011 -> 3
1111 1101 -> -3

なんだか気付きませんか?
デジタル人間なら、

2進数で考えよう。
 
偶数だと、必ず最下位ビットが 0 になる。
奇数だと、必ず最下位ビットが 1 になる。
 
という法則がある。
これを利用しよう。
マスクしましょう。

たとえば、5 が偶数か奇数か調べたいとき。

0000 0101 == 5

00000101 & 00000001
= 00000001

if(i & 0x01) {} じゃだめですか?
実際どっちがいいのよ...

んー。
% を、CPU がどんな計算してるんだかわからん。(知識不足)
たぶん、そんな命令もなかったはずだし。

マスクしたほうが、オールマイティーに早い。
とおもう。(どんなCPUでもってこと)
だけど、コード読みづらくなるかも...
コメント重要。
課題 2

100点満点の点数を入力し、 50点以上であれば、A、50点未満であ
れば、B、0から100の数字でなければ、errorと出力するプログラムを
作成しなさい.

おー。
これもなかなかおもしろそう。
一般的なやり方

if(a < 0 && a > 100) {
    if(a >= 50) { puts("A"); }
    else           { puts("B"); }
}
else { puts("error"); }
                              こんな感じだと思うのですが
                              いかがでしょう?
                              やり方は、いっぱいありますが。
だけど...

先程の例は、問題の文章通りに設計書を書いただけ。
 
ここから、人力最適化のお時間です。
コンパイラの最適化なんかあてにしちゃーいけません。
そもそも、コンパイラの最適化は、設計書に書いてあることに忠実
に、ちまちまやってるだけだし。
人力最適化。

if(a >= 0 && a <= 100) {
    if(a >= 50) { puts("A"); }
    else           { puts("B"); }
}
else { puts("error"); }             error は最大 2 回の比較。
                                    A, B は 3 回の比較。

                                    という感じになります。
人力最適化。

たとえば、違う実装。
if(i >= 50 && i <= 100)   { puts("A"); }
else if(i < 50 && i >= 0) { puts("B"); }
else                             { puts("error"); }

error は 3 回の比較。
A, B は最大 3 回の比較。
コードを短くすればいいというものではない。
人力最適化

if(i >= 50) {
  if(i <= 100) { puts("A"); }
  else { puts("error"); }
}
else {                          error は 2 回の比較
  if(i >= 0) { puts("B"); }     A, B も 2 回の比較
  else { puts("error"); }
}                               完璧じゃない?
                                ご想像にお任せします。
ただ、よくみると....

なんだか、行数が多い?
 
そう、コード量が若干多くなりました。
error を 2 回出力させているんです。
 
ということは、バイナリのサイズもでかくなる。
(goto でジャンプさせるってのもありだけど、たぶん else で JMP したあとに、
goto でもう一度 JMP するような気もするので、実行時間的には JMP 命令だからといえど、
最適なコードとは言えない...)
(そうだ、アセンブラだ!!!)
人力最適化はほどほどに。

もうちょっと、語ると...

なんだか、あとのコードになるほど、理解しづらくなったとは思いませ
んか?
 
変に最適化しすぎると、コードが読みづらくなって、コードも長くなっ
て... という状況になることが。
まあ、ほどほどに。
課題 3

二つの整数値A、Bを読み込んで,BがAの約数かどうかを判定する
プログラムを作りなさい.表示は以下のようにしなさい.
 
つまんねーな。
これが一番単純じゃん?
いきなりだけど、解答例。

if(a % b) {
  puts("n");
}
else {
  puts("y");
}
 
これ以上、どうしろっていうの...
ちょっと思いつきませんでした。
課題3について議論?

なんかありますかね?
最後に...

普通に解いて終わりでは、つまらない!
とおもった、techno のお遊びでした。

これからも、また不定期にやるかもしれません。(LT とかで)
プログラミングの面白さが少しでも分かってくれたら...

1年生いっぱいよんできてください。
以上。
ご清聴ありがとうございました。

More Related Content

Viewers also liked (9)

Sap Solution Manager - Administrative
Sap Solution Manager - AdministrativeSap Solution Manager - Administrative
Sap Solution Manager - Administrative
 
Hello,World Crazy!!
Hello,World Crazy!!Hello,World Crazy!!
Hello,World Crazy!!
 
VoIPcare qMetrix for Transportation
VoIPcare qMetrix for TransportationVoIPcare qMetrix for Transportation
VoIPcare qMetrix for Transportation
 
Solucoes sustentaveis
Solucoes sustentaveisSolucoes sustentaveis
Solucoes sustentaveis
 
カーネルをmakeしよう! - 第4回つくらぐ勉強会
カーネルをmakeしよう! - 第4回つくらぐ勉強会カーネルをmakeしよう! - 第4回つくらぐ勉強会
カーネルをmakeしよう! - 第4回つくらぐ勉強会
 
ばっしゅ! (LT) - 第4回つくらぐ勉強会
ばっしゅ! (LT) - 第4回つくらぐ勉強会ばっしゅ! (LT) - 第4回つくらぐ勉強会
ばっしゅ! (LT) - 第4回つくらぐ勉強会
 
Latest Resume
Latest ResumeLatest Resume
Latest Resume
 
VoIPcare qMetrix for Healthcare
VoIPcare qMetrix for HealthcareVoIPcare qMetrix for Healthcare
VoIPcare qMetrix for Healthcare
 
Debug Hacks - 第4回つくらぐ勉強会
Debug Hacks - 第4回つくらぐ勉強会Debug Hacks - 第4回つくらぐ勉強会
Debug Hacks - 第4回つくらぐ勉強会
 

Similar to C言語の課題を(エクストリームに)解こう #1

Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビュー
Moriharu Ohzu
 
Numeric クラスについて
Numeric クラスについて Numeric クラスについて
Numeric クラスについて
Tomoya Kawanishi
 
2011年10月28日
2011年10月28日2011年10月28日
2011年10月28日
nukaemon
 

Similar to C言語の課題を(エクストリームに)解こう #1 (20)

C言語よくある誤り
C言語よくある誤りC言語よくある誤り
C言語よくある誤り
 
プログラミング講座 #2 複雑なデータの扱い
プログラミング講座 #2 複雑なデータの扱いプログラミング講座 #2 複雑なデータの扱い
プログラミング講座 #2 複雑なデータの扱い
 
Lt会01_uetch
Lt会01_uetchLt会01_uetch
Lt会01_uetch
 
Rust Error Handling
Rust Error HandlingRust Error Handling
Rust Error Handling
 
Test12 16
Test12 16Test12 16
Test12 16
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
第1回SE勉強会(080302)
第1回SE勉強会(080302)第1回SE勉強会(080302)
第1回SE勉強会(080302)
 
プログラミング講座 #6 競プロのテクニック(初級)
プログラミング講座 #6 競プロのテクニック(初級)プログラミング講座 #6 競プロのテクニック(初級)
プログラミング講座 #6 競プロのテクニック(初級)
 
20160620 競技プログラミングのすゝめ
20160620 競技プログラミングのすゝめ20160620 競技プログラミングのすゝめ
20160620 競技プログラミングのすゝめ
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビュー
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
 
Numeric クラスについて
Numeric クラスについて Numeric クラスについて
Numeric クラスについて
 
Python基礎その1
Python基礎その1Python基礎その1
Python基礎その1
 
大学でC言語をはじめて触る人へ
大学でC言語をはじめて触る人へ大学でC言語をはじめて触る人へ
大学でC言語をはじめて触る人へ
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
講座C入門
講座C入門講座C入門
講座C入門
 
Compile Time Type Level C Compiler (this may indicate out of memory)
Compile Time Type Level C Compiler (this may indicate out of memory)Compile Time Type Level C Compiler (this may indicate out of memory)
Compile Time Type Level C Compiler (this may indicate out of memory)
 
2011年10月28日
2011年10月28日2011年10月28日
2011年10月28日
 

More from University of Tsukuba Linux User Group

More from University of Tsukuba Linux User Group (8)

Gentoo Linuxの紹介
Gentoo Linuxの紹介Gentoo Linuxの紹介
Gentoo Linuxの紹介
 
monoqloの麻雀講座
monoqloの麻雀講座monoqloの麻雀講座
monoqloの麻雀講座
 
カーネルモジュールプログラミング超入門 #1(仮)
カーネルモジュールプログラミング超入門 #1(仮)カーネルモジュールプログラミング超入門 #1(仮)
カーネルモジュールプログラミング超入門 #1(仮)
 
linuxで動画キャプチャ。 - 第4回つくらぐ勉強会
linuxで動画キャプチャ。 - 第4回つくらぐ勉強会linuxで動画キャプチャ。 - 第4回つくらぐ勉強会
linuxで動画キャプチャ。 - 第4回つくらぐ勉強会
 
USBからLinuxを起動してみよう! - 第4回つくらぐ勉強会
USBからLinuxを起動してみよう! - 第4回つくらぐ勉強会USBからLinuxを起動してみよう! - 第4回つくらぐ勉強会
USBからLinuxを起動してみよう! - 第4回つくらぐ勉強会
 
うぶんちゅ! - 第4回つくらぐ勉強会
うぶんちゅ! - 第4回つくらぐ勉強会うぶんちゅ! - 第4回つくらぐ勉強会
うぶんちゅ! - 第4回つくらぐ勉強会
 
シンガポールのインターネット検閲事情 (LT) - 第4回つくらぐ勉強会
シンガポールのインターネット検閲事情 (LT) - 第4回つくらぐ勉強会シンガポールのインターネット検閲事情 (LT) - 第4回つくらぐ勉強会
シンガポールのインターネット検閲事情 (LT) - 第4回つくらぐ勉強会
 
楽しい怪しいシェルスクリプト - 第4回つくらぐ勉強会
楽しい怪しいシェルスクリプト - 第4回つくらぐ勉強会楽しい怪しいシェルスクリプト - 第4回つくらぐ勉強会
楽しい怪しいシェルスクリプト - 第4回つくらぐ勉強会
 

Recently uploaded

The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
koheioishi1
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
YukiTerazawa
 

Recently uploaded (8)

The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
 

C言語の課題を(エクストリームに)解こう #1