【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20055

条件分岐
投稿者---c言語歴3ヶ月(2005/02/17 22:39:52)


質問させてください

void func0(void)
{
    printf("func0\n");
}

void func0(void)
{
    printf("func0\n");
}

int main(void)
{
    int n;
    scanf("%d",&n);
    if(n==0)
        func0();
    else
        func1();
    return 0;
}

上記のプログラムをif及びswitchを使わずに書けと言われて、
私は次のプログラムを書きました

int main(void)
{
    int n;
    scanf("%d",&n);
    while(n==0)
    {
        func0();
        return 0;
    }
    func1();
    return 0;
}

これを提出したら、今度は、do while for も使わずに書きなさい
と言われてしまいました。
昨日、この掲示板を見て、関数へのポインタというのを使えばいいのかなと思ったのですが
0以外の数字が入力された場合のことを考えると、使えないと思いました・・・

どなたか、ヒントだけでも教えて頂けないでしょうか






この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:条件分岐 20056 c言語歴3ヶ月 2005/02/17 22:44:00
<子記事> Re:条件分岐 20059 あかま 2005/02/17 23:39:43
<子記事> Re:条件分岐 20075 NykR 2005/02/18 16:30:28
<子記事> Re:条件分岐 20077 かずま 2005/02/18 19:57:06


No.20056

Re:条件分岐
投稿者---c言語歴3ヶ月(2005/02/17 22:44:00)


>
訂正です

void func0(void)
{
    printf("func0\n");
}

void func1(void)
{
    printf("func1\n");
}

int main(void)
{
    int n;
    scanf("%d",&n);
    if(n==0)
        func0();
    else
        func1();
    return 0;
}

の間違いでした
申し訳ございません





この投稿にコメントする

削除パスワード

No.20057

Re:条件分岐
投稿者---Blue(2005/02/17 22:58:35)


三項演算子を使うのでしょうかねぇ。

#include <stdio.h>

void function0( void );
void function1( void );

typedef void ( *FUNC )( void );

int main( void )
{
    FUNC func;
    int n;

    scanf( "%d", &n );

    func = ( ( n == 0 ) ? function0 : function1 );
    ( *func )();

    /* 関数ポインタを使わない場合 
    ( n == 0 ) ? function0() : function1();
    */
    return 0;
}

void function0( void )
{
    puts( "function0" );
}

void function1( void )
{
    puts( "function1" );
}




この投稿にコメントする

削除パスワード

No.20058

Re:条件分岐
投稿者---c言語歴3ヶ月(2005/02/17 23:30:35)


Blueさん。有難うございます!
「三項演算子」について調べてみました。
こんなものがあったとは・・・

自分の勉強不足を思い知らされてしまって恥ずかしいです。
本当に有難うございました。


この投稿にコメントする

削除パスワード

No.20059

Re:条件分岐
投稿者---あかま(2005/02/17 23:39:43)


>昨日、この掲示板を見て、関数へのポインタというのを使えばいいのかなと思ったのですが
>0以外の数字が入力された場合のことを考えると、使えないと思いました・・・
関数ポインタを使いつつ0以外のチェック。にしても変な問題ですね。

#include <stdio.h>

void func0(void)
{
    printf("func0\n");
}

void func1(void)
{
    printf("func1\n");
}

typedef void (*FUNC)(void);
FUNC func[] = {func0,func1};

int main(void)
{
    int n;
    scanf("%d",&n);
    n && (n = 1);
    func[n]();
   
    return 0;
}



この投稿にコメントする

削除パスワード

No.20060

Re:条件分岐
投稿者---Blue(2005/02/17 23:49:59)


>   n && (n = 1);
これはうまいですね。思いつかなかった。

> にしても変な問題ですね。
ですよね。どんどん理解しにくいソースになりそうw



この投稿にコメントする

削除パスワード

No.20061

Re:条件分岐
投稿者---c言語歴3ヶ月(2005/02/18 00:09:15)


有難うございます。
n && (n = 1);
の意味がわかりません

「&&」で検索したところ、
「||」と「&&」は、
左オペランドで結果が確定すれば右オペランドを省略すると書いてありました。
この性質を利用したということですか?


この投稿にコメントする

削除パスワード

No.20062

Re:条件分岐
投稿者---Blue(2005/02/18 00:18:21)


n(1) && n = 1(2)

例えば
n = 0 の場合

(1)の結果は 偽 になります。( (1)は n != 0 の意味です。)
よって && 以降の (2) の処理は走りません。
したがって n は 0 のままです。

n < 0 の場合
(1)の結果は 真になり、(2)の処理が行われます。
したがって n は 1 に変更されます。




この投稿にコメントする

削除パスワード

No.20063

Re:条件分岐
投稿者---Blue(2005/02/18 00:21:40)


>n < 0 の場合
またタグ間違えた。orz (&gt;と&ltね)

n > 0 ですね。

って、 n != 0 なら何でもいいんですけど。



この投稿にコメントする

削除パスワード

No.20065

Re:条件分岐
投稿者---c言語歴3ヶ月(2005/02/18 00:43:29)


あかまさん、Blueさん。
理解することができました
解かりやすい説明をしてくださって
本当にありがとうございました。



この投稿にコメントする

削除パスワード

No.20066

Re:条件分岐(訂正)
投稿者---Blue(2005/02/18 01:07:40)


ちょっと説明足りませんでした。突っ込まれる前に訂正します。


>(1)の結果は 偽 になります。( (1)は n != 0 の意味です。)
>よって && 以降の (2) の処理は走りません。
(1)の結果は 偽 になります。( (1)は n != 0 の意味です。)
&&演算子は (1)の結果だけで (1) && (2) の結果が 偽 だと確定します。
よって && 以降の (2) の処理は走りません。

>(1)の結果は 真になり、(2)の処理が行われます。
(1)の結果は 真になり、この結果だけでは全体の結果( (1) && (2) の結果)
が確定せず、そのために(2)の処理が行われます。



この投稿にコメントする

削除パスワード

No.20075

Re:条件分岐
投稿者---NykR(2005/02/18 16:30:28)


ほかにですね。

!演算子の
非ゼロに適用すると0になり、
ゼロに適用すると1になる
という性質を利用する
という手もありますよ。

>             関数へのポインタというのを使えばいいのかなと思ったのですが
> 0以外の数字が入力された場合のことを考えると、使えないと思いました・・・


この投稿にコメントする

削除パスワード

No.20077

Re:条件分岐
投稿者---かずま(2005/02/18 19:57:06)


> 昨日、この掲示板を見て、関数へのポインタというのを使えばいいのかなと思ったのですが
> 0以外の数字が入力された場合のことを考えると、使えないと思いました・・・
関数へのポインタは不要です。

    n ? func1() : func0();

または、

    n && (func1(), 1) || (func0(), 0);



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