C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[17]: 偶然できたプログラムの解釈をお願い


(過去ログ 23 を表示中)

[トピック内 56 記事 (1 - 20 表示)]  << 0 | 1 | 2 >>

■9942 / inTopicNo.1)  偶然できたプログラムの解釈をお願い
  
□投稿者/ ツインクル (1回)-(2007/11/07(Wed) 20:28:52)

分類:[C#] 

下記のようなプログラムをつくりました。ボタンを押すと「99y99」と表示されます。
本当はちがうものを作ろうと思っていたのですが偶然おかしなものができてしまいました。
それで興味がわいて、なぜこのプログラムで上記のような「99y99」が表示されるのでしょうか?
おしえてください。

private void button1_Click(object sender, EventArgs e)
{
string x = "";
for (int i = 0; i < 100; i++)
{
x += i ;

if (i % 3 == 0)
{
x += x.Replace(" ", "y");
}

else if (i % 3 != 0)
{
x=" ";

}

textBox1.Text = x;
引用返信 編集キー/
■9944 / inTopicNo.2)  Re[1]: 偶然できたプログラムの解釈をお願い
□投稿者/ カンタービレ (17回)-(2007/11/07(Wed) 20:38:27)
2007/11/07(Wed) 20:40:12 編集(投稿者)
2007/11/07(Wed) 20:39:21 編集(投稿者)

No9942 (ツインクル さん) に返信

デバッガでステップ実行をお勧めしマス。

特に、「x = " "」
っていう今までループでx+=i とかx+=x.Replace(〜)で追加編集しているつもりで
結果を空白1つに初期化してる様子を毎回見てみるといいデス。

ちなみにxはString型でiはInt型ですので
i.ToStringなり文字列に変換することもお勧めしマス。
引用返信 編集キー/
■9945 / inTopicNo.3)  Re[2]: 偶然できたプログラムの解釈をお願い
□投稿者/ Ruku (6回)-(2007/11/07(Wed) 20:50:01)
i == 98 ループ目と i == 99 ループ目以外の意味がありませんね…
引用返信 編集キー/
■9946 / inTopicNo.4)  Re[3]: 偶然できたプログラムの解釈をお願い
□投稿者/ ツインクル (2回)-(2007/11/07(Wed) 21:06:01)
No9945 (Ruku さん) に返信
実を言うと、2ちゃんねるで下記のような問題があったのでおもしろそうなのでチャレンジしてみましたが、完成できず下記のようなプログラムができてしまう困惑している次第です・
(Fizz-Buzz問題」と呼んでいる問題のクラス 1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。となっていますが、3の倍数のときに
数の代わりに「y」と表示させるようにしてみたつもりです)
 
private void button1_Click(object sender, EventArgs e)
        {
            string x = "";
            for (int i = 0; i < 100; i++)
            {
                x += i ; //数を100まで加算する
                
                if (i % 3 == 0)  //3で割り切れたならその数をyに置換する
                {
                    x += x.Replace(" ", "y"); //文字の置換(のつもり)
                }

                    else if (i % 3 != 0)
                    {
                        x=" ";
                        
                    }

                    textBox1.Text = x; //テキストボックスに結果を表示する



                    

引用返信 編集キー/
■9948 / inTopicNo.5)  Re[4]: 偶然できたプログラムの解釈をお願い
□投稿者/ Ruku (7回)-(2007/11/07(Wed) 21:11:14)
FizzBuzz っぽいなぁとは思いましたが…
敢えて答えは書きませんけど。
引用返信 編集キー/
■9950 / inTopicNo.6)  Re[2]: 偶然できたプログラムの解釈をお願い
□投稿者/ ツインクル (3回)-(2007/11/07(Wed) 21:44:40)
No9944 (カンタービレ さん) に返信
> デバッガでステップ実行をお勧めしマス。
>
> 特に、「x = " "」
> っていう今までループでx+=i とかx+=x.Replace(〜)で追加編集しているつもりで
> 結果を空白1つに初期化してる様子を毎回見てみるといいデス。

レスありがとうございます。しかし、愚鈍な私の頭では今ひとつわかりかねます。
引用返信 編集キー/
■9952 / inTopicNo.7)  Re[1]: 偶然できたプログラムの解釈をお願い
□投稿者/ επιστημη (636回)-(2007/11/07(Wed) 22:12:59)
επιστημη さんの Web サイト
> なぜこのプログラムで上記のような「99y99」が表示されるのでしょうか?
> おしえてください。

