[表示 : 全て 最新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/

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