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

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

新規登録して質問してみよう
ただいま回答率
85.35%
標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

1314閲覧

整数配列の中に整数5の配列の添字を出力したい

Ryuji_T

総合スコア6

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/05/10 08:25

編集2020/05/10 12:59

whileを使った探索です。昇順に整数を入力し、その中で5の位置(配列の添字)を出力したいのですが、うまく行きません。5が存在しない場合はー1を出力させるのですが、自分のプログラムだと5を入力してもー1が出てきます。main関数内が間違っていると思うのですが、どのように治せばいいのでしょうか。(初歩的なミスだと思います。。。)

#理想の実行結果
入力 1 2 3 4 5
出力 4

C++

1#include <iostream> 2#include <vector> 3using namespace std; 4 5int binary_search(vector<int>& numbers, int target, int low, int high){ 6 while(true){ 7 if(low>high) 8 return -1; 9 int mid=(low+high)/2; 10 if(numbers[mid]==target) 11 return mid; 12 if(numbers[mid]<target) 13 low=mid+1; 14 else 15 high=mid-1; 16 } 17} 18 19int binary_search(vector<int>& numbers, int target){ 20 return binary_search(numbers, target, 0, numbers.size()-1); 21} 22 23int main(void){ 24 vector<int> numbers; 25 int nums=0; 26 cin >> nums; 27 int idx=binary_search(numbers,5); 28 if (idx>=0) 29 cout << numbers[idx] << endl; 30 else 31 cout << "-1" << endl; 32 return 0; 33} 34

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/05/10 08:46 編集

1.入力した数値(nums)は何処に格納するのですか? 2.数値(int)を入力くして、数字'5'を探しているのは何故でしょう?
Ryuji_T

2020/05/10 09:20

1 それを考えていませんでした、、、配列を作ればいいのでしょうか。 2 課題の指示なので、特に理由はありません。
cateye

2020/05/10 09:39 編集

1.せっかく、vector使ってるんだからvectorに格納しましょう。 >課題の指示なので・・・数値を入力して文字を探すのですか? ・・・もし、そういう指示なら出題者に聞ましょう・・・“昇順に整数”とはなんですか? また。2分検索にした理由はなんでしょう? ・・・関数名ダブってるし・・・まぁ。パラメータで分けられるけど・・・ 蛇足:vectorのインデックスは'std::vector::size_type'です。
Ryuji_T

2020/05/10 09:41

Binary Searchを使って数値を入力して特定の数字の位置を出力するプログラムを作るという課題です
cateye

2020/05/10 10:09

数値と数字は違いますよ。'5'はASCIIで53(0x35)です、
Ryuji_T

2020/05/10 10:14

これは失礼しました。入力するのは「数字」でした。
cateye

2020/05/10 10:50

もう一つ、(配列の添字)と言っていますが、cout << numbers[idx] << endl;では見つかった文字を出力しています。 実行結果は添字になっていますね^^;
episteme

2020/05/10 12:14 編集

入力: 5 5 5 5 5 に対して 2を返すけど、それでいいのね?
episteme

2020/05/10 11:14

> 入力するのは「数字」でした。 数字じゃないでしょ。「数値」でしょ。
Ryuji_T

2020/05/10 12:32

会話をもう一度しっかり見直して、やっとお二方のおっしゃっていることがわかりました。「「数値」を昇順に入力して、「数値」の5の位置を探す」でした。しかし、(numbers,5)にしても結果は変わりませんでした。。。
cateye

2020/05/10 13:07 編集

“昇順に整数を入力”とありますから、入力: 5 5 5 5 5は違うのでは? ・・・最初に見つかった所、2が帰るのは間違いないです。 usr ~/Project/test % ./a.out 1 2 3 4 5 6 4 usr ~/Project/test % ./a.out 5 5 5 5 5 2
episteme

2020/05/10 13:46

> “昇順に整数を入力”とありますから、入力: 5 5 5 5 5は違うのでは? なんで? X[n] <= X[n+1] が成り立つなら昇順じゃないっけ?
cateye

2020/05/10 16:59 編集

