Suche senden
Hochladen
C言語の課題を(エクストリームに)解こう #1
•
1 gefällt mir
•
554 views
University of Tsukuba Linux User Group
Folgen
筑波大学 Linux User Group (つくらぐ) http://www.tsukuba-linux.org/
Weniger lesen
Mehr lesen
Bildung
Technologie
Melden
Teilen
Melden
Teilen
1 von 25
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
C++の黒魔術
C++の黒魔術
Daichi OBINATA
闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
C言語講習会1
C言語講習会1
odenhadengaku
IBMModel2
IBMModel2
Hidekazu Oiwa
C言語講習会2
C言語講習会2
odenhadengaku
復習と型 Jyoken
復習と型 Jyoken
reew2n
Goto
Goto
oupc
C言語講習会4
C言語講習会4
odenhadengaku
Empfohlen
C++の黒魔術
C++の黒魔術
Daichi OBINATA
闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
C言語講習会1
C言語講習会1
odenhadengaku
IBMModel2
IBMModel2
Hidekazu Oiwa
C言語講習会2
C言語講習会2
odenhadengaku
復習と型 Jyoken
復習と型 Jyoken
reew2n
Goto
Goto
oupc
C言語講習会4
C言語講習会4
odenhadengaku
Sap Solution Manager - Administrative
Sap Solution Manager - Administrative
umarfakih
Hello,World Crazy!!
Hello,World Crazy!!
University of Tsukuba Linux User Group
VoIPcare qMetrix for Transportation
VoIPcare qMetrix for Transportation
RobinMangold
Solucoes sustentaveis
Solucoes sustentaveis
Mônica Sales
カーネルをmakeしよう! - 第4回つくらぐ勉強会
カーネルをmakeしよう! - 第4回つくらぐ勉強会
University of Tsukuba Linux User Group
ばっしゅ! (LT) - 第4回つくらぐ勉強会
ばっしゅ! (LT) - 第4回つくらぐ勉強会
University of Tsukuba Linux User Group
Latest Resume
Latest Resume
ahaftab
VoIPcare qMetrix for Healthcare
VoIPcare qMetrix for Healthcare
RobinMangold
Debug Hacks - 第4回つくらぐ勉強会
Debug Hacks - 第4回つくらぐ勉強会
University of Tsukuba Linux User Group
C言語よくある誤り
C言語よくある誤り
長岡技術科学大学 自然言語処理研究室
プログラミング講座 #2 複雑なデータの扱い
プログラミング講座 #2 複雑なデータの扱い
ZOIdayo
Lt会01_uetch
Lt会01_uetch
Tomoaki Ueda
Rust Error Handling
Rust Error Handling
ShunsukeNakamura17
Test12 16
Test12 16
chibi_LT
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
第1回SE勉強会(080302)
第1回SE勉強会(080302)
柴田 篤志
プログラミング講座 #6 競プロのテクニック(初級)
プログラミング講座 #6 競プロのテクニック(初級)
ZOIdayo
20160620 競技プログラミングのすゝめ
20160620 競技プログラミングのすゝめ
Yoshiki TAKADA
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビュー
Moriharu Ohzu
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
Numeric クラスについて
Numeric クラスについて
Tomoya Kawanishi
Python基礎その1
Python基礎その1
大貴 末廣
Weitere ähnliche Inhalte
Andere mochten auch
Sap Solution Manager - Administrative
Sap Solution Manager - Administrative
umarfakih
Hello,World Crazy!!
Hello,World Crazy!!
University of Tsukuba Linux User Group
VoIPcare qMetrix for Transportation
VoIPcare qMetrix for Transportation
RobinMangold
Solucoes sustentaveis
Solucoes sustentaveis
Mônica Sales
カーネルをmakeしよう! - 第4回つくらぐ勉強会
カーネルをmakeしよう! - 第4回つくらぐ勉強会
University of Tsukuba Linux User Group
ばっしゅ! (LT) - 第4回つくらぐ勉強会
ばっしゅ! (LT) - 第4回つくらぐ勉強会
University of Tsukuba Linux User Group
Latest Resume
Latest Resume
ahaftab
VoIPcare qMetrix for Healthcare
VoIPcare qMetrix for Healthcare
RobinMangold
Debug Hacks - 第4回つくらぐ勉強会
Debug Hacks - 第4回つくらぐ勉強会
University of Tsukuba Linux User Group
Andere mochten auch
(9)
Sap Solution Manager - Administrative
Sap Solution Manager - Administrative
Hello,World Crazy!!
Hello,World Crazy!!
VoIPcare qMetrix for Transportation
VoIPcare qMetrix for Transportation
Solucoes sustentaveis
Solucoes sustentaveis
カーネルをmakeしよう! - 第4回つくらぐ勉強会
カーネルをmakeしよう! - 第4回つくらぐ勉強会
ばっしゅ! (LT) - 第4回つくらぐ勉強会
ばっしゅ! (LT) - 第4回つくらぐ勉強会
Latest Resume
Latest Resume
VoIPcare qMetrix for Healthcare
VoIPcare qMetrix for Healthcare
Debug Hacks - 第4回つくらぐ勉強会
Debug Hacks - 第4回つくらぐ勉強会
Ähnlich wie C言語の課題を(エクストリームに)解こう #1
C言語よくある誤り
C言語よくある誤り
長岡技術科学大学 自然言語処理研究室
プログラミング講座 #2 複雑なデータの扱い
プログラミング講座 #2 複雑なデータの扱い
ZOIdayo
Lt会01_uetch
Lt会01_uetch
Tomoaki Ueda
Rust Error Handling
Rust Error Handling
ShunsukeNakamura17
Test12 16
Test12 16
chibi_LT
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
第1回SE勉強会(080302)
第1回SE勉強会(080302)
柴田 篤志
プログラミング講座 #6 競プロのテクニック(初級)
プログラミング講座 #6 競プロのテクニック(初級)
ZOIdayo
20160620 競技プログラミングのすゝめ
20160620 競技プログラミングのすゝめ
Yoshiki TAKADA
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビュー
Moriharu Ohzu
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
Numeric クラスについて
Numeric クラスについて
Tomoya Kawanishi
Python基礎その1
Python基礎その1
大貴 末廣
大学でC言語をはじめて触る人へ
大学でC言語をはじめて触る人へ
ssuser3c1023
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
Kenta USAMI
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
啓 小笠原
講座C入門
講座C入門
Tokai University
Compile Time Type Level C Compiler (this may indicate out of memory)
Compile Time Type Level C Compiler (this may indicate out of memory)
Sohei Yamaga
2011年10月28日
2011年10月28日
nukaemon
Ähnlich wie C言語の課題を(エクストリームに)解こう #1
(20)
C言語よくある誤り
C言語よくある誤り
プログラミング講座 #2 複雑なデータの扱い
プログラミング講座 #2 複雑なデータの扱い
Lt会01_uetch
Lt会01_uetch
Rust Error Handling
Rust Error Handling
Test12 16
Test12 16
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
第1回SE勉強会(080302)
第1回SE勉強会(080302)
プログラミング講座 #6 競プロのテクニック(初級)
プログラミング講座 #6 競プロのテクニック(初級)
20160620 競技プログラミングのすゝめ
20160620 競技プログラミングのすゝめ
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビュー
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
Numeric クラスについて
Numeric クラスについて
Python基礎その1
Python基礎その1
大学でC言語をはじめて触る人へ
大学でC言語をはじめて触る人へ
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
講座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)
2011年10月28日
2011年10月28日
Mehr von University of Tsukuba Linux User Group
Gentoo Linuxの紹介
Gentoo Linuxの紹介
University of Tsukuba Linux User Group
monoqloの麻雀講座
monoqloの麻雀講座
University of Tsukuba Linux User Group
カーネルモジュールプログラミング超入門 #1(仮)
カーネルモジュールプログラミング超入門 #1(仮)
University of Tsukuba Linux User Group
linuxで動画キャプチャ。 - 第4回つくらぐ勉強会
linuxで動画キャプチャ。 - 第4回つくらぐ勉強会
University of Tsukuba Linux User Group
USBからLinuxを起動してみよう! - 第4回つくらぐ勉強会
USBからLinuxを起動してみよう! - 第4回つくらぐ勉強会
University of Tsukuba Linux User Group
うぶんちゅ! - 第4回つくらぐ勉強会
うぶんちゅ! - 第4回つくらぐ勉強会
University of Tsukuba Linux User Group
シンガポールのインターネット検閲事情 (LT) - 第4回つくらぐ勉強会
シンガポールのインターネット検閲事情 (LT) - 第4回つくらぐ勉強会
University of Tsukuba Linux User Group
楽しい怪しいシェルスクリプト - 第4回つくらぐ勉強会
楽しい怪しいシェルスクリプト - 第4回つくらぐ勉強会
University of Tsukuba Linux User Group
Mehr von University of Tsukuba Linux User Group
(8)
Gentoo Linuxの紹介
Gentoo Linuxの紹介
monoqloの麻雀講座
monoqloの麻雀講座
カーネルモジュールプログラミング超入門 #1(仮)
カーネルモジュールプログラミング超入門 #1(仮)
linuxで動画キャプチャ。 - 第4回つくらぐ勉強会
linuxで動画キャプチャ。 - 第4回つくらぐ勉強会
USBからLinuxを起動してみよう! - 第4回つくらぐ勉強会
USBからLinuxを起動してみよう! - 第4回つくらぐ勉強会
うぶんちゅ! - 第4回つくらぐ勉強会
うぶんちゅ! - 第4回つくらぐ勉強会
シンガポールのインターネット検閲事情 (LT) - 第4回つくらぐ勉強会
シンガポールのインターネット検閲事情 (LT) - 第4回つくらぐ勉強会
楽しい怪しいシェルスクリプト - 第4回つくらぐ勉強会
楽しい怪しいシェルスクリプト - 第4回つくらぐ勉強会
C言語の課題を(エクストリームに)解こう #1
1.
C言語の課題を (エクストリームに)解こう
techno@Hirotaka Kawata 筑波大学 情報学群 情報科学類 1年
2.
プログラミング入門1の課題 ここからみれます。 今回は、課題2 をやります。
http://www.ialab.is.tsukuba.ac.jp/~maeda/class/prog1/ 多分、みなさんなら、きっと簡単な課題でしょう! 僕には、むずかしすぎて...(笑 ちょっと、情報科学類1年生の内輪向けですが...
3.
ここでやること。 プログラミング入門 1 の課題を、究極の形で、皆さんと一緒に解いて きましょう。 条件:
課題の本来の趣旨を守る 無理しすぎない なるべく効率の良いコードを(?)
4.
やってみよう。 そうしよう。
5.
課題1 整数を入力し,入力された値が偶数か奇数かを判定して出力するプ ログラムを作成しなさい. よくありそうな、課題ですねー。 きっと頭にうかんだ演算子は...
6.
%
ですよね....
7.
念のため、聞いておきます。 多分いちばん代表的なやり方は if(i % 2)
{ 奇数 } else { 偶数 } % (あまりを求める演算子) 以外を使おうとした人。 いてほしい...
8.
もし % が使えなかったら... どうするおつもりですか? 偶数であるか奇数であるかを見分ける方法... 思いつきますか? 決して、ずっと
/ (割り算) していくなんてことはしませんよ。
9.
例えばこんな例も... 0000 0001 ->
1 1111 1111 -> -1 (2の補数表現) 0000 0010 -> 2 1111 1110 -> -2 (2の補数表現) 0000 0011 -> 3 1111 1101 -> -3 なんだか気付きませんか?
10.
デジタル人間なら、 2進数で考えよう。 偶数だと、必ず最下位ビットが 0 になる。 奇数だと、必ず最下位ビットが
1 になる。 という法則がある。 これを利用しよう。
11.
マスクしましょう。 たとえば、5 が偶数か奇数か調べたいとき。 0000 0101
== 5 00000101 & 00000001 = 00000001 if(i & 0x01) {} じゃだめですか?
12.
実際どっちがいいのよ... んー。 % を、CPU がどんな計算してるんだかわからん。(知識不足) たぶん、そんな命令もなかったはずだし。 マスクしたほうが、オールマイティーに早い。 とおもう。(どんなCPUでもってこと) だけど、コード読みづらくなるかも... コメント重要。
13.
課題 2 100点満点の点数を入力し、 50点以上であれば、A、50点未満であ れば、B、0から100の数字でなければ、errorと出力するプログラムを 作成しなさい. おー。 これもなかなかおもしろそう。
14.
一般的なやり方 if(a < 0
&& a > 100) { if(a >= 50) { puts("A"); } else { puts("B"); } } else { puts("error"); } こんな感じだと思うのですが いかがでしょう? やり方は、いっぱいありますが。
15.
だけど... 先程の例は、問題の文章通りに設計書を書いただけ。 ここから、人力最適化のお時間です。 コンパイラの最適化なんかあてにしちゃーいけません。 そもそも、コンパイラの最適化は、設計書に書いてあることに忠実 に、ちまちまやってるだけだし。
16.
人力最適化。 if(a >= 0
&& a <= 100) { if(a >= 50) { puts("A"); } else { puts("B"); } } else { puts("error"); } error は最大 2 回の比較。 A, B は 3 回の比較。 という感じになります。
17.
人力最適化。 たとえば、違う実装。 if(i >= 50
&& i <= 100) { puts("A"); } else if(i < 50 && i >= 0) { puts("B"); } else { puts("error"); } error は 3 回の比較。 A, B は最大 3 回の比較。 コードを短くすればいいというものではない。
18.
人力最適化 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"); } } 完璧じゃない? ご想像にお任せします。
19.
ただ、よくみると.... なんだか、行数が多い? そう、コード量が若干多くなりました。 error を 2
回出力させているんです。 ということは、バイナリのサイズもでかくなる。 (goto でジャンプさせるってのもありだけど、たぶん else で JMP したあとに、 goto でもう一度 JMP するような気もするので、実行時間的には JMP 命令だからといえど、 最適なコードとは言えない...) (そうだ、アセンブラだ!!!)
20.
人力最適化はほどほどに。 もうちょっと、語ると... なんだか、あとのコードになるほど、理解しづらくなったとは思いませ んか? 変に最適化しすぎると、コードが読みづらくなって、コードも長くなっ て... という状況になることが。 まあ、ほどほどに。
21.
課題 3 二つの整数値A、Bを読み込んで,BがAの約数かどうかを判定する プログラムを作りなさい.表示は以下のようにしなさい. つまんねーな。 これが一番単純じゃん?
22.
いきなりだけど、解答例。 if(a % b)
{ puts("n"); } else { puts("y"); } これ以上、どうしろっていうの... ちょっと思いつきませんでした。
23.
課題3について議論? なんかありますかね?
24.
最後に... 普通に解いて終わりでは、つまらない! とおもった、techno のお遊びでした。 これからも、また不定期にやるかもしれません。(LT とかで) プログラミングの面白さが少しでも分かってくれたら... 1年生いっぱいよんできてください。 以上。
25.
ご清聴ありがとうございました。
Jetzt herunterladen