🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

C++

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

配列

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

Q&A

解決済

3回答

1587閲覧

vector配列に格納した単語に、二分探索を適用して、指定された単語を検索するプログラム

退会済みユーザー

退会済みユーザー

総合スコア0

STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

C++

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

配列

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

0グッド

0クリップ

投稿2019/11/20 02:35

編集2019/11/22 10:05

C++でテキストファイルを読みvector配列に格納した単語に、二分探索を適用して、指定された単語を検索するプログラムを作成しています.
辞書順にソートを行った後に、探索単語の受け付けと探索の実行を繰り返すループを入れたいです.探索は終了指示マーク($$)を受け付けるまで繰り返します.
コードを以下のように修正したのですが,
if (!inFile) {
cout << "入力ファイルを開けません" << endl;
return;
}
のreturnの部分に「'main': 関数が値を戻すように宣言されていますが、関数定義に 'return' ステートメントがありません」というエラーが出ます.エラーを消すには,コードをどのように修正したらよいでしょうか?
他にもおかしいところがあったら教えてください.
よろしくお願いします.

C++

1#include <iostream> 2#include <fstream> 3#include <string> 4#include <vector> 5#include <algorithm> 6using namespace std; 7 8//メイン関数 9int main() { 10 11 ifstream inFile; //入力ファイル 12 string word; //単語 13 vector<string> vector;//vector配列 14 15 //入力ファイルを開く 16 inFile.open("test.txt"); 17 18 // 入力ファイルが開けなければ終了する 19 if (!inFile) { 20 cout << "入力ファイルを開けません" << endl; 21 return; 22 } 23 24 //ファイルから単語を読み込む 25 inFile >> word; 26 27 //ファイルの末尾でなければ、以下の処理を繰り返す 28 while (!inFile.eof()) { 29 30 //単語を格納する 31 vector.push_back(word); 32 33 //新しい単語を読み込む 34 inFile >> word; 35 } 36 37 //vector配列に格納した単語を、辞書順にソートする 38 sort(vector.begin(), vector.end()); 39 40 string a; 41 42 while ("$$"==a ) { 43 cout << "探索単語?"; 44 cin >> a; 45 binary_search(vector.begin(), vector.end(), a); 46 47 if(true){ 48 cout << "存在する" << endl; 49 } 50 else { 51 cout << "存在しない" << endl; 52 } 53 } 54}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/11/20 04:10 編集

前の質問は解決しました.ありがとうございました.
cateye

2019/11/20 04:55

解決したなら、ベストアンサーを選ぶなりして問題を閉めて下さい。
guest

回答3

0

ベストアンサー

こんなんでいいかな?

C++

1#include <iostream> 2#include <fstream> 3#include <string> 4#include <vector> 5#include <algorithm> 6 7//メイン関数 8int main() { 9 using namespace std; 10 11 string word; //単語 12 vector<string> words; //単語列 13 14 //ファイルから単語を読み込む 15 { 16 ifstream inFile("test.txt"); //入力ファイル 17 // 入力ファイルが開けなければ終了する 18 if ( !inFile.is_open() ) { 19 cout << "入力ファイルを開けません" << endl; 20 return 1; 21 } 22 23 while ( inFile >> word ) { 24 //単語を格納する 25 words.push_back(word); 26 } 27 } 28 29 //vector配列に格納した単語を、辞書順にソートする 30 sort(words.begin(), words.end()); 31 32 while ( true ) { 33 cout << "探索単語?" << flush; 34 cin >> word; 35 if ( word == "$$" ) { 36 break; 37 } 38 if ( binary_search(words.begin(), words.end(), word) ) { 39 cout << "存在する" << endl; 40 } else { 41 cout << "存在しない" << endl; 42 } 43 } 44}

投稿2019/11/22 13:27

episteme

総合スコア16612

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

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

退会済みユーザー

退会済みユーザー

2019/11/22 13:44

正しく出力されました.ありがとうございました.
episteme

2019/11/22 22:03