コンソール・アプリに仕立て直し、for-loop回るたんびにConsole.WriteLine(x)すりゃわかると思う。

引用返信 編集キー/
■9962 / inTopicNo.8)  Re[2]: 偶然できたプログラムの解釈をお願い
□投稿者/ ツインクル (4回)-(2007/11/08(Thu) 07:26:17)
No9952 (επιστημη さん) に返信
> コンソール・アプリに仕立て直し、for-loop回るたんびにConsole.WriteLine(x)すりゃわかると思う。
 ありがとございます。
ただ、コンソールアプリではできたのですが、IDEではどこの記述がおかしのでしょうか?
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int x = 0; x <= 100; ++x) 
            {
                if(x%3==0)
                {
                    Console.Write(("F").ToString());
                }

                    else if (x%5 == 0)
                                        {
                                            Console.Write(("p").ToString());
                    }
                    else if (x % 3 == 0 && x % 5 == 0)
                    {
                        Console.Write(("k").ToString());
                    }


                    else
                    {

                        Console.Write((x).ToString());
                    }
        }
    }
    }
}

引用返信 編集キー/
■9963 / inTopicNo.9)  Re[3]: 偶然できたプログラムの解釈をお願い
□投稿者/ επιστημη (637回)-(2007/11/08(Thu) 08:36:04)
επιστημη さんの Web サイト
> ただ、コンソールアプリではできたのですが、IDEではどこの記述がおかしのでしょうか?

textBox1.Text = x; //テキストボックスに結果を表示する
これじゃダメ。最後にセットしたxでテキストボックスの中身を置き換えてしまう。
xを"追加する"にはならない。

引用返信 編集キー/
■9964 / inTopicNo.10)  Re[3]: 偶然できたプログラムの解釈をお願い
□投稿者/ Mr.T (114回)-(2007/11/08(Thu) 09:08:12)
Mr.Tです、こんにちは。

No9962 (ツインクル さん) に返信
> ■No9952 (επιστημη さん) に返信
>>コンソール・アプリに仕立て直し、for-loop回るたんびにConsole.WriteLine(x)すりゃわかると思う。
> ありがとございます。
> ただ、コンソールアプリではできたのですが、IDEではどこの記述がおかしのでしょうか?

ちょっと何をいいたいのかわかりません。
#IDE?え、いやWindowsFormアプリケーションと言いたいのですか?
コンソールアプリだろうが、WindowsFormアプリだろうが、アルゴリズム(考え方)は一緒です。
#「っていうか、No9962とNo9942とぜんぜん違うんですが...

このNo9962だと、
else if (x % 3 == 0 && x % 5 == 0)
が絶対に実行されません。

おそらく、適用する条件の順番を問題文に書いてある通りに
適用してしまうこと、それが誤ってしまう原因だと思います。

問題文をプログラムに落とす前に、条件をきちんと簡単にまとめて
みることをお勧めします。その上で、各条件の優先順位をつけ、
その適用する順番でよいのかどうかを考えましょう。

あとは、どうやって確かめたらいいのか、プログラムを作る前に
きちんと考える。

では、がんばってください。



引用返信 編集キー/
■9966 / inTopicNo.11)  Re[4]: 偶然できたプログラムの解釈をお願い
□投稿者/ ツインクル (5回)-(2007/11/08(Thu) 10:17:15)
No9964 (Mr.T さん) に返信
> このNo9962だと、
>  else if (x % 3 == 0 && x % 5 == 0)
> が絶対に実行されません。
> では、がんばってください。

