[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 05/09 21:47 / Filesize : 118 KB / Number-of Response : 352
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C,C++】 ちょっと問題解いて行け 【勉強】



1 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:16:00 ]
他人のソースを読むことは非常に勉強になります。
と言うわけで、初心者〜プロの方まで様々な人が書いたソースを見て、より良いプログラムを作れるようになろうと言う目論見です。
問題は未来アンカーで踏んだ人が空気を読んだ問題を出しましょう。

解答ソースを貼る人用テンプレ
【C言語歴】 (例)4年
【レベル】 (例)初心者、プロ、学校で習った程度 など
【コンセプト】 (例)処理速度重視、可読性重視、容量重視 など
【コメント】 (例)みっくみくにしてやんよ。など、有れば

長すぎるソースはこちらへ
ttp://codepad.org/

宿題は C/C++の宿題片付けます 130代目へ
pc12.2ch.net/test/read.cgi/tech/1250204272/
相談は C言語なら俺に聞け(入門篇)Part54などへ
pc12.2ch.net/test/read.cgi/tech/1254829314/

296 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 11:26:35 ]
> iの宣言だけはポリシーに反することになるので美しくない。
どゆこと?

297 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 12:57:01 ]
>>296
また古いものをw

>280では、以下の例外を除く変数は全て関数の先頭で宣言している。
但し、ループ制御のiだけはC99やC++でしか通用しない宣言を使っている。
また、>282でも指摘されているが、イタレータもブロックの途中で宣言している。
こういうのをポリシーがないというのだろ。

298 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:33:58 ]
うちも今更>>2をやってみる

【C++言語歴】約10年。
【レベル】いわゆるサンデープログラマ。主にフリーソフト制作等。
【コンセプト】 シンプルに。
【コメント】STLコンテナは簡潔に表記する為にある。本題でvector使うのは逆効果。

#include <iostream>
#include <iterator>

int main()
{
using namespace std;
const int numberOfNumbers = 5;
// 入力
cout << "数字を" << numberOfNumbers << "個入力" << endl;
istream_iterator<double> it(cin);
double sum = *it;
for (int i = 1; i < numberOfNumbers; ++i) sum += *++it;
double average = sum / numberOfNumbers;
// 出力
cout << "合計: " << sum << endl;
cout << "平均: " << average << endl;
// 終わり
return 0;
}

299 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:36:56 ]
【問題2:ワード覆面算】
入力された任意の8文字以内の単語2つからワード覆面算を作成せよ
入力された単語に含まれない文字は適当な記号を用いて表示すること
ただしそれぞれの覆面算は単一の解を持つものとし"浮き"は認めない

【難易度】
80分で中級

【入力例】
バナナ
バナナ

【出力例】
バナナ+バナナ=ナナ◎ [ 499+499=998 ]
バナナ+バナナ=○ナナナ [ 500+500=1000 ]
バナナ+バナナ=△△バ◇ [ 577+577=1154 ]
バナナ+バナナ=△△ナ◎ [ 599+599=1198 ]
バナナ+バナナ=ナ△△△ [ 611+611=1222 ]
バナナ+バナナ=△▽※バ [ 688+688=1376 ]
バナナ+バナナ=△ナ△○ [ 755+755=1510 ]
バナナ+バナナ=△☆バ※ [ 788+788=1576 ]
バナナ+バナナ=△ナ☆◇ [ 877+877=1754 ]
バナナ+バナナ=△◎ナバ [ 899+899=1798 ]
バナナ+バナナ=△バ△○ [ 955+955=1910 ]

【補足】
上記はWikipediaの例"バナナ+バナナ=シナモン"に合わせただけであり
入力される単語2つが同じとは限らない

300 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:42:41 ]
かなりの良スレの予感がするけど自分にはついてけないぜ・・・

301 名前:298 mailto:sage [2010/05/18(火) 22:01:47 ]
覆面算を解く問題はたまに見かけるのでちょっとひねって作成のほうにしてみました。
前回の出題よりは品質あげたつもりなんですがどうでしょう。
80分は作者が実際に解くのにかかった時間が基準なので異論は認めません。

302 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 03:07:45 ]
using namespace std;

ヒェー。

303 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 05:47:06 ]
>>302
それを使うことの弊害を知りつつ使ってるのなら、無駄に恐れることはない。

おまじないのように付けてるのならタダのバカだけど、
おまじないのように避けてる人とそう変わらんよ。

