-2

関数への入力が無効な場合 (つまり、身長または体重のいずれかがゼロより小さい場合) に、関数 getCategory() が "invalid" という単語を出力する代わりに (つまり、 printf を使用する代わりに)、 "invalid" を返すようにします。助けてください:

#include<stdio.h>
#include<conio.h>

char getCategory(float height,float weight)
{
    char invalid = '\0'; 
    float bmirange;

    if(height<=0 || weight<=0)
        return invalid;
    else
    {
        height=height*0.01;        //1 centimeter = 0.01 meters
        bmirange=[weight/(height*height)];

        if(bmirange< 15 )
            return starvation;
    } 
}

int main()
{
    char Category;
    float height,weight;

    printf("enter height");
    scanf("%f",&height);

    printf("enter weight");
    scanf("%f",&weight);

    Category=getCategory(height,weight);

    if(Category == 0)
        printf("invalid");
    else
        printf("%c", Category);
 }
4

6 に答える 6

2

注:元の質問は何度も変更されており、コードも同じように頻繁に変更されており、反復ごとに新しいエラーが発生しています。元のコードに回答したので、この回答を残します。履歴を参照してください。この回答の下には、コードの代わりにアドバイスを提供する更新があります。

うーん、アスタンダーは彼の答えを削除しました。しかし、おそらくこれはあなたが実際に持っているべきものです:*

char getCategory(float height,float weight)
{
    char invalid = '\0';

    if(height<=0 || weight<=0)
        return invalid;

    return 'c';   /* do something for the valid cases */
}

*もともと質問に含まれheight || weight <= 0ていて、 variable の値がありませんでしinvalidた。

コードに関する注意:
適切なインデントを使用すると、プログラムの流れがより明確になります。これが実際にあなたの意図であると仮定して、私はあなたのif文を修正しました。最後の行には、質問で現在省略しているものを含める必要があります。最初の行に初期化を追加しました。これは、値を持たないよりも値を持つ方が良いためです (つまり、初期化しないと、実際には何でもかまいません)。

呼び出しコードでは、次のことができます。

Category = getCategory(height, weight);
if(Category == 0)
    printf("invalid");
else
    printf("%c", Category);

意図した場合、実際には「無効」という単語が出力に出力されます。


更新:質問の新しいテキストに基づいて、質問者が何か他のものを望んでいることは明らかであるため、ここに新しい回答があります。上記はそのままにしますが、元の質問でも有効です。

ここで、「無効」という単語を出力しないように、また無効なケースに特別な値を使用しないように求めています。代わりに、 return を要求します。これは、値が「無効」の文字列を返すと理解しています (それ自体は、まだ特別な値を返しています)。"invalid"

あなたはそれをすることはできません

要するに、それはできません。現在の関数の戻り値の型はcharです。私はあなたの関数の目的を知りませんが、あなたはそれにいくつかの考えを与えたと確信しています.aを使用する理由がありcharます. char には 1 文字しか含めることができません。そして、「無効」という言葉は複数の文字です。いくつかのオプションがあります。最適なものを選択してください。

他の方法

  • 戻り値の型をstringではなく に変更しcharます。これには、関連するすべてのコードの再設計が必要です。
  • 特別な値を返すことで解決します。関数の本体は表示されませんが、通常は返されない場合は\0、上記の例のようにその値を使用できます。もちろん、他の char 値を選択することもできます。
  • 例外を発生させ、本体で try/catch を使用します。ただし、C++ ではなく C を使用します。C のC++ スタイルの例外処理の使用について説明するリンクを次に示しますが、これは少し範囲外である可能性があります。C の学習は、その時点で小さなステップで行うことをお勧めします。

一般的なベスト プラクティスとは

通常の状況では、特殊なケースの値 (C やアセンブラーなどの古い言語またはより基本的な言語で一般的) または例外 (C++、Java、Python などのより構造化された言語で一般的) のいずれかを選択するのが一般的です。特殊なケース (無効な入力など) のために完全な関数を変更することは、一般的に悪い習慣と考えられています。

どうして

代わりに、関数の呼び出し元がこれらの特殊なケースに対処する必要があります。この理由は、プログラミングにおける非常に重要なルールです。関数は、何か悪いことが起こった場合 (不正な入力)、その関数のユーザーが何をしたいのかを事前に知ることはできません。「不正な入力」を出力することを選択する場合 (コマンドライン ユーザーの場合)、プログラムを終了する場合 (ライブラリ内の場合)、無視して何もしない場合 (自動処理の場合) があります。要するに、達成しようとしていることは、別の方法で達成しようとする必要があります (上記のオプション 2 と 3、および私の元の解決策を参照してください)。

教師と教科書

このアプローチを使用することは、一般的なコンピューターの慣行に従っているため、はるかに簡単であり、(将来の) 同僚にとっても理解しやすいものです。もちろん、あなたの課題や教科書を見たことがないので、彼らがどの方向に解決策を望んでいるのかはわかりませんし、最初にあなたに間違った道を示す教科書や教師になることはありません。そして、あなたに正しい道を示します。

于 2009-12-04T15:34:57.290 に答える
1

getCategory メソッドは常に返されるとは限りません (if ステートメントのため)。また、ifステートメントの高さについてもわかりません。メソッドの最後に別の return invalid を追加します。

char getCategory(float height,float weight)
{
    char invalid;
    if(height<=0 || weight<=0)
       return invalid;
    return 0
}
于 2009-12-04T15:32:07.443 に答える
0

ちなみに、関数getCategoryには、使用も宣言もされていない変数があります - starvation。それはどこから来たのですか?それがグローバル変数であるとは思えません。

また、変数bmirangeは意味がなく、コンパイルされません

bmirange=[体重/(高さ*高さ)];

ご覧のとおり、これは左側の式 (LHS) ですが、式の右側 (RHS) で配列添字演算子を使用しています。それは違法な発言です!

そこにはどんな意図があったのですか?それは一対の括弧であることを意味していましたか?

これを確認できますか?

OPはエラーの内容や、何が起こっているのかについての説明を明確にしておらず、OPを満たさないコードが投稿されてしまうため、多くの回答が混乱しています。

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2009-12-05T14:10:53.557 に答える
0

上記のコードの多数のエラーを確認するには、(非常に注意深く) 教科書に目を通す必要があります。
1、getCategory でのテストは、ほぼ確実に、やりたいことを実行しません。
2、場合によっては無効を返します(ただし、すべてではありません。#1を参照してください)。ただし、 as invalid に既知の値がないことを知る方法はありません。
3. それ以外の場合、getCategory は値をまったく返さない

于 2009-12-04T15:33:20.593 に答える
0

という名前の変数を定義していますinvalid。その内容は未定義です (-128 から 127 までの任意の値になります)。この変数を返すと、何でも返されます。変数を返す前に変数に何かを代入しますinvalidか? 例えば


char invalid;
invalid = 'i';
if ( ... ) {
  return invalid;
} else {
  return 0;
}
于 2009-12-04T15:34:51.230 に答える
0

無効は何にマップする必要がありますか? 次のような規則が必要です。

char invalid_category = '?';

多分:

#define INVALID_CATEGORY '?'

これは、呼び出し元のコードがアクセスできるように、getCategory 関数の外部で定義する方が適切です。

また、有効な引数が渡されたときにコードが何を返すかは明らかではありません。

于 2009-12-04T15:35:10.927 に答える