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

C/C++の宿題を片付けます 58代目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/01/18(水) 03:35:45
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。
【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して
 投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 2.9 VC 6.0等)
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】
http://www.linux.or.jp/JM/index.html

【前スレ】
C/C++の宿題を片付けます 57代目
http://pc8.2ch.net/test/read.cgi/tech/1136768567/l50#tag993
【過去スレ一覧】
http://makimo.to/cgi-bin/search/search.cgi?q=C%2B%2B%82%CC%8Fh%91%E8&andor=AND&sf=2&H=&view=table&D=tech&shw=2000
0322デフォルトの名無しさん2006/01/20(金) 22:57:25
>>310 説明。
哲学者が食事をしようと、食材を入れた箱を開けようとする。
ふと哲学者の脳裏にひょっとして、あけたらまずいんちゃうか? という思いがかすめる。
けっこう前のだし・・・・。
箱を開ければ状態は確定するが、箱を開ける前、
箱の中の状態は食べられるものか食べられないものかの状態が入り混じっている。
・・・って、こんなんじゃなかったっけ?

解決策は、箱を開けるとヤバイかもしんないので、箱は絶対に開けない。
0323デフォルトの名無しさん2006/01/20(金) 23:05:43
>>321
�@普通に考えたら
(0.1,0.6) (0.2,0.7) (0.3,0.8) (0.4,0.9) (0.5,0.0)
のような表示を出せばいいだけだろうな
�A言語がCならAPIだのcoutなんて言い出さないよな
0324 ◆wa2f.aihh2 2006/01/20(金) 23:15:33
>>323
その解釈であってると思います。レスありがとうございます

どなたかお願いします
0325デフォルトの名無しさん2006/01/20(金) 23:22:15
>>322
シュレディンガーのぬこかよ!
0326デフォルトの名無しさん2006/01/20(金) 23:23:27
>>322
シュレーディンガーの猫?
03272412006/01/20(金) 23:28:02
>255
このスレ回転速いですね…;
お礼遅くなってすみません、ありがとうございました!
0328デフォルトの名無しさん2006/01/20(金) 23:35:59
哲学者の食事って、アレじゃないの?
フォークとナイフが2人分しか用意されてない四角のテーブルに
4人の哲学者が座り、瞑想を終えた哲学者からさっさとフォーク、ナイフ
を取って食事を始めるって奴。

デッドロックのシミュレーションだと思う。要するに、デッドロックが起きない
ようにうまくプログラムをせよって事か?
0329デフォルトの名無しさん2006/01/20(金) 23:42:36
>>324
(1)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
    int i;
    srand((unsigned int)time(NULL));
    for (i = 0; i < 5; i++) printf("(%f, %f)", 2 * rand() / (RAND_MAX + 1.0), 2 * rand() / (RAND_MAX + 1.0));
}

(2)
#include <stdio.h>
int main(void) {
    int c;
    scanf("%d", &c);
    if (40 <= c && c <= 65) printf("%c", (char)c);
}
0330デフォルトの名無しさんNGNG
>>328
それです。哲学者のルーチンを二つに分けて考えようとしたのですが、これは反則ですか?
Aは周りを気にせず自己中に食いたいときに食う。
Bは隣が食ってたら終わるまで待つ。
といった感じに。
0331デフォルトの名無しさん2006/01/20(金) 23:50:49
>>310
説明:
おなかをすかせた哲学者が角を曲がったところ、100メートル先に焼きいも屋をハケーン。
小カール君にもすんでのところで勝てそうだった経験のある哲学者は50メートル6秒フラットの俊足。
一方、リアカー商いの焼きいも屋のおじいさんは足取りも重く6秒で3メートルも進めたらいいとこ。
しかし哲学者が焼きいも屋を最初に見かけたところまでたどりつくと、
耳の遠いおじいさんはこちらの呼びかけにも気づかず5メートルほど先に行ってしまった。
あわてて哲学者がそこまで追いついても、その頃にはおじいさんはおじいさんなりのペースでまた先に。
哲学者とおじいさんの速さの比を20:1とすると、
哲学者がおじいさんがいたところにたどりつくたびに、おじいさんはその20分の1だけ先に行っていることになり、
哲学者は永遠に焼きいもを食べられない…って問題。

