• ベストアンサー

C言語の演算子!=の使い方で質問です。

if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o) 上記は間違いです。 変数a~nが同じじゃなければとしたいのです。 ご指導お願いします。

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

  • ベストアンサー
  • rays1103
  • ベストアンサー率39% (13/33)
回答No.13

配列に入れ直せば簡単ですね。 下のはインデントは全角スペースです。 int x[15] x[0] = a; x[1] = b; x[2] = c; .... x[14] = o; int check = 0; for(int i = 0;i < 14;i++)  for(int j = i+1;j < 15;j++){   if(x[i] == x[j]){    check = 1;    break;   }  } } こんな感じでcheck=0なら全部値が違う、check=1なら同じ値ありです。

その他の回答 (14)

  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.15

template<typename T> class IsnotExistSame_t { public:  IsnotExistSame_t(const T& value)  {   m_values.insert(value);   m_detectedSame = false;  }  IsnotExistSame_t& operator()(const T& value)  {   if( !m_detectedSame )   {    if( m_values.find( value ) != m_values.end() )    {     m_detectedSame = true;    }    else    {     m_values.insert( value );    }   }   return *this;  }  operator bool(void) const  {   return !m_detectedSame;  } private:  std::set<T> m_values;  bool m_detectedSame; }; template<typename T> IsnotExistSame_t<T> IsnotExistSame(const T& value) { return IsnotExistSame_t<T>(value); } if( IsnotExistSame(a)(b)(c)(d)(e) .... ) こんなんでどうでしょうか。

回答No.14

C++の範囲だけど、この前、STL の set を使う方法を教えてもらった。 本質的には、No.12 であげられている > ・一つずつ、リストに昇順または降順になるように挿入する→同じのが見つかったら失敗して終了 ですが。 #include <iostream> #include <set> int main() { int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o; std::set<int> forCheck; // a - o に何か計算結果を入れる if( forCheck.insert(a).second && forCheck.insert(b).second && forCheck.insert(c).second && forCheck.insert(d).second && forCheck.insert(e).second && forCheck.insert(f).second && forCheck.insert(g).second && forCheck.insert(h).second && forCheck.insert(i).second && forCheck.insert(j).second && forCheck.insert(k).second && forCheck.insert(l).second && forCheck.insert(m).second && forCheck.insert(n).second && forCheck.insert(o).second ) std::cout << "全部違う"; else std::cout << "同じのがある"; return 0; }

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.12

まずは、配列を使えるように勉強するのが最初ですね。 こんな式、例え期待通りに動作するとしても、面倒だし打ち間違いしそうだし、自分では作りたくないです。 出てないアイディアとしては ・ソートする→前後が等しくないことだけチェックすればよい ・一つずつ、リストに昇順または降順になるように挿入する→同じのが見つかったら失敗して終了 ・前のつづきで1~15だったら、 int check[15+1]={0} ;とでもして用意した、中身が0の配列で、 check[a] += 1; check[b] += 1; .... とやって、check[?]>=1 だったら重複あり で、これらを int isUniq(int ia,int ib,...) { 上のような判定 return 判定結果,1なら重複無し } みたいに関数にして if( isUniq(a,b,c,...) ) { 重複しないときの処理 } みたいにすると、ちょっとは見易くなる。

  • neko1963
  • ベストアンサー率49% (127/258)
回答No.11

>#.7 それがわかっているのなら、 比較結果に等しい場合だけロジックを分ける事もできるでしょ。 どちらにしてもスマートでは無いですけどね。 変数a~nでは簡潔な記述はできないですね。

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.10

