20

ほら、私は独学で C++ を習得しました (完全ではないので、まだ先延ばしにしています ---)。それで、今私は大学に入学し、彼らは C を教えていて、4 つの整数を入力するプログラムを作らせて、それらの最大値と最小値を教えなければなりませんでした。簡単ですよね?

問題は、私はすでに関数と配列をよく理解しているということです。はい、これを配列でプログラムできます。問題ありません。しかし、これは最初のラボだったので、まだ「学習」していないので、それらのどれも使用できません。

これは私がそこに書いたものです(どういうわけか間違っているように感じます)。

#include<stdio.h>

int main(void)
{
    int first, second, third, fourth;
    printf("Enter four integers (separated by space): ");
    scanf("%d %d %d %d", &first, &second, &third, &fourth);

    if((first>second) && (first>third) && (first>fourth))
        printf("\nFirst number is largest");
    else if((second>first) && (second>third) && (second>fourth))
        printf("\nSecond number is largest");
    else if((third>second) && (third>first) && (third>fourth))
        printf("\nThird number is largest");
    else if((fourth>second) && (fourth>third) && (fourth>first))
        printf("\nFourth number is largest");

    if((first<second) && (first<third) && (first<fourth))
        printf("\nFirst number is smallest");
    else if((second<first) && (second<third) && (second<fourth))
        printf("\nSecond number is smallest");
    else if((third<second) && (third<first) && (third<fourth))
        printf("\nThird number is smallest");
    else if((fourth<second) && (fourth<third) && (fourth<first))
        printf("\nFourth number is smallest");

    printf("\n"); 
    return 0;
}

ご覧のとおり、長すぎて退屈で複雑です。しかし、今のところ、クラスで取り上げたのはループ意思決定ステートメントだけです。これを行うよりエレガントな方法はありますか?より少ないifsを使用するもの?これに何か問題があるわけではありませんが、改善される可能性があります。

PS これは正確には「宿題」などではありません。私はプログラムを作成しましたが、それをより良くするために何ができたかを知り、より良いプログラミング手法を学びたいと思っていました.

4

19 に答える 19

28

OPの条件によると

しかし、今のところ、クラスで取り上げたのはループ意思決定ステートメントだけです。これを行うよりエレガントな方法はありますか?より少ないifsを使用するもの?

ifこのタスクを実行できるのは、1つのelse ifステートメントと 1 つのforループのみです。シンプルで時短!

#include <stdio.h>

int main()
{
    int num, max, min;

    printf ("Enter four numbers: ");
    scanf ("%d", &num);
    max = min = num;

    for (int i = 0; i < 3; i++)
    { 
        scanf ("%d", &num);
        if (max < num)
            max = num;
        else if (min > num)
            min = num;
    }

    printf ("The smallest and largest of given four numbers are %d and %d respectively.\n", min,  max);
    return 0;
}
于 2013-10-05T16:31:00.920 に答える
13

「手動」マージソートを実行するか、その2番目のビットだけを実行します。

概念的には、マージソートは次のように機能します

  1. ソートされていないリストを、それぞれが 1 つの要素を含む n 個のサブリストに分割します (1 つの要素のリストはソート済みと見なされます)。
  2. 残りのサブリストが 1 つになるまで、サブリストを繰り返しマージして新しいサブリストを生成します。これがソートされたリストになります。

マージ ソート マージ ステップの図

コード:

int a = 5, b=4, c=7, d=9;
int min_ab, min_cd, min;
min_ab = a < b ? a : b;
min_cd = c < d ? c : d;
min = min_ab < min_cd ? min_ab : min_cd;
printf("%d", min);

..そして同様に最大。

必要に応じて、三項演算子を次のように展開できますif (a < b) { min_ab = a; } else { min_ab = b; }(読みやすくするために複数行に広げます)。

マージソートの複雑さはであるため、多くてもsO(n*log(n))が必要です(マージソートに関するウィキペディアの記事を参照してください)。ウィキペディアによると、「...これらはすべて比較ソートであるため、平均または最悪のケースで O(n log n) よりも優れたパフォーマンスを発揮することはできません」( source )。最小数のs..他のアルゴリズムのいずれかを手動で実行するとsが少なくなるかどうかを確認することはできますが;-)。O(n*log(n)) ififif

于 2013-10-05T15:50:43.650 に答える
10

このようなことを試してください

int main(void) {
    int a=-2,b=-3,c=-4,d=-5;
    int max=a,min=a;

    if(b>max){
        max=b;
    }else if(b<min){
        min=b;
    }
    if(c>max){
        max=c;
    }else if(c<min){
        min=c;
    }
    if(d>max){
        max=d;
    }else if(d<min){
        min=d;
    }
    printf("max: %d min : %d",max,min);
    return 0;
}

デモ

于 2013-10-05T15:44:50.943 に答える
9

最大と最小を同時に見つけることを要求する教室の問題の要点は、各比較から最大の価値のある情報を抽出することを教えることです.

