C言語関係掲示板

過去ログ

No.1206 入力した数だけ「Hello」を表示する

[戻る] [ホームページ]
No.15846

scanfで困っています。
投稿者---初心者(2004/07/25 00:04:55)


とても初歩的なことですみません。
どうしても問題が解けないのですが。

任意の数だけ(入力した数だけ)「Hello」を表示せよ。
(なるべく変数は少なめに。シンプルに。)
上記の問題で自分なりに精一杯何度も試してみたのですが
実行までに至りません。
アドバイスお願い致します。

#include <stdio.h>

int main(void)
{

    int number ;
    {   
    printf("整数を入力してください->");
    scanf("%d",&number);

    }
    
    int i = 1;
    while(i != number)
    {
        printf("Hello\n");
        i++;
    }      
    return 0;
}



No.15847

Re:scanfで困っています。
投稿者---RiSK(2004/07/25 00:17:20)


# >とても初歩的なことですみません。
#
# 初歩的な事が分かっているならあと一押しと思ってみては?
## なぜそれが分かるのだろうか???

>上記の問題で自分なりに精一杯何度も試してみたのですが
>実行までに至りません。
>アドバイスお願い致します。

えっ? 実行できない?
コンパイルできないという意味ですか?
だとしたらコンパイルエラーの内容を貼り付けてください。

もし、実行できるが望んだ結果ではない場合は
・望んでいる結果
・現在のあなたのソースでの結果
を書きましょう。

ちょこっと直せば正しく動きますよ。
頑張ってください。

P.S.
ハンドルネームは変えた方がいいです。


No.15848

Re:scanfで困っています。
投稿者---たま(2004/07/25 00:28:08)


>えっ? 実行できない?
>コンパイルできないという意味ですか?
>だとしたらコンパイルエラーの内容を貼り付けてください。

貼り付け方がわかりませんでした。すみません。
コンパイルしようとすると
「ここでは宣言できません」といった内容でエラーになるのですが、
これは while()の上の int i=1; を指しているようです。
何故、宣言できないのでしょうか。
ちなみにコンパイラはBorland c++ 5.5.1です。

こんな内容で理解して頂けますでしょうか?




No.15849

Re:scanfで困っています。
投稿者---RiSK(2004/07/25 00:37:13)


>コンパイルしようとすると
>「ここでは宣言できません」といった内容でエラーになるのですが、
>これは while()の上の int i=1; を指しているようです。
>何故、宣言できないのでしょうか。
>ちなみにコンパイラはBorland c++ 5.5.1です。

現在のC言語の規格(C99)ではどこで変数を宣言しても許されますが、
昔は許されませんでした。
Borland C++ 5.5.1 や私が使っている Visual C++ 6.0 のコンパイラは
古いCに対応しているので途中で変数を宣言しようとすると怒られます。