解決策:
宇宙は閉じているので全く反対方向に走れば
しばらくすると正面をこちらむきに歩いてくるおじいさんと出会うことになる。

0332 ◆wa2f.aihh2 2006/01/20(金) 23:52:14
>>329
ありがとうございます。感謝です
0333デフォルトの名無しさん2006/01/20(金) 23:56:15
>>331
アキレスの亀頭?
0334デフォルトの名無しさん2006/01/21(土) 00:06:15
>>307
これで分からなければ勉強不足、と言えるほど簡単に書いた。
#include <cmath>
#include <iostream>
int main() {
    int n;
    std::cin >> n;
    double x[100], y[100];
    for (int i = 0; i < n; ++i) std::cin >> x[i] >> y[i];
    int index_start = 0, index_end = 0;
    double dist2, max_dist2 = 0;
    for (int i = 0; i < n; ++i)
        for (int j = i; j < n; ++j)
            if ((dist2 = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])) > max_dist2) {
                index_start = i; index_end = j;
                max_dist2 = dist2;
            }
    std::cout << x[index_start] << ' ' << y[index_start] << '\n' << x[index_end] << ' ' << y[index_end] << '\n' << std::sqrt(max_dist2) << std::endl;
    return 0;
}
0335デフォルトの名無しさん2006/01/21(土) 00:23:15
>>251-252
かなり遅いレスになるが、標準Cにstrrevは含まれない。
0336デフォルトの名無しさん2006/01/21(土) 00:28:27
>>331 上手だな。
(なお、シュレディンガーの半死半生の猫の話はHALってマンガからの引用)

えーっと。哲学者の食事の解説(上手な解説はWebで見てくれ。脳内の情報だけで書いてる)
A)円形の卓があって、哲学者がN人居て、その間に1つづつ食器が置いてある。
B)哲学者は食器を2つ使わないとメシが喰えない。
C)哲学者は以下の動作を1つだけする
C1)まだ食器を持っていないなら、右手の食器を取ろうとする。右手の食器が開いていなければ次のチャンスを待つ
C2)C1が完了していれば、左手の食器を持とうとする。左手の食器が開いてなければ次のチャンスを待つ
C3)両手に食器を持っていれば、(メシを一口喰って)両手の食器を離す
D)哲学者が行動する順序はランダムである(続けて1人の哲学者が行動を続けることもある)
・・・ってすると、そのうち状態が変化しなくなってしまう。

改善:
食器に1〜Nの番号を振る(Cらしく、0〜N-1でも可)。
C1〜C2)を次のように変える。
C1)左右にある食器のうち若い番号の食器を持とうとする。持てなかったらC1へ
C2)もう一方の番号の食器を持とうとする。持てなかったらC2へ
0337デフォルトの名無しさん2006/01/21(土) 00:29:11
誰か野球チームのプログラム作ってよ
0338デフォルトの名無しさん2006/01/21(土) 00:43:10
>>337 >>1使ってkwsk
0339デフォルトの名無しさん2006/01/21(土) 00:47:51
デッドロックの問題か。
0340310NGNG
>>336
持てるようになるまでtryし続けるってことですね。
どうもありがとうございます


みなさん、スレ違いなのにすみませんでした。
0341デフォルトの名無しさん2006/01/21(土) 00:59:30
OSの授業で出た問題なんですが
↓これは何をするプログラムですか?実行結果も教えてください。
#include <errno.h>
#include <dirent.h>
#include <stdio.h>
int main(void) {
DIR * dir;
struct dirent * ent;
/* "." is the current directory */
if (!(dir = opendir("."))) {
perror("opendir");
return 1;
}
/* set errno to 0, so we can tell when readdir() fails */
errno = 0;
while ((ent = readdir(dir))) {
puts(ent->d_name);
/* reset errno, as puts() could modify it */
errno = 0;
}
if (errno) {
perror("readdir");
return 1;
}
closedir(dir);
return 0;
}

0342デフォルトの名無しさん2006/01/21(土) 01:08:39
>>331
面白そうだな
つまりデッドロックが発生するまでをシミュレートしろということか
暇が出来たときに作ってみるか
0343デフォルトの名無しさん2006/01/21(土) 01:10:37
ただの極限使った収束じゃないか
0344デフォルトの名無しさん2006/01/21(土) 01:14:41
>>341
ls
実行結果は状況依存。環境依存じゃなくて状況依存。なので答えられん。
0345デフォルトの名無しさん2006/01/21(土) 01:20:24
デッドロックの問題を真面目に書こうとすれば、Windowsなら
スレッド使った方がすっきり書けるね。

