純真な若者に変なことを教えてしまわないように、
大学のプログラミング演習の課題をブラッシュアップしよう。
>>1 不可でもつけられたのか?? 言いたいことあったら自分で言ってこい。
ttp://www.syst.cs.kumamoto-u.ac.jp/~masato/pe2/02/index.html > 問題2
> 以下のプログラムを見て,問に答えなさい.
> #include <stdio.h>
> #include <stdlib.h>
>
> #define SIZE 5
>
> int main()
> {
> int a[SIZE], i;
> int *b = (int *)malloc(sizeof(int)*SIZE);
>
> for (i = 0; i < SIZE; i++)
> a[i] = i * i;
>
> for (i = 0; i < SIZE; i++)
> b[i] = a[i];
>
> for (i = 0; i < SIZE; i++)
> printf("%d ", b[i]);
> printf("\n");
>
> return 0;
> }
>
> 1. 「配列aとmallocで確保された領域bの違いは,
> 静的に確保されるメモリ領域と,
> __に確保されるメモリ領域という違いがある.」
> __に入る適切な言葉を以下から選びなさい.
>
> a.愛ゆえ
> b.俺的
> c.仮想的
> d.動的
これは酷い。
おもむろに
にわかに
やにわに
夏厨が最期の力を振り絞ってゴミスレたてまくってるな
課題にいちゃもんつけて期限延長とか課題自体を無効にしたいのかね
>>9 どっから、そういう発想が出てくるんだろ。
とっくに提出期限は過ぎている課題っしょ?
>>10 成績提出期限までなら成績変えられるからなぁ
12 :
1:2007/08/31(金) 10:08:19
>>11 考え杉。
とっくに大学は卒業してる。
ましてや熊本大学でもない。
別スレで見かけて、
こりゃ酷い
と思っただけさ。
間違った知識を植えつけられ、
へんてこなコードを書く人間を、
業界に送り込んでくる大学の
ほうが遥かにウザいのですが。
マ板でやれ
いかに酷いかを理解できない時点で、自分が酷いってことを理解してないってことだ。
大学は純粋培養で、
いま教える立場にある人達がC言語を覚えたのは、
10年とか20年も前だったりするんだろう。
そして今だにK&Rを教科書として使っていたりしてさ。
大学は職業訓練校ではないぞ、と言いたい人もいるだろうが、
他所の国の大学生が書いたオープンソースのコードを見て、
自分のところの学生の書くコードと比べてみるべきだろう。
べつにどーでもいいんじゃね?
これが東大なら大問題だが、熊本大なら無問題。
staticという予約語がある以上、別の意味で「静的」なんて言うべきじゃないんだけど、まぁいいや。
22 :
デフォルトの名無しさん:2007/09/01(土) 23:58:40
ageますよ。
そんなリストならfreeする必要なんて全然無いけどな
>>23 あなたが自家用に書くプログラムで手抜きするのはいいが、学生に教えるのはマズいでしょう。
こういう例で勉強した学生さんは、freeする必要があるプログラムを書けないでしょう?
>>23 それこそが、
バグの原因になるのでfreeしないほうがいい教
ってやつだな。
>2007/09/02
この日付と内容の古臭さのギャップに驚いた
だいたいさ、大学で素っぴんのC言語なんて教える必要あるの? 時代遅れじゃない?
ふつーJavaだろ?
教授が時代遅れなんだからしょうがない。
さび付いた頭でJavaを覚えなおせなんて酷だろう。
いや、「今の時代○○だよな」という考えで言語を選んでるんじゃないし…
言ってみれば、実験器具の使用方法を学んでいるのに等しい
のちのちC言語やFORTRANを使わされる人が多いからC言語やFORTRANを学ぶんだし
教養科目によっては「今の時代○○だよな」とかそういう「プログラミング思考なら何でもよし」なノリで選ばれることはあるけどな
漏れが若い頃は、いきなりC言語はキツいので、Pascalから入ったぞ。
というか、9割までの人間にとって必要なのは変数とループと条件分岐と算術演算くらいだろ
C言語である理由はほぼゼロだ
ポインタやらメモリ管理やらは不要な知識
Javaの「おまじない」もな
データベースでしょ。最終的には。それ以外いらない。
ぶっちゃけ、
MS-ExcelとVBAマクロで十分
だと思うんだよね。
変数や配列を表のオブジェクトとして持てば、
入出力のコードを書かなくて済むし、
処理中のデータの様子も見れるしさ。
キーボードからインタラクティブにデータを入力させ、
それをscanfで受けるとか、
もう、馬鹿馬鹿しい。
プログラミングの授業って、数学や物理に比べたら、はるかに簡単なのかな。
なぜ大学でプログラミング演習やるかっつーと、実際に研究初めてデータ解析に進んだとき必要になるから。
ということでjavaなどやっても時間の無駄遣い。
というか自分しか使わないプログラムなんだから、スパゲッティだろうとメモリ管理がいい加減であろうと
どうでもよい。free()?いらねーよそんなもん。
大体、知識足らずを業界に送り込んでくるってなに甘えてんだ。
金融だろうと商社だろうと製造だろうと、どんな業界だって新入社員は実務経験ゼロで入ってくるんだよ。
そいつらを教育するところから仕事なんだろ。
多少なりともコンピュータに触る時間を作ってやった大学に感謝しろ。
>>37 いまどき学生の間にアルバイトやベンチャーで、
いくらでも実務経験を積んでいると思うのだが。
実務経験ゼロの人間も取っているが、
プログラミング経験ゼロは取っていない。
この違い、わかる?
仕事ではなく趣味や研究のために、
一人で我流でプログラムを書く技術があることを前提に、
複数人でチームを組み、仕事としてプログラムを書くために、
やり方や作法を矯正していくのが、実務のための教育。
大学に職業訓練校になれとは言わないが、
せめて、
間違ったことや変なことを教えて遠まわりさせるのだけは、
やめてもらいたい。
自動変数がメモリ上に静的に確保されるだなんて、
そんな言い方をするのは、大学だからといって許されることではない。
>>39 バイトなんてただの社会見学だ、実務経験になんてならねえよ。
金融業務にバイトを携える企業があるか?? どこまで関われるかなんてたかが知れてる。
というかおまえさんは根本的に勘違いをしている。
>>複数人でチームを組み、仕事としてプログラムを書くために、
>>やり方や作法を矯正していくのが、実務のための教育。
大学はこんなことを目的としていない。
理系大学生のプログラミング教育は、自分自身で必要な数値解析を行えることを最終目的とする。
実務のための教育をされた人材を望むなら、まずそういう教育方針の学校探しから始めろ。
なんで学校で教えないんだよー、なんてのはただの甘えだ。
能力のある奴なんていくらでもいる。
結局、本人のレベルを見抜けなかった自分達が悪い。
>>41 郵貯や社会保険庁のシステムの孫請けでアルバイトしていた学生が、
NTTデータに就職するなんていうのは、よくある光景なんだがなぁ。
上流工程をやる人間が現場を知らないと思ったら大間違いだよ。
できる学生は、ちゃーんと勉強している。
> 大学はこんなことを目的としていない。
当たり前だ。
あなたが引用した2行は、企業で行う新人教育の話だから。
その前提として、
> 仕事ではなく趣味や研究のために、
> 一人で我流でプログラムを書く技術
を、大学にいる間に習得しろという話なのだから。
>>40 それは本当に正しい。
今の大学には、「情報教育」とか名乗っておきながら意味不明な授業を
展開する輩が多すぎる。
俺の分野で使うなら、どう確保されるなんて構わず、変数として使えれば困らん。
だから、こうすれば使えます、こう書けばいいんですとまでしか言わない。
もちろん聞かれりゃ答えるし、勉強したくなったやつは自分でしてる。
嘘を教えることは最大の罪だ。
これは、教育機関として絶対に許されるべきことじゃない。
>>40 それは本当に正しい。
今の大学には、「情報教育」とか名乗っておきながら意味不明な授業を
展開する輩が多すぎる。
俺の分野で使うなら、どう確保されるなんて構わず、変数として使えれば困らん。
だから、こうすれば使えます、こう書けばいいんですとまでしか言わない。
もちろん聞かれりゃ答えるし、勉強したくなったやつは自分でしてる。
嘘を教えることは最大の罪だ。
これは、教育機関として絶対に許されるべきことじゃない。
>>42 そういう奴らは、今話してる「変な教育受けた使えない学生」じゃないでしょ。
もともとインターンなりで十分判断できた上で採るんだから。
今は、「大学でて、とりあえずプログラマ受けてみました」っていう学生についてだ。
そういう奴らが怪しげな知識を持っている、これは大学が悪いのか?? っていうことを
話してるんじゃないのか??
>仕事ではなく趣味や研究のために、
>一人で我流でプログラムを書く技術
だからこれは今の段階で十分取得できている。
あんた、大学研究で必要とされるプログラミングレベルを過剰評価してないか??
かぶった
>>44 > だからこれは今の段階で十分取得できている。
mallocしてfreeしないのは、習得できているとは思えないけどな。
少なくとも情報工学とか銘打っているところでは、許されないだろう。
たとえば生物工学の人なら、
研究のための道具の1つに過ぎないプログラムを書くというのなら、
目的どおりに動けば何でもいいと思うよ。
でもね、情報工学の人は、それはダメだろう。
学部1〜3年で様々な講義を受けておいて、
いざ研究となったら、それらを全て無視して、
動けば何でもいい、というのはお粗末過ぎる。
>>46 たしかにそれは正しい。そのへんは
>>44でも言ったとおり、許しがたい奴らが大勢いる。
これ以上なんか言うと教育論になってしまうな。
> mallocしてfreeしないのは、習得できているとは思えないけどな。
常駐プロセスなら free するべきだろうけど、malloc したら必ずしも free する
必要はあるまい。
バカか
>>48 ソフトウェア工学とか勉強しておいて、
そういう非対称で歪なプログラムを書くのは、
キチガイだと思うんだが。
>>50 キチガイがあふれている世の中では生きにくいですね><
ただでさえ発展途上のソフトウェア工学が、
今よりもずっとずっと未発達だった頃の
やりかたでやるのは、どうかと思うよ。
20年前と同じじゃん、と。
別にデーモンでもないプログラムで馬鹿みたいに指摘するの方がどうかと思うけどね
>>53 そういう考え方は、昔にあったな。
プロセスの寿命は短く、
freeはバグの原因になるから、やらないこと
そういってプロセスをぼっこぼこforkしまくるというのが。
freeはバグを顕在化させるから、やらない
というのなら、まだ、いい。
freeがバグの原因だとか言うようじゃ、死んだほうがいい。
freeして問題になるようなら、freeしなくても問題なんだ。
ただそれが、表に出て来ないだけで。
なんでもいいから、準教授くらいになって論文書いてくれたら読んであげるよ。
>>56 いきなり何を言い出すんだ。
学生の教育なのだから、
たとえ例題が小さなプログラムだろうと、
大きなプログラムと同じようにやるべきだろう。
それともなにか、
あんたのところの研究では、
小さなプログラムだけで片付くのかい?
権威主義者が居るスレはここですか?
>>57 なにその大きなプログラムとか小さなプログラムとか。
まずは、プログラムの大きさについて書いてくれ。
>>59 小さなプログラムだから、適当でいいじゃん、という主張をしている人に聞いてくださいな。
>>60 >>57 と同一人物なのかわかんないけど。
「小さなプログラム」という言葉は、このスレでは
>>57 が初めて使ったと思うんだ。
なにをもって「小さなプログラム」としたいのか明らかにしてもらわないことには
話が進まないと思うよ。
>>61 「小さなプログラム」という言葉は出てなかったね。
たとえば
>>4のようなプログラム。
freeくらいめんどくさがるなよ
自前プール作って、プールごとfreeすればいいじゃん
プールを使うにしても、
free(p) ;
が
oPoolHoge.free(p) ;
とかになるだけじゃん。
いや、atexit()使って登録してしまえば明示的に呼ぶ必要はなくなる。
>>66 そんなことなら、freeしないのと一緒だろ。
freeすることが目的じゃあない。
1つは、その関数が繰り返し呼ばれたときにメモリリークしないこと
もう1つは、ポインタの指す先が無効であることを明確にすること
呼ばれてから、戻るまでしか寿命がないなら、
スタックでなんとかならないか検討する。
atexitだけじゃなくて、atreturnとかatendofscopeがあればいいのに。
>>69 C++のデストラクタは、スコープ抜けるタイミングで呼ばれるよ。
そうですね。そのおかげでC++でRAIIが実現できたわけで。
RAIIでちゃんとやれば、リソースの解放忘れは、だいぶ気にしなくて良くなりますね。
GCC使うなら、Cでもcleanupのattributeをつけてやれば、似たことは出来ますけど。
GC使えよ
メモリだけならGCでいいけど。
74 :
デフォルトの名無しさん:2007/10/17(水) 10:49:14
掛け算九九を出力しなさい。
for(i in 1:9){for(j in 1:9{
の後はどうすれば九九が出ますか?
わからないんで教えてください。
その言語は何?
77 :
デフォルトの名無しさん:2007/10/17(水) 18:49:58
九九プログラム
#include<stdio.h>
#define MAX 9
int main()
{
int i, j;
for(i=1; i<=MAX; i++){
for(j=1; j<=MAX; j++)
printf("%d * %d = %d\n", i, j, i*j);
}
return 0;
}
多重ループが理解できればおk
78 :
デフォルトの名無しさん:2007/10/18(木) 16:11:10
x[i+1]=0.5x(i)+1をx[1]=10を初期値としてx[100]まで求めなさい。
これのやりかたを教えてください。
>>78 double x[101] = {0, 10};
for (int i = 1; i < 100; ++i) x[i + 1] = 0.5 * x[i] + 1;
>>78 宿題を代わりにやるスレではないんだが。
ネタを振るなら、
大学名・学科名・教授名・科目名などを明らかにした上で、
問題の全文を晒してくれ。
x[i+1]-2=0.5*(x(i)-2)
だから、
x[i]=pow(0.5,i-1)*8+2 だね。あとは適当に i を決めれば?
出身学校別・国益貢献力ランキング
高専>京大>東工・理科大>大学校・図書館情報≫電通・農工≫早慶≫高卒(農・水)>高卒(工・商)≒一橋>(要再教育の壁)>中卒≒高卒(普通)>(矯正不能の壁)>ソウル大(笑)≒東大
84 :
デフォルトの名無しさん:2008/02/16(土) 08:34:45
かなりスレ違いな予感がしますが投下
当方文系私大5回生です。
プログラミング入門という科目があって
そこで初めてプログラミングを経験したのですが(VisualBasicをやってます)
ベテランプログラマーの方々に質問です。
実技試験とか提出した課題が全て
「テキストボックスを空白にしていない(TextBox1とか入ってる)」
or
「名前書き忘れ(Form1.vb[デザイン]とForm1.vbの両方に記名が必要とのこと
ちなみに提出したフォルダ名は学籍番号なので個人特定可能)」
といういずれかの理由で評価対象外となり
0点にされて単位もらえずまたもや留年の危機ww
デバッグ無しで開始すると課題テーマ通り正常に動作するのですが・・・・
開始ボタンをクリックするとテキストボックスが空白になるように
自分なりに工夫してみたつもりでしたが裏目に出た結果になりました。
名前はForm1.vb[デザイン]とForm1.vbの両方に氏名表記がないと
採点するつもりはないと断言されてしまいました。
片方あればいいと思ってたorz
この採点基準はプログラマー的には普通なんですか?
「その2つは講義中に当然の常識的プログラミングマナーとして注意した」
と言いくるめられてしまったが、タイピングに必死で先生の発言なんて
聞いてる余裕なかったんだよおおお
これは独り言ですが、私と同様の感覚で提出していた友人二人はちゃんと点数ありました。
なんでやねん。
そんなDQNな講師がいるレベルの大学に入った奴が悪い
だから高校のときに皆必死でより偏差値の高い大学目指して勉強するのだ
単なる嫌がらせ。
87 :
デフォルトの名無しさん:2008/02/16(土) 10:58:12
プログラミング演習にVBなんか使うところだからたかが知れてるよね。
採点基準としてはどうかわからないけど、まあ誰が書いたかわかるようにはしておく。
他人のソースぱくってて
そいつの署名が残ってたから
0点にされただけだろうな
ソースの冒頭に著作権表示は最低限入れとかないとダメだろ
// (C) 2ch
プロセス終了とともに勝手にメモリ解放されるんだからfree()とか使う必要ない。
最後まで使うならね。
確保と解放を繰り返すような糞設計をしなけりゃいいだけだし。
まあそうだ。処理次第だけど。
処理単位に複数プロセスにして殺せばいいか。
>>92 またfree()不要論者かよ。
すくなくとも教育なんだから、
きちんとリソースの管理をするように教えるべきだろ。
一つ言えることは
本当に優秀で実戦的なノウハウ豊富なプログラマの人は、
他人にそれを教えることよりも、より多くのソフトウェアを産み出すことに、
限られた時間を使うだろう。
一流のプログラマとしてやっていけず脱落した人、
もしくは、疲れて引退した人でなければ、
とてもではないが、入門書を書くような暇はないだろう。
ろくな本がない理由は、そういうことだと思う。
大学教授と低学歴マとでは書く本の格が違うのも致し方ない
>>97
俺もそう思ってた
焼酎学校にまともな教師がいないのも同じ理由らしい
洋書の有名な本でも、書いているのはコンサルタント。
コンサルタントは机上の空論の専門家だからな。
101 :
デフォルトの名無しさん:2008/07/09(水) 02:10:32
プログラマっておかしな奴多いよ
頭おかしいよ
97の考えには同意できない
脱落とか、引退とか、
所詮生きてくための職業だろうが、
なんでそんな必死になってんの
102 :
デフォルトの名無しさん:2008/07/09(水) 05:30:03
こんばんは、C言語の課題で困ってます。
誰かわかる人がいれば教えてくれませんか。
ttp://uproda11.2ch-library.com/src/11100317.jpg 実行結果
データを読み込むファイル名を入力してください:input02.txt
データベース内のデータを並び替えます
並び替える科目を選んでください
(1)数学 (2)英語 (0)終了:1
並び替える順序を選んでください
(1)昇順 (2)降順 (0)終了:1
並び替える方法を選んでください
(1)単純交換ソート(バブルソート) (2)単純選択ソート
(3)クイックソート (0)終了:1
データベース内のデータを先頭から順番に表示します
Name: Spike
Math: 45 Eng: 30
Name: Rachel
Math: 55 Eng: 85
・・・・・・・・
・・・・・・・・
Name: Ross
Math: 90 Eng: 85
本当に優秀で実戦的なノウハウ豊富なプログラマの人は、
いちいちfreeすることに気を使うことよりも、より多くのソフトウェアを産み出すことに、
限られた時間を使うだろう。
一流のプログラマとしてやっていけず脱落した人、
もしくは、疲れて引退した人でなければ、
とてもではないが、freeを過不足なく丁寧に書くような暇はないだろう。
メモリリークしないOSやアプリケーションがない理由は、そういうことだと思う。
>>104 丁寧に書いてさえも、足りなかったり、余計な free() を取り除けなかったりする。
どっかの文庫のしおりにあったが、間違いを犯すのは、人間に与えられた(機械には与えられない)優れた能力だ。
丁寧さ、慎重さは、プログラマにとっては美徳だと思う。
コンパイルする前に、コミットする前に、デプロイする前に、少し思いをコードに馳せてみよう。
>>101 どんな仕事でもそうだが、第一線で働き続けるというのは難しいのですよ。
私も入門書を書きたいとは思うのだけど、対価を払ってくれる当てがないので口に糊する仕事をするしかないのさ。
>>104 その通り。
freeを人間が管理するのは一流のプログラマのやることではない。
>>102 終わってるな。
いまどきデータベースって言ったら、なぁ。
C言語でやるこっちゃないよ。DBMS使え。
何でもかんでもDBMS使えばいいってもんじゃないけどな
malloc/freeごときをきちんと管理できないやつは一流のプログラマとはいえないだろうよ。
あまりに複雑でどうしてもちゃんとfreeできないというならば、それはGCを使えということだ。
>>112 ちゃんとfreeできないほど複雑にしてしまうのは、一流のプログラマのやることじゃない。
大学の演習ぐらいならな。
いやいや。
プロの仕事だからこそ、参照カウントやGCという乱暴な解決手段を避けるのですよ。
それらは問題解決に役立つ便利なものに見えて、かえって問題をややこしくするから。
自分で複雑怪奇な設計しておいて、
複雑でどうしてもちゃんとfreeできないんだから仕方ないだろ! って音をあげつつ逆切れするのが三流プログラマ。
複雑にならないように設計し、あるいは、複雑にしろと命令されるような仕事をやらなくて済むようにするのが一流プログラマ。
C++で、コンテナ使いまくりのプログラムをCにコンバートする羽目になった洩れ。
半泣きになりながらどこでfreeするか検討したよ。
で、終わってからatexit()みたいな仕掛けでデストラクタもどきを実装すればよかったことに気づいた罠。
GCは乱暴じゃないよ。
OSによる
>>120 BSDは?Linuxは?win32は?
そいつらはfreeで解放できるようなメモリなら真
メモリリークのバグを発見する手段として、
プロセスが終了する時点でfreeされていないメモリブロックの有無を確認する
というのがあるのだが。
乱暴にfreeを省かれていると、そういう確認ができなくなってしまう。
リークする可能性がある、リークすると困るようなメモリならfreeするでしょう。
そうじゃなければ勝手にしろってだけでは?
>>124 どれがリークに繋がらないfree省略で、
どれがリークに繋がるfree忘れなのか、
ちゃんと管理できていればいいんだがな。
つまり、
メモリリークの有無を確認するときのみ、
前者についてfreeを呼び出すようにマクロで切り換えてコンパイルできるように・・・
ってするくらいなら、freeって直に書いてもいいんじゃないか?
>>123 そうですよね。宿題スレで
p = malloc(sizeof(struct node)) + 1;
と書いてしまって、自力で誤りがみつけられず、散々悩みました。
私の環境では、のミス含みでは一見、振る舞いに異常がみられず、ただリリースができない、という状況でした。
free() をきちんとかき動作確認をすることで、malloc() にミスがないことが同時に確認できるわけです。
>>126 C++にするだけで解決する問題だね。free()するかどうかは殆ど関係ない。
>>127 C++なら尚更、ちゃんとやらないと、大変なことになるぞ。
アライメント違反したら死ぬような環境ならすぐ分かるね。
>>129 今ならそうですが、はじめてみためには、free() がうまくいかないねー、くらいしかわからなかったのでした。
freeがうまく行かないって言うのは、けっこう聞きますね。
mallocが管理してるところをぶっ壊してるとか。
ものによるけど、それなりの規模のプログラムなら、
データ構造ごとにalloc/free用の関数作っちゃうから、
直にmalloc/free呼ぶことはほとんど無い。
Windows用のVC++なんかは、
デバッグビルドではヒープ破損のチェックとか自動で行われるんだが・・・。
なんかの書物に PHK malloc() の実装がありました。それをみると、今の malloc() では管理領域は簡単には壊れないようにできているようですね。
むしろ簡単に壊れてくれたほうがバグ発見が早くなる。
135 :
デフォルトの名無しさん:2008/09/07(日) 05:00:14
hosu
137 :
デフォルトの名無しさん:2009/02/16(月) 13:16:31
もう話おわった?
誰か上の人達にstl教えてあげて。
まだ終らんよ
140 :
デフォルトの名無しさん:2009/04/09(木) 18:47:59
新学期age
141 :
デフォルトの名無しさん:2009/04/10(金) 21:11:40
C言語で加算平均を求めるプログラムってどこかにありますか??
ここは質問スレではないよ。
はいはい
145 :
デフォルトの名無しさん:2009/05/08(金) 23:56:35
フィボなっちw
別にフィボナッチ数を求める関数として後置の!を使う記法があってもいいじゃない
マジックナンバーだらけで、
ループ用のiやjまでグローバル変数ってなCのプログラムってどうよ?
golf と判断します
自分の中での既成概念が壊れてしまうのだが、
数値計算やシミュレーションは、
ほぼ全ての変数をグローバルで書く方が効率良い。
と思ったら大間違いだ
そんなの最適化でやってくれよ
例えばこんなコード。
int foo;
void func()
{
for (foo = 0; foo < 1000 * 1000; ++foo) {
// some sequence w/o function.
}
}
最適化でこれ相当になるかもしれない。
int foo;
void func()
{
for (int ic = 0; ic < 1000 * 1000; ++ic) {
// some sequence w/o function.
}
foo = 1000 * 1000;
}
でも、ループ内部で(グローバルな)関数を呼んでいたら無理。
つまり、グローバル変数だけで書かれたコードは一般的に遅くなる。
# 開発効率がいいかどうかはプログラマ次第だが……
まず基礎をちゃんとすることが肝心だから、
コードは意図した機能をストレートに書くべし、速度のために変な工夫をしたくなっても我慢しろ
って叩き込むべきだろう。
それにしても
>>144は酷いな。
学生さんから授業料とって教えているのに、なんで20年も昔の内容を教えるんだろうな。
なにが酷いか、書いたほうがいいか。
1、main関数内にダラダラ書いてあること。
あの内容に付けるべき関数名はmainじゃない。
mainとは別の関数にして、mainからそれを呼ぶようにすべき。
たった1つの関数を呼ぶだけのmainであっても、それは無駄じゃない。
2、main関数は2つの別の機能を持ってしまっていること。
リスト構造の構築 と リストのダンプ は、別の機能だから、それぞれ関数にすべき
たった2つの関数を呼ぶだけの関数であっても、それは無駄じゃない。
3、list_newで、mallocが失敗した場合に備えてない
4、llist_newは、3つのメンバの初期値を引数で受け取るべき
メモリは確保したら速やかに初期化すべきで、ゆえに、引数で受け取った初期値を代入してから返すほうがいい
5、mallocしたのをfreeしてないぞ
6、引数で引き回すのが面倒という理由でグローバル変数を使うべきじゃない
短いプログラムだからグチャグチャでいい、なんてのは学生さんに教えることじゃない。
いずれ書く大きなプログラムのために勉強してるんだから、短くても、大きなプログラムと同じように書くべき。
短いプログラムでしか通用しないことを勉強するのは無駄だし、いざ大きなプログラムを書くとなったときに困るんじゃ・・・
んじゃ、私も>154に倣って。
・フィボナッチ数列のバッファに使うのなら可変長配列で充分だし、実際にリスト構造を扱う応用ではC++でSTLを使えばいいからリスト構造を教える意義が殆どない。
・配列版において配列の初期化にmemset()を使っているが、これもナンセンス。グローバルに置くなら初期化自体不要だし、そうでなくてもmemset()の使い方が間違っている。
・そもそも個数の13をマジックナンバーで与えるのは下策。神経を疑うと言ってもいい。
・これは細かい話になるが、fib()は静的にすべき。main()であれこれやるなというのは>154に既出だが、激しく同意。
>>155 >実際にリスト構造を扱う応用ではC++でSTLを使えばいいからリスト構造を教える意義が殆どない。
こういうことを言う馬鹿に限ってリスト構造も作れなかったりしてな。
リスト構造とはどういうものかは知らないと使えないけど、
リストを自分で作ることまでは、やらなくてもいいと思う。
(やらなくてもいいと、出来なくてもいいは違う。)
大学の授業って、1つの講義で一週間に、
授業90分、演習90分、自習180分くらいでしょ。
1年でそれなりのところまで行かないといけないから。
20年前と今とで、教える内容が同じなのはオカシイ。
そんな学校を卒業しても、20年前の新人と同じレベルだ。
使えない。
今の時代なら、
1年生の最後には、Scott MeyersやHarb Sutterの本を理解できるレベルにないと。
>>154 Cだからそういう面倒くさいことやる必要が生じるのであってこれがLispか何かの問題ならかなりすっきりするんじゃないかな。
お前らは
>>144の問題の意図を勘違いしているな。
問題は穴埋め、つまり他の誰かさんが書いたコードから
その意図を読み取り、必要な変更を行えということだ。
ろくにドキュメントもないソフトウェア資産を継承しなければならない
今の時代に合った教育じゃないか。
160 :
デフォルトの名無しさん:2010/01/17(日) 09:19:43
どんなライブラリを使えるのか、文法で許可されていることは
自由に使っていいのか明確に規定していない課題や試験は
まずいと思います
>>154 >>155に反論。
> 1、main関数内にダラダラ書いてあること。
mainにダラダラ書いていい。
main内で**重複するコードがあれば**、
関数としてくくり出し、それを該当箇所で呼べば良い。
汎用的に括りだされた関数は、**使われる側**であって、
mainはそれを**使う側**でしかない。
> ・そもそも個数の13をマジックナンバーで与えるのは下策。神経を疑うと言ってもいい。
これも上のケースと同様。複数の関数をまたがるように、
それぞれの中で13が使われているのならともかく、各関数を使う側の文脈として、
mainのスコープ内で一箇所だけ使われてるのなら、何も困らない。
main以外の関数の中でマジックナンバーを使う件とは、話が違う。
main以外での場合は、汎用性を完全に失墜させる愚行。使われやすさが失われる。
> 3、list_newで、mallocが失敗した場合に備えてない
デーモンプロセスになるわけでもないプログラムならば、
失敗して結構。オチて結構。
> 5、mallocしたのをfreeしてないぞ
プログラムの動作としてバグっているのならともかく、
そうでないのなら、ましてや、
実行後すぐ終了するような小規模プログラムならば見過ごせる。
> 6、引数で引き回すのが面倒という理由でグローバル変数を使うべきじゃない
これだけは最高に同意。気軽にソレを使っちゃだめ。
何ヶ月も経っているのに何を書いているのかと思えば、反論って程の反論になってない辺り。
main()にだらだら書いていると、そのロジックを他から利用したくなったときに書き換えが多く発生する。
main()はコマンドインタプリタとのI/F関数と言う位置づけに留めて処理の流れを書かない方がいい。
と言うのが、ある程度再利用を考慮に入れたプログラムの場合の鉄則。
最初から使い捨てが目的なら>161の言うようにmain()にマジックナンバーでも処理でも資源解放の
省略でも好きなように書いていいと思う。逆に言えば、使い捨てじゃないならどうすべきかは自明。
まったく再利用しなくても、書き捨てでも、整然と書く習慣を付けるべきだと思うぞ。
わざわざ悪い習慣を染み込ませてから、それを拭うような矯正をするのは無駄だと思う。
たとえば
printf("Hello, world!\n");
なんてのを手本として示す人がいるけど、
自分が落ちた落とし穴に後輩をも落す陰湿な行為だと思うんだ。
>>163 それのどこが問題なのか、詳しく。
もし仮に、私が想定している点を指摘したいのなら多くの人が落とし穴の存在にも気づいていないと思うのだが。
165 :
163:2010/04/08(木) 18:26:13
printfの第一引数は、あくまでも「書式化文字列」へのポインタであって「表示したい任意の文字列」へのポインタではない、ってことを意識させないのが問題。
冗長なようでも
printf("%s", "Hello, world!\n");
や
fputs("Hello, world!\n", stdout);
とすべき。
あるいは1行ごとに出力なら
puts("Hello, world!");
でもいい。
失敗例1)
printf("100%suki!\n");
失敗例2)
void foo(char *str) {
中略
printf(str);
後略
失敗例3)
#define MESSAGE "hogehogehoge"
中略
printf(MESSAGE);
やっぱりそういうことか。
まぁ、Cの入門書は実際に使っている人間が書いていないことはほぼ間違いないから仕方ないんじゃね?
>163はその手のバッドノウハウを纏めてwikiで公開してくれる気はないかい?
私も仕事をやめたらやろうかと思っているのだが、仕事をやめる気になれるほど稼げていないから未だ無理なんだ。
素のstrcpyを使った「お手本」を示す本は発禁にしてほしいわ
うーん、strcpy()はいい代案がないなぁ。
strcpy_s()が標準じゃないこともそうだけど、strcpy()で起きる問題の全てを解決できるわけではないし。
そもそも、実務ではstrcpy()というか、単純な文字列コピーを行なう機会は殆どないと思う。
# sprintf()が強力だし、文字列をコピーしなくてもポインタを引き渡せば済むことも多いし……
169 :
163:2010/04/08(木) 21:40:41
>>166 人様に教えることが許されるほどのスキルはないんで無理だよー。
持ちネタも、このprintf一つだけだし。
>>165 めちゃめちゃどうでもいいことだな。
こんなこと律儀にやってるやついないだろ。
>>170 とても大切なことだよ。
何らかの教育機関でプログラミングを習うのなら、なぜ大切なのか教わって当然だと思う。
printfというたったひとつの関数固有の、
引数の与え方がどれほど大切かね?w
>>172 バグに時間を取られないようにするためには、必要なこと
針小棒大。
んなこたーない
printfは基礎段階で用いる例であって、printfの使い方「だけ」の話ではない
これが適切にできないやつは、他でも同様のポカをする
> これが適切にできないやつは、他でも同様のポカをする
何を根拠に…。
で、例えばどんなポカをすると? 同様の?
例えば、SQLインジェクションを許してしまうようなセキュリティホールを作る、とかだな。
今日の東工大計算工学専攻の院試問題(C言語)が激ムズだったらしい。
誰か問題どっかにうpしてくれないかな…
180 :
デフォルトの名無しさん:2010/12/06(月) 15:25:53
純真な若者に一日中彼女と「おまんこ」し続けるとか変なことを教えてしまわないように、
大学レベルのプログラミング演習の課題をブラッシュアップしていこうう。
首都圏もチェルノブイリ並みに汚染されている(日刊ゲンダイ)2011年8月9日
医師の土井里紗氏はこう言った。
「首都圏はチェルノブイリ事故のような汚染はない、とされてきたが、(調査結果は)それを否定するもの。
降り積もった(高濃度汚染の)砂塵(さじん)が風などで吹き上がれば、皮膚や粘膜に吸着される可能性もあります」
どーせ、ほとんどがIT業界に行くんだから、
schemeインタプリタやOSぐらい演習で書かせりゃいいのに