どこの/なにが/どうダメだったか理解した?
guest

0

いろいろとやばそうな部分がありますが,とりあえず…

探索単語の受け付けと探索の実行を繰り返すループを入れたいです.探索は終了指示マーク($$)を受け付けるまで繰り返します.

この文章を読めば,

  1. ループが必要であって,
  2. そのループの内側に,「探索単語の入力処理」と「探索処理」を書く必要があり,
  3. 入力されたものが終了指示マークか否かの判定結果によってループを抜ける判定処理が必要である

ということがわかりませんか…?
少なくとも

ループ { ・探索単語の入力 ・if( 入力されたものが終了指示マークである ){ ループを抜ける } ・探索する  ・(探索した結果の情報をどうしたいのか不明ですが,表示するだとか必要な処理を行う) }

みたいな形にコードを書きましょうよ.

現在のエラーに関しては,「main()を戻り値の無い関数として書いているのにreturnで戻り値を返そうとしているのが矛盾」ということなので,
そのエラーだけを見るならば
あなたがどうしたいのか(何かを返したいのか否か)に合わせて修正すればよかろうと思うのですが,
そこだけを今ピンポイントで解消したところでプログラム自体が思ったような動きをしないでしょうから,
とりあえず上記のようにコードそのものを修正することを優先してはどうでしょうか.
その過程で今のエラーは勝手に消滅するのではないかと思います.

投稿2019/11/22 09:49

編集2019/11/22 09:52
fana

総合スコア11990

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

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

退会済みユーザー

退会済みユーザー

2019/11/22 10:09

コードを上記のように修正したのですが, if (!inFile) { cout << "入力ファイルを開けません" << endl; return; } のreturnの部分に「'main': 関数が値を戻すように宣言されていますが、関数定義に 'return' ステートメントがありません」というエラーが出ます.エラーを消すには,コードをどのように修正したらよいでしょうか? 教えてください.よろしくお願いします.
fana

2019/11/22 10:18

main()がintを返すように変えたわけですね. で,その箇所では単にreturn;とだけ書いているから「intを返すなら返せや」と言われている,と. だったら「何かてきとーな値を」返せばいいんじゃないですか? ファイルを開けない場合にあなたが返したいと思う値を. 0がいいなら return 0; だし,いやいやこの場合は-1だぜ!というなら return -1; と. (こんなことを人に聞いているようでは,二分探索がどうのとか言ってる場合ではないですぞ…)
guest

0

つ 探索( 線形探索/二分探索/STL利用)まとめ

ソースは理解して使いましょう。
main()やreturn;も直ってないし・・・
「追記」ifstream の eof を理解しないとループは正しく回らない

投稿2019/11/20 03:14

編集2019/11/20 03:28
cateye

総合スコア6851

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

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

cateye

2019/11/20 03:15

ちゃんとコンパイルしてますか?
LouiS0616

2019/11/20 04:15 編集

C99は void main() を許容しているようです。 C11ではmain関数の戻り値がintであることを暗に規定していますが、GCCでは警告を吐くだけでコンパイルは問題無くできました。(C99でも警告吐くんでちょっとあれですけど) 返り値をvoidにするのは避けるべきとは思いますが、コンパイルが通らないとは一概に言えません。
cateye

2019/11/20 04:51

了解です。 ・・・復帰値はどうなんですかね?・・・0なのかなぁ?
LouiS0616

2019/11/20 04:58

N1256には『If the return type is not compatible with int, the termination status returned to the host environment is unspecified.』って書いてありました。 未規定の動作みたいですね。
cateye

2019/11/20 05:43 編集

echo $? では判定できないですね^^; 実装依存か・・・・コマンド繋げる場合は厄介ですね。まぁ、そんな変な実装は無いでしょうけど・・・ 「An implementation shall not predefine the main function. This function shall not be overloaded. Its type shall have C ++ language linkage and it shall have a declared return type of type int, "but otherwise its type is implementation-defined."」ですね。(n4659)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問