手持ちのWin32システムサービスプログラミングって本に例が
載ってる。mutexを使って同期を取っているが、デッドロックの
回避にはWaitForMultipleObjects()を使ってる。

ま、この単純な方法では、スタベーション(飢餓状態)という
別の問題が発生するので、待機時間を無限ではなくて
タイムアウトを設定する事で回避しているね。
0346デフォルトの名無しさん2006/01/21(土) 01:24:08
>>330
そいつは哲学者の問題とは違ったニュアンスになるぞ。
Aばかり食いっぱなしになって、Bは飢え死にする。

ダイクストラが例えた哲学者の問題は、すべての者が
同様の権利を持つものだ。
0347デフォルトの名無しさん2006/01/21(土) 01:29:23
つーかこの本のプログラムリストを今から打ち込んで>>1にうp
しとくから、後は自分で考えれ。

著作権の問題があるから本当はまずいんだが・・・・・・
0348デフォルトの名無しさん2006/01/21(土) 01:41:29
こんばんは。
フローチャートでCのポインタを描くにはどのようにしたらいいですか?
例えば

*foo = *foo + 5;

だとどうなるのでしょうか。
よろしくお願いします。
0349デフォルトの名無しさん2006/01/21(土) 01:42:57
その前に*foo += 5って書けや
0350デフォルトの名無しさん2006/01/21(土) 01:43:41
敢えて*foo = *foo + 5;と書いておきました。
0351デフォルトの名無しさん2006/01/21(土) 01:45:51
アドレスfoo番地のデータ(整数なり、キャラクタなり、オブジェクトなり、てきとー)に5を加算する。
0352デフォルトの名無しさん2006/01/21(土) 01:46:09
アドレスが5バイト分ずれる
0353デフォルトの名無しさん2006/01/21(土) 01:46:54
>>352
それはfoo+=5だろw
0354デフォルトの名無しさん2006/01/21(土) 01:47:22
>>351
ありがとうございます。
記号は処理を表す長方形でいいですか?
0355デフォルトの名無しさん2006/01/21(土) 01:47:44
突っ込まれる前に書いておくと>>353は
fooがchar*とかだった場合な
0356デフォルトの名無しさん2006/01/21(土) 01:47:49
>>350
普通、フローチャートで型は指定しないよ
0357デフォルトの名無しさん2006/01/21(土) 01:48:19
あー・・・流儀がいっぱいあるからさ・・・資料をみせてもらえば、分かる・・・<処理を表す記号
0358デフォルトの名無しさん2006/01/21(土) 01:48:35
>>353
あ・・・・・ボケたorz
0359デフォルトの名無しさん2006/01/21(土) 01:49:29
>>355
あ・・・確かにsizeof(型)分ずれるにしとこう
どっちにしろ間違ってるけど
0360デフォルトの名無しさん2006/01/21(土) 01:49:43
int **foot;と定義されていれば、・・ウソではないが・・。
0361デフォルトの名無しさん2006/01/21(土) 01:50:21
またバカが来たぞw
0362デフォルトの名無しさん2006/01/21(土) 01:51:30
>351 >357 >360 でつ。どーせ馬鹿でつ(涙)
0363デフォルトの名無しさん2006/01/21(土) 01:53:33
>>357
http://venus.aez.jp/uploda/data/dat5/upload321785.jpg

こんな感じです。
0364デフォルトの名無しさん2006/01/21(土) 01:54:13
ところで、もまえら、いつねてるの?
もれは、さけを、もういっぱいのんだら、ねるぅ。
0365デフォルトの名無しさん2006/01/21(土) 01:57:08
a = 0と同じやつ記号使っといてくださいな。>フローチャートの人。
多分、処理だとは思うけど。
0366デフォルトの名無しさん2006/01/21(土) 01:57:31
>>310
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1515.txt

これは本のリストをC用に書き直しただけなので、そのまま提出すると
バレる可能性がある。適当に修正しといた方がいい。

簡単に説明すると、csStat[]は、現在持たれている箸(もしくはフォーク)
を表す。pStat[]は、現在実際に飯を食っている哲学者を表す。

