プロが教える店舗&オフィスのセキュリティ対策術

大学でC言語を習っていて、今も実験などでC言語のプログラミングをしなければならないのですが、なかなか思うようにプログラムが書けません。

いつも何回も友達や教授に聞かないと納得が出来ないし、とても時間がかかるので困っています。

情報系の学科なのでこれからも使うことになるだろうし、自分としてももっとプログラミングが出来るようになりたいと思っているのですが、良い勉強法などあれば教えてください。

今までちゃんとやったことのある言語はC言語のみで、大学では1年半C言語の授業がありました。

自分でプログラミングをしていて困ってしまうのは、主に条件分岐が複雑になってしまうときと、文字列の操作(ポインタ?)です。

今、3年後期なので4年次に研究室に配属されるまでにもっと出来るようになりたいのでよろしくお願いしますm(__)m

A 回答 (10件)

>>困ってしまうのは、主に条件分岐が複雑になってしまうとき



これはなかなか答えづらい質問ですね。
論理的思考能力の問題かと思うのですが、訓練方法はよく知りません。
学生時代には数学とかいくら教えても理解できないヤツとかいましたし、
得手不得手の問題かと個人的には考えますが‥。
日頃から、「なぜ」この結果になるのか?と何度も本当に自分が理解できるまで
何度も「なぜ」を繰り返すと自然と身につくようになる気がします。

>>と、文字列の操作(ポインタ?)です。

ポインタが分からないという人は「変数」の仕様を理解していない場合が大半です。
簡単に言うと、

・「変数」は「文字や数」を格納するのに使用します。
・そして、メモリ上のどこに格納したかコンピュータが覚えておくために、
「変数」には必ず一意な「アドレス」が割り当てられます。
・「ポインタ変数」はこの「アドレス」を格納するための「変数」です

上記に書いたようなことを常に念頭におきながらポインタを使っているとだんだん慣れてきます。

