質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • C

    3665questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3433questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

while文とif文の二分探索について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 150

xxxrrrr

score 1

__**二分探索しようとすると失敗します

配列に15個の数値を入力し、昇順にソートした後 二分探索でkeyに入力したデータが何番目にあるかを出力するプログラムを作りたいのですが、どうすればいいでしょうか。

 発生している問題・エラーメッセージ

keyが真ん中の時以外、ループを抜けて終わってしまいます。

### 該当のソースコード

lang-C

#include<stdio.h>
int main(void)
{
    int a[15],i,j,l,temp;

    for(l=0;l<15;l++)
    {
        printf("a[%d]=",l);
        scanf("%d",&a[l]);
    }
    for(i=0;i<15;i++)
    {
        for(j=i+1;j<15;j++)
        {
            if(a[i]>a[j])
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
    }

    printf("\n");
    int m;
    for(m=0;m<15;m++)
    {
        printf("a[%d]=%d\n",m,a[m]);
    }

    printf("\n");
    int key,low,high,mid;
    printf("key=");
    scanf("%d",&key);
    low=0;
    high=14;


/*恐らくこの下が間違っているのだと思います*/
    while(low<high)
    {
        mid=(low+high)/2;

            if(key==a[mid])
             {
                printf("目的データ:No.%d",mid);
                return 0;
            }
            else if(key<a[mid])
            {
                high=mid-1;
            }
            else if(key>a[mid])
            {
                low=mid+1;
            }
    }

    printf("目的データが見つかりません");
return 0;
}

 試したこと

C言語を始めたばかりなのでそもそもアルゴリズムが間違っているかもしれないです。
何度か不等号や変数を変えましたができませんでした。

昇順にしたら、きちんとできました!!!
ミスの見逃しですね。これからもさらに勉強してミスを減らしていきたいです。

ベストアンサー以外の回答者様や指摘をしてくれた方、ありがとうございました!

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2018/06/30 13:20

    コードは https://teratail.com/help#about-markdown の[コードを入力]を使ってください。

    キャンセル

  • xxxrrrr

    2018/06/30 13:31

    すみません。初投稿なのでミスりました。編集します。

    キャンセル

回答 2

checkベストアンサー

0

ソートの部分ですが、降順にしてませんか?ソートした後に中身を確認すると良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/30 13:22

    あ!降順にしてました!
    ありがとうございます!
    昇順にして試してみます。
    もしできなければ、この質問をもう一度昇順で編集します。

    キャンセル

  • 2018/06/30 13:39

    もう一度試したら
    できました!!!!
    ありがとうございます。

    キャンセル

0

高速探索 データは昇順にソートされている必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/30 13:34

    ご指摘ありがとうございます。
    昇順にしましたが、
    データがあるのに出力せずにループを抜けてしまいます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    ./a.outが出来なくなった

    いつもお世話になっています。emacsを使って、C言語でプログラミングをしていたら、急に./a.outを押してもプログラムが実行できなくなりました。どのようにすれば、実行できますか

  • 受付中

    C:大きな数の計算方法,オーバーフロー回避

    C言語で3^80の計算をしたいのですが、数が大きすぎてオーバーフローしてしまいます。各桁ごとに配列を置けばいいのかとも思いましたが、いまいちよくわかりません。 解決方法が分かる方

  • 解決済

    C言語の線型散策(逐次散策)

    C言語の線型散策(逐次散策)の質問です。 以下の演習がうまく行きません。 ご教授ください。 【要素数nの配列v内のkeyと等しい全要素の添字を配列idxに格納する関数searc

  • 解決済

    AOJの問題。2行目に、指定された数のデータを一度にinputする方法がわからない。

    前提・実現したいこと 只今、PCKに向けてAOJを頑張っている高専生です。 言語はCを使っています。 そこで質問なのですが、 1行目に入力するデータ(整数)の数を提示し、 2行目に

  • 解決済

    バブルソートについて

    10個の整数を入力して、それを昇順に並べるプログラムを自分なりに作ってみたのですが、データを入力してもソートされず入力したデータそのものが返ってきてしまい、うまく機能しません。どの

  • 受付中

    プログラムを見やすく改良したい

    正常に動くプルグラムを見やすく改良したい。 具体的に教えていただければありがたいです。セグメンテーションフォルトでベスト7まで表示して停止します。173行あたりだと思うのですが、よ

  • 解決済

    文字型ポインタの配列について[C]

    #include <stdio.h> #include <string.h> int main(void) { char *key[] = {"一,二,三,四,五,六,七

  • 解決済

    C言語: 文字型ポインタの配列

    #include <string.h> int main(void) { int a=0,b=0,c=0; int max = 100; int min

同じタグがついた質問を見る

  • C

    3665questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3433questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。