1 名前:デフォルトの名無しさん [2008/03/30(日) 01:50:26 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.50【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1204124447/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
892 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 07:09:45 ] それコンパイル通るの?
893 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 07:55:39 ] コンパイルできないし、それが単なるtypoだったとしても資源の管理はどうなってるんでしょうね、と。
894 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 09:21:56 ] コンパイルはできますがやはりaaae.ShowWindow(SW_SHOW);で消滅します
895 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 09:25:14 ] あ、aaaeをポインタにしたら出来ました。
896 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:23:53 ] 単にスコープ抜けたから、msgdlgのインスタンスが死亡しただけだろう。
897 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:23:39 ] vsprintfについてなんですけど、下記のva_end(..)っているのですか? xx func(const char* format, ...) { char buf[256]; va_list args; va_start(args,format); vsprintf(buf, format, args); va_end(args); // <=== これ必要なんですか? ... }
898 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:30:35 ] 規格で、同じネストレベルでva_start,va_endの組で使うことになっている。
899 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:32:48 ] 実装によるかも知れんがメモリとかがぶっ壊れるんじゃまいか
900 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:49:24 ] すいませんちょっとお聞きしたいのですが、GCCで if(ret = 1){ int dt = 1; } みたいにしたら、 「真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします」 と言われたので、 if((ret = 1)){ int dt = 1; } みたいにしたら、許してもらえました。 なぜ ((ret = 1)) の方がよいのでしょうか??
901 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:52:09 ] >>900 ret==1って書いたらその警告消えてくれるよ。
902 名前:897 mailto:sage [2008/04/22(火) 21:54:54 ] >>898-899 どうも、 ここのサンプルではva_end使ってないんです msdn2.microsoft.com/ja-jp/library/28d5ce15 (VS.80).aspx そして、www.bohyoh.com/CandCPP/C/Library/vsprintf.html ここに、「本関数は、va_endマクロを呼び出さない」 と記述があるんです
903 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:00:56 ] >>900 ==の間違いだったりしませんよね?大丈夫?っていう警告だからそういうもんだと思え 別に前の書き方でも問題ない (())の方がよいというわけじゃない
904 名前:900 mailto:sage [2008/04/22(火) 22:05:44 ] >>901 さん >>903 さん なるほど!ありがとうございます!
905 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:28:34 ] >>902 VCに限っていえばva_endマクロは何もしないから呼ばなくても問題はない。 しかし、他の処理系で動くとは限らない。
906 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:00:01 ] >>902 書かなくてもいい環境が有るとはいえ、プログラムとしては書かないと駄目。 運悪く駄目なサンプルに当たったね。
907 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:05:39 ] >>896 なるほど! msgdlg aaae = new msgdlg(); をグローバル領域に持って行っても起動しました。 ポインタの理解が深まりました。ありがとう!
908 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:07:36 ] ちょっとぉぉぉぉぉ
909 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:13:26 ] これが 「何か適当にいじったら動いた」 という奴か
910 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:14:27 ] > グローバル領域 深まってない悪寒
911 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:15:55 ] さすがにこれをコンボでくらったら元のソースを自分で書いていたとしてもデバッグしたくなくなるな (だから、その変てこなのは後から馬鹿が弄ったんだってば ><)
912 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:18:30 ] >msgdlg aaae = new msgdlg(); このコード、何度見ても謎が残りすぎ。
913 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:29:02 ] >891の段階で既に釣りだったんじゃね?
914 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:30:42 ] >>907 C++の入門書か入門サイトをもう一度見て回った方が良いと思うぞ。 煽りとかじゃなくて本当に。基礎は大事だから。 とりあえず、理解する必要のあるキーワードとしては、 ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープ あたりかな。
915 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:32:33 ] 釣りなら、それはそれでおk。
916 名前:デフォルトの名無しさん [2008/04/23(水) 00:24:05 ] switchのcase文内で、auto変数を宣言しようとすると、{}をつかってブロックを 作らないとだめですか?
917 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 00:25:05 ] だめです
918 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 00:30:02 ] >>916 例えばこういうことならできる。 switch (value) { int someVar; case 0: someVar = 0; break; case 1: someVar = -1; default: someVar = value; break; }
919 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 00:35:00 ] >>914 レベルアップした気分ですごく満足なのですが もう一度新C++言語入門シニア編上下を読み直してみます・・・ が、ずばり一言でどこがおかしいですか?頭関係以外でおねがいします。
920 名前:デフォルトの名無しさん [2008/04/23(水) 00:35:09 ] >>917-918 ありがとうです。 918はやり方自体知らんかったス。
921 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 01:01:17 ] >>919 頭関係以外で一言にまとめるには、対象が「少数」の「具体的なディテール」である必要がある。 でも君の場合、「基本的な抽象概念」の理解が「幾つも」欠けているように見受けられるから、まとめようがない。 だから>>914 も困った挙げ句 > ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープあたり という言い方になってるんだよ(これでも親切に用語を絞って挙げてるほう)。
922 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 02:37:20 ] >>919 msgdlg aaae; //○msgdlg型の変数 msgdlg aaae = new msgdlg(); //×msgdlg型の変数にmsgdlg*型の値を代入 msgdlg *aaae = new msgdlg(); //○msgdlg*型の変数にmsgdlg*型の値を代入 一言でいうと,どこがイコールよ?
923 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 07:18:54 ] >>919 void CtimerDlg::OnBnClickedButton2() { // new msgdlg() → msgdlgのインスタンスをヒープに確保。 // // msgdlg aaae = ... → msgdlgのインスタンスをスタックに確保して、 // msgdlg(msgdlg* ptr)に適合するコンストラクタで初期化。(※1) msgdlg aaae = new msgdlg(); ... // 自動変数のaaaeがスコープから外れるのでデストラクタが呼ばれ、 // aaaaが保持していたウィンドウなどが削除される。 // // (※1)のポインタptrをdeleteしていなければメモリリーク。 } が理解出来ていないように見える。 作りたいのがモーダルダイアログなら、 { msgdlg aaae; aaae.Create(IDD_DIALOG1, this); aaaa.DoModal(); } 関数を抜けてもmsgdlgを保持するなら、 グローバルでなくCtimerDlgのメンバにする。
924 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 07:20:43 ] よく見たらeだった。 × aaaa ○ aaae
925 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 09:41:18 ] ビットフィールドは、 unsigned char x : 50; のように元の型を超えていても定義できますか?
926 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 09:43:54 ] unsigned char配列を、38 、 6 、 4 のように分けたいのですが、ビットフィールドで出来ますか? あと、38bitの部分は、=で比較できますか? 無理な場合、別の方法はないでしょうか
927 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 09:51:28 ] このようにしたら、確保する領域は、40bit + 8bitになりますよね? 33 + 7 ではないですよね? class A{ public: bitset<33> a; char b : 7; };
928 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 10:06:17 ] 自己解決しました これで長い列に変換出来ました bitset<40> *p; unsigned char s[5]={1,255,1,255,128}; p=(bitset<40>*)&s; cout<< *p;
929 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 10:53:08 ] そ れ は 偶 然 だ
930 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:16:25 ] >>922 >>923 ありがとうございます。すごくよくわかりました。 void CtimerDlg::OnBnClickedButton2() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 int a =0; while(a < 100){ msgdlg *aaae = new msgdlg[100]; aaae[a]->Create(IDD_DIALOG1, this); // エラー aaae[a]->ShowWindow(SW_SHOW); aaae[a]->OnBnClickedOk(); delete aaae[a]; a++; } } error C2819: クラス 'msgdlg' にはオーバーロードされたメンバ 'operator ->' がありません。 これは何がいけないんでしょうか?
931 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:32:26 ] 下記のコードを実行したときに test::aaa で内部的に確保されたメモリ(?)が解放されず、 メモリリークが起きてしまっているようで解決方法が見つからず困っています。 STLなどの場合、確保したメモリを明示的に解放する関数などがあるのでしょうか? ( aaa.clear() や aaa.~vector() などは試してみたのですが駄目でした) それとも test::aaa 自体も new で確保して delete で解放したほうが良いのでしょうか? 環境はVC++2005です、よろしくお願いします。 class base { public: ~base(){ destory(); } virtual void destory(){}; }; class test : base { public: std::vector< int > aaa; void destory(){ aaa.clear(); } }; void main(){ void *p; { test *ptest; ptest = new test; ptest->aaa.resize(100); p = (void*)ptest; } //ここではポインタ p の基本クラスが base ということ以外はわからない delete (base*)p; }
932 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:39:01 ] デストラクタで仮想関数呼び出すとか馬鹿じゃねーの?
933 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:42:12 ] 古い形式のキャスト使ってるとか馬鹿じゃねーの? スマートポインタ使ってないとか馬鹿じゃねーの? いやいや、馬鹿じゃないって。 デストラクタの中から仮想関数呼び出すのはさすがにないけど。
934 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:44:25 ] >>930 これはひどい
935 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:57:28 ] … ~base() が呼び出されるときは 既に test::destory の実体はなくなっているからでしょうか? 馬鹿ですみません… こういう場合、クラスtestで確保したメモリは どう解放したら良いのでしょうか?
936 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:59:40 ] しかも書いてありました。 スマートポインタで調べてみます。
937 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 12:31:15 ] baseのデストラクタにvirtualをつけて上で testに自分のdestoryを呼ぶデストラクタを書けば baseのデストラクタの最初でtestのデストラクタが呼ばれて、testのdetoryが呼び出されるため この場合はmain内部の変更無しでメモリリークがなくなるけど、それじゃ駄目なの?
938 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:22:22 ] >>937 ありがとうございます、無事に解放されるようになりました。 いろいろと勉強不足でした。 仮想デストラクタにしないと派生クラスのデストラクタが呼び出されないのはもちろん メンバ変数のデストラクタも呼び出されないということ(?)なんですね。
939 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:39:34 ] >メンバ変数のデストラクタも呼び出されない 詳しくは覚えてないが、デストラクタが仮想関数(virtual)であれば、delete演算子が 渡されたポインタから仮想関数テーブルを辿って継承関係を把握できるとか だったと思う(逆に言えば仮想関数でないと把握できない)。 ちなみに勘違いしてそうなので書いておくけど、デストラクタとは ~クラス名();←引数無し のこと。destroyとか勝手に名前つけたらそれはただのメンバ関数だよ。 この場合正しくは virtual ~base();とかだ。
940 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:43:43 ] あ、そういえば~base()はちゃんと書いてあるのかw
941 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 14:11:20 ] なるほど…仮想関数テーブルですか、 virtual指定はなんだか漠然としていて理解しにくかったですが なんとなくはどう動作するかが理解できました。 ありがとうございます。
942 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 14:16:49 ] >>930 下のソースはコンパイル可能 行数減らしたから少し見辛いかも >>914 の言うようにポインタと参照について学んだ方がいい struct CTest{ void test(){} }; void f(){ CTest a; CTest* b = new CTest(); CTest* c = new CTest[1]; CTest d[1]; a.test(); (*&a).test(); (&a)->test(); (&a)[0].test(); (*b).test(); b->test(); b[0].test(); (*c).test(); c->test(); c[0].test(); (*d).test(); d->test(); d[0].test(); delete b; delete[] c; }
943 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 14:47:49 ] >>942 感動しました。こんなにわかりやすいの初めてみました。がんばります!
944 名前:デフォルトの名無しさん [2008/04/23(水) 15:37:22 ] 物凄い初歩的な質問なんですが 上手い方法を教えてもらいたくて質問します。 ある文字列があって 1文字ずつ処理していくんですが、 何か文字に変化があった時だけ処理を行いたいのです。 char str[]="ああいうええお";//何か文字列 int len=strlen(str); char current_c; current_c=str[0];//内容を覚える for(int i=0; i<len; i++){ if(current_c!=str[i]){//連続している文字が変われば //処理 } } こんなのを思いついたんですが これだと、1つ目の文字が当然処理されません。 current_c=str[0];//内容を覚える これを current_c=str[0]+1;//内容を覚える として、必ず1回目は処理が行われるようにするのも考えたんですが もっとちゃんとしたスマートな方法があると思うんですが・・・ こういう場合、どうやるのが一般的なのでしょうか?
945 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 15:46:25 ] str[0]+1なんて代入しなくても、0で初期化しておけばいいんじゃないの?
946 名前:デフォルトの名無しさん [2008/04/23(水) 15:48:09 ] >>944 charは1バイトだから平仮名みたいな多バイト文字はうまくゆかないよ。 分かっているならごめん。
947 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:11:33 ] >>945 0に相当する文字が来た時に駄目でしょ。
948 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:12:08 ] >>944 typedef char val_t; val_t str[]="aabbbcccddee"; typedef val_t* iter_t; for(iter_t begin=str,end=str+strlen(str),back,it=begin; it!=end; ++it){ if(it==begin || *back!=*it){ //処理 back=it; } } (・∀・)
949 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:13:42 ] >>947 それはひょっとしてギャグでいってるのか・・・・
950 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:19:37 ] >>944 最初に1文字目と異なる値 str[0]+1 で初期化しとけば良いんじゃね? ってのは結構頭の良い発想。凡百の徒には嫌われるけどね。 でもそういうときの current_c は普通 prev_c だな。
951 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:22:12 ] >>950 そうか?ムダじゃね?
952 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:33:50 ] 一つ目の文字が変わるっていう意味が分からんw
953 名前:948 mailto:sage [2008/04/23(水) 16:41:36 ] struct CTest{ bool operator!=(const CTest& o){ // ... return true; } }; template<typename iter_t> void unique_each(iter_t begin, iter_t end){ for(iter_t back,it=begin; it!=end; ++it){ if(it==begin || *back!=*it){ //処理 back=it; } } } void f(){ CTest v[10]; // v[0] ... unique_each(v,v+sizeof(v)/sizeof(*v)); } (∩゜д゜)アーアーきこえなーい
954 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:46:59 ] >>951 今回は文字だから 0 にしときゃ良いけど、 一般に先頭要素または直前のと異なる要素を 判定していくには良い方法だよ。
955 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:58:36 ] >>945 の前提条件 nul終端文字列 >>947 の前提条件 文字列 >>950 の前提条件 コピーコンストラクタ operator+ operator!= を持っている型 >>953 の前提条件 operator!= を持っている型
956 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:04:34 ] >>955 もう>>944 とは別世界に行ってるなw
957 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:31:55 ] PHPやperlでprint を使いながらデバッグするような方法をC++でもやりたいのですが、どうすればよいでしょうか?? そういうデバッグの仕方はC++では難しいのでしょうか。
958 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:32:34 ] >>944 ちょっとトリッキー、でもうまいやり方 >>945 一番シンプル >>946 一番重要なレスw >>953 汎用化し杉ワロタw
959 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:44:15 ] >>944 #include <algorithm> #include <string> #include <iostream> #include <functional> int main() { std::wstring src = L"ああいうええお"; src.push_back(0); ::setlocale(LC_ALL, "ja_JP.UTF-8"); for (std::wstring::iterator i = src.begin(); *i != 0; ++i) { i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>()); std::wcout << i-src.begin() << *i << std::endl;; } } 終端一つ加えて条件が逆のadjacent_find >>957 エスパーするとコードを読ませて実行時に一時的な値を見るとかならデバッガ gdbとVC付属のやつとか
960 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:44:31 ] >>944 は、charの取りうる最大値を指していた場合 +1すると、オーバーする。 >>945 は、処理内容次第では、\0がいきなり来た場合にヤバい。 が、あのプログラムの場合strlenの値がループの実行回数だからOK >953は、恐らく>>944 が本当に必要だったものではない可能性が高いw
961 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:47:00 ] >>959 さん なるほどデバッガで変数に格納されてる値を見ることが出来るんですね。 ありがとうございましたm(_ _)m
962 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:51:55 ] >>>944 は、charの取りうる最大値を指していた場合 >+1すると、オーバーする。 するってーと current_c=~str[0]; が適切?
963 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:53:43 ] オーバーフローしても大丈夫だろ。
964 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:55:39 ] あ、一文字目が処理されない
965 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:56:06 ] >>963 実動はともかく、規格的にはアウトだろ
966 名前:959 mailto:sage [2008/04/23(水) 18:12:21 ] リベンジ #include <algorithm> #include <string> #include <iostream> #include <functional> int main() { std::wstring src = L"ああいうええお"; ::setlocale(LC_ALL, "ja_JP.UTF-8"); std::wstring::iterator i = src.begin(); if (!src.empty()) { do { std::wcout << *i << std::distance(src.begin(), i) << std::endl; i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>()); } while(i++ != src.end()); } }
967 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 18:15:31 ] そして通告されるeucJP
968 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:01:21 ] vectorの配列を作ろうと思い vector<vector<string> > vecStrDim; vector<string> vecStr; string strTest = "test"; vecStr.push_back(strTest); vecStrDim[0].push_back(vecStr); とやってみました。コンパイルは通るのですが This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. とでて実行してもデバッグエラーになります vecStrDim[0].push_back(vecStr);が悪いのはわかるのですが、方法が思いつきません どうすればデバッグエラーを対処できるのでしょうか?
969 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:06:06 ] >>968 ×vecStrDim[0].push_back(vecStr); ○vecStrDim.push_back(vecStr);
970 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:10:40 ] >>969 あわわ……とんでもなく馬鹿なことしてすみません 解決しました
971 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:14:36 ] そのコードがコンパイルが通ることが不思議だ…
972 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:29:14 ] シングルバイト限定なら、current_cをintか何かにして、charで表現できないデカい値にしとけばいい。
973 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 20:44:51 ] class内で、static付けたものは、配列にしたときコピーは作られないんですよね? すべて同じ物を参照するんですよね
974 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:27:08 ] まあ配列にしなくても1つしか実体が存在しないようになるけどな
975 名前:デフォルトの名無しさん [2008/04/24(木) 00:49:34 ] #include <stdio.h> void main(void) { int a; pirntf("何か入力してください\n\n"); scanf("%d",&a); while(1){ printf("ぐははははははは!!\n\a"); } } この程度しか俺は中なので書けません。プログラマーさん お願いします。
976 名前:デフォルトの名無しさん [2008/04/24(木) 00:50:21 ] ↑MISSりました #include<stdio.h> void main(void) { int a,b,c; printf("数字を入力してください\n"); scanf("%d",&a); printf("数字をまた入力してください\n"); rewind(stdin); scanf("%d",&b); printf("数字をまたまた入力してください\n"); scanf("%d",&c); if(a == b == c) printf("等しいです,\n"); else printf("等しくないです,\n"); } これでa==b==cだったら"等しい"と表示させるように組んでるのに 1、1、1以外の数字は入力してもは全部"等しくないです"になるのは なんででしょうか?
977 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:52:43 ] >>976 a == b == c は、(a == b) == c と解釈される。つまり、使い方が間違っている。 その場合、恐らくa == b && b == c でいいだろう。
978 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:57:13 ] 980あたり、次スレたのむぜ
979 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:59:27 ] >>977 おおwなるほど! ありがとうございました^^
980 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:11:37 ] >>990 にパス
981 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:14:03 ] >>976 移動前のスレのコメントにもありましたが、 「君が参考にしてるものは信用しないほうがいい」 です。void main(...) はまずい。
982 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:17:45 ] void main は g++ でエラーになるしな。 gcc だと警告ですむけど。
983 名前:981 mailto:sage [2008/04/24(木) 01:34:22 ] rewind() も、あるのかわからない.....。stdin に対して rewind() ?
984 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:35:46 ] 1〜100までの数字でひとつだけない数字があるのでそれを探すという問題なのですが ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6318.cpp でひとつひとつ探す方法はあるのですが 他の方法で、まず 1〜50までの個数と51〜100までの個数を数えて 1〜50が49個 51〜100が50個で1〜50にあるとして 次は1〜25、26〜50とどんどん減らして 26〜38と39〜50の割り切れないときは13と12にしたりなどして 最後2つの数字にし 48が1個 49が0個で49がない数字とするプログラムを作りたいのですが どなたか例みたいなものを書いていただけないでしょうか?
985 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:41:23 ] 数えながら2つのファイル(小さい,大きい)に書き出していけばいいんじゃねの?
986 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:42:37 ] どこにあるのかわからないなら、ひとつひとつしらべるのが最善
987 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:48:07 ] 問題でこのような方法で作りなさいとあるので作りたいんですがダメでしょうか? #include<stdio.h> #define N 100 int main(void){ int min , max , mid; int count1, count2; int data, i; FILE *fp ここまでの指定はあるのですが、今自力でやってみてるんですが どう二つに分けそれ以降どのように区切っていけばいいのかよくわからないんです
988 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 04:42:58 ] 物凄い無駄な処理だなw 再帰呼び出しを使うのが良いよ
989 名前:988 mailto:sage [2008/04/24(木) 04:46:09 ] ああ、ごめん。数字は順番に並んでるわけじゃないのか
990 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 04:54:26 ] 諦めて全部足して5050から引け
991 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:18:22 ] #include <vector> //trueならmidより上、falseなら下 bool hilow(int min, int mid, int max, std::vector<int> src, std::vector<int> dst) { dst.clear(); std::vector<int> hi, low; //中間数超と以下でhi, lowに分ける for(size_t c=min; c <= max; c++) { if(src[c] <= mid) low.push_back(src[c]); else hi.push_back(src[c]); } //個数が規定値か調べて多い方を返す if(hi.size() == max - mid ) { dst.swap(hi); return ture; } dst.swap(low); return false; } 続く
992 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:33:54 ] 続き void main() { std::vector<int> num; //ファイルからnumに一度全部読み込む //ここは自分で書けるでしょ? int min, mid, max; min = 1; max = 100; do { (max - min + 1) % 2 ? mid = (max - min + 1) / 2 + 1 : mid = (max - min + 1) / 2; if( hilow(min, mid, max, num, num) ) min = mid + 1; else max = mid; } while(max - min > 2); //完了 }