だから、csStat[]で 1 になっている数は pStat の 1 の丁度2倍になるはずだ。

numPhilosopherは、哲学者の数を表す。これを10とか20とかに変更
してコンパイルしても、デッドロックが起きない事が確認できると思う。

尚、このプログラムはスタベーションへの対策はしていない版である。
プログラムは必ずマルチスレッドでコンパイルする事。以上。
0367デフォルトの名無しさん2006/01/21(土) 01:59:01
ありがとうございました!
頑張って残り終わらせます。
0368デフォルトの名無しさん2006/01/21(土) 02:00:33
訂正。
×だから、csStat[]で 1 になっている数は pStat の 1 の丁度2倍になるはずだ。
○だから、csStat[]で 1 になっている数は pStat の 1 の丁度2倍になるはずだが、
 他のスレッドでまだ1本しか箸を取っていないタイミングもあるので、少なくなる
 事がある。
0369デフォルトの名無しさん2006/01/21(土) 02:02:33
んー・・・まあ・・・スレッドやらマルチプロセスやらforkで組むのが正解なんだろぉなぁ・・・
ほえほえなアルコール漬けの脳みそで、Cでシングルスレッドなプログラムを構築していた漏れ。
哲学者の状態は関数ポインタだった。
0370デフォルトの名無しさん2006/01/21(土) 02:07:30
自前でラウンドロビンをシミュレートしてもいいけど、mutexなんかの
実現が困難だと思う。まあいろいろ方法はあるが。
0371 ◆wa2f.aihh2 2006/01/21(土) 02:14:55
[1]授業単元:プログラミング
[2]問題文:�@50〜60の整数の乱数を5個生成し配列Sに格納した後それらの和を求める
�A入力したアルファベットを大文字→小文字、小文字→大文字に変換して表示する
[3]環境
 [3.1]OS:Windows
 [3.2]コンパイラ名とバージョン:Visual C++ .NET 2003 コマンドプロンプト
 [3.3]言語:C
[4]期限:月曜
さっき解いてもらったばかりなんですが、まだあったんでお願いします
度々すいません
0372デフォルトの名無しさん2006/01/21(土) 02:17:17
(1)50〜60というのは、50以上60以下のことか?
(2)入力の仕方、出力の仕方を提示せよ。
0373 ◆wa2f.aihh2 2006/01/21(土) 02:19:36
>>372
�@その通りです
�AskuAA→SKUaa
こんな感じです
0374デフォルトの名無しさん2006/01/21(土) 02:23:16
(1)了解
(2)そーじゃなくって、文字列を入力させるやりかたを教わらなかったか?
0375デフォルトの名無しさん2006/01/21(土) 02:25:58
>>371
http://hp.vector.co.jp/authors/VA008536/data/ascii.html
0376 ◆wa2f.aihh2 2006/01/21(土) 02:30:05
>>374
>>375
キーボードからです
0377 ◆wa2f.aihh2 2006/01/21(土) 02:32:18
>>374
gets
puts
とかのことですかね?
0378さっきの人2006/01/21(土) 02:36:59
>>377
(1)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
    int S[5], i, sum = 0;
    srand((unsigned int)time(NULL));
    for (i = 0; i < 5; i++) S[i] = 50 + (int)(11 * rand() / (RAND_MAX + 1.0));
    for (i = 0; i < 5; i++) sum += S[i];
    for (i = 0; i < 5; i++) printf("%d\n", S[i]);
    printf("sum:%d\n", sum);
    return 0;
}
(2)
#include <stdio.h>
#include <ctype.h>
int main(void) {
    int c;
    while ((c = getchar()) != EOF && c != '\n')
        if (islower(c))
            putchar(toupper(c));
        else
            putchar(tolower(c));
    return 0;
}
0379 ◆wa2f.aihh2 2006/01/21(土) 02:42:05
>>378
多謝
0380デフォルトの名無しさん2006/01/21(土) 03:02:08
前スレで貼ったけどもう1回

[1] 授業単元:プログラミングII演習
[2] 問題文(含コード&リンク):
自分の好きな野球チームの選手名、背番号、ポインタの入る構造体を
9つ作り打順通りのリニアリストを作れ
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン:
 [3.3] 言語: C
