• ベストアンサー

C言語では0は・・・

shin_nosukの回答

  • ベストアンサー
回答No.9

#7 です。 禅問答みたいなので最後にしますが、以下について、 >>> もし負の値を入力されたら、というときに-1でいいのか0なのか。 >>0 をどちらに含めるかです。 これはちょっと誤解を招く表現でした。失礼しました。 たとえば、 if ( a > 0 ) { (真) printf("a は正の数です."); }else { (偽) printf("a は負の数です."); } というのは厳密には間違いで、 if ( a > 0 ) { (真) printf("a は正の数です."); } else { (偽) printf("a は 0 か負の数です."); } が正しい。 ここで、正の数のときは真、負の数は偽になるが、0 は偽になるから負に含まれているようにみえるという、条件の真偽と、数の正負の区別ができていないことが疑問の発端のようにみえたので、このような表現をしました。 >>> -1にすると負の値として扱っているように見えるのですが、実際のところどうなんでしょうか >>扱っていません。 >>a = 0 のとき、 ( a < -1 ) は 偽です。 >ということはif(a < -1){正} else { 偽 } の場合 >偽のほうにいくということでしょうか? は、 > if ( a < -1 ) { (1) } else { (2) } > であるときは、 > 実際のところ、(2)を通ります。 と書いたとおりです。 「負の値を入力した場合、という条件」の正解についてご執心のようですが、 >むむ、ということはif(a<=0)かif(a>=0)にすると負の値を入力した場合、という 誤解を招いて申し訳なかったですが、両方なりません。 前者は a が 0 以下(a が 負と 0 )のとき真で、後者は、a が 0以上(a が 正 と 0 )のとき真、という条件で、0 が入ってしまっているので、もはや、正負とかの問題じゃなくなってしまう。 負の値は、0 より小さい数。これは定義だから、「負の値を入力した場合、という条件」は ( a < 0 ) で 正解です。 で。 この定義とプログラムの挙動のつじつまがあわないのであれば、if の条件よりも、その前後のコードや、実装の方法に問題があるんじゃないかと思います。だから、 > -1にすると負の値として扱っているように見えるのですが、 という疑問に至ったコードを示してもらえれば、エキスパートのみなさんも答えやすいと思いますよ。:-)    

izupawapuro
質問者

補足

一応No.9さんをベストアンサーにしておきたいと思いますが エキスパートの人用にコードを書いておきます 昔のファイルから引っこ抜いてきたので間違ってるかもしれません・・・ ****問題**** main()関数で10個のintの要素を持つ配列xを宣言する。 x[9]には-1を入れておく。 配列xにはforループを用いて、scanfで最大9個の値を読み込む。 (すなわちx[9]には決して値を入れない。) ただし、負の値が入力されたら、その値(負の値)を 配列xに入れて、ループを終了し、関数kosuu()を呼ぶ。 関数kosuu()には引数としてxを渡す。 関数kosuu()は、与えられた配列に負の値が現れるまでに、何個 の要素があったかを返す関数である。 たとえば、3 4 1 -1であれば、3個あるとしてとして3を返す。 main()関数では、関数kosuu()から返された値を画面に出力する。 #include <stdio.h> int kosuu(int []); int main() { int x[10],a; x[9] = -1; for(a=0;a<9;a++){ scanf("%d",&x[a]); if(x[a]<-1){ x[0]=x[a]; break; } } kosuu(x); return 0; } int kosuu(int x[]) { int b=0; int c; for(c=0;c<9;c++){ } if(x[c]>0){ b = b+1; } printf("%d\n",b); return b; }

