●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);
}
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% …
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
足して100になるような乱数のア...
-
(int *)の意味
-
ラップ関数とはどんなものですか?
-
「{ } で囲むだけ」は正しい?
-
C言語 配列と関数の練習問題
-
【C++】関数ポインタの使い方
-
acceptをalarmでタイムアウトさ...
-
C言語で三目並べをするプログラ...
-
【C言語】円の面積を求めるプロ...
-
任意の文字列のアルファベット...
-
C#の質問
-
system関数がうまくいかない
-
c言語
-
if と配列の組み合わせ
-
C++でvectorにテキストファイル...
-
日数チェックプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報