たとえば、それが真実であることがわかっている場合、その 1 回の比較から、それはもはや最小の候補ではなく、最小のものを見つけるための比較に参加するべきではないa > bことに気付くはずです。a同時に、それbはもはや最大の候補ではないことを認識する必要があります。4 つの数値、2 つのテストa > bc > dは、数値を 2 つの独立したクラス (最大の候補 2 つと最小の候補 2 つ) に明確に分けています。残りは簡単です。

言い換えれば、全体の考え方は、最小値と最大値の両方を見つけるタスクをさらに進めるために、各比較によって提供される情報を使用して、極値を並行して見つけることです。

if (first > second) { 
  int t = first; first = second; second = t; 
}

if (third > fourth) { 
  int t = third; third = fourth; fourth = t; 
}

/* Now 'first' and 'third' are candidates for the smallest,
   while 'second' and 'fourth' are candidates for the largest */

int min = first < third ? first : third;
int max = second > fourth ? second : fourth;

ご覧のとおり、両方の数値を見つけるのに必要な比較は 4 回だけです。

上記のコードは、最小と最大値を提供しますが、各値を提供した数値の元の「インデックス」を示していないことに注意してください。本当に必要かどうかはすぐにはわかりません。あなたの質問のテキストはそれについて何も述べていませんが、提供したコードサンプルはそれを実装しています。いずれにせよ、上記のコードを更新して数字の出所を「追跡」することは難しくありません。

于 2013-10-05T16:03:02.890 に答える
5

数字がa、b、c、dであることを考えると、これは簡単すぎる:

#define min(a,b)  ((a) < (b) ? (a) : (b))
#define max(a,b)  ((a) > (b) ? (a) : (b))
biggest  = max (max(a,b), max(c,d))
smallest = min (min(a,b), min(c,d))

ほら、if文も関数もありません(ただし、後者は私が聞いた中で最もばかげており、熟練者の要件に有害です)。

于 2013-10-05T15:42:54.653 に答える
2

これを試して

int max_of_four(int a,int b,int c,int d){
    int max=a;
    if(b>max) max=b;
    if(c>max) max=c;
    if(d>max) max=d;
    return max;
}

なしの場合はこのようになります

int max_of_four(int a, int b, int c, int d) {
    return ((a > b && a > c && a > d) ? a: ((b > c && b > d) ? b : (c > d ? c : d)));
}
于 2018-12-28T20:25:08.133 に答える
1

1 つのアイデアは、最初の 2 つの数値の最大値と最小値を計算することです。次に、残りの数値をペアで比較します。各ペアの大きい方が現在の最大値と比較され、各ペアの小さい方が現在の最小値と比較されます。このようにして、2 つの要素ごとに 3 つの比較を行います。これは、Arpit の回答 (要素ごとに 2 つの比較) よりもわずかに効率的です。

コード内:

#include <stdio.h>

int main(int argc, char **argv) {
    int a, b, c, d;
    printf("Enter four integers (separated by space): ");
    scanf("%d %d %d %d", &a, &b, &c, &d);

    int max, min;
    if (a > b) {
       max = a;
       min = b;
    }
    else {
       max = b;
       min = a;
    }

    if (c > d) {
       if (c > max) {
          max = c;
       }
       if (d < min) {
          min = d;
       }
    }
    else {
       if (d > max) {
          max = d;
       }
       if (c < min) {
          min = c;
       }
    }
    printf("max = %d, min = %d\n", max, min);
    return 0;
}
于 2013-10-05T16:19:11.500 に答える
0

これは、if ステートメントが 4 つしかない C コードです。最大数をdの位置に移動し、最小数をaの位置に移動します。値 b と c はシーケンス内で適切に配置されていませんが、要件では最小値と最大値が要求されるため、このコードはジョブを完了します。

#include <stdio.h>


    int main() {
        int a, b, c, d, temp;
        printf("Enter four digits: ");
        scanf("%d %d %d %d", &a, &b, &c, &d);
        if ( a > b){
            temp = a; a = b ; b = temp;
        }
        if ( c > d){
            temp = c; c = d ; d = temp;
        }
        if ( b > d ){
            temp = b; b = d; d = temp;
        }
        if ( a > c){
            temp = a; a = c ; c = temp;
        }
        printf("Max %d\nMin %d\n", d, a);

        return 0;
    }
于 2016-02-18T05:09:35.417 に答える
0

ここで条件文を利用できます。

int max,max1,max2,min,min1,min2;
max = (max1 = a>b?a:b)>(max2 = c>d?c:d)?max1:max2 ;
min = (min1 = a<b?a:b)<(min2 = c<d?c:d)?min1:min2 ;
于 2020-05-30T00:01:22.830 に答える
0

for loop と if else decision statement を使用したこの回答を見ましたが、より高速に実行され、4 つの変数のみを使用すると思われるソリューションを投稿します。だからここに行く...

#include<stdio.h>
void main()
{
int a,b,c,d;
printf("Enter four numbers of your choice");
scanf("%d%d%d%d",&a,&b,&c,&d);
a>b&&a>c?a>d?printf("%d",a):printf("%d" ,d):(b>c&&b>d)?printf("%d",b):c>d?printf("%d", c):printf("%d",d);
}
于 2017-12-15T06:46:56.543 に答える