304 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 12:43:18 ]
>>302
標準ライブラリ以外のライブラリは使っていないのだから
故意にcoutという変数を定義するようなことをしない限り名前は衝突しない
#include <iostream>してるんだから構文解析はそこで終わっていて
std名前空間にcoutの定義を探しにいっても追加のコストはほどんどない
と考えて記述が短くなる方を選んでるんだけど何か問題ありますか



305 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 13:16:46 ]
nothing

306 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 15:38:45 ]
おまじないのように付けてるタダの馬鹿ですんません・・・

307 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 15:39:29 ]
>>299
バナナ+バナナ

099+099=198(○ナ○)
100+100=200(○ナナ)

とかは不成立?

308 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 22:55:51 ]
>>307 不成立です

バナナ+バナナ=○ナ○ [099+099=198]
覆面算は同じ文字のところには同じ数字を入れるルールなので
バナナ+バナナ=○ナ△のように記号を変えなければなりません

また数字の先頭が0ではないというのは暗黙の了解になっていて
こういった場合"バ"が0ではないことを利用して解くのが
普通なので099という表記もできません

バナナ+バナナ=○ナナ [100+100=200] については他にも
200+200=400、300+300=600、400+400=800と回答が複数あるので
パズルとして成立しません

Wikipediaに解説があります
ja.wikipedia.org/wiki/%E8%A6%86%E9%9D%A2%E7%AE%97

309 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 00:27:34 ]
そういや、ここってスレタイにはC,C++って入ってるけど、限定する意味あんのか?

310 名前:307 mailto:sage [2010/05/23(日) 03:14:31 ]
>>308
サンクス、了解した。

311 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 04:36:49 ]
お題 (次>>350)
16進テキストをファイル・コマンド・またはgetsから入力して、
バイナリーに変換し、test.txtファイルに落とす。

312 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 05:46:32 ]
%81%AB0%E3%81 とかも。
81 AB 30 E3 81

313 名前:デフォルトの名無しさん [2010/05/25(火) 19:41:39 ]
お題: >>311,312に示す文章にはいくつかの誤りがあります。正しい日本語へ修正しなさい。

314 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 09:39:13 ]
gets()を使えだなんてろくでもない問題、直すほどの価値もない。



315 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 10:03:55 ]
>>314
使わせといてあとでこれこれこういう理由があるから使うな、と言った方が
何でか教えないけどとにかく使うな、よりは覚えると思う

316 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 10:21:26 ]
>>315
そういうのは初心者スレでやれ。

317 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 11:19:19 ]
それは>>314に言ってくれ

318 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 11:29:50 ]
ちょっと待ってくれ。
とどのつまりは>311の説明が下手なことが原因じゃないか。
ここは一つ、>311がお題を提示し直すまで静観しようじゃないか。

319 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 15:08:20 ]
例えば、gets()で1行入力
ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:%E6%A4%9C%E7%B4%A2?search=%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A22010
標準出力には、
E7 89 B9 E5 88 A5 E6 A4 9C E7 B4 A2 E3 82 A6 E3 82 A3 E3 82 AD E3 83 9A E3 83 87
E3 82 A3 E3 82 A2
ファイルには 文字コードUTF-8で、
ja.wikipedia.org/wiki/特別検索?search=ウィキペディア2010

320 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 22:57:18 ]
>>319
何が言いたいんだよ。リンク間違ってるし。
あなたが311でgets()の使い方教えてあげてるつもりなら芯でくれ。
gets()は学校では習うかもしれないけど安全じゃないから誰も使わないの。
そもそもファイルからの入力にはgets()使えないでしょ。(本当は使えるけど。)
もしファイルからの入力はどの関数を使ってもいいのに
標準入力にはgets()を使わなければいけないという意味なら問題がおかしい。

311は出力ファイルは指定しているのに入力ファイルは指定していなかったり
バイナリーファイルの拡張子がtxtだったり
なぜか"%AB0"とか三桁の数字がでてきたり意味不明な上に
16進テキスト(16進数のこと?)とかコマンド(コマンドラインのこと?)とか
単語も日本語の文法もめちゃくちゃなんだからウダウダいってないで直せよ。


321 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:02:13 ]
お題を出す立場じゃなくて、課題を出された方なんだろうな。

322 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:03:04 ]
問題;scanf()で入力して、バイナリー変換し、ファイルに書き出してください。
%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%BC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%81%8Ctxt%E3%81%A0%E3%81%A3%E3%81%9F%E3%82%8A%20


