• 締切済み

C言語の不等号の計算

三つの整数の変数a,b,cを用意して、プログラムの各変数に任意の値を代入する 例:a=9,b=31,c=25 このプログラムを実行して 「a=9,b=31,c=25です.よって b>c>a です.」 と表示するプログラムを組みなさい とゆう課題が出されたのですが switch文を使ってプログラムを組んで課題は終わったのですが・・・ switch文以外方法でこのプログラムが組めるのか プログラムの例を教えてください。 あとプログラムを組むときにはシンプルで行数の少ないプログラムのほうがいいのですか? 教えてくださいお願いします。

みんなの回答

回答No.10

単純な if ですが、こんなのもありかと。 2つの条件を && でつなぐくらいまでだと、案外追いかけやすいですね。 if ((a > b) && (a > c))// a が最大 { if (b > c) {// a > b > c} else { // a > c > b) } else if ((b > a) && (b > c)) { if (c > a) {// b > c > a} else { // b > a > c) } else if ((c > a) && (c > b)) { if (a > b) {// c > a > b} else { // c > b > a) } else { // 等しいものが一組以上ある }

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.9

( a, b, c がすべて異なるとして) >switch文以外方法でこのプログラムが組めるのか 「ソート」の思考で作ってみました(*1)。 発展(数の増加)させることが可能です。 ただ冒頭の >三つの整数の変数a,b,cを用意して、プログラムの各変数に任意の値を代入する には反しています、結果重視ということで・・。 なお、今回は、「三つの整数」の6通りなので「switch文」を用いた方がシンプルと思います(*2)。 #7 さんの「こるなら」バージョンをヒントに、こらずにそのまんま・・。 >シンプルで行数の少ないプログラムのほうがいいのですか? 「虫」にしてみれば、住みにくい環境と思います。 注:共にインデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。 *1 ++++++++++++++++++++++++++++++++++++++ #include <stdio.h> #define KOSU 3 typedef struct{  int iRank;  int iVal;  char cName; }KADAI; KADAI sWork[ KOSU ] = {  { 0, 9, 'a' },  { 0, 31, 'b' },  { 0, 25, 'c' } }; int main() {  int i, j, k, iMax, iJun, iCnt = 0;  printf( "a=%d,b=%d,c=%dです.よって ", sWork[ 0 ].iVal, sWork[ 1 ].iVal, sWork[ 2 ].iVal );  for( i = 0; i < KOSU; i++ ){   for( j = 0; j < KOSU; j++ ){ // 最大抽出    if( sWork[ j ].iRank ) continue;    iMax = sWork[ j ].iVal;    iJun = j;    for( k = ( j + 1 ); k < KOSU; k++ ){     if( sWork[ k ].iRank ) continue;     if( sWork[ k ].iVal < iMax ) continue;     iMax = sWork[ k ].iVal;     iJun = k;    }    iCnt++;    sWork[ iJun ].iRank = 9; // 済み    printf( "%c", sWork[ iJun ].cName );    if( KOSU != iCnt ) printf( ">" );   }  }  printf( " です.\n" );  return( 1 ); } *2 ++++++++++++++++++++++++++++++++++++++ #include <stdio.h> int main() {  int a = 9, b = 31, c = 25;  printf( "a=%d,b=%d,c=%dです.よって ", a, b, c );  switch( ( a < b ) * 4 + ( b < c ) * 2 + ( c < a ) * 1 ){   case 6: printf( "c>b>a" );     break;   case 5: printf( "b>a>c" );     break;   case 4: printf( "b>c>a" );     break;   case 3: printf( "a>c>b" );     break;   case 2: printf( "c>a>b" );     break;   case 1: printf( "a>b>c" );     break;   default: printf( "?????" );  }  printf( " です.\n" );  return( 1 ); }

回答No.8