[4] 期限: 2006/1/24/
[5] その他の制限: 名前とか適当でいいんでお願いします
0381デフォルトの名無しさん2006/01/21(土) 03:42:06
好きな野球チームがない漏れはなじょすればよかと?
0382デフォルトの名無しさん2006/01/21(土) 04:06:17
>>381
NULLでも入れとけ。
0383デフォルトの名無しさん2006/01/21(土) 04:14:38
>>380
main(){
struct tagBaseballPlayer{
char name[256];
char no[4];
struct tagBaseballPlayer* next;
} team[] = {
{ "泉孝介", "8", 0 },{ "栄口勇人", "4", 0 },{ "巣山尚治", "6", 0 },
{ "田島悠一郎", "5", 0 },{ "花井梓", "9", 0 },{ "沖一利", "3", 0 },
{ "水谷文貴", "7", 0 },{ "三橋廉", "1", 0 },{ "安部隆也", "2", 0 }
};
int i;
for(i=0;i<8;++i) team[i].next = &team[i+1];
}

ポイントは「背番号」をintにしてしまうと"00"が表現できないという指摘がはいるとこか?
0384デフォルトの名無しさん2006/01/21(土) 04:15:46
背番号00なんて0と等価じゃん
0385デフォルトの名無しさん2006/01/21(土) 04:16:26
1] 授業単元:プログラミング
[2] 問題文(含コード&リンク): 線形リストに格納したデータをソートする。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 1/23まで
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1517.txt
線形リスト自体は本で調べて、なんとかできたのですが
ソート(バブルソート)の部分がうまくできません。
よろしくお願いします。
0386デフォルトの名無しさん2006/01/21(土) 04:20:12
おいおいバブルソートぐらい少しは調べてやってくれ
何でもいいから間違ったソースぐらいうpってくれ
0387デフォルトの名無しさん2006/01/21(土) 04:30:36
>>385
4 3 2 1 5
3 4 2 1 5
3 2 4 1 5
3 2 1 4 5
3 2 1 4 5
2 3 1 4 5
2 1 3 4 5
2 1 3 4 5
2 1 3 4 5
1 2 3 4 5
0388デフォルトの名無しさん2006/01/21(土) 04:32:59
>>387,386
バブルソート自体は分かるんですけど、
線形リストでやろうとするとどのようにすればいいのか
よく分かりません。
0389デフォルトの名無しさん2006/01/21(土) 04:41:21
48行目の
Node *ptr = list->head;
としてる意味がわからないんだけど、これ何してるの
0390デフォルトの名無しさん2006/01/21(土) 04:44:59
>>389
先頭ノードをポインタptrに格納しています。
0391デフォルトの名無しさん2006/01/21(土) 04:54:06
>>383
ありがとうございます
00は使わないです
0392デフォルトの名無しさん2006/01/21(土) 05:14:19
>>389
とりあえず考えた
バブルソートはどうしても自分の一個前の値のポインタが必要だから
Nodeのポインタの配列を必要な数だけ(別途存在するノードの関数を作成する)確保して(lplpNodeとする)
lplpNodeに順々に存在するNodeへのポインタを格納して

それを参照しながら、必要とあらばアドレスを入れ替えてバブルソートするってのはどう?
ただ問題はlplpNode配列の個数の限界がsizef(int)個になるんだけどね
0393デフォルトの名無しさん2006/01/21(土) 05:15:26
言葉足らずだった
(別途存在するノードの関数を作成する) → 別途存在するノードの個数を計算する関数
0394デフォルトの名無しさん2006/01/21(土) 07:50:27
「前の値のポインタ」というのは視点によるんじゃないでしょうか。
0395デフォルトの名無しさん2006/01/21(土) 11:31:51
>>385 線形リストに格納したデータをソートする。
バブルソートでやれって指定なのか?
0396デフォルトの名無しさん2006/01/21(土) 13:41:01
>>385
int CompareData(void *lhs, void *rhs){return ((Data*)lhs)->num - ((Data*)rhs)->num;}
void sort(List *list, int(*pfnCompare)(void *lhs, void *rhs)){
  Node *p, *prev;
  int changed=1;
  if(!list->head||!list->head->next) return;
  while(changed){
    changed=0;
    if(pfnCompare(&(list->head->data), &(list->head->next->data))>0){
      Node *temp1 = list->head->next, *temp2 = list->head->next->next;
      list->head->next->next = list->head; list->head->next = temp2; list->head = temp1;
      changed=1;
    }
    prev=list->head;
    for(p=list->head->next; prev->next->next; p=prev->next){
      if(pfnCompare(&(p->data), &(p->next->data))>0){
        Node *temp = p->next->next;
        prev->next = p->next; p->next->next = p; p->next = temp;
        changed=1;
      }
      prev=prev->next;
    }
    list->crnt=p;
  }
}

