ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ホーム > コミュニティ > PC、インターネット > C言語とC++言語 > トピック一覧 > お題をひたすら解くトピック

C言語とC++言語コミュのお題をひたすら解くトピック

  • mixiチェック
  • このエントリーをはてなブックマークに追加

コミュ内全体

週替わり、月替わりで提示されたお題をC/C++でひたすら解くトピックです。

/******** 心得 ********/
一. typoやバグ、効率、最適化は深く考えない。アイディアの実践やコダワリを重視すべし。
一. 初心者の参加は 大 歓 迎。失敗や考え違いを恐れるなかれ。
一. 簡単に見えてこそ奥が深い。よってお題はできるだけ単純なものにすべし。
一. お題の仕様は曖昧でも良し。むしろ足りない仕様をキラリ☆と光るアイディアで補うべし。
一. 短く答えるべし。

お題は頃合を見て誰かがテキトーに振っちゃってくださいm(_ _)m
学校の課題をお題にするのもありだぞっ(コラ

お題の例:
http://mixi.jp/view_bbs.pl?id=680219
http://mixi.jp/view_bbs.pl?id=434052

コメント(413)

369で提示されたお題を、如何にしてC/C++でひたすら解くか。
こう答えましょう。

> この関数に関して、find 見つからなかった時、変数に何が入ると仮定していますか?
そのような場合まで考えていません。

> 空白とタブが両方入ってない時に各変数の値がどうなって、最終的に何が返ってくるか?
未定義です。

> 空白が 3 文字目に入っていて、タブが入ってない時に、各変数がどうなって、最終的に何が返ってくるか?
spaceには2が格納されます。
最終的に返ってくる値は未定義です。

> 空白が 5 文字目に入っていて、タブが 3 文字目に入っている時、各変数がどうなって、最終的に何が返ってくるか?
spaceには4が格納され、tabには2が格納され、最終的には3が返ってきます。
下記のように、完璧に丸投げだというのはわかったけど、「お題」には全然なっていないので別なところでやりましょうね:-)
http://mixi.jp/view_bbs.pl?id=3577496&comm_id=357462
 まあ、あれだ、授業を受けただけでプログラムを書けるようにはならないだろうからなあ。よくて十人に一人ってとこでしょ。俺もラーメン一杯で何回か書いてやった。嘘でも情報系学科でないというなら工学部生でも同情の余地はあるんだよな(特に化学系生物系)。

 問題は、態度が悪いんだよね。特に……

>関数の説明をどうせ書かなければならないので、以下の要領で書いてもらえますか?

これ。間違っててもいいから自分で書いてみて、「……これで合ってますか?」というならまだ話が分かる。プログラムの骨組だけ書いて感謝されるならまあ書きましょ。だが劣等生のレポート全部面倒みるなんて、2、3万くらい貰ったって嫌だ。10万超えたらさすがに心が動くがな ミ゚∀ ゚ ミ
http://mixi.jp/view_bbs.pl?id=3577496&comm_id=357462
> なんですけどエラーがかなり出てしまいます・・・

一応コンパイルはしてるのかな?
コンパイルとか動作確認さえもできないレベルの可能性もあるなと思ってたけど。
int main(void)
{
 for(;;){
  sleep(31556952);
  puts("Happy new year!");
 }
 return 0;
}
system( "echo あけましておめでとう。今年も猫年だにゃあ" );

毎年使えます
こ、こんな感じでだめだったらすいません・・・orz

#include <string>
#include <sstream>
#ifdef WINDOWS
#include <windows.h>
#else
#include <unistd.h>
#endif
using namespace std;

class HappyNewYearCountDown
{
private:
 unsigned int Count;
 bool IsNewYear;
public:
 void Reset(unsigned int value) {Count = value; IsNewYear = false;};
 bool IsCounting() const {return !IsNewYear;};
 string Down() {
  ostringstream ostr;
  if(Count) {
   ostr << Count << "!";
   Count--;
  } else if(!IsNewYear) {
   IsNewYear = true;
   ostr << "A Happy New Year!";
  }
  return ostr.str();
 };
 HappyNewYearCountDown(unsigned int count) {Reset(count);};
};

int main(int argc, char* argv[])
{
 HappyNewYearCountDown h(10);
 do {
  cout << h.Down() << endl;
  if(h.IsCounting()) {
#ifdef WINDOWS
   Sleep(1000);
#else
   sleep(1);
#endif
  }
 } while(h.IsCounting());
 return 0;
}
魚ちょこさん


この関数に関して、find 見つからなかった時、変数に何が入ると仮定してい
ますか?
関数の説明をどうせ書かなければならないので、以下の要領で書いてもらえま
すか?

・空白とタブが両方入ってない時に各変数の値がどうなって、最終的に何が返っ
てくるか?
・空白が 3 文字目に入っていて、タブが入ってない時に、各変数がどうなっ
て、最終的に何が返ってくるか?
・空白が 5 文字目に入っていて、タブが 3 文字目に入っている時、各変数が
どうなって、最終的に何が返ってくるか?



