学校の課題が分かりません。下記が問題文です。
次の返却値と引数の型をもつisOdd関数を定義し,aが奇数なら0以外(たとえば1)を,aが偶数なら0をそれぞれ返却する.返却値は,教整数値の真偽値である.
int isOdd(int a);
/* aが偶数か奇数かを判別する */
main関数では,scanf関数を使って整数xを入力し,isOdd関数を呼んでからxが奇数か偶数かを出力する.
isOdd関数にはprintf, scanfを書いてはいけない.大域変数を使ってはいけない.
実行例(下線部分がキーボード入力,%はコマンドプロンプト)
% ./ex41
整数を入力
3
3 は奇数です
% ./ex41
整数を入力
0
0 は偶数です
% ./ex41
整数を入力
-10
-10 は偶数です
%
以下は私が書いたソースコードですが、どのように間違っているのか見当がつきません。お願いします。
真偽値を返却する関数について
Re: 真偽値を返却する関数について
- includeの前の#が全角になっている
- isOdd(アイ・エス・オー・ディー・ディー)ではなく、is0dd(アイ・エス・ゼロ・ディー・ディー)関数になっている
- 14行目に余計なセミコロンがあるので、is0dd関数の定義ができていない
- is0dd関数のプロトタイプ宣言と定義になるべきもので戻り値の型が違っている
- is0dd関数がmain関数から使われていない
- 「isOdd関数にはprintf, scanfを書いてはいけない」という条件があるのに、is0dd関数の定義になるべきものの中にprintf関数がある
- is0dd関数が戻り値を返していない
- インデントが乱れている
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 真偽値を返却する関数について
「教整数値」とは何ですか?Makoto さんが書きました:返却値は,教整数値の真偽値である.
オフトピック
isOdd関数を呼びさえすれば、その結果を利用する必要は無いのですね。 (名推理)Makoto さんが書きました:main関数では,scanf関数を使って整数xを入力し,isOdd関数を呼んでからxが奇数か偶数かを出力する.
まあ、せっかく呼ぶのだから結果を使ったほうが良さそうですが。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 真偽値を返却する関数について
よく見たら引数も違いますし、どっちの関数も問題文に合っていないですね。みけCAT さんが書きました:is0dd関数のプロトタイプ宣言と定義になるべきもので戻り値の型が違っている
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 真偽値を返却する関数について
みけCATさん回答ありがとうございます。「教整数値」についてですが、問題文の不必要な部分の消し忘れが残った物なので「整数値」です。また、書き直しましたが、main関数上でどのようにprintf()関数を使用して偶数と奇数の場合分けの結果を出力すればよいのか分かりませんでした。
Re: 真偽値を返却する関数について
普通に出力すればよいです。Makoto さんが書きました:main関数上でどのようにprintf()関数を使用して偶数と奇数の場合分けの結果を出力すればよいのか分かりませんでした。
また、xも宣言しなければいけません。
実装例
#include<stdio.h>
int isOdd(int x);
int main(void)
{
int x, n;
printf("整数を入力");
scanf("%d", &x);
n = isOdd(x);
printf("%d は%sです\n", x, n ? "奇数" : "偶数");
}
int isOdd(int x)
{
if(x%2 == 0){
return 0;
}else{
return 1;
}
}
%s → 対応する位置にある文字列(char*型 : 文字列の先頭の文字へのポインタ)を出力する。
X ? Y : Z → まずXを評価する。その結果が0以外(真)ならYを、0(偽)ならZを評価し、その結果になる。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)