昇順 →http://e-words.jp/w/%E6%98%87%E9%A0%86.html 残念ながら、X[n] <= X[n+1]かX[n] < X[n+1]か正確な定義は見つからなかったですが・・・ こちらは'<’を使っています→https://byjus.com/maths/ascending-order 「To represent this order of numbers, we need to use the ascending order symbol “<“」
episteme

2020/05/10 17:45 編集

X[n] < X[n+1] が昇順の必要条件だとすると 数列 1 2 3 3 4 5 6 は昇順でないことになる...直感に反するんよなー。
cateye

2020/05/10 19:16 編集

この問題では1 2 3 3 4 5 6もありだろうけど、1 2 3 4 5 5 6 はまずいと思う。 まぁ、出題者はそこまで考えてないと思うけど・・・・
guest

回答4

0

ベストアンサー

出来ましたか?

text

1usr ~/Project/test % ./a.out 21 2 3 4 5 6 34 4usr ~/Project/test % ./a.out 51 2 3 4 6 7 6-1

binary_search()は、パラメータと変数宣言以外ほとんどいじっていません。
・・・まぁ、一行でもブロックにするたちなので、{}は追加してありますが・・・
数字(char)と数値(int)に,対応しましたが分かりますか?

cpp

1#include <iostream> 2#include <vector> 3// 4using std::cin; 5using std::cout; 6using std::endl; 7// コンパイルオプション→-DSCHAR で、文字検索 8// オプション無しでint検索 9#ifdef SCHAR 10typedef char inputType; 11const char searchVal = '5'; 12#else 13typedef int inputType; 14const int searchVal = 5; 15#endif 16// 17typedef std::vector<inputType> iVec; 18// 19static size_t binary_search(iVec &numbers, inputType target) 20{ 21 size_t low = 0; 22 size_t high = numbers.size( ) - 1; 23 size_t mid; 24 // 25 while(true) { 26 if(low > high) { 27 return -1; // size_tは非負なのでwarningが出る。 28 } 29 mid = (low + high) / 2; 30 if(numbers[mid] == target) { 31 return mid; 32 } 33 if(numbers[mid] < target) { 34 low = mid + 1; 35 } else { 36 high = mid - 1; 37 } 38 } 39} 40// 41int main(void) 42{ 43 iVec numbers; 44 inputType nums; 45 // 46 while(true) { 47 cin >> nums; 48 if(cin.eof( )) { // UNIX系はCtrl+D,windowsはCtrl+Z 49 break; 50 } 51 numbers.push_back(nums); 52 } 53 // 54 int idx = int(binary_search(numbers, searchVal)); 55 cout << idx << endl; 56 // 57 return 0; 58}

投稿2020/05/16 11:12

編集2020/05/16 11:13
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryuji_T

2020/05/17 02:05

その後解説が行われ、理解しました。こちらのプログラムも参考にさせていただきます。ありがとうございます。
guest

0

なにもわざわざ自作せんでも...

C++

1#include <iostream> 2#include <vector> 3#include <iterator> 4#include <algorithm> 5 6int binary_search(const std::vector<int>& numbers, int target) { 7 auto itr = std::lower_bound(numbers.begin(), numbers.end(), 5); 8 return (itr == numbers.end() || *itr != 5) ? 9 -1 : static_cast<int>(std::distance(numbers.begin(), itr)); 10} 11 12int main(void) { 13 using namespace std; 14 vector<int> numbers = { 1, 2 ,3 ,4 ,5 }; 15 16 cout << binary_search(numbers, 5) << endl; 17}

投稿2020/05/10 11:23

編集2020/05/10 11:36
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/05/10 13:06

“Binary Searchを使って〜”が。どういった意図か分からないとなんとも言えませんね。
guest

0

vector<int> numbers;

int nums=0;
cin >> nums;

numbers に値が入っていません。

でも、それ以外も NGっぽい。

投稿2020/05/10 08:43

pepperleaf

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あんましナカミ見てませんが、

int idx=binary_search(numbers,5);

なのでは

投稿2020/05/10 08:32

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryuji_T

2020/05/10 09:20

それでも試してみましたが、同じ結果になってしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問