- ベストアンサー
C言語の上級者を目指したい。
就職活動でソフト会社へ面接に行きました。 金融関係のプログラムをつくっている会社です。 そのとき社長さんから聞いた話です。 「学校を出たばかりの人にプログラムを書かせると100万口座の処理に3日もかかってしまうが、プロが書いたものは10分で処理できる。」 ポインタをしっかり勉強しておいて欲しいとの話でした。 結局、その会社は断りましたが自信をなくしてしまいました。 残りの1年はCをどのように勉強していけば良いでしょうか。 アドバイスをお願いします。 いまの私のレベルは基本情報処理技術者試験をC言語で合格しています。 勉強した本は下記の通りです。 (1) やさしいC ソフトバンク (2) 明解C言語入門 ソフトバンク (3) らくらく突破C言語 技術評論社 (4) 合格サポートC言語 一橋出版 (5) ポインタの極意 ソフトバンク (6) C言語によるアルゴリズムとデータ構造 ソフトバンク ただし、(1)~(4)はサンプルコードを入力し演習問題も自力で解いてますが (5)、(6)は一通り読んだだけです。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
とても勉強家で関心します。 「残りの1年何を勉強していけば良いか」に重点を置かせて頂きます。 勉強方法については賛否両論なので、あくまで当方がある程度(ランクをつけるなら中級とさせてもらいます)C言語を扱えるようになった方法をお答えしたいと思います。 (1) 基本情報処理技術者試験を合格なさっているので、これを有効活用してみては如何でしょうか。 午前の部の「アーキテクチャ」と「アルゴリズム」、午後の部の「アセンブラ(仮想コンピュータCOMET)」です。 これはコンピューターを動かす上で(つまりプログラム)コアになります。 「アーキテクチャ」で仕組み(仕様)を見て、目的の「アルゴリズム」を選択し、「アセンブラ」でプログラミングする、といった手法です。 いまどき「アセンブラ」なんてという意見が大半を占めると思いますが、これが理解できてしまうと、現状あるありとあらゆる「プログラミング言語」が不思議と理解できてしまいます。 C言語のポインタが難所と呼ばれる起点は、ここを教えてもらえないからだと当方は思います。 (2) 「マルチタスク(マルチスレッド)」の概念を頭に叩き込んでおくとよいでしょう。 システム開発において必要不可欠な知識であることは断言できます。 当方の回答で、少しでも貴方の問題が解決できたら幸いです。
その他の回答 (8)
- sakusaker7
- ベストアンサー率62% (800/1280)
やる気に水を差すかもしれないけど参考に。 The top 10 dead (or dying) computer skills http://www.computerworld.com/action/article.do?command=viewArticleBasic&articleId=9020942&pageNumber=3 これの6番目が ' C programming' です。 As the Web takes over, C languages are also becoming less relevant, according to Padveen. "C++ and C Sharp are still alive and kicking, but try to find a basic C-only programmer today, and you'll likely find a guy that's unemployed and/or training for a new skill," he says. もちろん日本と状況が同じということはないでしょうけど、 使われる場面は減少傾向にあって、「高く売れる技術」 ではないことを頭に入れておきましょう。 まあ今売れ線のものも5年後はどうだかわかったもんじゃないですけどね。
お礼
ありがとうございました。 JAVA、VB.NET、Parlも勉強してきましたが、内定した会社がCを使っているのでこだわっています。 他にも何社か話を聞いてきました。 必ず出てくるのがJAVA、次がVB.NET、次がC#かC++かCです。 私の住んでいる田舎でもCは需要が減少しているようです。 やはり、ここは一旦Cをとめて時間がある学生のうちにアセンブラを一冊読みます。 もちろんNo9さんが紹介してくれた本も必ず読みます。
- 5S6
- ベストアンサー率29% (675/2291)
ポインタは基礎です。 基本情報処理持っているならわかっていると思いますけどね。 ようはアルゴリズムです。 例えばHTML <TR>・・・</TR> などのタグがありますよね。 それを元に罫線を書いたり色をつけたり、画像を貼り付けたり。 あるいはJavascriptが組み込まれているときはその通り動作させます。 HTMLでなく独自の似た言語があったとします。 "<BIG>"というタグで囲んだ部分は文字を大きくする "<SMALL>"というタグで囲んだ部分は文字を小さくする というルールだけであればそれを表示するプログラムは書けますよね?? "<BIG>あ<SMALL>い<BIG>" "あ"が大きく"い"は小さい。でも"い"の終了タグは省略。 人間ならすぐわかりますがコンピュータは難しいです。 省略OKとかエラーがあった場合などに対応させ、しかもルールが 多くなるととても複雑な処理が必要です。 こういう場合ポインタうんぬんよりアルゴリズムです。 昔、開発しましたが処理に1週間かかるプログラム(VB)を VCで作り直して30秒台まで短縮しました。 元のプログラムが悪いという表現もできますが動くには動きます。 ベンチマークじゃないのでCPU性能とかメモリとかは関係ありません。 ただし一般的にはC言語プロフェッショナルよりDB技術者のほうが 好まれますよ。
お礼
ありがとうございました。 これは勉強してきたなかで思ったことです。 ポインターはエイリアスに慣れてしまえば自然と読めるようになるもんだと思いました。 それより、時間計算量を意識したアルゴリズムですね。
- maguro999
- ベストアンサー率21% (59/273)
結局の所 アマグラマー(死語かな)とプログラマーの差です。 後、下手な勉強方法で変な癖だけは付けないようにしましょう。
お礼
ありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
C言語を最も活用できる分野は、今のところ組み込み系だと思います。 その意味では、アセンブリ言語やハードウェアのことも勉強した方がよいでしょう。仮に組み込み系に関わらないとしても、必ずC言語の上達には役立つはずです。 組み込み系だと、ものにもよりますが、ほとんどの処理をスクラッチで実装しなければならないことも多く、基本的なアルゴリズムやテクニックを駆使する機会も多いと思います。多くの場合は、そのような難度の高い部分は、ごく一部の優秀なプログラマが実装して、その他大勢のメンバーはそれを使うだけになるわけですが、どうせなら、ごく一部の優秀なプログラマの中に入る方がいいですよね。
お礼
ありがとうございました。 Cを理解する1つの方法としてアセンブラも読んでおきます。
- sakusaker7
- ベストアンサー率62% (800/1280)
ポインタ云々はともかく、100万口座を…というのは 別にCに限った話ではないと思うので、 「C言語の上級を目指したい」というのと今ひとつ かみ合っていないような気がします。 Javaなんかでは顕著ですが、アプリケーションを作るのに from scracthでたとえば検索とかソートのような肝の部分を毎回実装するようなことは ほとんどないんじゃないでしょうか。 実装技術を知っておくことは大切ですが、あまりそれにとらわれることも ないでしょう。 その辺を踏まえて読んで欲しいなと思う本を挙げておきます。 珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造: 本: ジョン ベントリー,Jon Bentley,小林 健一郎 http://www.amazon.co.jp/gp/product/4894712369 プログラミング作法: 本: ブライアン カーニハン,ロブ パイク,Brian Kernighan,Rob Pike,福崎 俊博 http://www.amazon.co.jp/gp/product/4756136494 My Job Went To India オフショア時代のソフトウェア開発者サバイバルガイド: 本: Chad Fowler,でびあんぐる http://www.amazon.co.jp/gp/product/4274066592 Joel on Software: 本: Joel Spolsky,青木 靖 http://www.amazon.co.jp/gp/product/4274066304 Cにこだわる話なら エキスパートCプログラミング―知られざるCの深層: 本: ピーター ヴァン・デ ・リンデン,Peter van der Linden,梅原 系 http://www.amazon.co.jp/gp/product/4756116396 これとか。
お礼
ありがとうございました。 必ず上記のどれか1冊だけは読んでおきます。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・まずはポインタ、アルゴリズム、データ構造の基本をしっかりと固めておきましょう。 その後、ポインタ+リスト構造でアドレス帳などのデータベースらしきものを作ってみる。 検索、ソート、ファイル処理、パスワード処理などを盛り込んで1つのソフトを作成してみる。 ・あとコマンドラインの引数を処理して簡単な電卓を作ってみる。 構文解析の方法や、文字列、ポインタ、スタックなどの基本がないと作れないため、 今までの学習の成果が本当に身についているかが分かります。もし、作成できれば リダイレクション入力、出力、パイプ処理をサポートして機能拡張をすればその後に ちょっとした計算インタプリタとして使えて便利になります。 変数や公式もサポートすれば、フリーソフトにしても恥ずかしくはないと思います。 ・とにかく何かツール(ソフト)を作ってみて下さい。 これからの学習で必要なのは実践編です。 C 言語の文法をどう活用するかのセンスも必要です。 コンソール・アプリケーションのソフトを多数作ってみて下さい。 (1)アドレス帳 (2)計算インタプリタ (3)ファイルの16進ダンプ一覧表示 (4)ファイルの分割&合併 (5)ファイルの検索&一覧表示 (6)ファイルのワイプ削除 こんな感じのテーマを決めて1つずつ作成してみて下さい。 もし出来れば、C 言語の文法以外にアルゴリズムに磨きをかけれます。 ・以上。今後の参考に!
お礼
ありがとうございました。 「ポインタの極意」と「アルゴリズムとデータ構造」をしっかり復習しなおします。 (1)のアドレス帳は構造体をリストにして、すぐにでもつくれそうです。 今、卒業制作に向けて何をつくるか考えています。 どうせ時間をかけてつくるならCに磨きをかけるためにCで実用的なソフトをつくることにしました。 まだ、漠然とはしてますが(2)~(6)の電卓やファイルの機能を含めたものをつくってみます。
- sha-girl
- ベストアンサー率52% (430/816)
>100万口座の処理に3日もかかってしまうが 基本情報を取っているということですので 「ハッシュ」や「B-Tree」についてはご存じでしょう? 100万口座を先頭から順番に検索していけば、目的の口座を検索するのに 平均50万回比較する必要がありますが ハッシュやB-Tree等のアルゴリズムを使えば 20回程度の比較で目的の口座番号をヒットさせることができます。 クイックソート、シェルソート、マージソート等 基本情報の中で色々なアルゴリズムについて学習したと思います。 それらをCで自分で書いてみてはどうですか? 勉強になるし、ポインタの重要性もわかると思います。 (文字列のデータが100万個あってそれをソートするとき、 文字列データそのものを置き換えたりはしなくても ポインタを並び替えるだけで良いのです。) >自信をなくしてしまいました。 資格をとったりと努力もしているようですし、 これからもCをを勉強していこうとする姿勢も 非常に前向きだと思います。 逆に自信をもってください。
お礼
ありがとうございました。 あのときは個人面接でしたが、木をしっかり勉強した学生か見ていたことがわかりました。 すぐ頭に浮かばなくて、まだまだ勉強不足を感じます。 「ポインタの極意」と「アルゴリズムとデータ構造」からしっかり復習しなおします。 励ましの言葉ありがとうございました。
- ari_els
- ベストアンサー率25% (111/439)
ポインタ制御は、ある程度は経験が必要でしょうね。 あとは、常にプログラムを作ることでしょうか。(時間が経つと作り方を忘れてしまいますので。) なので、自分が欲しいツールのようなものをひたすら作ってみた方が良いでしょう。 例えば、あなたがボーリングが趣味だとすれば、スコアを入力すれば自動計算してくれて、今までの平均スコアやストライクの数等も出してくれるようなソフトを作るとか。 (ボーリングのスコア計算って意外と面倒なので、ロジックの勉強には良いかも。) 遊びを入れながら学べば上達は早いです。 今まで(15年)この世界に居た経験上ですが、新人から直ぐに戦力になる人はまずいませんよ。(まれに中学辺りからプログラムを作っていたようなレベルも居ますけど。) まだまだ、本物の技術屋は全然少ないです。なので、落ち込むことはありません。
お礼
ありがとうございました。 偶然、今日の授業は卒業制作に向けていろいろな案を考える日です。 考えながら回答を読ませていただきました。 ほとんどの学生はVBやJAVAをつかってゲームをつくろうとしているようですが、私はCで実用的なツールをつくってみたい思います。 励ましの言葉ありがとうございました。
お礼
ありがとうございました。 回答を読んでいるうちに言語だけにとらわれていないか反省しました。 言語は時が経てば変りますし、プロを目指すならシステムがどのように動作しているか理解してなければなりません。 これからは、言語の使い方だけではなく言語がシステム内でどのように動作しているかも考えながら勉強していきます。 言語は言語、ハードはハード、と言うようにそれぞれ別物のようにとらえてしまわないように気を付けたいです。