No.6 です。 確かにできていますね、switch で。 前者は、実はおぼろげには考えましが。が、この方針でできるかどうか確信が持てる前に挫折しました。 後者は……同質の判断が3つネストすると思考が止まるので、やっぱり、「私には」無理です。 でも、これがプログラムできたのなら、どちらにしても、ちょっとすごいなと。

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

こるなら switch ((a<b)*4 + (b<c)*2 + (c<a)*1) 馬鹿なら switch (a<b) なんかのネスト でできます>#6.

回答No.6

ふと思ったのですが、switch による制御で本当にできますか? 「課題」として、どのようなソースができあがったのか、非常に興味があります。 私にはできませんでした。

回答No.5

条件判断が分散すると、何をやっているのか一目でわからなくなります。 では、どういうのがシンプルかと言えば、ひとつの尺度として、以前は、 「そのコードを電話越しに言って、相手にロジックがわかるか?」というのがありまいた。 そういうことからすると、条件判断を読み替えたり、ひとつずつ片付けたりというのも 意味がある方法です。 以下のコードは、「a, b, c がすべて異なる」場合にしかうまく動きませんが。 int max; char max_name; int min; char min_name; int middle; char middle_name; // 最大値を探す max = a; max_name = 'a'; if (max < b) { max = b; max_name = 'b'; } if (max < c) { max = c; max_name = 'c'; } // 最小値を探す min = a; min_name = 'a'; if (min > b) { min = b; min_name = 'b'; } if (min > c) { min = c; min_name = 'c'; } // 中間値を探す(それは、最大でも最小でもないもの) if ((max != a) && (min != a)) { middle = a; middle_name = 'a'; } if ((max != b) && (min != b)) { middle = b; middle_mame = 'b'; } if ((max != c) && (min != c)) { middle = c; middle_name = 'c'; }

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

短くしようとするあまりに凝ったコードを書いてしまうよりは、多少冗長でもロジックが見やすいコードの方が基本的に好まれます。 とりあえず同値は考えずに作ると、ifで普通に書けばこんな感じでしょう。 printf("a = %d, b = %d, c = %dです. よって "); if(a < b) {  if(c < a)  {   printf("c < a < b");  }else{ if(b < c)   {    printf("a < b < c");   }else{    prinff("a < c < b");   } } }else{  if(c < b)  {   printf("c < b < a");  }else{   if(a < c)   {    printf("b < a < c");   }else{    printf("b < c < a");   }  } } printf("です。\n");

回答No.3

#include <stdio.h> typedef struct { char name; /* 名前 */ int value; /* 値 */ } var; void swap(var* x, var* y) { var t = *x; *x = *y; *y = t; } int main() { /* 名前と値の組をみっつ用意 */ var x, y, z; /* テキトーに代入 */ x.name = 'a'; y.name = 'b'; z.name = 'c'; x.value = 9; y.value = 31; z.value = 25; /* 名前と値を列挙 */ printf("%c=%d, %c=%d, %c=%d です ", x.name, x.value, y.name, y.value, z.name, z.value); /* 大きい順に並び替え */ if ( x.value < y.value ) swap(&x,&y); if ( y.value < z.value ) swap(&y,&z); if ( x.value < y.value ) swap(&x,&y); /* 大きい順に名前だけ列挙 */ printf("よって %c > %c > %c です\n", x.name, y.name, z.name); return 0; }

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

この仕様が与えられたときに「switch で組む」というのが理解できん. 普通は if だろ. b>c>a なら「b>c>a」と表示するとか, そんなことだよな?

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