関連するQ&A

  • C言語のプログラムの質問です

    C言語で負の値が入力されたときに処理を終了する条件でキーボードから繰り返し入力するためにはどのようなプログラムにしたらいいですか? (FOR文を使い、FOR文の繰り返し条件を入れないで繰り返す)

  • C言語の問題

    C言語の問題ができません。 誰か教えてください。 「複数の人の平均年齢を求めるプログラムを作成せよ。最後の人の年齢を入力した後には、負の数を入力するものと約束する。for構文を用いて各人の年齢の読み込みと加算を順次行ない、負の数が入力されたらこれを判定条件としてforループを抜け平均年齢を求めるプログラムにせよ。」 このような問題です。なるべく早くどなたか回答してもらえるととても助かります。

  • C言語 プログラミング

    C言語初心者です。 以下の点を踏まえて、 2次方程式ax^2+bx+c=0の解が実数であるかどうか判定するプログラムを教えてください!お願いいたします。 ・if文を組み合わせる ・判別式D=b^2-4acを使う ・係数abcは実数として入力する ・aが0の場合などすべての場合を網羅している 例 a=0,b=0,c=1の場合、解は存在しない

  • 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言語とC++言語

    C言語でコンパイルできC++でコンパイルできないプログラムとその逆でC++でコンパイルできC言語でコンパイルできないプログラムを教えてください。よろしく

  • C言語で%を使わない余りの出し方

    c言語で%を使わない余りの出し方の問題を出されたのですが、色々考えたのですが全くわかりません まず余りの限界(余りがどこまであるか)がどこまであるか。 そしてwhileかforを使って余りを出す方法を自分で考えたのですが全くできませんでした。 自分の中ではif文でaを余りとして(a==1 && a==2)など考えたりしました。 またこれはポインタも使わずavgr**なども使いません。 さらに発展した問題で if文、switch文、for文、while文を使わないで余りを出すというのが出てきました 情けないのですが、何かアドバイスがあれば教えていただきたいと思います

  • C言語プログラミングで困っています。助けて下さい。

    C言語プログラミングで困っています。助けて下さい。 課題1-1: 実数 a と実数 b を入力すると、一次方程式ax + b = 0 の解を求めるプログラムを作る 課題1-2: 1-1 で作成したプログラムについて、さらにa として1が入力されたとき、方程式の表示       部分が1x + 3 = 0ではなくx + 3 = 0となるようにせよ 課題1-3: 1-2 で作成したプログラムについて、さらにb として0 や負の数が入力されたとき、方程式     の表示部分が2x = 0 や2x – 3 = 0となるようにせよ 課題1-4: 1-3 で作ったプログラムについて、さらにa の値として0が入力された場合、「解けません」     と表示するようにせよ 課題1-5: 係数 a, b, c を入力すると、 2次方程式ax2 + bx + c =0の解を表示するプログラムを作     れ ※ 1-2 ~ 1-4 のような機能を盛り込む ※ a が0の場合には、先に作った1次方程式のプログラムが動く という問題です。最終的にこれらを一つのプログラムにしてください。判別式や解の公式、ルート√などを使ってよろしくお願いします。C言語でお願いします

  • 2進数の足し算(C言語)

    C言語初学者です。 タイトル通り、2進数の足し算をするプログラムを作っていますが、行き詰ってしまいました。 特に、桁上げをどうするか悩んでいます。 今の自分の考えでは、入力された数値を10で割り、その余りを足していけばできると思っていたのですが、やはり桁上げや繰り上がりに悩んでいます。 全然できてませんが以下ソースです。 #include <stdio.h> int main(void) { int a, b, i; do { printf("8桁以下の非負の2進数を入力してください(1つ目): "); scanf("%d" ,&a); if (a < 0) puts("負の数を入力しないでください。"); } while (a < 0); do { printf("8桁以下の非負の2進数を入力してください(2つ目): "); scanf("%d" ,&b); if (b < 0) puts("負の数を入力しないでください。"); } while (b < 0); a = a % 10; b = b % 10; よろしくお願いします。

  • C言語における定数の使用方法

    こんにちは。 今日質問したいのは、タイトルにありますように、C言語における「定数」の使い方についてです。 私は現在、Visual C++を用いてC言語のプログラミングを勉強しているのですが、条件文(if文)に定数を用いてコーディングを行おうとしても、どうしてもエラー表示が出て、うまくコンパイルすることができません。 具体的には、 if(No>=1 && No<=10){ //具体的な処理部分 } というif文を、予めヘッダファイル内にて定義した定数 #define start 1; #define stop 10; を用いて次のように、 if(No>=start && No<=stop){ //具体的な処理部分 } コーディングしたいと考えています。 しかし、これをコンパイルするとエラーが発生してしまいどうにもうまくいきません。 また、定数ではなく数字で記述するとうまく回ります。 別のところで定数を、 wk = start; のように代入で使用しているのですが、そこではなにも問題がありません。 いったい何が間違っているのか、どのようにすればうまくいくのかを教えていただきたいと考え、書き込ませていただきました。 皆様、どうぞよろしくお願いします。

  • C言語の初歩的な問題です。

    現在C言語の入力の部分を勉強しているのですが 数字の入力をもらってから、それが数字じゃない場合 もう一度入力を受けるようなものを作りたいのですが、 うまく数字なのか文字なのかが判定できなくてこまっています。 どうすればいいのでしょうか? int n; int flag = 0; do{ printf("value:"); scanf("%d",&n); if(入力された値が数字であった場合) { flag = 1; } }while(flag == 0);