- ベストアンサー
c言語の勉強方について
いま、独学でc言語を勉強しています。 しかし、なかなか上達しません。問題を見たときに何を考えればいいのか わからないのです。 友人の中には、問題を見てすぐにプログラミングが浮かんでくるという人がいるのですが、 このような人たちは問題から何を察知しているのでしょうか? そして、どのようなことを頭のなかで考えているのでしょうか? 少し抽象的な質問ですが、よろしくお願いします。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
はじめまして 独学でCを勉強なされてるんですね それは逆にいいことかもしれません 私の会社の技術顧問が勤めている会社の人達はプログラムはすべて独学なんだそうです その人達は専門は全然違ったとのことです 今は上達しないとのことですが、私もはっきり言って上達しにくい方です 最初は問題を見て何をすればいいの?という状態でしたが、それでもいいと 思います 因みにどれくらいの期間勉強なさったのでしょうか? 私の場合、真面目にCを頑張らなくてはと思い始めたのは今年会社に入って からだったのですが・・・ でも少しずつですが、もしかしてこの問題はこれを使うのでは?ということ が分かってくるようになりました 恐らく、mickmick2さんも真面目に勉強すれば、分かってくると思いますよ いや、分かります (学校でCで赤点ギリギリだった私が出来るのだから大丈夫ですよ!!) でも、プログラムをどう作るのかということを一生懸命考えもせずに友達に 聞いたりすることはやめておいた方がいいみたいです 話によると、100万部売れたCの本でも嘘が書いてあるとのこと プログラマでもその本を読んで育った人がいたりするぐらいですから、 自分が実際に試したことしか信じない方が身のためです (それに本当の意味でのプログラマは2%くらいしかいないとのことです ですが、ここまできたらはっきり言って恐ろしいほどの凄腕です 普通のプログラマをノイローゼにするくらいの力はあります) ですから、CのHPも参考にしたりしない方がいいです というか受け売りなんですけど間違ったことを覚えないためにも 見ない方がいいと思います それに、友達やHPに頼ってしまうと、それこそ駄目になってしまいます もし、本当にCをしたいのなら 「プログラミング言語C第2版」 の購入をお勧めします でも、この本にはアンサーブックだったと思うんですけど、課題の答え を載せている本が別に出ています でもこれは買っちゃ駄目です!!! 何でも、プログラミング言語Cに答えが載っていないのは必要がないためとか 各国の国語力があるエンジニアなら、答えあわせをしなくても 正しい答えに辿り着くとのことです (エンジニアを目指しているかどうかは分かりませんが) それでこの本を一週間に二度は読んでいくと最初意味がわからなくても 自然と分かってきます!(実際にそうでした) あとは見やすいプログラムを書くことだと思います 例えば演算子の両端はスペースを置くこととか そこから気を付けていけばいいかもしれません 友人の中には・・・ということですが、mickmick2さんは恐らく学生さん ですよね? はっきり言って学校で習ったCは役に立ちません っていうか、一体学校で何習ったの?という感じです ですから友人が出来ようが、自分があまり出来まいが気にしないで自分の ペースでしっかり基礎を身に付けて下さい もしmickmick2さんが頑張って勉強したら多分その人に追いつくことは可能 だと私は思います ただ、コードをいっぱい書いたらの話ですけど・・・ (結局は慣れの部分も出てきます) 私に言えることはもっと自分の力を信じてくださいということです プログラムをするところから、学力は低くはないんでしょう? だったら大丈夫! 努力次第で、どうにでもなります 頑張って下さいね
その他の回答 (11)
- ametsuchi
- ベストアンサー率31% (81/257)
具体例で出されている「2分木によるソート」とは、まさしく「QuickSort」じゃないですか。Sort技法は情報処理の基本中の基本で、昔から色々工夫され、今では外部記憶を使わない「InternalSort」,その中でも「QuickSort」がコードも簡単で処理時間も速いSort技法として、広く使われるようになりました。自らコーディングしなくても、「qsort」関数を使えば、楽にSortできるのは便利なもんです。 ただ、「基本」ですから、自分で「QuickSort」関数を作ってみるのはいいことです。しかし、正直なところ、世間の大半のプログラマは、以下の何れかです。 1)「qsort」関数を呼ぶだけ。自分では書いたことも読んだこともない。 2)「QuickSort」関数のプログラムが再帰的であることに驚き、頭がこんがらかって理解することを諦める。 3)「QuickSort」関数のプログラムを読んで理解し、そのエレガントさに感激。 私が知る限り、問題を与えられた時点で、パッと独自のエレガントなSortプログラムを思い付いたなんて人は皆無です。もしそう主張する人がいたら、 a)大天才 b)大ボラ吹き c)自分で考えたのではなく知識として覚えた の何れかです。ですからこの問題に関してはできなくて当り前です。 私のアドバイスは ■いいアルゴリズムに接すること。 この意味で私がいい本だと思っているのは、 「Algorithm」、RobertSedgewick著、AddisonWesley刊 です。Pascalで書かれているが、C版もあるようです。
- nagata
- ベストアンサー率33% (10/30)
いまのあなたの状況は、『鶴と亀があわせて20匹います。 足の数を合計すると50本でした。鶴と亀は何匹づついるでしょうか。』 と、問題をだされた小学生と似ていると思います。 何を考えたらいいのかわからない,と言う点で。 始めの内は典型的な問題とその解法をちょっとづつ覚えて行くしかないかと思います。 プログラムも数学の内だと思います。
- onosuke
- ベストアンサー率67% (310/456)
回答1の例題ですが,わたしだとぱっと見,こんな形の枠だけ作ってしまいます。 -------------- {二分木初期化} while(TRUE){ {入力処理} if({二分木探索}){二分木追加;二分木構造表示} } --------------- 他の皆さんがおっっしゃるところの流れ図ですが,まあ一例として,参考にしてください。 これがすんなり作成できないといわれると… このような流れ図は経験に基づいた勘が作り出すものと思います。ようするに慣れろってことですね。わからないうちは,悩んで悩んで悩みまくってください。悩んだ結果がずれていても,かまいませんから。その悩んだ上の考えを方向修正するのが,私等,教える側の人間の勤めかと思います。
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 私の場合ですが、大まかな手順を考え、その手順1つ1つについて掘り下げていく、という方法でプログラミングしています。 いきなり全体をみて、全体のプログラムを考えるなんていう事はしませんし、私は出来ません。 大概の人は気づいていないのですが、プログラミングは大多数の人が日々行っています。 車に例えます。 交差点Aを左折しようとします。 左折までのおおまかな手順は、 1.交差点が近づいたらウインカーを左に出す 2.徐々に減速 3.ハンドルを左にきる 4.左折が終了したらハンドルを戻し、加速。 です。 これ、コンピュータの世界ではプログラミングといいます。 多分ドライバーなら誰でも行っているでしょう、というかやってます(笑) 実際のプログラミングも全く同じように順を追って考えていけば良いです。 「数値A,Bをキーボードから入力し、加算して結果を画面に表示」という問題があったとします。 私の場合は、いきなりプログラムを考えようとせず、また、全体を考えようとせず、はじめの一歩を考えます。 最初に「数値A,Bをキーボードから入力し」とあるので、最初にしなければいけないのは、AとBという2つの数値を入力する事です。 次に加算。 その結果は画面に表示。 これを順に書きます。 1.AとBをキーボードから入力する。 2.加算処理をする。 3.画面に表示する。 問題のままですが、これがプログラミングです。 次に、それぞれについて、どんなコードになるか考えます。 1は、 scanf("%d %d", &a, &b); といったところ。 2は c = a + b; 3は printf("%d\n", c); 多分この段階でつまづく人は多いと思います。「キーボードからの入力はどうすればいいの?」とか。 これは覚えるしかないので勉強次第ですね。 この難関を越えれば無事プログラムの完成です。 全てのステップについてコードが思い浮かんだので、これを清書してカンペキなコードにすればOKです。 void main() { int a,b,c; printf("数を2つ入力してね。\n"); scanf("%d %d", &a, &b); c = a+b; printf("答えは %d です。\n", c); } プログラミングは手順を考える事が最重要です。 たくさんの命令を知っている事ではありません。 繰り返しになりますが、ここでの例題か簡単でしたので一気に全体をみても思いつくものですが、実際はそれは難しいことです。 まずどうすれば良いか、次に何をすれば良いか、と順を追って、問題を1つ1つ解決していく力が必要です。 また、慣れてくると、「どんなデータが必要か」をコンセプトに考える事も出来るようになります。 例えば、上記例で、「加算して表示すればいいのね」という所を先に考え、2,3の手順を思いつきます。 次に、「じゃあその処理にはA,Bという2つの数値が必要だったなぁ。どうやってキーボードから入手しようか」 と考え、1の手順を思いつきます。 この例では入手にたった1つの命令のみで済んでしまうのであまり意味のない考え方ですが、処理に必要なデータを入手するのにいくつかの、また別の手順が必要な場合もあるので、その場合に使うことがあります。 別件をとりあえずおいといて、先にこっちを片付けよう、という考え方ともいえますね。 因みに mickmick2さんの出してくれた例題を用いなかったのは、私が数学が苦手というのもありますが(笑)、その例題を追っていくと、殆ど2分木の説明になってしまうためです。 「順を追って」を説明するのに不向きなものでしたので、他に簡単な例題を出させて頂きました。 うまく説明出来ているか不安ですが、参考になれば幸いです(..
- hero1000
- ベストアンサー率29% (114/390)
No.1で回答した者です。 例題を出していただいたのですが、私が言いたいことはpunchan_jpさんが回答 なさった通りです。(汗) punchan_jpさんが回答なさったような事がスラッと出てくるかどうかは経験に よります。そのとき、 ・簡単に改造(改良や仕様変更)できるか? ・何かというとグローバル変数に頼っていないか? をポイントとしていつも心に置いてプログラミングするようにして下さい。 例えば、「あるノードを探し、その項目番号を返す関数」を作っておくといろいろ な用途に使えますよね。そういうふうに、「あるサービスを行う関数」を作って おくと、関数という「部品」を組みかえたり、特定の関数の中身を変えるだけで 仕様変更に対応できます。 一応アドバイスまで・・・ 勉強頑張って下さいね。
- bob
- ベストアンサー率50% (52/103)
もしかすると、参照URLの「プログラミングとは何ですか???」という質問が参考になるかも知れません。 ポイントは、目の前の問題(プログラミング対象)を一つの問題だと思わず、より基本的な小さな問題の集まりと見ることにあります。これをその言語で必要なレベルまでくり返せば良いわけです。 この能力にはやはりセンスが必要で、センスを磨くには経験(練習)しかありません。あなたは「ドアを開ける」をどこまで細分化できますか?
- punchan_jp
- ベストアンサー率55% (155/280)
No.1の補足の例題に関してですが、慣れた人なら30分もあれば書けそうな内容 ですよね。エキスパートならもっと速いかも。もっとも、本筋ではないですが 「格納関係を表示すること」って何のことかあいまいですね。「どのノードの どっちに追加したか」を表示すればいいのかな?出題者に問い合わせる必要も ありそうです。 で、問題を見て何を考えればいいかですが、mickmick2さんは、この問題を見 て何を考えますか? データ構造のイメージはわきますか?配列があって、その各要素は名前と左の 番号と右の番号を保持する構造体であるというイメージです。配列の第0要素 が2分木のルートノードです。 また、プログラムの動作途中では、空のノードと使用中のノードが混在してい ることはイメージできますか? データを追加するには、空のノードを探してそこにデータを入れ、どこかのノー ドの左または右として接続するということはイメージできますか? どのように空のノードを探すかの戦略をいくつか思いつきますか? この問題では不要ですが、場合によっては削除することもイメージする必要が あります。空になったノードは次に必要なときに探せるようにしておく必要が あります。 次に、そのデータの操作手順です。 2分木によるソーティングはご存知だとして、新しいデータを追加するには、 まず適切な位置を探さなければいけません。既に途中まで作られた2分木に対 して、追加位置を求めて探索していく手順はイメージできますか? その手順を実現するには、再帰呼出しが素直な方法だと予想できますか? 完成した2分木から結果を出力するには、そのルートノードの左の部分2分木 を出力して、ルートノード自身を出力して、最後に右の部分2分木を出力すれ ばいいという手順は理解されていますか? このように、データがどのように蓄えられるか、それをどう操作していくかと いうイメージを持つことが大切です。紙にも書いてないし、画面にも現れてな いイメージですから、それを頭の中で想像しなければいけません。 例にあげられている程度まで細分化された問題の場合、この程度のことが一気 にイメージできてから、プログラムを書き始めるわけです。このイメージが全 部わいていれば、あとは各言語の文法に合わせていくだけです。 これより大規模な問題になってくると、問題の細分化が必要でしょう。また状 況によってデータ構造が与えられているか新たに設計するかによっても、やり 方は異なります。
- coolguys
- ベストアンサー率18% (351/1917)
まず、 分かるところ(イメージできるところ)を 抜き出していく。 例えば、「同じ名前は追加しない」「名前を比べる」など。 分からないところは文章でも良いので書き出しておく。 書き出したものを、こうだと思う処理の順番に並べていく、 すると、処理の流れ図が出来上がる。 個の段階でプログラムがかけるとすごいのですが、 出来ない場合はさらに細かくしていく。 「名前を比べる」->「一文字目を比較」「2文字目を比較」・・・「最後を比較」 それを、 さっきの流れ図の部分と入れ替える。 というように、分かるところまで細かくやっていくと、 単純なプログラムの部分(if, for)になっていくと思います。
- mnabe
- ベストアンサー率33% (427/1283)
貴方は如何考えているのでしょうか? 最初にそれを教えて下さい。 まず最初に問題って事は、例えば『1~10までの合計を出すプログラムを作成せよ』って問題なのか? 『経理プログラムを作って欲しい』って問題なのかによります。 以下に、私の思考ルーチンを書きますが、参考にならないと思います。 前者: これは簡単、出題者がいるのですから、今までやったことから問題を出している事位は考えられます。そこで、自分が覚えている命令を思い出して、問題に近い物をリストアップしていきます。その後、チャート(手順)に興して、オブジェクトに分割して、それを繰返してプログラムレベルまで落として行きます。 ここでキーになるのは、命令をいくつ知っているのかになります。プログラムが浮かんでくる人は、命令と役割のリンクが沢山されている人って事になります。 後は、応用力になりますがこれは説明するのが難しいので、今は置いておきます 後者: これは、すごく経験が要ります。まずは、ビジネスモデルに分けるのですが、ユーザが何を望んでいるのか? 何をしないのか? 入力は何か? 出力は何か? 入力と出力の役割は? を理解する必要があります。 その後、問題を細分化して同じことを繰返します。ある程度の分割ができたら(ここいらへんが経験)。データの流れを把握する、データの流れと細分化されたオブジェクト間で不整合が見つからなければ、オブジェクトを、プログラムに興して行きます。ここからは前者と殆ど同じ方法になります。 こんな感じで考えていますが、慣れてくると、手順を理解しながら次の為の布石を打てるようになって来ます。
- xinman
- ベストアンサー率30% (25/83)
あくまでもわたしの場合の回答です。 何も察知しないし、 何も考えていません。 経験豊かなプログラマであれば、多少のプログラムは何も考えずに 半ば自発的に浮かんでくるはずです。 例えば、 1+1=? という問題があったときに大多数の人が考えること無く 答えが浮かんでくることと同じ事だと思います。 問題と答えが既に頭の中で結びついているが為に為せる技です。
- 1
- 2