仕方ないので関数の先頭で宣言してください。
int main(void)
{
  int number, i;
  // :

とりあえずコンパイルできたら正しく動くかいろいろ実験してみてください。


No.15850

Re:scanfで困っています。
投稿者---たま(2004/07/25 01:13:20)


アドバイス本当にありがとうございました。
下記のプログラムで無事に正しい実行結果が表すことができました。
本当にうれしかったです!どうもありがとうございました!!

#include <stdio.h>


int main(void)
{

    int number ,i = 1 ;
    {   
    printf("整数を入力してください->");
    scanf("%d",&number);
    
    }
    
    
    while(i <= number)
    {
        printf("Hello\n");
        i++;
    }      
    return 0;
}



No.15851

Re:scanfで困っています。
投稿者---RAPT(2004/07/25 01:41:47)


(なるべく変数は少なめに。シンプルに。)
とのことなので、変数1つでの記述例。

#incluide <stdio.h>

int main()
{
    size_t num = 0;
    printf("整数を入力してください->");
    scanf("%u", &num);
    for(; num > 0; --num){
        puts("Hello");
    }
    return 0;
}



No.15852

Re:scanfで困っています。
投稿者---たま(2004/07/25 09:48:20)


><pre><blockquote>(なるべく変数は少なめに。シンプルに。)</blockquote>
とのことなので、変数1つでの記述例。

#incluide <stdio.h>

int main()
{
size_t num = 0;
printf(<font color="#0000ff">"整数を入力してください->"</font>);
scanf(<font color="#0000ff">"%u"</font>, &num);
for(; num > 0; --num){
puts(<font color="#0000ff">"Hello"</font>);
}
return 0;
}

</pre>

ご親切に大変ありがとうございます。
質問なのですが、
for(; num > 0; --num)←for文の初期値がありませんが
省略しているのですか?
コンパイルは問題ありませんでしたが
初心者なもので、このような表現ははじめてみたのですが・・。
またfor文内処理でデクリメント部分なのですが、
--numはnum--と表現してもOKでしょうか?
こちらも、実行結果にはもんだいないのですが、
よく++iやi++といった表現をみるのですが、
今一よくわかりません。



No.15855

Re:scanfで困っています。
投稿者---RAPT(2004/07/25 12:18:19)


for(; num > 0; --num)←for文の初期値がありませんが
for( 式1 ; 式2 ; 式3 )
{
    // ....
}
は、

式1;
while( 式2 )
{
    // ....
    式3;
}
と同等で、式1・式2・式3 はいずれも省略可能です。そのため、
for(;;){ .. } とすると無限ループになります。


またfor文内処理でデクリメント部分なのですが、
--numはnum--と表現してもOKでしょうか?
--num; は前置デクリメント、num--; は後置デクリメントと呼びます。
単独で記述した場合の副作用はいずれも同等ですが、式中で記述した場合、
評価値が変わってきます。

下記のサンプルプログラムで結果を比較してみてください。

#include <stdio.h>
int main()
{
    int a = 0, b = 0, i, shiki;
    for( i = 0; i < 5; ++i ){
        printf("i = %d\t", i);
        shiki = ++a;
        printf("[++a] 式中 = %d , 結果 = %d\n\t", shiki, a);
        shiki = b++;
        printf("[b++] 式中 = %d , 結果 = %d\n\n", shiki, b);
    }
    return 0;
}

----------------------------------------
i = 0   [++a] 式中 = 1 , 結果 = 1
        [b++] 式中 = 0 , 結果 = 1

i = 1   [++a] 式中 = 2 , 結果 = 2
        [b++] 式中 = 1 , 結果 = 2

i = 2   [++a] 式中 = 3 , 結果 = 3
        [b++] 式中 = 2 , 結果 = 3

i = 3   [++a] 式中 = 4 , 結果 = 4
        [b++] 式中 = 3 , 結果 = 4

i = 4   [++a] 式中 = 5 , 結果 = 5
        [b++] 式中 = 4 , 結果 = 5
----------------------------------------

このことから、以下のことが確認できると思います。
tmp = ++a; は、(++a)が評価され、その結果を tmp に代入している。
tmp = b++; は、tmp に b を代入してから、(b++)を評価している。



No.15933

Re:scanfで困っています。
投稿者---たま(2004/07/27 20:28:11)


for( 式1 ; 式2 ; 式3 )
{
// ....
}
は、

式1;
while( 式2 )
{
// ....
式3;
}
と同等で、式1・式2・式3 はいずれも省略可能です。そのため、
for(;;){ .. } とすると無限ループになります。


またfor文内処理でデクリメント部分なのですが、 --numはnum--と表現してもOKでしょうか?

--num; は前置デクリメント、num--; は後置デクリメントと呼びます。
単独で記述した場合の副作用はいずれも同等ですが、式中で記述した場合、
評価値が変わってきます。

下記のサンプルプログラムで結果を比較してみてください。

#include <stdio.h>
int main()
{
int a = 0, b = 0, i, shiki;
for( i = 0; i < 5; ++i ){
printf("i = %d\t", i);
shiki = ++a;
printf("[++a] 式中 = %d , 結果 = %d\n\t", shiki, a);
shiki = b++;
printf("[b++] 式中 = %d , 結果 = %d\n\n", shiki, b);
}
return 0;
}

----------------------------------------
i = 0 [++a] 式中 = 1 , 結果 = 1
[b++] 式中 = 0 , 結果 = 1

i = 1 [++a] 式中 = 2 , 結果 = 2
[b++] 式中 = 1 , 結果 = 2

i = 2 [++a] 式中 = 3 , 結果 = 3
[b++] 式中 = 2 , 結果 = 3

i = 3 [++a] 式中 = 4 , 結果 = 4
[b++] 式中 = 3 , 結果 = 4

i = 4 [++a] 式中 = 5 , 結果 = 5
[b++] 式中 = 4 , 結果 = 5
----------------------------------------

このことから、以下のことが確認できると思います。
tmp = ++a; は、(++a)が評価され、その結果を tmp に代入している。
tmp = b++; は、tmp に b を代入してから、(b++)を評価している。
</pre>

お返事が遅くなりまして申し訳ありません。
上記のような大変ご親切なご指導大変ありがとうございます。
お陰さまで納得することができました。
本当にありがとうございまた。


No.15959

Re:scanfで困っています。
投稿者---for(;_;)(2004/07/28 15:50:38)


for( 式1 ; 式2 ; 式3 )
{
    // ....
    continue;
}
は、

式1;
while( 式2 )
{
    // ....
    continue;
    式3;
}
と同等ではありませんでした。



No.15962

Re:scanfで困っています。
投稿者---ぽこ(2004/07/28 16:13:18)


当然かと思います。
continueを考慮するなら、

for( 式1 ; 式2 ; 式3 )
{
    // ....
    continue;
  // ....

}
は、

式1;
while( 式2 )
{
    // ....
    式3;
    continue;
    // ....
}
と同等と考えるべきかと思います。




No.15963

Re:scanfで困っています。
投稿者---ぽこ(2004/07/28 16:17:16)


訂正。
式1;
while( 式2 )
{
    // ....
    式3;
    continue;
    // ....
  式3;
}

continueを通らない場合を考えていなかった。^^;


No.15944

Re:scanfで困っています。
投稿者---シャノン(2004/07/28 10:08:13)


>またfor文内処理でデクリメント部分なのですが、
>--numはnum--と表現してもOKでしょうか?

この場合は、どちらでも構いません。
しかし、C++ でクラスを扱うようになると、演算子を前に置いた方が
効率がいいケースがあります。
そのため、単独で使用する場合は前に書く癖をつけておくといいかもしれません。

もちろん、どんな場合でも必ず前に書けというわけではありません。
後ろに書くのが適切な場合は後ろに書かなければなりません。
ただ、どちらに書いてもいい場合は前に書いた方がいい、ということです。