a~o 全てが同じ値でないとしたいのなら単純に書くとこうなります if( (a != b) && (a != c) && (a != d) && (a != e) && (a != f) && (a != g) && (a != h) && (a != i) && (a != j) && (a != k) && (a != l) && (a != m) && (a != n) && (a != o) && (b != c) && (b != d) && (b != e) && (b != f) && (b != g) && (b != h) && (b != i) && (b != j) && (b != k) && (b != l) && (b != m) && (b != n) && (b != o) && (c != d) && (c != e) && (c != f) && (c != g) && (c != h) && (c != i) && (c != j) && (c != k) && (c != l) && (c != m) && (c != n) && (c != o) && (d != e) && (d != f) && (d != g) && (d != h) && (d != i) && (d != j) && (d != k) && (d != l) && (d != m) && (d != n) && (d != o) && (e != f) && (e != g) && (e != h) && (e != i) && (e != j) && (e != k) && (e != l) && (e != m) && (e != n) && (e != o) && (f != g) && (f != h) && (f != i) && (f != j) && (f != k) && (f != l) && (f != m) && (f != n) && (f != o) && (g != h) && (g != i) && (g != j) && (g != k) && (g != l) && (g != m) && (g != n) && (g != o) && (h != i) && (h != j) && (h != k) && (h != l) && (h != m) && (h != n) && (h != o) && (i != j) && (i != k) && (i != l) && (i != m) && (i != n) && (i != o) && (j != k) && (j != l) && (j != m) && (j != n) && (j != o) && (k != l) && (k != m) && (k != n) && (k != o) && (l != m) && (l != n) && (l != o) && (m != n) && (m != o) && (n != o) ){ }

回答No.9