呼び出しは: sort(&list, CompareData);
もっと簡単になりそうな気もする。
0397デフォルトの名無しさん2006/01/21(土) 19:35:00
RPCのプログラム番号nsrmmdは390104だけど、nsrmmdbdも同じでしたっけ?
0398デフォルトの名無しさん2006/01/21(土) 22:23:06
[1] 授業単元:シミュレーション
[2] 問題文(含コード&リンク):

2つの窓口をもった航空機check-inカウンタがあるとする
客の到着時間timeとサービス時間durが与えられた時、客の平均待ち時間を求めることを考える。
例えば、客A,B,C,D,E,F,Gが以下のような時間単位でカウンタに到着し、サービスを受けた場合の平均待ち時間を計算してみなさい。
    time dur
A 1 3
B 2 3
C 3 4
D 4 2
E 5 5
F 6 2
G 7 3

2つの待ち行列Q1、Q2とする客は待ち行列の短い方でサービスを受ける。また、待ち行列の長さが同じなら、Q1でサービスを受けるとする

[3] 環境
 [3.1] OS: (Windows)
 [3.2] コンパイラ名とバージョン: (VC 6.0またはbcc32)
 [3.3] 言語: (C/C++/どちらでも可)
[4] 期限: ([2006年01月23日まで])
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1518.cpp
このサンプルの欠けている関数を埋めていくと完成するらしい。
でも、上のコードが読みづらい場合は0から好きなように作ってもよいそうです。

二つQueueがあって、待ちが少ない方に新しくきた客がpushされていくシミュレーションで、
待ち始めてからサービス終了してpopするまでの待ち時間の平均値を出せという問題のようです。
割と難しいのではないかと思いますが、どうかよろしくお願いします。
0399デフォルトの名無しさん2006/01/21(土) 22:33:48
[1] 授業単元:C++言語
[2] 問題文(含コード&リンク):
同じ長さの文字列2個(s1,s2)を比較して s1>=s2なら1 s1<s2なら0 を返す関数を作成せよ。
また、文字列の大小は辞書順。例えば a>b a=a ab>ac となる。    
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: VC++ 6.0
 [3.3] 言語: C++
[4] 期限: 2006年1月24日まで
[5] その他の制限: ポインタを使うこと。また、文字列に含まれる文字は小文字のみ。
よろしくお願いします。
0400デフォルトの名無しさん2006/01/21(土) 22:55:45
>>399
#include <string>
int compare(const std::string& lhs, const std::string& rhs){
  return std::lexicographical_compare(rhs.begin(), rhs.end(), lhs.begin(), lhs.end()) ? 0 : 1;
}

どこにポインタ使うんだ? そんな「C++言語」って授業は受ける価値なし。
っていうかs1<s2がtrueだろ。常識的に考えて。
0401デフォルトの名無しさん2006/01/21(土) 22:58:40
>>399はもしやstring.hのstrcmpに変わる関数を作れってことなのだろうか。
全然C++じゃないが。
0402デフォルトの名無しさん2006/01/21(土) 23:03:29
>>398
ソースがどう見てもCなんだが、本当にC++でもいいのか?
0403デフォルトの名無しさん2006/01/21(土) 23:05:14
>>400
悪意があって言う訳ではないので誤解しないで欲しい。
lexicographical_compare()は#include <algorithm>が必要。
0404デフォルトの名無しさん2006/01/21(土) 23:14:36
>>399
出題者(センセ)のセンスを疑う問題だな
0405デフォルトの名無しさん2006/01/21(土) 23:23:25
>>404
センスを疑うレスだな
0406デフォルトの名無しさん2006/01/21(土) 23:48:47
>>405
えー
0407デフォルトの名無しさん2006/01/21(土) 23:50:58
>>403
VCだと通っちまうので忘れてた。thnx.
0408デフォルトの名無しさん2006/01/22(日) 00:06:59
>>398
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1519.txt
嫌がらせのようにC++で。
まぁシミュレーションという授業なら、自前でqueueなんか組まなくてもいいでしょう。
0409デフォルトの名無しさん2006/01/22(日) 00:11:55
408ですが、Customerのデフォルトコンストラクタは消してください。
0410デフォルトの名無しさん2006/01/22(日) 00:31:42
さらに訂正。
列への追加は、サービス終了判定のあとが正しいですね。
timeループの中を、counter_a/bの終了判定、列への追加while、開始時刻設定の順に訂正します。
0411名無し2006/01/22(日) 01:04:38
>>233の期限が近いので、
どうかよろしくお願いします。
0412デフォルトの名無しさん2006/01/22(日) 01:09:26
説明のどこが説明になっているのかがわからん
0413デフォルトの名無しさん2006/01/22(日) 01:40:29
こんばんわ
ポインタについて質問させてください

