• ベストアンサー

C言語のプログラム作成について

●2つの整数a,bを入力し、aがbより大きいとき、aとbを入れ替える場合、どのようなプログラムを作成すればよいのでしょうか? ●aとbを入れ替えるには、入れ替え作業用の領域tempを使い、次の処理を行う。 a→temp, b→a, temp→b 【プログラム作成例】 a =>10 a=>10 b =>5 b=>20 a=5 b=10 a=10 b=20 上記のような問題の解答は下記のようになるのですが、下記以外の解答方法はありませんでしょうか? C言語に詳しい方、解答の方よろしくお願いします! #include <stdio.h> main() { int a,b,temp; /* データの入力 */ printf("a=>"); scanf("%d",&a); printf("b=>"); scanf("%d",&b); /* a>bのときにデータを入れ替える */ if(a>b){ temp = a; a = b; b = temp; } printf("a=%d b=%d\n",a, b); return (0); }

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

  • ベストアンサー
  • maku_x
  • ベストアンサー率44% (164/371)
回答No.1

この課題ですと、hamasaki-- さんが書かれたコードが最もシンプルな書き方になります。プロの世界では、最もシンプルで効率の良い書き方が最も良い(お金がかからない)とされています。(但し、効率を求めて複雑なコードを書く場合はあります) なので、それ以上どのようなコードが書けるか、と言うことは通常追求しません。ちょっと趣向を変え、敢えて難しく書く方法を考えてみます。 ----------------------------- (方法1) ・a>b のとき、aとbを入れ替えるならば、a<b すなわち、a には小さいほうの数が、b には大きいほうの数が入る。2つの数のうち小さいほうを得るマクロ min() と大きいほうを得るマクロ max() を3項演算子によって実現します。 : (前略) : #define min(a,b) ((a)<(b) ? (a) : (b)) #define max(a,b) ((a)>(b) ? (a) : (b)) : (中略) : int a, b, temp_a, temp_b; : (中略) : temp_a = a; temp_b = b; a = min(temp_a, temp_b); b = max(temp_a, temp_b); : (後略) : ----------------------------- (方法2) ・考え方は(方法1)と同じですが、2つの数を配列に入れ、昇順に並び替える方法で実現します。並び替えには、C言語の標準関数である qsort() 関数を使用します。qsort() の動作原理は、(参考URL)を参照してください。 : (前略) : #include <stdlib.h> /* クイックソート関数から呼び出される比較関数の宣言 */ int comp_sub(int *a, int *b); : (中略) : int a, b, array[2]; : (中略) : array[0] = a; array[1] = b; qsort(array, 2, sizeof(int), comp_sub); a = array[0]; b = array[1]; : (中略) : /* クイックソート関数から呼び出される比較関数の実体 */ int comp_sub(int *a, int *b) { if (*a == *b) { return (0); } else if (*a < *b) { return (-1); } else { return (1); } } ----------------------------- (こちらから逆質問) 学校が出す課題としたら、異様なほどシンプルですね。hamasaki-- さんがプログラミングに興味があり、独学で勉強しようと思われたのでしょうか? また、最近の学生さんは C言語より Java言語を勉強すると聞きます。それなのに敢えて C言語を選ばれたのには、何か訳があるのでしょうか?

参考URL:
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

●aとbを入れ替えるには、入れ替え作業用の領域tempを使い、次の処理を行う。 a→temp, b→a, temp→b ↑の条件でしたらほとんどの人が if(a>b){ temp = a; a = b; b = temp; } と書くでしょうね これ以外には考えつきません

回答No.2

   a, bが必ず別の変数であるなら、 #include <stdio.h> int main(void) { int a = 2, b = 3; printf("a = %d, b = %d\n", a, b); a = a + b; b = a - b; a = a - b; printf("a = %d, b = %d\n", a, b); return 0; }  