323 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:13:10 ]
>>322 嫌です。

324 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:22:31 ]
URLデコーダー



325 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:25:12 ]
あきらかに宿題だろ。

326 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 03:05:10 ]
ていうか、>>311には文字コード指定されてないんだから、空読みしてオレオレコードで書き出せばいいんじゃないの?

#define ENOUGH_LONG_LENGTH 3
int main(void)
{
char buf[ENOUGH_LONG_LENGTH];
FILE *fp;
int miyazaki = 0xdeadbeef;

gets(buf);
fp = fopen("test.txt", "wb");
fwrite(&miyazaki, sizeof(int), 1);
fclose(fp);
return 0;
}

327 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 03:26:17 ]
>>326
ところが>>322でURLエンコードのデコードをバイナリー変換と呼んでるらしいことが
判明しているのでそれでは正解にならない
つか宮崎って何w

328 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 04:01:43 ]
>>327
deadbeef…(´;ω;`)ブワッ

329 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 08:08:54 ]
>>320
>バイナリーファイルの拡張子がtxtだったり
ftpでbinary modeで*.txtを転送するなんて当たり前のことだろ。

330 名前:319 mailto:sage [2010/05/27(木) 08:19:39 ]
>>326
16進数のASCII文字列を読み込んで、その内容をバイナリーでファイルに出力だ。
gets()して、それは捨てるって書いて無いよ。
デフォルトで使うだろうと予想してたけど。

331 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 08:43:08 ]
>>319
だからきちんと問題書けよ。つーか、課題丸投げなんだろ。宿題スレに逝けよ。

332 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 23:13:26 ]
>>330
問題文を短くしてgets()を使わなければ突っ込まれないと短絡的に考えたのだろうが
あいにくURLエンコーディングには英数字の平文が混ざるので16進数ではないし
実装を比べるスレの趣旨からしてscanf()を指定する必然性も全くないし
URLデコードは文字列から文字列への変換なんだからバイナリーとか発してる時点で馬科決定。
関数の使い方もコンピュータ用語も理解してないレベルで出題するなよ。




333 名前:デフォルトの名無しさん mailto:sage [2010/05/28(金) 00:32:43 ]
#include <stdio.h>
#define ENOUGH_LONG_LENGTH 24
int main(void)
{
  char buf[ENOUGH_LONG_LENGTH];
  FILE *fp;
  int miyazaki = 0xefBeadDe;

  strcpy(buf, "ef Be ad De");
  fp = fopen("test.txt", "wb");
  fwrite(&miyazaki, sizeof(int), 1, fp);
  fclose(fp);
  return 0;
}

334 名前:デフォルトの名無しさん mailto:sage [2010/05/30(日) 10:54:03 ]
お題 (次>>350) 文字コードに関係の無いURLデコード
%と16進文字2桁を標準入力(コマンド引数、ファイル以外)から入力して、
バイナリーに変換し、test.txtファイルに落とす。
%の後に2桁の16進文字が続かない場合は、変換しないでそのまま出力する。
例:
%Y %0X ⇒ 出力無し
%Y0 ⇒ '0'出力
%00 ⇒ '\0'出力
%Aa01 ⇒ '\xaa' '0' '1'出力



335 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 09:13:37 ]
>>281 日本語でオス
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
const int NUM_SIZE = 5;
int main()
{
  int i, temp = 0, sum = 0;
  vector<int> intContiner;

  cout << "5つ数を入力して下さい。" << endl;
  for( i = 0 ; i < NUM_SIZE ; ++i ) {
  // 上のfor文内でiを宣言するなら、sumやtempも移動すべき場所があるべきだろう。
    cout << i + 1 << "番目入力" << endl;
    cin >> temp;
    intContiner.push_back( temp );
  }

  cout << "5つ数の合計" << endl;
  vector<int>::iterator itr = intContiner.begin();
  for( ; itr != intContiner.end() ; ++itr ) {
    sum += *itr;
  }
  cout << sum << endl;

  cout << "5つ数の平均" << endl;
  cout << sum / NUM_SIZE << endl;
}

336 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 17:16:25 ]
>>335
>282

337 名前:デフォルトの名無しさん [2010/06/06(日) 15:00:48 ]
問題:
ジョンにとって縁起のいい数字は4と7で,
他はどうでもいい.ラッキーナンバーとは,
縁起のいい数字を含んだ10進数である.
整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数を挙げよ.

オブジェクトの定義:
クラス名 : TheLuckyNumbers
メソッド名 : count
引数の型 : int,int
返値の型 : int
メソッドの表記 : int count(ints,intb)
として,公的メソッドとせよ.
注:
aの値は1から1,000,000,000まで
bの値は1から1,000,000,000まで

TopCoderでグーグル先生に聞いたら出てきた問題を適当に張ってみる

338 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 19:38:26 ]
a〜b=(1〜b)−(1〜a){a,b:a<b}
ここまで分かった。

339 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 18:49:53 ]
>>337
できたぞ
#include <iostream>
#include <cmath>
using namespace std;

class TheLuckyNumbers
{
public:
int count(int s, int b);
};

int TheLuckyNumbers::count(int s, int b)
{
int digits=0,temp;
int k=0;
if(s<1 || s > 1000000000 || b<1 || b > 1000000000) return 0;
for(int i=s;i<=b;i++)
{
temp=i;
while(temp){digits++;temp/=10;}
temp=i;
while(digits)
{
if(temp % 10 == 4 || temp % 10 == 7) k++;
temp/=static_cast<int>(pow(10.0,digits));
digits--;
}
}
return k;
}

340 名前:339 [2010/06/12(土) 19:07:36 ]
temp/=static_cast<int>(pow(10.0,digits));
digits--;

じゃなくて

temp/=static_cast<int>(pow(10.0,--digits));
だな。

341 名前:339 mailto:sage [2010/06/12(土) 19:25:34 ]
全然間違ってた
while(digits)
{
if(temp % 10 == 4 || temp % 10 == 7) k++;
temp/=10; digits--;
}
で最後だ

342 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 10:22:47 ]
if(s<1 || s > 1000000000 || b<1 || b > 1000000000) return 0; は必要。
始めにdigitを求め無くても、tempを10で割って行ったら0になる、
そうするともっと早い修正になる。

343 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 10:55:40 ]
>>341
7777とかだと一つの数字で+4されないか?

344 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 11:27:16 ]
>>343
そうだな
7777→1個だな
まぁすぐ直せるだろうけど



345 名前:344 mailto:sage [2010/06/13(日) 11:51:22 ]
#include <iostream>
using namespace std;

class TheLuckyNumbers
{
public:
int count(int s, int b);
};

int TheLuckyNumbers::count(int s, int b)
{
if(s<1 || s > 1000000000 || b<1 || b > 1000000000) return 0;

int digits=0,temp;
int k=0;
for(int i=s;i<=b;i++)
{
temp=i;
while(temp)
{
if(temp % 10 == 4 || temp % 10 == 7){ k++; break;}
temp/=10;
}

}
return k;
}

346 名前:342 mailto:sage [2010/06/13(日) 12:25:23 ]
temp%10は2回やる必要なくてtmp=temp%10とかで、俺もやった。

347 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 13:13:26 ]
Javaで貼ってもよかとですか?

348 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 13:24:40 ]
>>347
リンクならOK
本体は
pc12.2ch.net/test/read.cgi/tech/1268003943/l1

349 名前:347 mailto:sage [2010/06/13(日) 13:33:56 ]
ほい

pc12.2ch.net/test/read.cgi/tech/1268003943/674

350 名前:348じゃばじんすげえ mailto:sage [2010/06/13(日) 14:47:13 ]
class TheLuckyNumbers {
public: inline
  static int count(int a, int b) {
    if (a < 1 || a > 1000000000 || b < 1 || b > 1000000000 || a > b) return 0;
    return count(b) - count(a - 1);
  }
private: inline
  static int count(int a) {
    int result = 0, digits/*=0*/, add = 0;
    if ((digits = search(a)) != 0) {
      result = a % digits; a -= result; result += 1;
    }
    digits = 1;
    while (a != 0) {
      for (int i = 0, j = a % 10; i < j; i++) {
        result += (i == 4 || i == 7) ? digits : add;
      }
      a /= 10; add = add * 8 + digits * 2; digits *= 10;
    }
    return result;
  }
private: inline
  static int search(int a) {
    int result = 0;
    for (int digits = 1; a != 0; digits *= 10, a /= 10) {
      if (a % 10 == 4 || a % 10 == 7) {
        result = digits;
      }
    }
    return result;
  }
};

351 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 00:35:58 ]
>>350
コメントくらい書こうぜ。
つーか、問題文にはsの方がbより小さいとは書いてないみたいだけれど。

>>337
再帰でやってみた。
codepad.org/3FZQcU4D






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<118KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef