トップページ⇒tech
1001コメント374KB

宿題見てやるよ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
カワイイ弟のために宿題を見てやろう。
ただし、「考え方」を教えてやるから「答え」は自分で見つけろよ。

麻衣スレ
http://piza2.2ch.net/test/read.cgi/tech/982853418/
0153151NGNG
すまん。なんか違うようだな。
それにしても writefile の引数がファイル名だけってのが謎だ。

一体どういうクラスなんだ?定義をぜんぶ出さんとわからんぞ。

…いやまて、手で打ち込んでタイプミスしてるってことは、
問題は印刷物でしか与えられてないのか?
0154スミマセンNGNG
>>151
そのとおりです。
甘えるつもりはないんですが、ほんとになんもわっかてないっす。
今、周りに追いつくので必死なので、
こんな単純な間違いにも気づかない厨房です。

どうかあきらめずに救いの手を。
0155151NGNG
>>154
>こんな単純な間違い
って結局どこがちがったんだ?それともちがわないのか?
ともかく、どういう問題かが伝わってくるまで手が出せんぞ。
0156スミマセンNGNG
>>153
こちらこそスミマセン。

テキストファイルの読み込み、書き込みの
資料を紙一枚いただいただけです。
問題に関しては2問合わせて4行程度です。

問1の問題は、その2つのメソッドの定義と
2つのファイル名をコマンドオプションから受け取る。
ぐらいしか、情報はありません。
問2の問題も、コマンドオプションからファイル名を
取得せよとのことです。

まだJAVAをはじめて一週間しかたっていなのですが、
よろしくお願いします。
0157156NGNG
>>155
単純な間違いとはタイプミスのことです。
すみません。

BufferedReaderとBufferedWriterを
問題の前に説明を受けました。
(2つ合わせて10分ぐらい)
あとtry catch を4回使うとも言ってました。
0158151NGNG
まず、メソッド writefile の定義が謎だってことをわかれ。

ファイルに書き込みをするってことは、
「<あるファイル>に<ある内容>を書き込む」
というふうに、投入口と品物がないと成立しない。

その引数リストでは、どうやって書き込むべき<内容>を指定するのか、
がわからん。

もし長くなければ、writefile の定義を書いてみれ。
0159151NGNG
まてよ?これまでの話をそーごーすると、
どうやら「readfile」「writefile」とかいうメソッドは、
呼び出し方だけ定義されていて、内容は自分で埋めなきゃいけないのか?
0160デフォルトの名無しさんNGNG
なんか見てておもろい。
がんばれ151と156。
0161156NGNG
>>158
言われていることは分かるのですが、
問題にはテキストファイルの内容
(ファイル名はコピー元txt(メモ帳に"あああ"と書いたもの)
とコピー先txt2)をコピーしろとしか書いてないので定義と
言われてもこんなことしか分かりません。
0162デフォルトの名無しさんNGNG
>>牡蠣フライ
まず、問題を一字一句間違いなくこの掲示板にカキコしてみ。
答えてやるから。
0163156NGNG
>>159
はい。
呼び出し方しか決まっていません。
すみません。説明が小出し小出しに
なってしまっていて。
0164デフォルトの名無しさんNGNG
>>158
読み込んだテキストを String の Vector のインスタンス変数で持つんでないの?
0165151NGNG
>>161
なんか講義自体が雑だって言いたいのか?そりゃそうかもしれんが、
おまえの説明もちんぷんかんぷんだ。特に writefile/readfile以降、
不正確な言い回しが目立つ。

>問題にはテキストファイルの内容
>(ファイル名はコピー元txt(メモ帳に"あああ"と書いたもの)
>とコピー先txt2)をコピーしろとしか書いてないので

だから言っとくが、それだけならもうわかってるんだろ。

本当は「それだけしか書いてない」じゃなくて、
「writefileとreadfileを使え」とか「BufferedReaderとPrintWriterを使え」
とか、うるさい条件がついてんじゃなかったのか?

はっきりさせろよ、伝わってないんだから。
0166156NGNG
コマンドオプションよりコピー元ファイルとコピー先ファイルを受け取り
テキストファイルの内容をコピーするプログラムを作成しなさい。

とにかく習ったものだけでプログラムをつくれとのことです。
BufferedReaderとPrintWriter writerを習いました。
0167156NGNG
>>165
すみません。
言葉が軽率でした。
0168151NGNG
>>166
じゃあ、writefileとかreadfileとかはなんだったわけ?
0169156NGNG
>>168
問題をやる前に

private Vector readfile (String fileName)
private boolean writefile (String fileName, Vector lines)

この2つを使ってやってみろ、という指示が出ました。
0170デフォルトの名無しさんNGNG
ほれ

import java.io.*;

public class FileCopy
{
public static void main(String[] args)
{
String from, to;
BufferedReader reader = null;
PrintWriter writer = null;

if (args.length != 2) {
System.err.println("usage: java FileCopy file_from file_to");
return;
}

from = args[0];
to = args[1];

try {
String line;

reader = new BufferedReader(new FileReader(from));
writer = new PrintWriter(new FileWriter(to));

while ((line = reader.readLine()) != null) {
writer.println(line);
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
reader.close();
writer.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
0171デフォルトの名無しさんNGNG
インデントバージョン

import java.io.*;

public class FileCopy
{
  public static void main(String[] args)
  {
    String from, to;
    BufferedReader reader = null;
    PrintWriter writer = null;

    if (args.length != 2) {
      System.err.println("usage: java FileCopy file_from file_to");
      return;
    }

    from = args[0];
    to  = args[1];

    try {
      String line;
    
      reader = new BufferedReader(new FileReader(from));
      writer = new PrintWriter(new FileWriter(to));

      while ((line = reader.readLine()) != null) {
        writer.println(line);
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    finally {
      try {
        reader.close();
        writer.close();
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}
0172151NGNG
>>169
それって
「本問題を解く<前>に、練習として〜を使ってまずやってみろ」
なのか?わからんぞイヤマジデ
まあいいや、どのみち使うってことだな。

で、そのふたつを完成させてから、それを組み合わせてコピーするってわけな。
わかった。

じゃあまず。。
0173151NGNG
あ、終ってた(w
0174151NGNG
>>170-171は Vector readfile (String)とか使ってないけどいいのか?
どうよ?>156
0175156NGNG
>>170-171
丁寧にありがとうございます。

>>151
本問題です。
使って頂きたいです。
よろしかったらお願いします。

private Treemap readfile (String fileName)を使って
テキストファイルより任意の人数分の番号、名前、住所を読み込んで
コマンドオプションから受け取った番号に該当する情報を画面表示。

もし、よろしければこちも希望。
0176デフォルトの名無しさんNGNG
コミュニケーション能力の重要性を改めて認識させてくれたエビフライ事件であった。
0177デフォルトの名無しさんNGNG
>>175
まず、その番号、住所などが書かれたテキストファイルの
フォーマットを示せよ。
0178デフォルトの名無しさんNGNG
>private boolean writefile (String fileName, Vector lines)

こんなメソッドを作れって指示する教官はJavaのことを
よくわかっていないので、習うのをやめれ。
0179151NGNG
>>175
引っ張っといて悪いが、そろそろ風呂入って寝たいので
ひとこと。

readfileについて:
writefileの「lines」っていう引数名から察するに、
一行を一要素としてファイル全体をVectorオブジェクトに格納していくんだよな。
それ想像できるか?できないならいえよ。

それには「BufferedReaderから一行ずつ読み込む」ってことと、
Vectorオブジェクトの扱い方がわかってればできるはずだよな。

で、どっちがわかんないのかは知らんが、とりあえず
とにかくそこんとこAPIドキュメントを読め。

Javaはじめて一週間ってことは、ひょっとして基本的な構文の理解から
すでにあやしいのか?そこまではちょっとな。。
0180151→風呂NGNG
>>178
それはすでに暗黙の前提。たしかに156は不幸ではある。
0181156NGNG
>>177
すみません。
問題の意味もよく分かっていないので
テキストファイル自体にどのように番号、名前、住所を
書き込んだらよいのかも分かっていません。
メモ帳にそれらをずらずらっと書き込んだらよいのでしょうか。
ファイル名はTXT3にしようと考えています。
0182156NGNG
>>151
長い時間ありがとうございました。
"もうめんどうくせぇ"
と思いでしょうが、また次の機会もよろしくお願いします。
基本的な構文をきちんと復習します。
本当にありがとうございました。
0183デフォルトの名無しさんNGNG
ほれ
import java.io.*;
import java.util.*;
public class Address
{
public static void main(String[] args)
{
String num;
TreeMap map;
String[] item;

if (args.length != 1) {
System.err.println("usage: java Address [number]");
return;
}
num = args[0];
try {
map = readfile(addressFile);
if (!map.containsKey(num)) {
System.out.println("no such number");
return;
}
if ((item = (String[]) map.get(num)) != null) {
System.out.println("number: " + num);
System.out.println("name: " + item[0]);
System.out.println("addr: " + item[1]);
}
else {
System.err.println("no value defined");
}
}
catch (Exception e) {
e.printStackTrace();
}
}
private static TreeMap readfile(String file)
throws FileNotFoundException, IOException
{
BufferedReader reader;
TreeMap map;
StringTokenizer st;
String line;
reader = new BufferedReader(new FileReader(file));
map = new TreeMap();
while ((line = reader.readLine()) != null) {
String num;
String[] item = new String[2];
st = new StringTokenizer(line, ",");
num = st.nextToken();
item[0] = st.nextToken();
item[1] = st.nextToken();
map.put(num, item);
}
return map;
}
private static String addressFile = "TXT3";
}
0184デフォルトの名無しさんNGNG
5,あいうえ太郎,東京都3
6,あいうえ花子,東京都3
1,山田太郎,東京都1
2,山田花子,東京都1
3,砂糖太郎,東京都2
4,砂糖花子,東京都2
0185デフォルトの名無しさんNGNG
インデントバージョン

import java.io.*;
import java.util.*;
public class Address
{
  public static void main(String[] args)
  {
    String num;
    TreeMap map;
    String[] item;
  
    if (args.length != 1) {
      System.err.println("usage: java Address [number]");
      return;
    }
    num = args[0];
    try {
      map = readfile(addressFile);
      if (!map.containsKey(num)) {
        System.out.println("no such number");
        return;
      }
      if ((item = (String[]) map.get(num)) != null) {
        System.out.println("number: " + num);
        System.out.println("name: " + item[0]);
        System.out.println("addr: " + item[1]);
      }
      else {
        System.err.println("no value defined");
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
  private static TreeMap readfile(String file)
    throws FileNotFoundException, IOException
  {
    BufferedReader reader;
    TreeMap map;
    StringTokenizer st;
    String line;
    reader = new BufferedReader(new FileReader(file));
    map = new TreeMap();
    while ((line = reader.readLine()) != null) {
      String num;
      String[] item = new String[2];
      st = new StringTokenizer(line, ",");
      num = st.nextToken();
      item[0] = st.nextToken();
      item[1] = st.nextToken();
      map.put(num, item);
    }
    return map;
  }
  private static String addressFile = "TXT3";
}
0186156NGNG
>>183-185

ありがとうございました。
基本をまずはしっかり復習して
がんばりたいと思います。

本当にありがとうございます。
0187112ですNGNG
どうも今いち、わからないです。どなたか、今一度お教えください。
よろしくお願いします。
0188 NGNG
>>187
とりあえず、自分で書いたコードみせてみ。
間違ってるところ教えてやるから。
0189デフォルトの名無しさんNGNG
C++で画面を100×100に分割し、指定されたブロックから指定された
ブロックまでの経路の全通りを作るプログラムを作りたいのですけど
経路の全通りを作る部分がわかりません。教えてください。
ただし一度通過したブロックは通過できない、経路は最短距離
ではない、です。
こんな感じです
●○○○○○○
○○○○○○○
○○○○○○○
○○○○○●○
○○○○○○○
○○○○○○○
↓4回、→5回、↑一回って経路も必要なのです。
0190デフォルトの名無しさんNGNG
>>189
迷路をスネークパターンで生成する技術が応用できますね。
0191デフォルトの名無しさんNGNG
100×100で最短経路以外も含めると総数が膨大になりそうな予感。
0192デフォルトの名無しさんNGNG
>>191
あたりまえだろ?
これはその総数を計算で求めるんじゃないの?
0193デフォルトの名無しさんNGNG
>>192
総数でいいんだよね?
全通りを「作る」って書いてあるが・・
0194189NGNG
経路そのものがほしいのです。
総数は膨大になると思いますが・・・
0195デフォルトの名無しさんNGNG
>>194
本当に100×100?
0196デフォルトの名無しさんNGNG
>>194
 というか、100×100での経路の全通りを求めるのが宿題なの?
 もし、それが宿題の自分なりのアプローチの1プロセスだとしたら、
そのアプローチの仕方はまずいと思う。
0197189NGNG
100×100でなくてもよいのですが、
「こういうアルゴリズムで作っていく」
というのが教えてほしいのです。
0198デフォルトの名無しさんNGNG
>>197
そういうことだったら。って、言葉で上手くできる自信ないが一応試みてみます。
基本的には再帰。で、一度通ったところは配列作ってチェックしていく。

とりあえず、めんどくさいのでグローバルに定義されている二次元の配列aに、
x,yを通ったか通ってないかを、1か0かで保持しているとしましょう。
また、今までの経路を何か配列か何かにつめてとおきましょう。

地点x,yから、ゴールまでの全ての経路を求める関数f(x,y)を考えるとします。

f(x,y)では、次のような処理をします。
(1)そこがゴールならば、今までの経路が答えの一つなので、それを保持します。
 で、一つ前に戻ります(return)。

(2)そこがゴールでないなら、
(2-1) 今居る地点を「通ったと記憶します」(a[x][y]=0)。また経路の配列にも
    記憶します。
(2-2) 上、右、左、下、それぞれについて。
選んだ隣接ブロックが存在して、そこにはまだ行ったことがないなら
ax,ayにその隣接ブロックの場所を入れてf(ax,ay)を呼び出します。
(2-3) 一歩もどります。その前に、今いる地点を「通っていない」状態に戻し
   ます(a[x][y]=0)、あと経路の配列も一つ戻します。で、return

これで、適当な初期化してfを呼び出せば大丈夫です。
0199198NGNG
補足。

高速化するために枝狩りした方がこの場合はいいと思います。
fを呼び出すたびに、「現在の地点からゴールまでたどり着く
可能性があるか」を判定し、それがなければreturnするのが
いいかと思います。
0200198NGNG
>(2-1) 今居る地点を「通ったと記憶します」(a[x][y]=0)。また経路の配列にも
    記憶します。
a[x][y]=1ですね、わかると思うけど。
0201デフォルトの名無しさんNGNG
しかしな、15x15でも、やってみたら4千万通り以上の経路があったぞ。
(40116600通り)

100x100の全ての経路を数えるだけでも一筋縄では行かない。
まして、全部プリントしたら、一生かかっても終わらない。
0202189NGNG
>>198-201
どうもありがとうございました。
15×15で4千万通り以上ですか・・・
ちょっと考え直してみます。
0203デフォルトの名無しさんNGNG
>>189
http://www.google.com/search?as_q=%83o%83b%83N%83g%83%89%83b%83N
0204デフォルトの名無しさんNGNG
http://pc.2ch.net/test/read.cgi/prog/1004278856/147-
誰かめんどうみてやれや。
0205五目並べNGNG
まずは終了判定部分、つまり石が5個並んだ事をチェックする部分を書いてみればいいんじゃないかな。
あとはおのずと道が開けていくと思うんたげど。
0206デフォルトの名無しさんNGNG
>>205
まあ、そうだねぇ。まず盤面を表すクラスを作って、その中で、3、4,5が何個あるか
を判定するメソッドを書いてみるあたりからはじめるのがよいかねぇ。
0207デフォルトの名無しさんNGNG
連珠の特殊なルールはストラテジパタンですか…。
0208デフォルトの名無しさんNGNG
PROLOGで、OX(まるぺけ)ゲーム作るんですが。
O-O
XX-
---
って状態で、Oが次の手をどう打つかっていうのを、
move([[o,-,o],[x,x,-],[-,-,-]], o, B)
と与えると、Bに [[o,-,o],[x,x,o],[-,-,-]] を代入する
みたいなのを作りたいんです。

「i 行目に x が2つ並んでなかったら」とか
「i 列目に x が2つ並んでたら」とかいうロジックを
どうやって書いたらいいっすか。
0209デフォルトの名無しさんNGNG
>>208
いろんなやり方あるが

count([Item|Rest], Item, N):-!, count(Rest, Item, M), N is M + 1.
count([_|Rest], Item, N):-!, count(Rest, Item, N).
count(_, _, 0).

futatsu(List, Item):-count(List, Item, 2).

とか使うと簡単では?

3x3なら羅列してもできちゃうけど。
0210デフォルトの名無しさんNGNG
○の次の手は[[o,o,o],[x,x,-],[-,-,-]] ではないのか?
0211デフォルトの名無しさんNGNG
>>152の
>各列、各列の中央値による行のソートをされた...

というのは>>128あての(順列を求める問題の)回答ではなくて
「ソートせずに中央値を求める」方の問題の回答ですね
これですか。

 ttp://www-or.amp.i.kyoto-u.ac.jp/members/ibaraki/algo.shtml

4. 整列のアルゴリズム  の
「第p要素を選ぶSELECT」

 ttp://www-or.amp.i.kyoto-u.ac.jp/members/ibaraki/shokodo/select.c

全体をソートするのでなくてグループに分けてソートして
それらの中央値を集めて...
なにかやってるみたいですね。
0212 NGNG
>>211
その、ソースちらっと眺めんですが、何してるのかよくわからんっす(^^;
誰かしっかり読んだ方解説お願いできませんか?
0213212NGNG
って、理解(^^;
>>121
のやり方で、基準とする要素を適当に選ぶのではなく、中間値
の中間値を採用するってこと・・ですよね、多分。
 で、最悪でO(N^2)になるのをさけると。
0214デフォルトの名無しさんNGNG
>>152
Median のアルゴリズムは情報系の学生には常識だと思ってたけど,
結構知らない人が多いみたいだね.
ちなみに,茨木先生の本に書いてある5個ずつに分けるアルゴリズムよりも,
徳山先生が情処かどっかに解説書いてたサンプリングによる方法の方が平均的
には圧倒的に速くて実用的.こっちを勉強しなよ.
0215208NGNG
>>209
ありがとうございます。
これから試してみます。なるほどなぁ。

>>210
鬱氏。
0216デフォルトの名無しさんNGNG
最悪の場合はO(n^2)になっちゃうが、
>>121 の考え方をHaskellで素直に書くとこんな感じだね。
すごく楽だ。

nearest_to_median :: Int->[Int]->[Int]
nearest_to_median k list =
 map snd (nth_smaller k distance)
  where distance = [(abs(x - median), x) | x <- list]
     median = last (nth_smaller (length list)/2 list)

-- 小さい方からn個を求める。
nth_smaller n list :: Int->[Int]->[Int]
nth_smaller n (m:more)
 | n == 0   = []
 | otherwise  = if (length left) < n then
           left ++ m:(nth_smaller n - (length left) - 1 right)
          else
           nth_smaller n left
          where left = [x | x <- more, x < m]
             right = [x | x <- more, x >= m]
0217216NGNG
× nth_smaller n list :: Int->[Int]->[Int]

○ nth_smaller n list :: (Ord a) => a->[a]->[a]
0218デフォルトの名無しさんNGNG
>>214
 サンプリングを取るっていうのは、適当に何個か抜き出して、そのMedianを採用
するってこと? この場合何個抜き出せばいいかっていうことに対して何か指針は
あります?
 最悪値をo(n)に抑える為に、要素を定数で割った数だけサンプリングすることに
なるんでしょうか。
0219デフォルトの名無しさんNGNG
引数が現在の局面で返り値が次の局面という評価関数を作るのか。
面白いね。

手続き指向で考えると、盤面を配列に持って手が進むごとに代入によって変化
していく作りになりがちな気がする。っていうかそんな風に作った。
ちょっと工夫が足りなかったと反省。
0220デフォルトの名無しさんNGNG
>>216
再帰的なプログラムって関数型言語で書くと綺麗にかけるねぇ。
0221超初心者の名無しさんNGNG
>>1さんへ
弟ではなく、妹ですがどうぞ、力を貸してください。
3問あるのですが、この問題が試験に出るそうなので、どうかお願いします。

/*
演習課題1.配列と整数nを与えて、その配列の先頭からn個の要素の和を
求める関数テンプレートを定義しなさい。

ヒント:整数配列の和を求める関数

int arraySum(int a[], int n)
{
int s = 0;
for (int i = 0; i < n; i++)
s += a[i];
return s;
}

*/

#include <iostream>
#include <conio>
using namespace std;

//関数テンプレート



int main(void)
{
int a[] = { 1, 2, 3}; //大きさ3の整数配列の例
double b[] = { 4.5, 6.7}; //大きさ2の実数配列の例

cout << arraySum(a, 3) << endl; // 出力は6。 arraySum<int>と書いても同じ。
cout << arraySum(b, 2) << endl; // 出力は11.2。arraySum<double> 〃

cout << "\Press any key to continue... ";
getch();
return 0;
}
0222超初心者の名無しさんNGNG
続きです。お願いします。
演習課題2.要素の型をクラスパラメータとした、2次元ベクトルクラステンプレート
を定義しなさい。


参考:要素がdouble型の2次元ベクトルクラスの定義

class Vec {

friend ostream &operator<<(ostream &os, const Vec &v); //フレンド関数の宣言

private:
float x, y;

public:
Vec(double xx = 0, double yy = 0) //コンストラクタ
{
x = xx;
y = yy;
}

Vec operator+(const Vec &b) const // メンバ関数として、+演算子を多重定義
{
return Vec(x + b.x, y + b.y);
}

};
ostream &operator<<(ostream &os, const Vec &v)
{
os << "(" << v.x << ", " << v.y << ")"; // フレンド関数として<<を定義
return os;
}

*/

#include <iostream>
#include <conio>
using namespace std;

//クラステンプレートの定義



int main(void)
{
Vec<int> intVecA(1, 2), intVecB(3, 4), intVecS; //整数ベクトル
Vec<double> doubleVecA(1.1, 2.2), doubleVecB(3.3, 4.4), doubleVecS;
//実数ベクトル
intVecS = intVecA + intVecB;
doubleVecS = doubleVecA + doubleVecB;

cout << intVecS << endl; //出力: (4, 6)
cout << doubleVecS << endl; //出力:(4,4, 6,6)

cout << "\Press any key to continue... ";
getch();
return 0;
}
0223デフォルトの名無しさんNGNG
てんぷれーと<たいぷねーむ てぃー>
てぃー あれい_さむ(てぃー *あ、いんと ん)
{
 てぃー さむ=0;
 ふぉー(いんと い=0;い<ん;い++) {
  さむ+=あ「い」;
 }
 りたーん さむ;
}
0224超初心者の名無しさんNGNG
さらに続きです。

/*
問題3 スタックのデモプログラム
文字列を入力し、1文字ずつスタックに入れて、逆にスタックから1文字ずつ
取り出すことによって、逆順の文字列を出力するプログラムを作りなさい。
文字列型は使用しないこと。

ヒント:空白を含めて、行末まで1文字ずつ読む部分は次のように記述する
for (;;) { //無限ループ
char ch = cin.get();
if ( ch == '\n' )
break;
// ここで、chをスタックに入れる;
}
*/

#include <iostream>
#include <conio>
#include "stack_tp_l.h"
using namespace std;

int main(void)
{


cout << "\n\nPress any key to continue... ";
getch();
}
これから、私もできないなりに勉強をします。
お願いします。
0225デフォルトの名無しさんNGNG
>>221-224
もう答え書いてあるも同然…
C++とかSTLの本買って嫁嫁。
0226デフォルトの名無しさんNGNG
template<class T>
class Vec {
private:
T m_x, m_y;

public:
Vec(T x=0, T y=0) : m_x(x), m_y(y) { }
Vec operator+(const Vec& rhs) const
{ return Vec(m_x + rhs.m_x, m_y + rhs.m_y); }
friend ostream &operator<<(ostream& lhs, const Vec& rhs)
{ lhs << "(" << rhs.m_x << ", " << rhs.m_y << ")"; return lhs; }
};
0227デフォルトの名無しさんNGNG
stack<char> stk;

stk.clear();

for (;;) { //無限ループ
 char ch = cin.get();
 if ( ch == '\n' ) {
  break;
 }
// ここで、chをスタックに入れる;
 stk.push(ch);
}

while ( !stk.empty() ) {
 cout<<stk.pop();
}

// 初めてSTL使ったんだけど、これで合ってる?
0228214NGNG
>>218
n 個の要素から K 番目に大きい要素を取り出すアルゴリズムは以下の通りです.
1. √n 個のサンプルをデータからランダムに選ぶ.
2. サンプルをソートして,K/√n - 2√√n 番目に大きいサンプル x と,
K/√n + 2√√n 番目に大きいサンプル y を求める.
3. n 個の要素から,y より小さなデータを全て破棄する.K 個未満になって
しまったら 1. からやり直し.
4. その中で x より小さなデータを全て選ぶ.K 個以上になってしまったら
1. からやり直し.
5. y 以上 x 以下のデータをソートして,大きい方からデータを選び,
全体で K 個目選ばれるまで続ける.
6. 終了

上記のアルゴリズム中,ステップ 3., 4. で失敗して 1. からやり直す確率は
4% 以下らしい(チェルノフの不等式より).だから,1.〜4. を繰り返す回数は
平均すれば約 1.04 回.全体に対する処理は全て O(n) で,√n 個のサンプルに
対する処理は O(√n log n).全体に対する処理がさほど多くないので速いと
いうのがこのアルゴリズムの売り.

チェルノフの不等式の他の応用例としては,テレビの視聴率調査が分かりやすい
かな?たった数千軒のサンプルで数千万世帯の推測がかなり高い確率であっている
ということは,チェルノフの不等式が保証してくれます.

参考文献:
徳山豪, "ランダムアルゴリズムの話題から", 電子情報通信学会誌, vol.77,
no.9, pp.957-967, 1994. (いくつか細かいミスがあります.要注意.)
0229218NGNG
 詳しい解説ありがとうございます。

 細かいところで、5番の処理で残ったデータ数mに対しo(mlog m)になるのが
気になりましたが、可能性としてはこのmが√nより大きいオーダになってしまう
ことがあるとしても、現実的には、4√nくらいを中心に散らばるから問題ない
ということですね。 気になるなら再帰的にやればいいのかな。

 勉強になりました。
0230デフォルトの名無しさんNGNG
sum=1/2~n-1 nの値を入力し答えを出力するプログラムを完成させなさい。


どのように考えればいいのでしょう?
0231デフォルトの名無しさんNGNG
>>230
問題文の意味不明。もう少しわかりやすく書け。
話はそれからだ。
0232デフォルトの名無しさんNGNG
えーと、
1
__
n-1
2 nに整数値を入力してこの式の答えを出力させなさい

但し
1 1
___ __
0   -3
2 , 2   などにも対応させること、ということです。
0233デフォルトの名無しさんNGNG
ずれまくり・・・欝

2のn-1乗ってしたかったんですが・・。
0234デフォルトの名無しさんNGNG
>>230
nの入力を促す
  ↓
2の(n-1)乗を計算する
  ↓
結果を表示する
  ↓
(゚Д゚)ウマー
0235デフォルトの名無しさんNGNG
>>230
double func(int n)
{
return pow(0.5, (double)n - 1.0);
}
0236名無しですけどNGNG
�@自然対数の底eを求めるプログラムを作成する。
 自然対数の底eは、無限級数eにより次のように定義される。
 e≒1+1/1!+1/2!+1/3!+1/4!+…+1/n!

�Aライプニッツの公式により、円周率の近似値を求めるプログラムを作成
 しなさい。
ヒント…マイナスとプラスになる項を別々に考えると楽。

さっぱりわかりません。教えてもらえませんか?
0237デフォルトの名無しさんNGNG
#include <math.h>
void main()
{
printf("�@: %lf\n", M_E);
printf("�A: %lf\n", M_PI);
}
0238デフォルトの名無しさんNGNG
>>236
とりあえず何がわからないか整理しろ。
以下の項目それぞれについて「わかる」か「わからない」か答えてみろ。
1.自然対数
2.底
3.無限級数
4.n!
5.自然対数の底eの求め方
6.ライプニッツの公式
7.円周率
8.近似値
9.マイナスになる項、プラスになる項
10.円周率の近似値の求め方
0239236ですけどNGNG
1〜10まではわかるのですが、プログラムの仕方がわかりません。
いろいろ本とかで調べたのですが、どうしてもエラーがでて・・・
どこが間違ってるのかさえもわかりません。
0240デフォルトの名無しさんNGNG
>>239
エラーの出る部分を載せてみ。
0241236ですけどNGNG
上の�Aの問題ですが、
円周率=4(1/1-1/3+1/5-1/7+1/9-1/11+…-1/47+1/49)を使わなきゃみたいなんですよ。
それで
main(){
int i,j,k,l,m,sum=0i
for (i=1;i<=49;i=i+4)
sum+=i;
for (j=3;j<47;j=j+4)
k=1/i;
l=-(1/i);
m=4*(k+1);
printf("%d\n",m);
}
といれました。どこが間違ってるんでしょうか?
0242236ですけどNGNG
追加…結果円周率3.181とでなきゃいけないみたいです。
0243デフォルトの名無しさんNGNG
>>241
まず数学の勉強をやり直した方が…
これはプログラム以前の問題…
0244236ですけどNGNG
やっぱり・・・涙
もうちょっとがんばってみます。ありがとうございました。
0245236ですけどNGNG
やっぱ教えてください。初めてなのでC言語自体がよくわかりません。
0246236ですけどNGNG
2行目の0iは0;です。5行目の47の前に=を追加してください。
7行目のiはjです。8行目の1はlです。間違えまくってすみません。
0247デフォルトの名無しさんNGNG
>>241
int では、その計算はできません。float か double にしなさい。
0248デフォルトの名無しさんNGNG
>>241
sumは何に使ってるの?
0249デフォルトの名無しさんNGNG
>>241
for文は { } を使って範囲を明確にする方が良いです。そうしなさい。
↓こんな感じで

for( ; ; ){

}
0250236ですけどNGNG
>>248
sumはちょっと自分でもわけわからず使ってました。
>>249
わかりました。やってみます。
0251236ですけどNGNG
>>247
すいません。見落としてました。
floatでやってみます。
0252デフォルトの名無しさんNGNG
>>251
修正したら、またソース載せな。
■ このスレッドは過去ログ倉庫に格納されています