英単語のソートプログラムについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
緑、許さない絶対にだ

英単語のソートプログラムについて

#1

投稿記事 by 緑、許さない絶対にだ » 14年前

「一行ごとに一単語(英単語)が書かれたファイルがある。
このとき、このファイルの内容をソートとして画面上に標準出力するプログラムを作成せよ。
ファイルの行数は不定とし、また上限を定めないこと。
また、ソートは降順あるいは、昇順のどちらにも対応できること。」
ちなみにファイルの読み込みは1回、単語格納のための配列は使ってはいけない、qsortは使ってはいけない
という条件付きです。

手順はだいたいわかるんですが、どのような関数を使ったりとかがわかりません
よろしければ誰か分かる人がいれば教えてください。お願いします。

non
記事: 1097
登録日時: 14年前

Re: 英単語のソートプログラムについて

#2

投稿記事 by non » 14年前

緑、許さない絶対にだ さんが書きました:手順はだいたいわかるんですが、どのような関数を使ったりとかがわかりません
どのような手順なのか、教えてもらえますか。
また、
緑、許さない絶対にだ さんが書きました:単語格納のための配列は使ってはいけない
ってのは、配列でなければ、メモリーにすべて読み込んでもいいのですか?
でも、ファイルの数の上限がないですよね。すべて、メモリーに読み込むことはできませんよね。
でも、ファイルは1回しか読み込めない。さて、困った。思いつかない。
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 英単語のソートプログラムについて

#3

投稿記事 by softya(ソフト屋) » 14年前

配列は使えないとのことですが、ツリー構造やリスト構造はOKなのでしょうか?
それとファイルの行数が不定ならメモリに読み込めませんので、ソート中の情報をファイルに作るというかなり面倒で低速な処理になると思われますが、その認識でよろしいですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

たかぎ
記事: 328
登録日時: 14年前
住所: 大阪
連絡を取る:

Re: 英単語のソートプログラムについて

#4

投稿記事 by たかぎ » 14年前

一応作ってみましたが、ファイルの行数は、使用可能なメモリで上限が決まってしまいます。
また、辞書を作るのが面倒だったので、入力された文字列が英単語として妥当かどうかの判定も行っていません。
使い方はソースから読み取ってください。
あと、言語不明なので、勝手にC++だと判断しました。

コード:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
#include <exception>

int main(int argc, char* argv[])
try
{
  std::vector<std::string> v;
  while (std::cin)
  {
    std::string s;
    std::getline(std::cin, s);
    if (!s.empty())
      v.push_back(s);
  }
  std::sort(v.begin(), v.end());
  if (argc < 2 || *argv[1] != 'd')
    std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
  else
    std::copy(v.rbegin(), v.rend(), std::ostream_iterator<std::string>(std::cout, "\n"));
}
catch (std::exception& e)
{
  std::cerr << e.what() << std::endl;
}

たいちう
記事: 418
登録日時: 14年前

Re: 英単語のソートプログラムについて

#5

投稿記事 by たいちう » 14年前

私も作ってみました。main関数のみ載せます。

コード:

int main(int argc, char* argv[]) {
	set<string> words;
	ifstream ifs(argv[1]);
	while (!ifs.eof()) {
		string buf;
		getline(ifs, buf);
		words.insert(buf);
	}
	for (set<string>::iterator it = words.begin(); it != words.end(); it++)
		cout << *it << endl;
	return 0;
}

たいちう
記事: 418
登録日時: 14年前

Re: 英単語のソートプログラムについて

#6

投稿記事 by たいちう » 14年前

問題を読み返してみると「ソートは降順あるいは、昇順のどちらにも対応できること。」に対応してませんね。
逆順の場合はbegin()とend()のずれに注意してforを逆にしてください。

緑、許さない絶対にだ

Re: 英単語のソートプログラムについて

#7

投稿記事 by 緑、許さない絶対にだ » 14年前

皆さん色々と意見どうもありがとうございます。とても参考になります。
ただ自分が習っていない関数なども多々有り、正直いまいちわからないです。
そして書き忘れてしまって申し訳ありませんが言語はC言語で、
自分はリストを作ってそこに単語を格納してソートの手順でしようと思っています。
しかし、上手くリストに単語を格納してソートするためにどうプログラムをくめばいいのかがわかりません。
色々ミスがあってスイマセンが引き続き教えてもらえないでしょうか、お願いします

たかぎ
記事: 328
登録日時: 14年前
住所: 大阪
連絡を取る:

Re: 英単語のソートプログラムについて

#8

投稿記事 by たかぎ » 14年前

緑、許さない絶対にだ さんが書きました:正直いまいちわからないです。
ということはある程度はわかるのですね。
どこまでわかったのかを説明してみてください。

閉鎖

“C言語何でも質問掲示板” へ戻る