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

C/C++の宿題なら俺にやらせろ!

■ このスレッドは過去ログ倉庫に格納されています
0001C++房 ◆9ye75cT6 NGNG
俺はC++房。
今まで8ヶ月、毎日休まず一生懸命C++を勉強してきた。
わからない宿題若しくは処理があったら俺にやらせてくださいm(_ _)m
ただしソート、2分木など俺が5分以上悩むの問題はお断りだ。
他の手強に聞いてくれ
0153142=148NGNG
あー、やっぱりprotected継承は考えなくていいのか。
てゆーか EffectiveC++読まなきゃだめだね(苦笑

どうもさんくすでした。
0154デフォルトの名無しさんNGNG
>>152
どういうときに使う?
あんまり意味があるとは思えないんだけど
0155デフォルトの名無しさんNGNG
>>154
has-a時に、
ベースクラスのprotectedメンバを操作する場合
(ベースクラスのコンストラクタやデストラクタがprotected等)や、
ベースクラスの仮想関数をオーバーライドする場合。
0156デフォルトの名無しさんNGNG
>>154
所有/包含の代わりに使う。「それを実装手段とする」だね。また継承元
のprotedtedメンバを使えるという点で、包含よりも柔軟な事がある。
0157デフォルトの名無しさんNGNG
なんか、C++相談室の実質的な次スレになりつつあるなぁ
0158デフォルトの名無しさんNGNG
>>157
あちらのスレは何気に荒れているからかな。
0159デフォルトの名無しさんNGNG
>>155-156
なるほどねぇ、俺は絶対やりたくないですね
面倒でも所有させちゃいます。
0160デフォルトの名無しさんNGNG
>>159
所有/包含とfriend class宣言のセットが一番ポピュラーなんでしょうな。
0161デフォルトの名無しさんNGNG
>>159
だから所有の1つの方法なんだって。
>>160 のいってるように、
protectedにアクセスするだけなら
メンバとして所有してfriendを使ってもいい。
オーバーライドが必要ならprivate継承。
0162デフォルトの名無しさんNGNG
>>161 俺は絶対やりたくないですね
って書いてあるけど、何をそんなにムキになってるんだ?
0163デフォルトの名無しさんNGNG
>>162
あんまりバカだから。
>>159
> なるほどねぇ、俺は絶対やりたくないですね
> 面倒でも所有させちゃいます。
とかバカ丸出し。
その所有を実現するために、
場合によっては必要なんだよ。
夏ってこんな奴ばっかりだな。
0164デフォルトの名無しさんNGNG
>必要なんだよ
必要な例って何?
すべて所有で置き換え可能だから、
C#やJavaではprivate継承がないんでしょ。
0165デフォルトの名無しさんNGNG
>>164
>>155>>156
0166デフォルトの名無しさんNGNG
>>165
だから、プロテクトメンバーを捜査する必要がある場面って何かある?
勿論柔軟なプログラムが可能だろうけど、親クラスの実装に強く依存することになるんでない?
0167デフォルトの名無しさんNGNG
s/捜査/操作/
0168デフォルトの名無しさんNGNG
>>166
SOFTBANK刊、「詳説C++」のP165〜P168に、まさにそのような論議が
書かれています。XはYを使って実装される、の関係を表すのに、できる
だけ包含/所有を使い、private/protected継承は使わないように、と
推奨されています。

他の欠点として、継承すると、親クラスは一つしか使えないことがあげ
られています。包含/所有を使えば、いくつでもはめ込むことが可能で
すから。

protectedなメンバを参照する機会というのは、実際、あまりないでしょ
う。論理的な組み立ての流れの中で、そのような場合も考慮しておか
なければならないでしょうが、実務の世界では親クラスの設計が悪い
時に現れてくるかもしれません。
0169花男NGNG
すみません。宿題でどうしても分からないのですが手伝っていただけませんでしょうか?
C言語の構造体の問題です。
「1:00から5:00まで4時間分の電車の時刻表がある。この時間帯(1:00〜4:00)
のある時刻を入力し、次の電車の到着時刻は何分後で何時何分か表示せよ

(時刻表)
1時 10分 24分 35分  40分 55分 59分
2時 13分 26分 37分  49分 
3時 7分  15分 45分
4時 30分 51分       」

ちなみに自分はプログラムではCが初めてでそれも数ヶ月はじめたばかりの厨房です。
せめてヒントを下さい。よろしくお願いいたします。
0170デフォルトの名無しさんNGNG
確かにこんな事するぐらいなら、class Aのインターフェースをもう少し改良
して所有させればいいように思う。それから A* ap = &b; とできないので、
ポリモーフィックな動作をさせられないのは意外だった。

##include <iostream>
using namespace std;

class A {
protected:
int i;
A() { i = 111; }
virtual void print() const { cout << i << endl; }
};

class B : private A {
int j;
public:
B() : A() { j = 222; }
void print() const { A::print(); cout << j << endl; }
};

int main()
{
B b;
b.print();
}
0171デフォルトの名無しさんNGNG
>>169
構造体を使わずに書けるが。
0172花男NGNG
構造体を使えという問題なんです。よろしくお願いします。
0173デフォルトの名無しさんNGNG
>>172
時刻を構造体に入れるの?
0174デフォルトの名無しさんNGNG
>>169 ほれ。盆休み大サービスじゃ。

#include <stdio.h>

struct train_arrival {
int hour;
int min;
} TA[] = {{1, 10}, {1, 24}, {1, 35}, {1, 40}, {1, 55}, {1, 59}, {2, 13}, {2, 26}, {2, 37},
{2, 49}, {3, 7}, {3, 15}, {3, 45}, {4, 30}, {4, 51}, {-1, -1}};

int main(void)
{
int h, m, i = 0, j, k;

printf("現在時刻を入力して下さい(hh:mm)? ");
scanf("%d:%d", &h, &m);

while (TA[i].hour >= 0)
if ((j = TA[i].hour * 60 + TA[i].min) < (k = h * 60 + m)) i++;
else break;

printf("次の電車の到着まで後 %d分で、%d時%d分に到着します。\n", j - k, j / 60, j % 60);

return 0;
}
0175花男NGNG
169さん 173さん
本当に申し訳ありません。やむを得ぬ用事が出来てしまったためまた改めてこのスレで
質問します。またどうぞよろしくお願いします。
173さんの質問は・・・恐らくint型で。
0176デフォルトの名無しさんNGNG
オナーニタイムか
0177花男NGNG
ですが取り合えず今は保留として置いてください。よろしくお願いします。
0178デフォルトの名無しさんNGNG
>花男氏
>>174さんのサービスについてのコメントはなしですか?
0179デフォルトの名無しさんNGNG
>>178
マルチだからあちこちのスレ見てて忙しいんだよ
0180デフォルトの名無しさんNGNG
宿題スレでヒントを出したものだが、>>174さんがずばり書いてしまっていてショボーン(w
0181デフォルトの名無しさんNGNG
>>180
こういう場合は答えを書かずにつき合ってやった方がいいのか。
これからそうしようか。
0182デフォルトの名無しさんNGNG
>>170
機能が変容するから多態できなくて当然

class battle_ship {
protected:
report local_order(command) ;
public:
void sail(void) ;
void move(two_dimensional_direction) ;
void attack(battle_ship) ;
void attack(submarine) ;
void communicate(station) ;
void suicide_bomb(void) ;
} ;

class space_battle_ship : protected battle_ship {
public:
void takeoff(void) ;
void move(three_dimensional_direction) ;
void attack(space_battle_ship) ;
using battle_ship::communicate ;
using battle_ship::suicide_bomb ;
void hadouho(three_dimensional_direction) ;
} ;

battle_ship yamato ;
space_battle_ship uchu_senkan_yamato ;
0183デフォルトの名無しさんNGNG
>>181
まったくやる気の見えないやつはマルチポストしたりしてうざかったりするので
ずばり答を書いて追い払うこともあったりする(w

今回はヒントをくれということだったんで、少しの間付き合ってみようかと思ってた。
0184デフォルトの名無しさんNGNG
>>182
using宣言を行うと、何か特別な意味があるの?virtualがついてない
から関数のオーバライドとも違うようだけど・・・・

>>183
なるほど。これから場の雰囲気を読むようにしますね。
0185デフォルトの名無しさんNGNG
usingで該当スープ(この場合はspace_battle_shipのpublic)に
メソッドをインポートしているだけ。
void communicate() { battle_ship::communicate(); }と記述しなくていい。
0186デフォルトの名無しさんNGNG
>>168
>継承すると、親クラスは一つしか使えない
ってどゆこと?
0187デフォルトの名無しさんNGNG
>>186
例えば Stackクラスを Listクラスで実装するとして

class Stack {
List l1;
List l2;
};

のように Listクラスを Stackクラスの中に必要なだけ埋め込み
できるけど、継承したら Listクラスの実体は一つしかできない。
0188デフォルトの名無しさんNGNG
>>185
ん?特にbattle::とスコープを解決しなくても、public継承なら親クラスの
関数はそのまま継承されてくると思うけど?usingをつけないと都合の
悪いことがあるのかな、と思って。
0189デフォルトの名無しさんNGNG
>>185
スマソ、protected継承でした。逝ってきます・・・・・・
0190186NGNG
ああ、なるほど。
0191デフォルトの名無しさんNGNG
>>185
そしたら、こういう場合の B::print は、public属性なのでしょうか、それとも
protected属性なのでしょうか。わけが分からなくなってきました(~_~;)

class A {
int i;
public:
A() { i = 111; }
void print() const { cout << i << endl; }
};

class B : protected A {
public:
using A::print; // void print() const { A::print(); }
};

class C : protected B {
public:
using B::print;
};

int main()
{
B b;
C c;

b.print();
c.print();
}
0192デフォルトの名無しさんNGNG
C++関係の質問はC++相談室でする事にします。スレ汚しスマソ。
0193デフォルトの名無しさんNGNG
>>191
そんなもんやってみれば一発じゃん
0194花男=169NGNG
174さん、180さん、183さん
特に174さん問題解いてくださって本当にありがとうございました!

すれ違いになってしまって174さんの書きこみ(解答)を見ずに175、177
のレスを書いた後席をはずしてしまいました。というか外出しておりまして
現在も外から書いております。本当に返事が遅れてしまい申し訳ありませんでした。
現在用事を済ませ、見せていただいています。あんなに早く解ける方がいるとは
思いませんでした。

今更なのですが{-1, -1}(8行目)がどういうことか分からないのですが
解説して頂けないでしょうか。
このプログラムそのものに関してはこれからじっくり考えさせて頂きたいと
思います。
0195デフォルトの名無しさんNGNG
>>194
while (TA[i].hour >= 0) の所でwhileを抜ける為。
0196花男NGNG
195さん
レス有難うございます。もう少し分かりやすく説明して頂けないでしょうか。
0197デフォルトの名無しさんNGNG
>>194
>>195さんも書かれていますが、最低限のエラートラップです。
配列添字が範囲を超えてしまうのを防いでいます。
0198デフォルトの名無しさんNGNG
>>196
それから入力する時刻が1:00〜4:00までに限定されていますが、これは
チェックしてないので、チェックするように変えてみてください。
0199花男NGNG
197さん 有難うございました。すみません あとの細かいところは
考えさせてください。プログラムの全体の形は理解するのに時間がかかると
思いますので・・
もっと厨房的な質問になってしまうのですが

printf("現在時刻を入力して下さい(hh:mm)? "); の(hh:mm)
のような表記で時間が出るのでしょうか。本当に厨房な質問ですみません。
0200デフォルトの名無しさんNGNG
>数ヶ月はじめたばかりの
数ヶ月でそれかよ、、、そんなの始めて2日以内のところだろ、、
0201デフォルトの名無しさんNGNG
>>199
違う違う。11:22のようにコロン( : )を間に挟んで入力してくれ、という意味。
例えば 1時20分なら 1:20[enter] と入れればよい。
0202花男NGNG
理解しました。
お恥ずかしい限りです。

じっくり考えたいと思います。皆さんありがとうございました。
0203デフォルトの名無しさんNGNG
>>187
本に書いてあることを鵜呑みにしないで、実践することも必要だぞ。
こんなケース無いだの、ベースクラスが悪いだの、
頭の中で空想しても何も得ることはない。
要は所有が必要なときに、その実装として何が最適かだ。
メンバで持つだけで解決できなかったり、
ベースクラスが変更できないときに、
実装できません・ベースクラスの設計が悪いです・
僕は悪くありませんじゃプロとして失格だろ。
自分の知識の無さが恥ずかしくて、自分を正当化ばかりしていないで、
設計の選択肢の1つとして覚えておけ。
誰もお前に、その手法を強制しているわけじゃない。
言ってること理解できるか?
0204名無しさん@EmacsNGNG
>>203
カコイイ!! 確かにそうだと思う.

…でもベースクラスの設計が悪かったんだよぉ, 残業になったのは
俺のせいじゃないよぉ、ウワアアアァァァンヽ(´Д`)ノ

…ごめん, 俺テンパってるかもしれん. 逝って来る.
0205デフォルトの名無しさんNGNG
>>200
それよりも日本語として変。
0206デフォルトの名無しさんNGNG
あーすみません、FtpCommand関数を使ってサーバーにあるファイルの
パーミッションをゲットするにはどうすればいいのでしょうか?
0207デフォルトの名無しさんNGNG
>>203
ベースクラスの設計が悪くてプロテクトメンバーをいじる必要があるなら、
継承させずにもう一枚少し大きめなラッパーを書きますが、何か?
0208デフォルトの名無しさんNGNG
>>207
こういう粘着の質問に答えたヤシは災難だな、いってることも矛盾だらけだし
0209デフォルトの名無しさんNGNG
プログラミングにはいろいろな手法があるので実装は人それぞれだし、
どれが正しいというもんでもない。
チーム開発では統一しなきゃいかんけど。
絶対に正しいプログラムは作れないという数学的証明があるらしい。
0210デフォルトの名無しさんNGNG
消費リソースを抑えるか、実行速度を取るか、再利用性&可読性、安定性で変わってくる。
0211デフォルトの名無しさんNGNG
>>209
>絶対に正しいプログラムは作れないという数学的証明があるらしい。
何もしないプログラム。

nop

すぐ終わるプログラム。

halt
0212デフォルトの名無しさんNGNG
>>209
チューリングマシンの停止問題っすか?
0213デフォルトの名無しさんNGNG
コボルがわからん
0214花男NGNG
すみません。>>169 で質問した花男というものですがやっぱり分かりません。
どなたか助けてください。困っている点その�@コンパイルしたら>>174 で通るんですが
「パラメーターが足りません」とエラー表示され実行されないんです。
どうしたら良いのでしょうか。
�Awhile〜else break;間の意味を解説して頂けませんでしょうか。
お願いします。
0215デフォルトの名無しさんNGNG
>>214
機種依存文字。
0216花男NGNG
え?読めない文字ありますか?
0217デフォルトの名無しさんNGNG
>>216
215「丸つき数字を使うなヴォケ」ということです。
分かりましたか?
0218デフォルトの名無しさんNGNG
>>214
できた実行形式のファイルの名前は何?
0219花男NGNG
すみません。丸付き数字は使わないようにします。
実行形式のファイル名は「shukudai.c」とつけました。
お願いします。上記の2点に関して教えてください。
0220218NGNG
あれ、はずしたみたい。
他に同名のファイルがあって、そっちを実行してんじゃないかとおもった。
0221デフォルトの名無しさんNGNG
>>214
k = h * 60 + m;
while (TA[i].hour != -1) {
 j = TA[i].hour * 60 + TA[i].min;
 if (j >= k) break;
 i++;
}
ちょっと変更してみた。多少わかり易くなったと思うけど。
これでもわからないですか?
0222デフォルトの名無しさんNGNG
実行ファイルに「 .c」はないと思うが・・・
0223デフォルトの名無しさんNGNG
>>214
whileの中の条件式は、配列TAが最後まで到達したかどうか見てる。
TAの初期化で最後に{-1,-1}ってのがあるだろ。それと比べてる。
これは番兵という手法で一般的に使われる。

ifの中は時と分で表されたものを分だけに直して、大小比較してる。
たとえば3時15分だったら、(3*60+15)=195分とかね。
構造体のままだと大小比較できないから分に直してるわけだ。

で、入力された時刻と時刻表を比べて入力された時刻の直後の時刻表の時刻が
出てきたらbreakしてる。

こんなもんでいいかな。
0224デフォルトの名無しさんNGNG
番兵って、この場合、最後を{5,0}とかにする手法じゃなかったけ。
0225デフォルトの名無しさんNGNG
>>224
要はデータに絶対出てこない数値が入っていれば良いんでは?
0226花男NGNG
なんとなくですが理解できました。
わかりやすく説明して頂いたように思います。
ありがとうございます。たいへん助かりました。
{-1,-1}に関しては前もどなたかにお聞きしたのですが
使い方が難しいですね。

ところでコンパイルの方は何故エラーが出てしまうのでしょう。
0227224NGNG
>>225
最後を{5,0}にすると
while (TA[i].hour >= 0)
を
while (1)
とかけるようになる。
終端検出の比較と次の到着時刻を求める比較とを
同じにすることで、ループ中の比較回数を減らす手法だと
解釈していたんだけど。
0228デフォルトの名無しさんNGNG
>>227
でも5時は (現在の仕様では) ありえないし。

でも100%現実には-1時はないから -1の法がいいけどな。
0229224NGNG
高速化を考えなくていい状況なら、俺も-1を使うと思う。
番兵を使うと読みにくくなると思うしね。

単に >>223 の番兵の解釈が間違っているんじゃないかといいたいだけ。
0230223NGNG
>>229
んん。おれの番兵の解釈間違ってるのか。
番兵って言葉どの本で覚えたんだっけかな。

手近にある「プログラミング作法」を開いてみると、
訳語が「番人」だったけど載ってた(以後「番人」で統一する)。

ちょっと引用すると、

>データの末尾にNONWORDを2〜3個追加しておくと、プログラムのメイン処理ルー
>プが格段にシンプルになる。これは番人(sentinel)値を追加して境界をマーク
>するテクニックの一例だ。
(「プログラミング作法」103ページ)

コードまでは載せないけど、ここに書いてあることからおれが読み取れることは
・あるデータの集まりがあって
・その末尾にありえないデータを置いておく。このありえないデータ値を「番人」と呼ぶ
・データの集まりを一通り舐めるときは番人が出現するまでループをまわす
ということなんだけど、この解釈で間違ってる?
間違ってるとすると認識を改めないと。
0231デフォルトの名無しさんNGNG
>230(=223)
あるデータの集まりを探索するときに、末尾に必ず条件にマッチする
データ(これには番兵であるという印を付けておく必要がある)を置いて
おく。このことによって(ループのたびに行われる)終了判定の式を省く
ことができる。

ってのが(いわゆる)番兵の使用法ですよね。

たぶん223さんの頭にあるのは、Cの文字列のNULL終端子みたいな
ものだと思うのですが、そういうのを番兵と呼ぶのは、少なくとも私は
聞いたことないです。
0232223NGNG
>>231
そうです。確かにCの文字列の終端子が頭にありました。
>>174の例でいうと{5,0}とか、拡張を考えると{25,0}みたいな
ものをおいておくとループの中で
・配列の末尾かどうか
・条件に合うものかどうか
という二つの判定を一つに省くことができるということですね。
で、番兵にぶちあたったかどうかというのはループの外で判定すると。

なるほど一つ賢くなりました。ありがとうございました。
0233デフォルトの名無しさんNGNG
なにかないの〜?
0234デフォルトの名無しさんNGNG
先生!浮動小数点数をC風文字列に変換するにはどうしたらいいんですか?
言語はC++かCで。
0235デフォルトの名無しさんNGNG
>234
sprintf()
0236234NGNG
あ、いないと思いますけどsprintfなんて辞めてくださいよ。
0237デフォルトの名無しさんNGNG
>>236
なんで?
0238234NGNG
ぁ・・・・・。
0239234NGNG
ごめんなさい。
ここで聞いたのが間違いでした。
0240デフォルトの名無しさんNGNG
>>236
てめー、Cをなめてんじゃねーのか?
勘違いすんじゃねーよボケ!
0241デフォルトの名無しさんNGNG
>>239
本気で教えてもらいたいなら、そういうなめた態度止めろよ。
0242デフォルトの名無しさんNGNG
>234
最初からここで質問しようとすんなよ。
ネタだと勘違いするヤツが出てくんだろが。
0243デフォルトの名無しさんNGNG
>>236
仕事で、そういう処理を書くなら、
漏れは迷わずsprintf使うけどな。
何か問題あんの?
0244デフォルトの名無しさんNGNG
C風文字列ってどんなの?
0245デフォルトの名無しさんNGNG
>>244
'\0'で終わる、charの配列。
0246デフォルトの名無しさんNGNG
>>243
そういう処理を自分で書く宿題なのだと思われ。
0247デフォルトの名無しさんNGNG
結構むづかしいね。
仮数部のビット数を得るマクロとか、ありましたっけ?
0248デフォルトの名無しさんNGNG
>>247
書けばいいじゃん。IEEEの浮動小数点っしょ?
0249デフォルトの名無しさんNGNG
>>247
float.h嫁
0250花男NGNG
>>169 で質問した花男というものです。
2度ほど教えて頂いたのですが、今回で最後にしますのでもう1度だけ同じ質問
に関して教えて頂きたいです。どうぞよろしくお願い致します。
>>174 という解答を頂いたのですがint h, m, i = 0, j, k;の部分が
分かりません。どうしてm, i を他の記号に置き換え、hをゼロとするのでしょうか。
あともうひとつ、仮にこの時刻表が1時〜5時までではなくて2時〜5時だった場合、{}内を
{2, 13}, {2, 26}, {2, 37},・・・以下を書いていくと思うのですが最後の
{-1, -1}はどのように書き換えればよいのでしょうか?これを本当に最後にしますので
宜しくお願いします。



0251デフォルトの名無しさんNGNG
#include <stdio.h>
#include <string.h>
main()
{
char ans[]="dictionary";
char guess[]="----------";
char a;
int i,count=0;
do{
printf("%s",guess);
printf("アルファベットを入力してください。:");
a=getchar();
for(i=0;i<10;i++) if(a==ans[i]) guess[i]=a;
count++;
}while(strcmp(ans,guess)!=0);
printf("正解は%sでした。\n",ans);
if(count<15)
{
printf("%d回目で正解です。あなたの勝ち。\n",count);
}
else
{
printf("%d回目で正解です。あなたの負け。\n",count);
}
}
0252デフォルトの名無しさんNGNG
上のはある本のをちょっと改良した、単語当て
ゲームです。
countで、何回で正解したのかを計測している
のですが二倍ぐらいの数になってしまいます。
あと、10、11行目がdoの二回目以降、二回
実行されてしまいます。どうしてでしょう。
この本のソースは間違っているんでしょうか。
■ このスレッドは過去ログ倉庫に格納されています