ありがとうございます。
下記のように書き直すと実行できました。

 static void Main(string[] args)
        {
            for (int x = 0; x <= 100; ++x) 
            {
                if(x % 3 ==0  && x%5 != 0 )
                {
                    Console.Write(("F").ToString());
                }

                    else if (x % 5 == 0 && x % 3 != 0)
                                        {
                                            Console.Write(("p").ToString());
                    }
                    else  if (x % 3 == 0 && x % 5 == 0)
                    {
                        Console.Write(("k").ToString());
                    }


                    else
                    {

                        Console.Write((x).ToString());
                    }

引用返信 編集キー/
■9967 / inTopicNo.12)  Re[5]: 偶然できたプログラムの解釈をお願い
□投稿者/ ツインクル (6回)-(2007/11/08(Thu) 10:27:33)
No9966 (ツインクル さん) に返信
> ■No9964 (Mr.T さん) に返信

private void button1_Click(object sender, EventArgs e)
        {
            int x ;
            for (int i = 0; i < 100; i++ )
            {
                x += i; //数を100まで加算する

                if (x %3 == 0)  //3で割り切れたならその数をyに置換する
                {
                    x = x.ToString().Replace(" ", "p");

                }

                else if (x%3 != 0)
                {
                    continue;

                }

                textBox1.Text = x.ToString(); //テキストボックスに結果を表示する



            }
            }
WINDOWSアプリのほうを上記のように記述すると、型変換(strig→int)が暗黙的にできませんとエラーがでます。

引用返信 編集キー/
■9969 / inTopicNo.13)  Re[6]: 偶然できたプログラムの解釈をお願い
□投稿者/ ぽぴ王子 (285回)-(2007/11/08(Thu) 10:38:53)
ぽぴ王子 さんの Web サイト
No9966 (ツインクル さん) に返信

> ありがとうございます。
> 下記のように書き直すと実行できました。

うーん、動けばそれでいいの?的なコードですね。
それでも最初の詰まった状態からするとだいぶすっきりしてきてますが。

参考にすべきは

> このNo9962だと、
> else if (x % 3 == 0 && x % 5 == 0)
> が絶対に実行されません。

はもちろんなのだけれど

> おそらく、適用する条件の順番を問題文に書いてある通りに
> 適用してしまうこと、それが誤ってしまう原因だと思います。
>
> 問題文をプログラムに落とす前に、条件をきちんと簡単にまとめて
> みることをお勧めします。その上で、各条件の優先順位をつけ、
> その適用する順番でよいのかどうかを考えましょう。
>
> あとは、どうやって確かめたらいいのか、プログラムを作る前に
> きちんと考える。

こっちですね。
自分が何を目的として、何を書こうとしているのかをしっかりと
把握した上で、それを実現するためにはどうすればいいかを考える
ことが大事です(アルゴリズムを考える、ということです)。

フローチャートってわかります?流れ図ってやつですけど。
まずはそういうあたりから書いてみるといいですよ。
僕も頭の中で考えて、オーバーフローしそうになったとき(意外と
容量少なめなのですぐあふれます)は紙に書いて整理したりとか
やったりします。
ちゃんとした、四角だとか三角だとかの図形を使ったフローチャート
でなくてもいいんです。「xが3で割り切れる?」とか書いて、Yes
とNoの矢印をひっぱって、その先に処理を書いてみるとか、その程度
でいいんです。そうやって頭の中の構造がスッキリすればおk。

あと、FizzBuzz問題は有名なので、ちょっと探すと例題がたくさん
出てきます。わんくまblogでもちょっとしたブームになっていたり
するので、めんどくさいものから超ストレートなものまで、いろいろ
探してみるとみつかると思います。ただ、それを見てできたつもり
になるのではなく、自分で作ったプログラムと答え合わせをしてみる
ような感じでやるのがいいんじゃないでしょうか。
# ちなみに僕のオススメはひろえむさんのやつ。


ところで
> 実を言うと、2ちゃんねるで下記のような問題があったのでおもしろそうなのでチャレンジしてみましたが、完成できず下記のようなプログラムができてしまう困惑している次第です・
これってどこのスレッドでの話でしょうか。
引用返信 編集キー/
■9970 / inTopicNo.14)  Re[4]: 偶然できたプログラムの解釈をお願い
□投稿者/ とおりすがり (3回)-(2007/11/08(Thu) 10:43:20)
No9946 (ツインクル さん) に返信
そろそろ誰かつっこんだほうがいいんじゃないか?
そうそう同じ脳みその構造の人はいないよって。
あえてなのか?…ならしょうがない。w
引用返信 編集キー/
■10056 / inTopicNo.15)  Re[7]: 偶然できたプログラムの解釈をお願い
□投稿者/ ツインクル (7回)-(2007/11/10(Sat) 14:10:29)
No9969 (ぽぴ王子 さん) に返信

詳細なアドバイスありがとうございます。