int a; /* メモリ上にaの値を格納するための領域を確保
a=100; /* メモリ上に確保したaの領域に100を代入
int *b; /* メモリ上にアドレスを格納するための領域を確保
b = &a; /* メモリ上に確保したbの領域にaのアドレスを代入
int *c; /* メモリ上にアドレスを格納するための領域を確保
c = b; /* メモリ上に確保したcの領域にbの値(すなわちaのアドレス)を代入
c = &b; /* メモリ上に確保したcの領域にbのアドレスを代入

>>情報系の学科なのでこれからも使うことになるだろうし

情報系の学科であろうと、近年はプログラミングができる必要はないパターンが増えています。
例えば、サーバ構築やネットワーク構築などの分野ですと、
ほとんどプログラミングは行いません。
また、会社に就職しても、プログラミングを行うのはいわゆる「下っ端」で
偉くなればなるほど、プログラミングをする機会は少なくなりますし、
今では「オフショア」といって、日本人よりももっと賃金の安い海外の方に委託するパターンが非常に多くなっています。
今必要とされている能力は、「プログラミングができる能力」ではなく、「問題解決できる設計能力」です。
通常、システム開発は「設計」⇒「プログラミング」で進めますので、
いかに実現に沿った「設計」を行えるかが重要になります。
つまり、「設計」が正しく行われていれば、「プログラミング」は誰でもできる、ということです。

とはいえ、じゃあプログラミングはいらないのかと言われれば、そういうわけではありません。
優秀な人ほど、すべてにおいて秀でていますし、
そもそも設計自体もコーディングしていく過程と考え方は似かよる上、
プログラミングができる(わかる)こと自体が、具体的な実現物の根拠に結びつくからです。

右往左往しましたが、私の考えとしましては、
・システム開発ではできる限り、プログラミングのできる能力はほしいが、
どうしても無理な場合は、分野によって回避できる。
ということです。
    • good
    • 0

ベンチマークで最高値を出すため読みやすさよりも速度優先で、最適化してみました。


0m58.902sをマークしました。
どの辺りをいじると速くなるか考察してみてください。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
include <stdio.h>

int
main(void)
{
int i;
int f, b;

for (i = 1; i <= 100; i++) {
if ((f = ((i % 3) == 0)) && (i % 5) != 0) {
printf("Fizz\n");
}
else if ((b = ((i % 5) == 0)) && !f) {
printf("Buzz\n");
}
else if (f && b) {
printf("FizzBuzz\n");
}
else {
printf("%d\n", i);
}
}
return (0);
}
    • good
    • 0

サンプルプログラムがそろって来ましたので、ベンチマークをとってみました。


0m59.097s apple_cube さん
1m16.190s mac_res
1m24.564s yama3092 さん
2m12.244s yaemon_2006 さん

for (j = 0; j < 1000000; j++) {
ここにプログラムを書く
}

と各プログラムを1000000回繰り返したものをtimeコマンドで計測しました。
コンパイラーはgcc version 4.2.1 (Debian 4.2.1-3)
-O2を付けてコンパイルしました。
ヒューマンリーダビリティーと実行速度は、相関性がないのが興味深いです。
apple_cube さん第一位おめでとうございます。
    • good
    • 0

 if文を使わずに、



#include <stdio.h>

int main(void)
{
int sw, i;
char str[][16] = {"", "Fizz", "Buzz", "FizzBuzz"};

for (i = 1; i <= 100; i++) {
sw = ((i % 3) == 0);
sw |= (((i % 5) == 0) << 1);
sprintf(str[0], "%d", i);
printf("%s\n", str[sw]);
}
return (0);
}
 
    • good
    • 0

if文を使わないと言う手もありますね。

見やすいかどうかは既に趣味の世界ですが。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
#include <stdio.h>

#define Fizz 1
#define Buzz 2
int
main(void)
{
int sw, i;


for (i = 1; i <= 100; i++) {
sw = (i % 3) ? 0 : Fizz;
sw |= (i % 5) ? 0 : Buzz;
switch (sw) {
case Fizz:
printf("Fizz");
break;
case Buzz:
printf("Buzz");
break;
case (Fizz | Buzz):
printf("FizzBuzz");
break;
default:
printf("%d", i);
}
printf("\n");
}
return (0);
}
    • good
    • 0

#1のzwiです。


いや、十分にプログラムの基本は理解されてます。
ただ、#5で回答された方の答えはシンプルですが、apple_cubeさんは複雑に書きすぎですね。常にシンプルで他の人が見て簡単に分かる書き方を心がけましょう。
1行のif文で何が何でも条件判断しようって方が間違いです。それはメンテナンス性の低い悪い書き方だと理解してください。複雑な条件文を書けることがプログラマの優秀さではありません。

ポインタの理解を深めるのに役に立つそうな本というと、最近ポインタだけで本も出てますが、「Cの絵本」なんてどうでしょう?
http://www.amazon.co.jp/C%E3%81%AE%E7%B5%B5%E6%9 …

他の方もかかれてますが、プログラムは数をこなす事が理解につながります。授業外でどんどんプログラムを組んでみてはどうでしょうか?
何か興味があるテーマでプログラムを組むのが良いのですが、ゲームとか音とか何かありませんか?

最後に苦Cを紹介しておきます。
http://homepage3.nifty.com/mmgames/c_guide/
ここの練習問題をクリアできると自信がある程度付くと思いますよ。
    • good
    • 0

>自分でプログラミングをしていて困ってしまうのは、


>主に条件分岐が複雑になってしまうときと、
>文字列の操作(ポインタ?)です。

簡単なものまで「複雑」と、してしまっていませんか。
例えば No1回答者さんの「Fizz-Buzz問題」で、私は以下のとおり作ってみました。

#include <stdio.h>
voidmain()
{
inti, iSw;

for( i = 1; i <= 100; i++ ){

iSw = 0;

if( 0 == ( i % 3 ) ){ // 3の倍数か
iSw = 1;
printf( "Fizz" );
}
if( 0 == ( i % 5 ) ){ // 5の倍数か
iSw = 1;
printf( "Buzz" );
}
if( 0 == iSw )printf( "%3d", i );

printf( "\n" );
}
}
条件をひとつずつクリアしていく、簡単ですよね。
(else文を使うと、「複雑」になります。極力使わない工夫をした方が・・・)

文字列の操作については、2次元変数にしろ、3次元変数にしろ、それはカセットテープに音楽が記録されるように「一直線」であると考えれば・・簡単かな。

「出来ません」なんて言わず、楽しくプログラミングしましょう。
「困ってしまうのは」なんて言わず、「うん、新種のなぞなぞだな」という感覚で。
    • good
    • 0

条件分岐に関しては、いきなりプログラムを書かずにきちんと設計してからプログラムを書いたほうがいいと思います。


頭の中だけで構成せずに、きちんとフローチャートなどに書いたほうがいいでしょう。
文字列に関しては、自分は数をこなして慣れた記憶しかないので、「数こなせ」としかアドバイスできないです。
プログラムにも、ある程度定型文のようなものが存在します。
それらが身についてくると、スピードも上がってくると思いますよ。
    • good
    • 0

情報科ですと、おそらくは一日中PCにかじりっつきの学生も


いらっしゃるでしょうね。
そのぐらいプログラミングに入れ込んでないと授業と宿題だけで
プログラミングを身に着けるのは難しいかもしれません。

私もプログラムは得意ではないですが、ある日気づいたことは
「画面に向かって作るより、紙の上で考えろ」
でした。
パソコンの画面は狭いし、本を見ながらだったりすると
結構疲れるので、ノートの上で考えるようにしました。
プログラム用ノートは一行おきに書きます。修正するときは空白の行に書き込むんです。だんだん煮詰まってきたら理解ができてきた証拠で、「これはこっちだな、これはやめよう」など。矢印とか打ち消し線がたくさん書き込まれてきます。
そうしたら、一度整理してプログラムらしく書き直します。
この時点までくれば、かなり自信がつきます。

どういうふうに組み立てていったのかが削除されずに紙の上に残るのですから、「そういえばあれはどうやったんだっけ?」と思ったらプログラミングノートを見直せばいいんです。
    • good
    • 0

どの程度理解できているか質問しますので答えてみてください。



「Fizz-Buzz問題」
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
これを参考書やWEBサイトを見ずに問題を見た瞬間から何分でプログラムできますか?
時間とそのプログラムを書いてください。
(1)2分以内
(2)10分以内
(3)30分以内
(4)できない。

「C言語のプログラムの流れの基本制御構造を動画で見せる学習ソフト」
というソフトがあります。
http://www.vector.co.jp/soft/win95/edu/se165337. …
動かしてみて、自分でどこまで理解できているか確認してみてください。
ポインタ以前の基礎知識なので、とりあえず全て理解している必要があります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!!
(2)3分くらいかかりました。
#include <stdio.h>

int main(void){

int i;

for (i=1 ; i<=100 ; i++){
if (((i % 3) == 0) && ((i % 5) != 0)){
printf("Fizz\n");
}
else if(((i % 3) != 0) && ((i % 5) == 0)){
printf("Buzz\n");
}
else if(((i % 3) == 0) && ((i % 5) == 0)){
printf("FizzBuzz\n");
}
else{
printf("%d\n", i);
}
}

return 0;
}

ソフトはこれから見てみます!

お礼日時:2007/10/20 12:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!