関連するQ&A

  • C言語の問題

    2つの整数a,bを入力し、aがbより大きいとき、aとbを入れ替えるプログラムを作成しなさい。 【ヒント】aとbを入れ替えるには、入れ替え作業用の領域tempを使い、次の処理を行う。 a→temp, b→a, temp→b a =>10 a=>10 b =>5 b=>20 a=5 b=10 a=10 b=20 上記のような問題の解答は下記のようになるのですが、下記以外の解答方法はありませんでしょうか? 図々しいのは承知の上、C言語に詳しい方、解答の方よろしくお願いします! #include <stdio.h> main() { int a,b,temp; /* データの入力 */ printf("a=>"); scanf("%d",&a); printf("b=>"); scanf("%d",&b); /* a>bのときにデータを入れ替える */ if(a>b){ temp = a; a = b; b = temp; } printf("a=%d b=%d\n",a, b); return (0); }

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }

  • C言語 %表示

    二つの整数値を読み込んで、前者が後者の何%かを表示するプログラムを作成したいです。 #include<stdio.h> int main(void){ int no1,no2; printf("整数を入力してください。\n"); printf("整数A:"); scanf("%d",&no1); printf("整数B:"); scanf("%d",&no2); printf("Aの値はBの値の%f%%です。\n",(double)(no1/no2)); } Aの値はBの値の0.0000%です。となってしまいます。 上記のプログラムの訂正をお願いします。

  • c言語のプログラムについて

    今年からC言語を始めた大学1年生です。レポートで四則計算を行うプログラムを6/19までに作らないといけないです。使えるのは今までに習った選択型、反復型、関数scanfです。このプログラムの留意点は次の4つです。 1.使う演算を選択してもらう   例えば   どんな演算をしますか? 1:+,2:-,3:*,4:/ (選択) 2.演算を行う数値を入力してもらう   例えば   a + b の計算をします。aを入力してください。 3.演算結果を表示する   ○+○の答えは ○です 4.計算終了か、それともほかの演算を行うか 決める   0:計算終了 1:他の計算を行う を選択してください  以下のプログラムはこのことを留意してプログラムをつくりました。どこがおかしいのでしょうか。 #include<stdio.h> main() { short a,b,m,n; long c,d,e,f; c = a + b; d = a - b; e = a * b; f = a / b; m = 1; printf("整数を入力してください:"); scanf("%d",&a); printf("どんな演算をしますか?:"); printf("1: +,2: -,3: ×,4: ÷ :"); scanf("%d",&n); while(m=1){ if(n<=4){ while(m=1){ switch (n<=4){ case 1: printf("整数を入力してください:"); scanf("%d",&b); printf("%d + %d = %d \n",a,b,c); break; case 2: printf("整数を入力してください:"); scanf("%d",&b); printf("%d - %d = %d \n",a,b,d); break; case 3: printf("整数を入力してください:"); scanf("%d",&b); printf("%d × %d = %d \n",a,b,e); break; case 4: printf("整数を入力してください:"); scanf("%d",&b); printf("%d ÷ %d = %d \n",a,b,f); break; } } } else { printf("計算できません。"); printf("演算をやり直してください。\n:"); } } printf("計算を終了しますか、それとも他の計算を行いますか?:"); printf("0:計算終了,1:他の計算を行う:"); scanf("%d",&m); printf("計算を終了します。\n"); } 提出期限があるのでなるべく早めのご回答待ってます。生意気言ってすいません。

  • C言語について

    「条件演算子(a?b:c)を使って、三つの整数値を読み込んで、その最小値を求めて表示するプログラムを作成せよ」という問題を初心者なりに自分で以下のように解いてみたのですが、もっと簡単に表示できるプログラムがあれば教えてください。 #include<stdio.h> int main(void) { int na,nb,nc,min; printf("整数1:"); scanf("%d",&na); printf("整数2:"); scanf("%d",&nb); printf("整数3:"); scanf("%d",&nc); (na<nb)?min=na:min=nb; printf("最小値は%dです。\n",(nc<min)?min=nc:min); return 0; }

  • c言語のプログラムで

    c言語で 2つの整数を読み込んで小さいほうの数以上で大きいほうの数以下の整数をすべて加えた値を表示するプログラム で最後の表示の仕方がわかりません。 実行結果は 整数1:37 整数2:28 28以上37以下の全整数は325です。と表示されるはずです。 この表示の3行目の28と37の表示がどうやればよいのかわかりません。 #include <stdio.h> int main(void) { int a, b; int sum=0; printf("整数1:"); scanf("%d",&a); printf("整数2:"); scanf("%d",&b); if(a>b) do{ sum=sum+b; b=b+1; }while(b<=a); else do{ sum=sum+a; a=a+1; }while(a<=b); printf("%d以上%d以下の全整数の和は%dです。",a,b,sum); return(0); } 全整数の表示はできます。 do文の中でa=cとかにしてやってみましたが、うまくいきませんでした。 お願いします。

  • c言語について

    C言語で、二つの整数値を読み込んで、前者の値が後者の何%であるかを実数で表示するプログラムを作成しようとして以下のコードを書きました。 #include <stdio.h> int main(void) { int n1, n2 ; puts("二つの整数を入力してください。") ; printf("整数A : \n") ; scanf("%d" , &n1) ; printf("整数B : \n") ; scanf("%d" , &n2) ; printf("Aの値はBの%f%%です。\n" , (double)(n1 / n2) * 100) ; return 0 ; } 上記コードを実行すると、0.000000%のような結果になります。 そこで、最後のキャスト演算子を使用した後の式で(n1 / n2) * 100がまずいのかなと考え、n1 / n2 * 100にしたら上手くいきました。 なぜ、上記コードだと上手くいかないんでしょうか?

  • C言語の課題で困っています。その1.四則演算

    二つの整数値を読み込んで、前者を後者で割り、その結果の商と余りを表示するプログラムを作成。 実行例にあるよう、ゼロで割るような場合への対処も考慮する。 実行例1: 整数の除算を行います。整数を入力してください。 整数A:13 整数B:5 13 ÷ 5 = 2 あまり 3 実行例2: 整数の除算を行います。整数を入力してください。 整数A:10 整数B:0 0でわることはできません! (注)プログラム実行時にキーボードからどんな整数を入力してもいいように作成すること。 という課題に取り組んでいますが、途中までしか記述できません。 どなたか助けてください。 下記が途中までの記述です。 /*二つの整数値を読み込んで、前者を後者で割り、その結果の商と余りを表示*/ #include <stdio.h> int main(void) { int na, nb; printf("shimasaki kazunori \n"); puts("整数の除算を行います。整数を入力してください。: \n"); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("na ÷ nb = %d あまり %d \n", na / nb, nb, na % nb); return(0); }

  • C言語の問題です

    整数xを入力し、xが正か負かゼロかを判定し、表示するプログラムを作成する問題です。 【ヒント】x > 0 が成立するときは正。 x < 0 が成立するときは負。正でも負でもないときはゼロ。 整数x => 2    整数x => -2    整数x => 0 2 は正です -2は負です 0はゼロです 上記の解答は下記の通りなのですが、下記以外の解答方法を教えてはいただけないでしょうか? プログラミングに詳しい方よろしくお願いいたします。 #include <stdio.h> main() { int x; printf("整数x=> "); scanf("%d",&x); if (x > 0) { printf ("%d は正です\n",x); } else if (x < 0) { printf ("%d は負です\n",x); } else { printf ("%d はゼロです\n",x); } return (0); }

  • C言語によるプログラミング

    【問題】 三角形の底辺bと高さhを入力し、面積areaを計算して、次のように表示するプログラムを作りなさい。 底辺=> 10 高さ=> 5 面積 = 25 上記のような問題の解答は下記のようになるのですが、下記以外の解答方法はありませんでしょうか? 図々しいのは承知の上、C言語に詳しい方、解答の方よろしくお願いします! #include <stdio.h> main() { int b, h, area; printf ("底辺 => "); scanf ("%d",&b); printf ("高さ => "); scanf ("%d",&h); area = b * h / 2; printf ("面積 = %d\n",area); return (0); }