private void button1_Click(object sender, EventArgs e)
//ボタンを押すと、0から99の数が表示されるが、そのうち3で割り切れる数だけkで表示される
// GUIプログラムを作ったつもりです。
{
int m;
int x;
for (int i = 0; i < 100; i++)
{

x += i; //数を100まで加算する

if (x % 3 == 0)
{
m = x; //3で割り切れる数をmに代入

string s = (string)Convert.ChangeType(m, TypeCode.String); //整数mを文字列に変換
textBox1.Text = s.Replace(" ", "k");  //文字列mをkに置換する

textBox1.Text = x.ToString(); //テキストボックスに結果を表示する

}
}
   

実行すると文字は0から99まで表示されますが下記のようなエラーがでて、3の倍数はkに変換されません。
エラー 未割り当てのローカル変数 'x' が使用されました。

ここ数日この問題が解けなくて頭がいっぱいです。どこがまちがえてるいるのでしょうか?厚かましいお願いですがヒントだけでもおしえてください。
引用返信 編集キー/
■10057 / inTopicNo.16)  Re[8]: 偶然できたプログラムの解釈をお願い
□投稿者/ やまだ (4回)-(2007/11/10(Sat) 15:08:43)
えーと、まずコードについてなのですが。

> x += i; //数を100まで加算する
とありますが、そもそも x の値が初期化されていませんよ。
エラーの直接の原因はこれでしょうかね。

でも、そこを直したからと言って、期待通りの結果にはならないと思います。
ぽぴ王子も指摘されていますが、
> 自分が何を目的として、何を書こうとしているのかをしっかりと
> 把握した上で、それを実現するためにはどうすればいいかを考える
> ことが大事です(アルゴリズムを考える、ということです)。

前回と比べて、if 文の中が複雑になっていますが、まず考えるべきところはそこではないと思います。
コードを書くテクニックの話ではなく、何をつくろうとしているかをもう一度整理した方がよいかと。

たとえば、変数として、m,i,x の3つが使われていますが、これらの意味と使い分けはなんですか?
かえって複雑になっていませんか?
#わたしもついこの間このプログラムを書いてみましたが、変数は1つで十分だと思いますよ。

i は 0 から 99 までループごとに増えていきますよね?では、それを都度 x に加算するとどういう値になると思われますか?

「数字を文字列に変換して、さらにその文字列を置換する」ということをされようとしておられますが、3の倍数のときだけ "k" という文字列を設定すればよいだけではないのでしょうか?

変数mの「何」を"k"に置き換えられようとしているのでしょうか?

あと、TextBox1.Text への代入を複数回すると、最初の代入は上書きされますよね?最初の方の代入には意味がなくなりますよ。

失礼かもしれませんが、コードを書いてみて、動かなかったら一部直して、それでも動かなかったからさらに直して、という形で自分の書いたコードに振り回されている印象を受けます。
落ち着いて、自分がやろうとしていること、その手順をフローチャートなりメモにまとめてみて、それとコードをつきあわせてみてはどうでしょうか?
それでもわからなかったら、FizzBuzz のキーワードで解答例がいっぱい見つかると思いますので、それと自分のコードをつきあわせて何が違っているのかを見てみるとよいかもしれません。

#あ、この辺はぽぴ王子も言われてますね。

引用返信 編集キー/
■10058 / inTopicNo.17)  Re[9]: 偶然できたプログラムの解釈をお願い
□投稿者/ ツインクル (8回)-(2007/11/10(Sat) 15:26:05)
No10057 (やまだ さん) に返信
たいへん明快な説明とアドバイス感謝します。また、がんばって取り組んでみたいと思っています。
本当にありがとうございました。
引用返信 編集キー/
■10257 / inTopicNo.18)  Re[9]: 偶然できたプログラムの解釈をお願い
□投稿者/ ツインクル (9回)-(2007/11/14(Wed) 20:32:04)
No10057 (やまだ さん) に返信
//ボタンを押すと、0から9の数が表示されるが、そのうち3で割り切れる数だけkで表示される
// GUIプログラムを作りたいのです。でもできないのです。(>_<)

○ボタンを押すと、0から9の数が表示されるプログラムは何とかできました。
private void button1_Click(object sender, EventArgs e)