上のは教授の指摘そのまま載せたものです・・・
書き方が悪くて誤解を招くような書き方をしてしまいました。
協力よろしくお願いします。
> つぎのような表を作り、それを if 文で実現するにはどうしたらいいでしょうか?
>
> x\y | npos | それ以外
> --------+------+---------
> npos | |
> --------+------+---------
> それ以外| |
>
>
> str.find() の値は
> ・str.npos
> ・0から文字列の長さ-1 の値
> のどちらかになります。
> > }else if((y)&&(x==str.npos)){
> が成立するのは
> (y が0 以外、つまり npos か 1 から文字列の長さ -1 )かつ (xが npos)
> という場合です
> 上のは教授の指摘そのまま載せたものです・・・

コレは言われなくても想像つくし、指摘されてるのはそういうことじゃないって、分からないんだろうか?
>さとし

 残念だけど、388 は致命的だなあ(他に行く処あるだろ?)。

◆ 冒頭から長い引用を書くのはまぎらわしくて不親切だと思わない?(しかも再掲)

◆「書き方が悪くて誤解を招くような書き方をしてしまいました。」

「書き方が……書き方を……」 「書き方」を繰りかえさないでもすむと思わない?
「書き方が悪くて誤解を招いてしまいました。」
「誤解を招くような書き方をしてしまいました。」
「誤解を招くような悪い書き方をしてしまいました。」

いかにも頭悪そうに読めるんだよね。この分だとこちらがいくら書いても相手は正しく理解できないだろう、と想像しちゃう。

◆「協力よろしくお願いします。」

「協力」とは「ある目的のために力を合わせること」。この場合、

1. 君に力がない。
2. 力を借りて得をするのは君だけ。
3. 力を貸すことに何の義もない。むしろ不義。

こういうとき普通「協力」と言わない。「助力」「救済」なら分かるが……。
#include <iostream>
void main()
{
 while(1)
  std::cout<<"喪中です。";
}
はじまして。もう一つの掲示板で、自分の勉強にもなるからいいかな、と思って答えてましたが、本人の為にも果たして答えて良かったものだろうかとちょっと悩んでます。(それに自分にももうすぐ共通一次が・・)
あとコード以外の部分が完全無視されてるのが少し悲しかったです。
ネズミにチーズを与えると, 次はミルクをよこせと言ってくる
ならば喜んでミルクを差し出そう
…賞味期限を確かめていないけれど
そろそろお題でも。

int型の数値をN進数の文字列に変換。
ただし
-16 <= N && N <= -2 || +2 <= N && N <= +16。

ちなみに、-2進数と10進数の対応は
0000 (0)
0001 (1)
0010 (-2)
0011 (-1)
0100 (4)
0101 (5)
0110 (2)
0111 (3)
1000 (-8)
1001 (-7)
...
この例からだけでは、 -N進法の定義が(僕には)わかりません。
1000 (-8)
1001 (-7)
abcd (a*-8 + b*4 + c*-2 + d)

N進法で表記された値の下位から数えたx桁目 (最下位は0)
の重さは pow(N,x)。

-3進法ならpow(-3,x)になるので、
最下位の桁からそれぞれの重さを見ると
1, -3, 9, -27, ...
N>0のときは負の数は - 記号を用い、N<0 のときは、用いないわけですね。それとも-を用いずに補数表現?

つまり、-12を16進数であらわすと、 -C で正解という題意?
そういうことなら、とりあえすダサいこーどはできた。。。
10進数-12は-16進数14になってほしいですけど
最初のうちはダサくても何でもやっちゃいましょう
もちろん、-12(10進)→ -C(16進)、14(-16進)とはなっています。
#define MAXDIGITS (LONG_BIT*8+2)

void convert(int n, int x)
{
 int digits[MAXDIGITS];
 int i,j,w;
 int sign, neg;
 bzero(digits, sizeof(digits));

 if (n>0) {
  sign=1;
  if(x<0) {
   neg=1;
   x= -x;
  }
 } else {
  sign= -1;
  n=-n;
  neg=0;
 }
 for(j=0;x;j++) {
  w=x %n;
  if(w<0) {
   digits[j] = n+w;
   x = sign*( x/n - 1);
  }else {
   digits[j]= w;
   x= sign* x/n;
  }
 }
 i=j;
 if(neg)putchar('-');
 for(j=i-1;j>=0;j--)
  putchar("0123456789ABCDEF"[digits[j]]);
 putchar('\n')
}

bzeroをつかってるとこなど、1980年代の技術水準で書かれたコードですが。MAXDIGITSの計算式に理論的根拠がないのが最大の欠点。+2で足りるのか?。番兵として印刷される桁数より1つ余分につかうので。
文字列に変換というお題ですが、いきなりstdoutに出力しちゃってます。
-3進数で21という表現なら、その値は10進数で表現すると-5。書き換えると
21(-3) == -5 です。さらに
210(-3) == 15
122(-3) == 5
1220(-3) == -15
つまり、右端に"0"を1つ書き足せば、-3倍に。

ということで-3進数の場合、
-5を与えて "-122" ではなく "21" という出力にしたいなら、
最初に負から正にする処理で
-1をかけるのではなくて、
-3をかけておいて (15にしておいて)、
そのあと従来通り計算すれば "210" になり、
一番最後に書くはずの "0" を書かなければ "21" ができます。
>>410の手っ取り早いを取ると、オーバーフローの可能性がでてきて
値の上限がintの枠より小さくなるのが欠点。
ひとまず "-122" という形で求めておいて、
あとで変換かける手もありですね。
僕のプログラム(409)でも、convert(-3,-5)で21が出力されます。最初に-1をかけているのは、 n>0で負の数を扱うときのみです。
>412
なるほど。失礼しました。
なんだかいろんな手法ができそうですねえ。
さいしょ、あの8倍くらいのコード量だったのですが、重複コードを統合したり、場合分けする必要のないところをマージしていって、かなり行数が減りました。

最初は、N進数に変換した後、桁ごとに加工して、 -N進表現に直すというアルゴリズムだったのですが。

ログインすると、残り386件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング