• ベストアンサー

if文で「配列a[i]が小数ならば」を表現したい

if文で「配列a[i]が小数ならば」を表現したいのですが、どうしたらよいのか分かりません。 if(????){ 配列a[i]には、整数や0、そして小数が入っています。 どうぞご教授いただければ幸いです。

noname#137025
noname#137025

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

  • ベストアンサー
  • smat7
  • ベストアンサー率46% (7/15)
回答No.2

aの型がdoubleとして if(a[i] != (double)(int)a[i]){ というのが自然ではあるのですが、内部表現上の誤差でうまくいかないケースもでてくると予想されます やろうとしているケースにもよりますが小数部分がある値より小さい時という判定にしなければならないかもしれません

その他の回答 (6)

回答No.7

okweb_doctorさん、今晩は。 単に配列と書いていますが、浮動小数点型の配列ですよね。私の知りうる範囲(多分、狭い範囲だと思いますが)では、一旦、浮動小数点型に入れた後では、どうしようもないと思います。従って、入れるとき、或いはその前に何らかの付加情報が必要になりそうです。 その理由は、#2の方が仰るように浮動小数点の誤差です。 ついでに、#6 >小数って「数のうち、整数ではないもの」だよね。 は違います。数学的或いはプログラミング的には小数は実数とも言い、整数を含みます。従って、質問者の言い方も >「配列a[i]が小数ならば」 でなく、 「配列a[i]が整数でない小数ならば」が正しいでしょう。

noname#137025
質問者

お礼

私の日本ごがおかしくてご迷惑おかけしました。 5や9などではなく、2.56や0.64や12.8などの小数部分を含む数でした。 みなさまありがとうございましたm(_)m

回答No.6

#蛇足 質問者ではないが To #5さん えっと……何かおかしい? そりゃ正確には「配列aの要素a[i]が~」だが、そこは問題じゃないんでしょ? 小数って「数のうち、整数ではないもの」だよね。 0 < x < 1 は「0より大きく1未満の数」だよね。 2.3とか-0.001も小数だよね。 何が引っかかるんでしょ

回答No.5

> 「配列a[i]が小数ならば」 「少数ならば」って何ですか? (日本語が変な感じしますが)。 もしや数学的な書き方するならば 0 < a[i] < 1 のことですか? だとすると if (a[i] > 0.0 && a[i] < 1.0) { ... } でできます。

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

何をもって整数とするかにもよりますが(おかしな表現ですが、概ね誤差をどう扱うかの意味です)、標準ライブラリに下駄を預けるなら、 double i; if (modf(a[i], &i) != 0.0) {  /* 小数 */ } かと思います。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/modf.3.html
回答No.3

#include <math.h> if(fmod(a,1) != 0 ) { // 小数 } else { // 整数 } で実装出来そうです。

回答No.1

数xの小数点以下を切り捨て、xから引くとどうなる?

関連するQ&A

  • 配列やif文について

    課題がでました。 最大で30個の整数を入力し、それを大きい順に並び替えるプログラムを 1次元配列と繰り返し・if文を使い作成しなさい。 例は input 12 8 90 the large order 90 12 8 という課題がでました。 ここの方なら簡単とは思いますが、よろしくお願いいたします。 自分で作ったプログラムは #include <stdio.h> main() { int a[30]; int n; int imax; int work; int max ; int i,k; printf("seisuunokosuu(<=30)="); scanf("%d",&n); for(i=0;i<n;i++){ printf("input.%2d=",i+1); scanf("%d",&a[i]);} for(i=0;i<n;i++){ imax = i; max = a[imax]; for(k=i+1;k<=n;k++){ if(a[k] > max){ imax =k; max = a[imax]; } } work = a[i]; a[i] = a[imax]; a[imax] = work; } for(i=0;i<n;i++){ printf("%d\n",a[i]); } return(0); } ですが、繰り返し・if文(一度)をつかっていません。 アドバイスの方よろしくおねがいいたします。

  • if文の判定条件に配列

    2次元配列(ここではa[M][N]とします)の値が全て0の時にだけある文章を実行したいのですが、 if(for(i=0; i<M; i++){ for(j=0; j<N; j++) map[i][j] == 0; }){ (実行したい文) } という文をコンパイルしたところエラーが出てしまいました。 if文の判定条件中にfor文は使えないのでしょうか? 使えないのであれば、別の書き方を教えて戴けると嬉しいです。よろしくお願いします。

  • if文を使わずに小数の符号を取れるか

    if文を使わずに、値が正なら1、0なら0、負なら-1を出力する方法はありますか? if文(とできれば掛け算)を使わずに、変数a(1か-1が入る)と変数b(小数が入る)の符号が違ったらカウントを増やすプログラムを作らないといけないのですが、 変数bを1,0,-1に分けることができれば楽になると考えたのですが、 符号を取り出す関数を見つけることができませんでした。 b/fabs(b)も考えたのですが、これだとb=0の場合に0/0となるためうまくいきません。

  • Rubyで配列を使ったfor文の中に条件つきif文

    Rubyで配列を使ったfor文の中に条件付きのif文を入れてループさせたいのですが、基本的な構文が分かりません。 for i in array     if i == 9       array[i] << 'ア'     end end という雰囲気で書きたいのですが、どうしたらよいでしょうか。 i番目のループまで、配列のarrayを走査するにはどうすればよいでしょうか。 基礎的な質問ですみません。よろしくお願いします。

  • if文の中のif文・・・について

    質問させていただきます。 if文の中のif文の記述の仕方について質問があります。 例えば if ( x > 0 ){ a = b+c; if ( a > 1) d = e+f; ・・・1 if ( a < 1) d = e-f; ・・・2 if ( a = 1 ) d = 1-g; ・・・3 } h = d + i; aが1より大きい場合は、1の処理を、aが1より小さい場合は2の処理を、aが1と同じであった場合、3の処理をして最終的に、h = d + i;の式の d に代入して h を求めたいと思っているのですが、うまくゆきません。 if文の中のif文の記述はどのようにすればよいのでしょうか? よろしければご教示よろしくお願いします。

  • IF文を教えてください。

         A    B         C  1    あ   10.23       10.23 2    い   10         10.23 3    い   1.23        1.23  上記のようなシ-トがある場合 あ以外の数値を整数止めを行い、尚且つ整数一桁の場合は 下二桁表示のIF文をお教えください。 尚、エクセル2003です。

  • 浮動小数点表現

    2^{24}を32bit整数表現及び32bit(単精度)浮動小数点表現で表せ。 結果は16進数で示せ。 符号ビット:MSB 指数部n:7ビット 仮数部:24ビット という問題があるのですが、 解いてみたものの、答えもないのであっているのか分かりません。 以下の答えで合っているでしょうか? また、合っていなかったら、どのように解くのか教えていただけませんか? 整数表現 0100 0000H 浮動小数点 0100 1000 0100 0000 0000 0000 0000 0000

  • a[i]とa[i+1]を入れ替えるような関数を作成するC言語の問題

    以下のように配列aとそのサイズsとインデックスiを引数 にとり、a[i]とa[i+1]を入れ替えるような関数を作成する問題。 但し、この関数内で配列の外側をアクセスしないようにエラー チェックをすること。正常に処理が終了した場合は0を返し、 そうでない場合は-1を返すようにする。 main関数では、10個分の整数を入れる配列を宣言し、 データをユーザに入力させる。 次に、ユーザに1個整数を入力させ、0からその番号まで順に iをずらしてswap_array関数を読んだ後、配列に入っているデータを 表示させる。 ・配列にデータを入力でき、交換が正しくできている ・ユーザが配列の外側を指定した場合は、エラーである旨を 表示して終了する。 取りあえずこうゆうかんじになるのですが、//の前などをどうにすればいいか分かりません。分かる方は知恵を貸してください。 int swap_array(int a[], int s, int i) { //a[i]番目とa[i+1]番目を入れ替え処理をする //正しく交換できた場合はreturn(0); //エラーが発生した場合はreturn(-1); } int main() { //サイズ10の配列の宣言 int a[10]; //ユーザに10個のデータの入力をさせる int i; for(i=0;i<10;i++){ scanf("%d",&a[i]); } //0番目から何番目まで入れ替えるかユーザに聞く: (ユーザがnと入力) int n; ...... //繰り返し構造を使って、0番目からn番目まで隣同士を交換 for(i=0;i<=n;i++){ int v; // swap_arrayを繰り返し呼び出すが、毎回戻り値が0であることを         //チェックしてエラーが発生していないことを確かめる v=swap_array(a,10,i); // エラーが発生していたら エラーが発生したことを表示して //break;文で繰り返し構造から外にでる。 if(v==-1) break; } //エラーが発生しなかった場合に、入れ替えられた配列の内容を表示 if(v!=-1){ ..... 配列の内容を表示 } return(0);

  • 整数の表現について

    もし、数字が整数だった場合はこのA処理を もし、数字が小数点を含む数字だった場合はB処理をというようなIF文を作りたいのですが”整数” ”小数点” をどのように表現するのか解りません。 どうか教えて頂けないでしょうか。 又、違う表現等があった場合もあるのでしょうかお願します。

  • if文で困っています。

    define A 5 void main(void) int i; scanf("%d", &i); if (i <= A){ このような形をつくったのですが、if文のところで質問があります。 「数字をいくつか入力し、その入力したデータ数が5つより少ないときに・・・」というようなプログラムにしたいのですが、この場合、「入力した数値が5.0以下であるときに・・・」というプログラムになっているのではないかと、困っています。どちらが正しいのでしょうか?

専門家に質問してみよう