• ベストアンサー

C言語初心者です。

大学に入ってからC言語を授業で習い始めました。なので、すごい初歩的なことですが丁寧に教えてくださると嬉しいです。いくつか分からないことがあるので教えてください。   1・よくprintf("");なので%dや%fを使いますが、これはint(整数)の時が%dで、double(小数点付)の時に%fを使えばいいのか。 2・mul(呼び出す)、return(戻る)の意味、使い方 3・if(aaaa%4==0){ if(aaaa%100!=0)printf("閏年である。\n"); else{if(aaaa%400==0)printf("閏年である。\n"); else printf("閏年ではない。\n"); の意味は、もしaaaaが4で割り切れ、100で割り切れなかったら閏年で、そうではなく100で割り切れ400で割り切れたら閏年である。という意味でいいのか。 4・andとor,whileの使い方が分からない。 5・授業でやったことなのですが、 # include<studio.h>  int passWordInput(); main(){    int a, pw=1234, a=passWordInput(); if(a==pw)printf("ok\n"); else{a=passWordInput(); if(a==pw)printf("ok\n"); else{a=passWordInput(); if(a==pw)printf("ok\n"); else printf("Byw!!\n"); } } } int passWordInput(){ int wk; printf("パスワード:");scanf("%d",&wk); return wk; } がよく分かりませんでした。特にwkが出てくるあたりからです。 一応全て自分なりに本とか見てみましたが、あまり理解出来なかったので詳しい回答をしてくださると嬉しいです。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

大学でC言語を勉強しているのでしたら、言語仕様がわかるようなリファレンス本を購入して手元に置くことをお勧めします。 ちなみに、私は 内田智史,他3名共著:「C言語によるプログラミング スーパーリファレンス編」,オーム社, 2000 を手元に置いて参照しています。 > 1・よくprintf("");なので%dや%fを使いますが、これはint(整数)の時が%dで、double(小数点付)の時に%fを使えばいいのか。 %d で intを扱い、%fでdoubleまたはfloatを扱う、というイメージで結構です。もっと丁寧な説明は、ここを参照してください。 http://www9.plala.or.jp/sgwr-t/c/sec05.html > 2・mul(呼び出す)、return(戻る)の意味、使い方 mul というキーワード(予約語)はありません。何かの勘違いではありませんか? return は、それを含む関数の実行をそこで終わらせて、制御を呼び出し元に返します。 > 3・if(aaaa%4==0){ (以下略) さらに、「100で割り切れ、400で割り切れなかったらうるう年ではない。」という意味も含まれています。 > 4・andとor,whileの使い方が分からない。 C言語に and と or というキーワードはありません。論理式で使いたいのであれば、and(論理積) は && 、or(論理和) は || を使います。 while は繰り返し制御を行うときに使います。例えば、 a=0; while( 3 > a ){ printf("a=%d\n",a); a++; } と書けば、a の値が3より小さい間だけ while の{ } で囲まれた中身が繰り返し実行されます。この例では a++(a=a+1と同じ)が3回繰り返された時点でa=3となるため、3 > a が成り立たなくなり、while のループから抜けます。 > 5・授業でやったことなのですが、 このプログラム全体が何をしようとしているかは、わかりますね? わからないのは関数の作り方ですか? それとも、scanf ですか? 関数int passWordInput()の中で使用している int wk; の wk は暫定的に値を入れておくだけの変数です。work(作業用変数)という意味で wk という名前になっているだけです。 return が何かは先ほど説明したとおりで、ここではこの関数から抜けるときに、この関数が wk の値を返します。言い換えれば、main関数のなかのa=passWordInput();で、aに先ほどscanfで取り込んだwk の値が入ります。 異常の説明でまだ不明確なところがあれば、また質問してください。

riko2005
質問者

補足

回答ありがとうございます。やっぱり手元に本があった方がいいですか。今度本屋さんでInterestさんの勧めてくださった本もあわせて見てみます。 5の質問ですが、プログラム全体が何をしようとしているのかは分かります。分からないのは、関数の作り方です。説明不足ですみませんでした。

その他の回答 (4)

noname#11920
noname#11920
回答No.5

printfで使用する%dや%fには、桁数や精度、符号部分の空白を出力するか、など色々あるので、一度きちんと調べることをお奨めします。 ところで、%dや%fはscanfでも同じ意味を持っています。 ですから、関数passWordInputの中の scanf("%d", &wk); は、キーボードで入力した数値を変数wkに格納しているのです。 wkの前にある'&'は変数のアドレスを取得するもので、 この辺りはポインタを勉強しないと分からないので、 今は「おまじない」と思ってください。 それで、関数passWordInputは所謂パスワードのような、 "abcde"のような文字列の入力を受け付けるものではありません。 C言語での文字列比較はある関数を使う必要があり、 それによる混乱を避けるために数値を「パスワード」としているのでしょうが、 逆に混乱させているような気がします。

riko2005
質問者

お礼

回答してくださりありがとうございます。分かりやすく自分が疑問になっていた部分が解決されました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

既に概ね回答が出揃っているようですので、andとorについてだけ解答します。 andやorは<iso646.h>ヘッダで定義されるマクロです。andは&&に、orは||に定義されます。ちなみにビット単位での論理積・論理和は、bitand, bitorというマクロになります。なお、これらのマクロはC++では同じ意味の予約語になっています。

riko2005
質問者

お礼

回答ありがとうございます。根本的な意味が分かってよかったです。

  • meek
  • ベストアンサー率40% (2/5)
回答No.3

1.その通りです。%fはdoubleだけではなくfloatのときにも使います。 double型をscanfで読み込むときは%fではなく%lfなので注意してください。 2. mul(呼び出す)というのは、関数の呼び出しのことだと思います。あらかじめ用意されている関数や、自分で作った関数を使用する場合、「関数名(引数)」といった形で書きます。 return(戻る)というのは、戻り値のことだと思います。 これはわかりにくいかもしれませんが、関数を実行した後に、returnで指定された値を、その関数を呼び出した関数に返します。 3. 括弧の対応がわかりません。if文やfor文などを書く時は、開き括弧だけでなく閉じ括弧の方もきちんと書くようにしてください。 括弧の位置や、括弧を書くか書かないかでは全然違う意味になることもあります。 閏年の話のようなので、恐らく if(aaaa%4==0){ if(aaaa%100!=0) printf("閏年である。\n"); else { if(aaaa%400==0) printf("閏年である。\n"); else printf("閏年ではない。\n"); } } だと思います。以下は↑の表記が正しいとした上での話です。これは、 ・aaaaが4で割り切れ、かつ100で割り切れないときに閏年である。 ・もしくは、aaaaが4で割り切れ、かつ400で割り切れれば閏年である。 ・aaaaが4で割り切れ、かつ上二つ以外の条件では閏年ではない。(つまり100で割り切れ、400で割り切れなかったら閏年ではない) という意味です。 4. andとorというのは論理演算のことだと思います。 これは、計算結果が1(真)か0(偽)のどちらかしかない計算で、whileやif文等で分岐条件を指定するときに良く使います。 andの場合、(条件式1) && (条件式2) (C言語ではandを&&と表記します)と書くと、条件式1と条件式2が成り立つときに、1(真)となります。 or(C言語では||と表記)の場合は、条件式1か条件式2のどちらかが成り立つ場合、真となります。 論理演算自体の意味がわからないのでしたら、検索エンジンで「論理演算とは」あたりのキーワードで検索すると山ほど見つかると思いますので、そちらを参考にしてください。 while(){}は、()内の条件が成り立つ間、{}の中に書かれている内容を繰り返す文です。 5. このプログラムでは、2で説明した関数呼び出しと戻り値を使用していますね。 a=passWordInput(); で、関数passWordInput()を呼び出しています。 こうすることで、int passWordInput() の{}内に書かれている文を実行します。 passWordInput()では、scanfでパスワードを読み込んでいます(読み込んだ値はwkに入る) で、return wk;とすることで、passWordinput()がmain()に戻り値(wk)を返します。 この場合、 a=passWordInput(); としているので、aに戻り値(wkの値)が入ります。 その下からのif文では、pwとaが一致しているかどうかを比較しています。 一見ややこしいように見えますが、 ・aとpwが一致したらokを出力して終了し、一致しない場合、もう一度 a=passWordInput(); を実行する。 ・再度aとpwを比較し、一致したらokを出力して終了する。 ・それでも一致しない場合、更にもう一度 a=passWordInput(); を実行し、またまたaとpwを比較し、一致したらokを出力して終了し、そうでない場合はByw!!を出力して終了する。 という意味です。 長くなりましたが参考になれば。

riko2005
質問者

お礼

お礼が遅くなりましてすみません。とても分かりやすい回答でした。今まで括弧をフィーリングでつけていたので今度からはちゃんと対応するようにつけていきます。C言語は難しいですが、興味はあるのでこれからも頑張って勉強していきたいです。回答ありがとうございました。

  • keikan
  • ベストアンサー率42% (75/176)
回答No.2

1.はそんなかんじ。 2.は関数の基本的なところかな。 Cは関数の集まりでできている。 通常まずmain()が呼び出され、その中で他の関数を必要により呼び出していく。 5.を参考にすれば int passWordInput(){ int wk; printf("パスワード:");scanf("%d",&wk); return wk; } の部分が関数の宣言の部分。 でこれをmain()関数のなかで、 a=passWordInput(); などとして呼び出している。 passWordInput()関数の中で return wk;として戻り値wkを返していいる。 よってa=passWordInput();でその結果がaに代入されている。 あとは#1さん参照^^;;

riko2005
質問者

お礼

ありがとうございます。これからテスト期間に入ってC言語のテストが危ないので回答を下さって本当に助かりました。

関連するQ&A

  • C言語習いはじめです

    大学の講義でC言語を習い始めたのですが、if文でコンパイルするとどうしても解決できないエラーが起こってしまいます。 文の意味は 「4で割り切れる年は”閏年”また、400でも割り切れる年も”閏年”と表示する。100で割り切れる年は”平年”と表示する」 というものです。値は2100で指定しています。 #include <stdio.h> main() { int y; printf(" y=2100; "); { if(y%400:0) { printf("a leap year \n"); {/* 閏年 */} } else if(y%100:0) { printf("a common year \n"); {/* 平年 */} } else if(y%40:0) { printf("a leap year \n"); {/* 閏年 */} } else { printf("a common year \n"); {/* 平年 */} } } return 0; } これをコンパイルすると、どうしても 「エラー E2377 ”ファイル名” 5: If文に ) がない(関数 main)」 と出てきてしまいます。 残るこのエラーだけが解決できません。どなたか、間違っている点がわかる方はいませんでしょうか。お願いします。

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • C言語

    #include <stdio.h> int main(void) { int a=0,ans1,ans2,ans3,ans4; printf("整数を入力してください。\n"); scanf("%d",a); ans1 = a+7; ans2 = a*;8 ans3 = a%3; ans4 = a*(-1); printf("%d\n",ans1); printf("%d\n",ans2); printf("%d\n",ans3); if(a==15){ prntf("true\n",a); } else{ printf("false\n",a); } if(a != 8){ printf("true\n",a); } else{ printf("false\n",a); } if(a <= 3){ printf("true\n",a); } else{ printf("false\n",a); } printf("%d\n",ans4); if(a<2||7<a){ printf("true\n",a); } else{ printf("false\n",a); } return 0; } これを実行しようとしてもexeファイルになりません。 教えていただけませんか?

  • C言語初心者です。

    #include <stdio.h> int main() { int b[100]; int i, n; int a, r, data; int count=0; printf("Please input two integers:"); fflush(0); scanf("%d %d", &a, &r); if(a<=0 || r<=1){ printf("Error\n"); } else{ for(n=0; b[n]<=80.0; n++){ if(n==0){ b[0]=0; count++; } else { for(i=0; i<=n-1; i++){ data*=r; } b[n]=a*data; printf("%d ", b[n]); count++; } } printf("\n"); for(; count>0; count--){ printf("%d ", b[count]); } } return 0; } windows8でeclipseを使ってC言語を書いてます。 eclipse上だと何もエラーが表示されてないのですが、実行し、 Please input two integers: と表示された後、適当な数字2つを入力しても何も反応しません。 稚拙な質問ですいません。どなたか原因を教えてください。

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • 私はC言語を習い始めて5日の初心者です。

    私はC言語を習い始めて5日の初心者です。 下記のプログラムが動かないので優しく教えてください。 どうかお願いします。 #include <stdio.h> int main() { int ans1,ans; int total printf("コンビニ行くときは(1:車で 2:自転車で 3:歩いて)行く\n"); scanf("%d",&ans1); printf("1:汗かいた記憶がない 2:たまに汗かく 3:よく汗をかく\n"); scanf("%d",&ans2); total=ans1+ans2; if (total<4) { printf("運動不足です\n"); }else { printf("良く運動していますね\n"); } return(0); }

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をどなたかフローチャートに直してください JIS規格のものでお願いします

  • c言語で

    c言語で /*a==bのとき商と余を求めるそれ以外は積を求める*/ # include<stdio.h> main () { int a,b,seki,sho,joyo; printf("aとbを入力してください\n"); scanf("%d %d", &a,&b); if(a==b) printf("sho=%d\n",(a/b)); printf("joyo=%d\n",(a%b)); else printf("seki=%d\n",(a*b)); return(0); } はどこがおかしいでしょうか? あと /*小数点*/ # include<stdio,h> main () { float a,b,seki,sho,joyo; printf("%f %f",&a,&b); if(a>b) printf("sho=%f4.3\n",(a/b)); printf("joyo=%f4.3\n",(a%b)); else printf("seki=%f4.3\n",(a*b)); return (0) にいたってはエラーの嵐なのですがどうすればいいでしょうか

  • c言語 プログラミング(初心者)

    解を判定するプログラミングを作成したのですが、a,b,cを0,1,2と入力したときに解に0.00000が出てきて解がおかしくなります。 どなたか詳しい方教えてください。また簡潔にできる点などありましたらご指摘お願いします。 #include <stdio.h> #include <math.h> int main (void) { double a,b,c,d,x1,x2; printf("ax^2+bx+c=0 の係数を入力してください\n"); scanf("%lf %lf %lf",&a,&b,&c ); if(a==0){ if(b==0) { printf("解は存在しません\n"); } else { x1=-c/b; printf("解は %f です\n",x1); } } else { d=b*b-4*a*c; if(d>=0){ x1=(-b+sqrt(d))/(2.0*a); x2=(-b-sqrt(d))/(2.0*a); if(d==0){ printf("解は %f (重解)です\n",x1); } else { printf("解は %f と %f です\n",x1,x2); } } else { printf("実数解は存在しません(虚数解)\n"); } } return 0; }

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をフローチャートに直したいのですがいまいち方法が解りません、どなたか詳しい回答お願いします JIS規格のものでお願いします

専門家に質問してみよう