{

string src=" " ;

for (int i = 1; i < 10; i++)
{
src += i+":"; //数を9まで表示する

}


textBox1.Text = src;

{
この後、if文を使って
if(i%3==0)

{//この部分に「もし、表示された数字iを3で割ったときの余りが0になるときに、数字iを文字”k”に変換する、というコードを書けばよいのですよね。
ここでよくわからないのですが、int型でなければ割り算はできませんよね。
このプログラムでは、int型からstring型に変換する必要があるのでしょうか?

意味不明かもしれませんが、よろしくお願いします。


引用返信 編集キー/
■10272 / inTopicNo.19)  Re[10]: 偶然できたプログラムの解釈をお願い
□投稿者/ chamaro (3回)-(2007/11/14(Wed) 23:36:38)
>ここでよくわからないのですが、int型でなければ割り算はできませんよね。
仰ってる事が良く分りませんが、ご自分で『・・・数字iを3で割ったとき・・・』と書かれており、
iはint型ですので、問題があるように思いません。
何が問題なのでしょうか?

>このプログラムでは、int型からstring型に変換する必要があるのでしょうか?
すみません、ここも良くわかりません。
どこの事を仰ってるのでしょうか?
引用返信 編集キー/
■10280 / inTopicNo.20)  Re[10]: 偶然できたプログラムの解釈をお願い
 
□投稿者/ サイトー (5回)-(2007/11/15(Thu) 01:55:52)
No10257 (ツインクル さん) に返信

> 意味不明かもしれませんが、よろしくお願いします。

だいぶ、頭が混乱されているようですね。
いくつか気になる点がありますので、順不同で指摘してみたいと思います。


> //ボタンを押すと、0から9の数が表示されるが、そのうち3で割り切れる数だけkで表示される
> // GUIプログラムを作りたいのです。でもできないのです。(>_<)
>
> ○ボタンを押すと、0から9の数が表示されるプログラムは何とかできました。
=== 中略 ===
> for (int i = 1; i < 10; i++)

まず、このfor文の内容では、1〜9までの数字しか表示されないと思います。
(iは1からスタートして、10より小さい数まで、1ずつ増えています。iはint型、つまり整数なので、10より小さい最大数は9です。よって、1〜9)
for文でどのようにループさせるかは間違いやすいところで、動かしてみてから「あ、やべ」と僕も思います(苦笑)
が、きっちりと「何の数字から始まって」「何の数字で終わる」ようにしたいのか、等号・不等号の考え方は身に着けたほうがいいと思います。


> このプログラムでは、int型からstring型に変換する必要があるのでしょうか?
=== だいぶ戻って ===
> src += i+":"; //数を9まで表示する

勘違いだったらすみませんが、「int型からstring型に変換する」話って、以前、どなたかに指摘されてた内容ですよね。
それを租借できずに苦しんでいるように思えます。
以前指摘されたソレを租借できていないことは、上記の1行を見ると読み取れます。
なぜなら、string型の変数strに、平気でint型のiを代入しているからです。
普通、違う型の変数に、違う型の変数を代入することはできません。
上記のコードがエラーになっていないのは、うまいことc#さんがint型のiを、暗黙的にstringにしてくれているからですが、
プログラマであれば、それを期待してこんなコードを書いてはいけないと思います。(という僕もなんちゃってプログラマですが)
これはたまたま動いているだけ〜に等しいです。
「int型からstring型に変換する」ってのは、この部分のことで、
src += i.ToString() + ":";
とすべきだと思います。
(ということで、以前ツインクルさんがやっていた「sringをstringに変換」しているソースの奇妙さ、納得できませんか?)


> この後、if文を使って
> if(i%3==0)
>
> {//この部分に「もし、表示された数字iを3で割ったときの余りが0になるときに、数字iを文字”k”に変換する、というコードを書けばよいのですよね。

うむむ。よいのかな。

ツインクルさんのロジックは、
一度0から9の数字を並べた文字列を作り、
その後、その文字列から"3の倍数"の数字部分を"k"に文字列変換
・・・というものですか?
そういうロジックもアリだとは思いますが、ちょっと面倒臭い方法ですね。

でもまあ、上記の「後で文字列変換するぜ」方式をとるというのであれば、
string.replace()メソッドあたりが役にたつと思います。がんばってみてください。
僕がそのようなロジックで書くのであれば、
もう一回for文で0〜9まで回し、その中でif文を使って3の倍数であるものを割り出し、その数字をkにstring.replace()する・・・かな。

これで実現できたら、また違うロジックで色々やってみるのもいいのでは?
またわからなくなったり、こちらの説明が下手な部分があれば(たくさんあると思いますが;)質問してくださいね。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 | 2 >>

管理者用

- Child Tree -