> 変数a~nが同じじゃなければとしたいのです。 o は仲間はずれで良いのだろうか? a, b, c ..... o にこだわるなら、 static int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o; に対して、 { int *array[] = {&a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &k, &l, &m, &n, &o, 0}; int ix; int iy; int s = 1; for(ix = 0; array[ix + 1]; ix++) for(iy = ix +1; array[iy]; iy++) { s *= (*array[ix] - *array[iy]); if (s) s = 1; } if (s) { // あれこれ } }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

C の比較演算子・等値演算子はすべて 0 または 1 の値を返します>#7. したがって, a == b == c の値は ・c が 0 なら !(a == b) つまり a != b と同じ ・c が 1 なら a == b と同じ ・どちらでもなければ a や b の値に無関係に必ず 0 です. ちなみに a != b != c だと ・c が 0 なら a != b と同じ ・c が 1 なら !(a != b) つまり a == b と同じ ・どちらでもなければ a や b の値に無関係に必ず 1 となります... おぉ, (c == c == c) == (c != c != c) とやると c == 0 || c == 1 と同じ意味なのか....

回答No.7

>#6 演算子の結合規則が分かっていないようですね。間違いを教えてもらっては困ります。 あなたの実行結果がそれらしくみえる(のかな?)のは、たまたまです。 a == b == c と書かれている場合 (a == b) == c と解釈されます。つまりaとbの比較結果をさらにcと比較します。比較結果は0または非0(通常1)なので全て1だと たまたま全一致という結果になります。すべて2だと別の結果になります。つまりあなたが思っている動作と異なります。 a~oが全て同じ値であるかを判定したかったら #5 で書かれているようにaとb~oをすべて比較して論理積(&&)を とる必要があります。

  • neko1963
  • ベストアンサー率49% (127/258)
回答No.6

スマートな書き方では無いですが、改めて実行結果を提示します。 int main() { int a, b, c, d, e, f, g, h, i, j, k, l, m, n; a = 1; b = 1 ; c = 1; d = 1; e = 1; f = 1; g = 1; h = 1 ; i = 1; j = 1; k = 1; l = 1; m = 1; n = 1 ; if(!(a == b == c == d == e == f == g == h == i == j == k == l == m == n)) { printf( "すべて同じ値\n" ); } a = 2; b = 1 ; c = 1; d = 1; e = 1; f = 1; g = 1; h = 1 ; i = 1; j = 1; k = 1; l = 1; m = 1; n = 1 ; if(!(a == b == c == d == e == f == g == h == i == j == k == l == m == n)) { printf( "aだけ異なる\n" ); } a = 2; b = 3 ; c = 1; d = 1; e = 1; f = 1; g = 1; h = 1 ; i = 1; j = 1; k = 1; l = 1; m = 1; n = 1 ; if(!(a == b == c == d == e == f == g == h == i == j == k == l == m == n)) { printf( "aとbだけ異なる\n" ); } return 0; } ※上記の実行結果 aだけ異なる aとbだけ異なる

noname#140082
noname#140082
回答No.5

文章で書けば、aとb~nを比較すればいいと思います。 if(!(a==b && a==c && ・・・ こんな感じでできると思います。

関連するQ&A

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • エクセルの使い方についてお教えください。

    エクセルの使い方についてお教えください。 例えば、 a | b | f c | g | j d | h | k | m e | i | l | n | o | のように、右肩下がりになっている列を、 a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | のように一列にまとめる方法は無いでしょうか? 何卒よろしくお願いいたします。

  • エクセル 条件に当てはまるセルの値を返す方法

    こんにちは、よろしくお願いします。   D   E   F   G   H   I ・・・・・N    O  1 北海道 東京 愛知 大阪 京都  沖縄  2  1   2   3   4   5   6        愛知  3  2   3   6   5   1   4        北海道    4  4   2   3   1   5   6        東京   5  2   3   6   5   1   4        京都  6  1   2   3   4   5   6        北海道 となっている表があります。(本来はMまで地名が入っています) この時にNに該当の数字を入れたいのです。 具体的にはN2に3、N3に2、N4に2となっていきます。 =IF(O2=$D$1,D2,IF(O2=$E$1,E2,IF(O2=$F$1,F2,IF(O2=$G$1,G2, IF(O2=$H$1,H2,IF(O2=$I$1,I2,IF(O2=$J$1,J2,IF(O2=$K$1,K2,(O2=$L$1,L2))))))))) とやってみたのですが、やたら長くスマートではない上に、これ以降が エラーになって入力できなくなってしまいました。 良い方法を知っていればご教授下さい。 お願いします。 mac OS10.5 excel2004を使用しています。

  • C言語でのFFTについて

    http://tsuyu.cocolog-nifty.com/blog/2007/03/publi.html に掲載されているVBAのFFTプログラムをC言語に書き換えて 実行しているのですがうまくいきません。 どこが、間違っているか教えてください。 ======以下FFTのサブルーチンソースコード===== void FFT(float Xr[], float Xi[]) { i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0; n=DN; m = log10(n)/log10(2); Table(c,s); l=n,h=1; for(g=1;g<=m;g++){ l/=2,k=0; for(q=1;q<=h;q++){ p=0; for(i=k;i<=l+k-1;i++){ j=i+l; a=Xr[i]-Xr[j], b=Xi[i]-Xi[j]; Xr[i] = Xr[i] + Xr[j], Xi[i] = Xi[i] + Xi[j]; if(p==0){ Xr[j]=a,Xi[j]=b; }else{ Xr[j] = a * c[p] + b * s[p], Xi[j] = b * c[p] - a * s[p]; } p+=h; } k+=l+l; } h+=h; } j=n/2; for(i=1;i<=n-1;i++){ k=n; if(j<i){ //ビットリバース swap(&Xr[i],&Xr[j]); swap(&Xi[i],&Xi[j]); } k=k/2; while(j>=k){ j=j-k; k /=2; } j = j + k; } }

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

    C言語についての質問です。 このプログラムの前半にある A[N][N]={{1,0,0},{0,1,0},{0,0,1}} b[N]={4,5,3} という行列の成分をキーボードから入力するようにする にはどうすればいいでしょうか。 for や scanf や printf を使って、変えてくれないでしょうか。 #include <stdio.h> #include <math.h> /* gauss33.c */ #define N 3 main(){ double A[N][N]={{1,0,0},{0,1,0},{0,0,1}}; double b[N]={4,5,3}; double Aa[N][N]; double x[N], bb[N], e[N]; int n=N; int i, j, k; double akk, aik, s; /* input original coefficients */ /* save original coefficients */ for(i=0; i<n; i++){ for(j=0; j<n; j++){ Aa[i][j]=A[i][j]; } bb[i]=b[i]; } /* forward operation */ for(k=0; k<n-1; k++){ akk=1/A[k][k]; for (i=k+1; i<n; i++){ aik=-A[i][k]*akk; for (j=k+1; j<n; j++){ A[i][j]+=aik*A[k][j]; } b[i]+=aik*b[k]; } for(j=k+1; j<n; j++){ A[k][j]*=akk; } b[k]*=akk; } /* backward operation */ x[n-1]=b[n-1]/A[n-1][n-1]; for(k=n-2; k>=0; k--){ s=0.0; for (j=k+1; j<n; j++){ s+=A[k][j]*x[j]; } x[k]=b[k]-s; } /* chek */ for(i=0; i<n; i++){ s=0.0; for(j=0; j<n; j++){ s+=Aa[i][j]*x[j];} e[i]=s-bb[i]; printf("\nx(%d)=%f error=%f\n",i, x[i], e[i]); } }

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

    C言語のプログラミングで質問です. 時間を測ろうと下記のようなプログラムをしてみましたが計測時間がoTime, nTime共に0.000になってしまいます.(winmm.libはリンクさせてます) おかしいところはどこでしょうか? #include<stdio.h> #include<time.h> #include<windows.h> #include<mmsystem.h> #include<stdlib.h> #define N 2048 #define M 32 int main(int argc, char* argv[]) {   int i, j, k, l;   float target = 0;   float* a;   float* b;   float c;   DWORD nTime, oTime;     a = (float*)malloc(sizeof(float)*N);   b = (float*)malloc(sizeof(float)*N);   c = 0;   for(i = 0; i < N; i++)   {     a[i] = 1000;     b[i] = 0;   }  oTime = timeGetTime();   for(i = 0; i < M; i++)   {    for(j = 1; j < N/M; j += j)    {      for(k = 0; k < N/M; k++)      {        if(k % 2 == 0)        {          a[k+i*N/M] += a[k+j+i*N/M];        }      }    }    b[i] = a[i*N/M];    printf("%f\n", a[i*N/M]);   }   for(i = 0; i < M; i++)   {     target += b[i];   }   c = target;   nTime = timeGetTime();   printf("%f\n%f\n%f", c, oTime, nTime);   getch();   return 0; }

  • 2行のセルの入れ替え。

     初めまして、よろしくお願いします。  セルに A B C D E F G H I J K L 1 a b c d e f 2 g h i j k l 3 m n o p q r 4 s t u v w x 5 " ・ " ・ " ・ " 100 "  という表があります。これを A B C D E F G H I J K L 1 a b c d e f g h i j k l 2 m n o p q r s t u v w x 3 " 4 " 5 " ・ " ・ " ・ " 100 "  という風に、偶数行のデーターを奇数行の後ろにつけるようにしたいと思います。無理ならば奇数行だけのデーター、偶数行だけのデーターとなるように、何かよい方法を教えて頂きたく、よろしくお願いします。

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

    C言語のプログラムで質問です。 下のプログラム(最小二乗法の計算)を実行したところ -1.#IND00 というエラーが出てしまいます。 どこを直せばいいのでしょうか、教えてください。 #include <stdio.h> #include <math.h> /* gauss33.c */ #define N 3 main(){ double A[N][N],Aa[N][N]; double b[N],x[N], bb[N], e[N]; int n=N; int i, j, k; double akk, aik, s; double y[N]; double xx,yy; for(i=0;i<n;i++){ /*変数の初期化*/ x[i]=y[i]=0; for(j=0;j<n;j++) A[i][j]=0; } for(i=0;i<5;i++){ /*データ点は5点*/ printf("\n(x,y)="); scanf("%lf,%lf",&xx,&yy); A[0][0]+=xx*xx*xx*xx; /*Σx^4*/ A[0][1]+=xx*xx*xx; /*Σx^3*/ A[0][2]+=xx*xx; /*Σx^2*/ A[0][1]=A[1][0]; A[0][2]=A[1][1]=A[2][0]; A[1][2]+=xx; /*Σx*/ A[1][2]=A[2][1]; A[2][2]=n; y[0]+=xx*xx*yy; /*Σx^2y*/ y[1]+=xx*yy; /*Σxy*/ y[2]+=yy; /*Σy*/ } /* save original coefficients */ for(i=0; i<n; i++){ for(j=0; j<n; j++){ Aa[i][j]=A[i][j]; } bb[i]=b[i]; } /* forward operation */ for(k=0; k<n-1; k++){ akk=1/A[k][k]; for (i=k+1; i<n; i++){ aik=-A[i][k]*akk; for (j=k+1; j<n; j++){ A[i][j]+=aik*A[k][j]; } b[i]+=aik*b[k]; } for(j=k+1; j<n; j++){ A[k][j]*=akk; } b[k]*=akk; } /* backward operation */ x[n-1]=b[n-1]/A[n-1][n-1]; for(k=n-2; k>=0; k--){ s=0.0; for (j=k+1; j<n; j++){ s+=A[k][j]*x[j]; } x[k]=b[k]-s; } /* chek */ for(i=0; i<n; i++){ s=0.0; for(j=0; j<n; j++){ s+=Aa[i][j]*x[j];} e[i]=s-bb[i]; printf("\nx(%d)=%f error=%f\n",i, x[i], e[i]); } }

  • 列A,列Bを参照して列Cにそれに対応する文字列を表示

    列A,列B,列C 4,8,A 4,9,B 4,10,B 4,11,C 4,12,C 4,13,D 3,8,E 3,9,F 3,10,F 3,11,G 3,12,G 3,13,H 2,8,I 2,9,J 2,10,J 2,11,K 2,12,K 2,13,L 1,8,M 1,9,N 1,10,N 1,11,O 1,12,O 1,13,P 列Aに1~4,列Bに4~20の値を入れ、 列Cに、計算式で上記のような文字列を表示させたいのですが、 if関数のネストが7つまでらしく8つ以上が出来ません。 何か方法がありましたらお願いします。 =IF(AND(A2=4,B2<=08),"A" ,IF(AND(A2=4,B2<=10),"B" ,IF(AND(A2=4,B2<=12),"C" ,IF(AND(A2=4,B2>=13),"D" ,IF(AND(A2=3,B2<=08),"E" ,IF(AND(A2=3,B2<=10),"F" ,IF(AND(A2=3,B2<=12),"G" ,IF(AND(A2=3,B2>=13),"H"))))))))

  • 難解なエクセル集計の仕方を教えてください!!

    以下のように集計したいのですが、いい方法はありませんか? 解りにくいですが、宜しくお願いします!!! ------------------------ 【関係図】  (1)(2)という2つグループの関係を表しています。  組織図のようなものと思ってくださって結構です。 ■元データ 【表あ】  関係図を分解し、2つごとの関係に直したデータです。   【表い】  それぞれA-Oに対応する数字が入っています。 ■集計要望 【表あ】と【表い】ふたつのデータを元に、関係図に基づいた集計をしたい。 例: 1.Aを集計すると、Aの下位のものはすべて集計したい。(A~Gまでの集計) 2.Dを集計すると、Dの下位のみが集計されるようにしたい。(D+E+F+G) 3.Fを集計すると、Fの下位のみ集計したい。(F+G) 4. Iを集計=I+K、Jを集計=J+L+M+N+O 【関係図】  (1)A-B-C      D-E       F-G  (2)H-I-K     J-L-M       N-O 【表あ】  A ― B  B ― C  B ― D  D ― E  D ― F  F ― G  H ― I  I ― K  H ― J  J ― L  L ― M  L ― N  N ― O 【表い】 A=1 B=2 C=4 D=5 E=6 F=7 G=8 H=9 I=10 J=11 K=12 L=13 M=14 N=15 O=16

専門家に質問してみよう