int i;
void*p;
uint32*ui32p;
p = malloc(1024);
ui32p = (uint32* )p;
for (i=0;i<5;i++)
      ui32p[i] = i*i;

↑のソースで一番下の行がどういった動作をしているのかがわかりません
uint32型のポインタに[ ]をつけるというのはどういうことなのでしょうか?
文字列のポインタに[ ]をつけるのはよく見かけるのですが・・・
0414デフォルトの名無しさん2006/01/22(日) 01:41:11
>>411
こんなのでいかがか
int find_max(int *a, int m, int n) {
    int b, c;
    switch (n - m) {
        case 1:
            return a[m] < a[n] ? a[n] : a[m];
        case 0:
            return a[m];
        default:
            return (b = find_max(a, m, (m + n) / 2)) < (c = find_max(a, (m + n) / 2 + 1, n)) ? c : b;
    }
}
int find_min(int *a, int m, int n) {
    int b, c;
    switch (n - m) {
        case 1:
            return a[m] < a[n] ? a[m] : a[n];
        case 0:
            return a[m];
        default:
            return (b = find_min(a, m, (m + n) / 2)) < (c = find_min(a, (m + n) / 2 + 1, n)) ? b : c;
    }
}
#include <stdio.h>
int main(void) {
    int i, a[32];
    for (i = 0; i < sizeof(a) / sizeof(a[0]); i++) scanf("%d", a + i);
    for (i = 0; i < sizeof(a) / sizeof(a[0]); i++) printf("%d\n", a[i]);
    printf("\nMax:%d\nMin:%d\n", find_max(a, 0, sizeof(a) / sizeof(a[0]) - 1), find_min(a, 0, sizeof(a) / sizeof(a[0]) - 1));
    return 0;
}
0415デフォルトの名無しさん2006/01/22(日) 01:42:14
>>413
何のポインタだろうが、a[i]は*(a + i)と同じ。
0416デフォルトの名無しさん2006/01/22(日) 01:46:49
>>413
ポインタに[]をつけるのは配列と同じとでも考えてればよか
char *p="ABCDEF";
*pはAだしp[0]もAだ
04174132006/01/22(日) 01:52:11
>>415-416
数値型に対して*(a + i)のようにするというのがどういうことなのかわかりません
文字列ならば*(a + i)でi個先の文字を参照したりできますが数値型だと何を参照するのでしょうか?
0418デフォルトの名無しさん2006/01/22(日) 01:53:48
もちろん数値ですが何か?
0419デフォルトの名無しさん2006/01/22(日) 01:56:58
1] 授業単元:情報処理�T
[2] 問題文(含コード&リンク):
以下の関数を完成せよ。
int hoge(x,y)
int x,*y;
{
/*
関数の機能:
 「変数xの値」と「ポインタyが示す変数値」をかけたものを「ポインタyが示す変数値」
 に代入する。戻り値は「変数xの値」と「ポインタyが示す変数値」を足したものとする。
*/
}

3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 1月23日でお願いします。
[5] その他の制限:特にないです。
0420デフォルトの名無しさん2006/01/22(日) 01:58:54
つまんねぇ
0421デフォルトの名無しさん2006/01/22(日) 02:01:08
この時期にこの程度の問題ができないなら素直に単位落としとけ
■ このスレッドは過去ログ倉庫に格納されています