if文や?でもできます。 if文の例 char *最大; char *中間; char *最小; if ( a > b ) {   if ( a > c ) {     最大 = "a";     if ( b > c ) {       中間 = "b";       最小 = "c";     }     else {       中間 = "c";       最小 = "a";     }   }   else {     最大 = "c";     中間 = "a":     最小 = "b";   } } 以下略 ?の例 char *最大 = ( a > b ? ( a > c ? "a" : "c") : ( b > c ? "b" : "c")); char *中間 = ( a > b ? ( b > c ? "b" : ( a > c ? "c" : "a" )) : ・・・略 char *最小 = ・・・略; >あとプログラムを組むときにはシンプルで行数の少ない 「シンプル」をどう考えるかですが、最も重要なことは 「分かり易い」ことです。if文と?はどうでしたか? あと、日本語の識別名が許されるVS2010やVBでは 私は日本語識別名を使うように心がけています。 英語やローマ字読みのアルファベットを使うよりずっと 分かり易いでしょ?

関連するQ&A

  • C言語プログラムの課題

    大学で以下のような課題が出ました。でも全然わかりません。わかる方がいらっしゃったら、是非教えてほしいです★ 1整数値123を変数iに代入して、iの値を表示するプログラムを作成せよ。 2実数値3.14159を変数xに代入して、xの値を表示するプログラムを作成せよ。 3文字型せーた'A'を変数chに代入して、chの値を表示するプログラムを作成せよ。ただし、chの値を表示する際には、%d,%x,%cの書式を用いること。 4キーボードから入力された2つの整数値i,jの値を画面に表示するプログラムを作成せよ。 5キーボードから2つの整数値を、変数in1とin2に入力して、以下の計算をした結果を画面に表示するプログラムを作成せよ。 in1+in2= in1-in2= in1*in2= in1/in2= in1%in2=

  • C言語で計算が合いません(初心者)

    C言語で計算が合いません(初心者) 簡単な計算のプログミングをしているのですが 計算が合わなくて困っています。 整数型変数aと実数型変数bを定義 整数型変数cとdを定義して、c=0.5*a*b、d=a/2*b 実数型変数eとfを定義して、e=0.5*a*b、f=a/2*b という内容のプログラムを作ったのですが a=7,b=2.4を代入してみた結果 ---------------------------- Input a>>7 Input b>>2.4 8 7 8.400000 7.200000 ---------------------------- となりました どこが間違っているのでしょう? 答えは8.4でcが8なのは有効数字のためだと思いますが dとeで答えが全く違う理由が分かりません。 下に私が書いたものを貼っています。 ---------------------------- #include<stdio.h> int main(void){ int a,c,d; double b,e,f,ans; printf("Input a>>"); scanf("%d",&a); printf("Input b>>"); scanf("%lf",&b); c=0.5*a*b; printf("%d\n",c); d=a/2*b; printf("%d\n",d); e=0.5*a*b; printf("%lf\n",e); f=a/2*b; printf("%lf\n",f); return 0; } ---------------------------- よろしくお願いします。

  • C言語についてなんですが

    プログラムの作成で分からないところがあります。 「二つの整数値を読み込み、小さいほうの数以上で大きい数以下の 整数を全て加えた値を表示するプログラムをdo文を使って 作成せよ。」 下の図のようにしたいです。 2つの整数を入力せよ。 整数A:37 整数B:28 28以上37以下の全整数の和は325です。 よろしくお願いします。

  • C++のcin命令について

     私は、C++言語を勉強している初心者です。  ある日、C++言語では、   「cin >> a >> b >> c;」と書くと、プログラムを実行したときに、   「3 4 5」と入力すれば、変数aには 3 が、変数bには 4 が、変数cには 5 が代入されるということを知りました。  けど、今まで私がC言語を使う際に使っていた、   「scanf("%d,%d,%d",&a,&b,&c);」という文では、プログラムを実行したときに、   「3,4,5」と入力すれば、変数aには 3 が、変数bには 4 が、変数cには 5 が代入されるというように、3つの数字の間にカンマを入れて数を代入するというプログラムを作りたいのですが、どうやってもcin命令では再現できません。  超初心な質問ですが、わかる方がいらっしゃったら、やり方を教えてください。

  • c言語のプログラムです

    2つの生の整数の割り算a÷bはaからbを繰り返し引いていき、引くことが出来なくなるまでの回数を商、その時の残りを剰余をすることで、引き算だけを用いて実現することができる。このことを考慮して、while文と引き算だけを用いて割り算を実現しなさい。という問題なんですけどどのようにプログラムを作っていいやらわかりません 一様ヒントはあります ・変数としては、入力する二つの整数に対応する変数m,n、商に対応する変数q、剰余に対応する変数rを使うとよいでしょう。すべて整数ですのでintで宣言する。 皆さんのご協力お願いします

  • C言語の課題

    1、整数型の変数を2個だけ使い、キーボードから5個の整数を読み込み負の整数のみの和を表示プログラムを作れ 2、1、の問題について使える変数を3個に増やしたうえでwhile文を使ったプログラムを作れ 3、1、の問題について使える変数を3個に増やしたうえfor文を使ったプログラムを作れ 1を作ろうとするとかなり長くなってしまうのです… ヒントでもいいので教えてください。

  • C言語 exitで終了した関数の戻り値

    引数が負の整数であればエラーを表示し終了、0以上の整数であればそのまま戻り値とする関数 int example(int a) { if( a < 0 ) { printf("Error!\n");   exit(1); } return(a); } があったとします。 ここでたとえば  int s1,s2; に対して、 s1 = example(3); とすれば、 s1 = 3 となりますが、 s2 = example(-5); とすれば、 s2 には何が代入されているのでしょうか? 例に書いた関数はしょーもないものですが、 もう少し難しい関数を使って変数に値を入れて、その値で後でfor文などを使って仕分けていくようにしたいのですが、エラー時に代入されるものがわからなくて困っています。 エラー時のみに目印となる値、たとえば -1 などを戻り値とすることはできません。 おねがいします。

  • C++の問題

    このプログラムを実行し、値234,453290453294をfloatとdoubleで定義した変数に代入して、画面に出力した時、どうなるか?実行結果にはどのような結果違いが発生し、なぜそうなるのかの理由を述べよ 文字変数aにbという文字、文字変数cにdという文字を代入して、変数aとcを使って、dbと出力するプログラムを作成せよ 誰かこれ助けてくれませんか

  • C言語の質問です。

    1.(a*b)/(a+b)の計算をさせたいのです。ふつうに変数は代入される方法でいいです。 #include <stdio.h> main() { double a,b S=(a*b)/(a+b) printf ("%f\n",S) } 上記のプログラムでできますか?間違いならば修正・訂正をお願いします。 2.整数の変数aに2.147.483.647をいれ、1を加えるとどうなるか? 実数の変数dに、 d=1/2とするとどうなるか? d=1.0/2とするとどうなるか? 実数の変数d1,d2,d3に対して、 d3=d1-d2を計算するとどうなるか? 出力は、「%22.16g-%22.16g=%22.16g」の書式で、d1,d2,d3を出力しましょう。 d1 | d2 0.1 | 0.01 1.0 | 1.0000000000000 (0は14個) 1.0 | 0.00000000000000001 (0は16個) 上記のようなプログラムでOKです。教えて下さい。

  • C言語で、2007年度が残り何日かを計算するプログラムは…

    2つの整数(月、日)を入力すると、2007年度があと残り何日かを計算するプログラムが書きたいのですが、できるだけif文(またはswitch文)を少なくして書きたいのですが、12こif文を使うと書けるものの、それ以下に絞ることができません。 2007年度(2007年4月1日~2008年3月31日)のみに適応できればいいので、日付をコンピュータから取得せず、入力された値だけに反応するものを書きたいです。 if文、switch文、printf文、scanf文のみで仕上げるというのが課題なのですが、他の文をつかえばできるとは思うのですが、上記のものだけで作るとなると、難しいです…、どなたか、教えていただけないでしょうか。

専門家に質問してみよう