ページ 1 / 1
ユーザー定義でわからないところがあります
Posted: 2016年7月12日(火) 21:02
by あっくん
C言語について
main関数のところでscanfを使って誕生日を入力して、ユーザー定義で、入力された数字が誕生日に適しているか(13月とか32日と打たれてないか)を判断する。
もし適しているなら1、正しくないなら1以外を返す。という課題を出されたのですがユーザー定義で複数の戻り値を返すのは可能なのですか?そもそも1で返すとか1以外で返すとかの意味がわかりません。ポインタは使わないものとしてください。
先生に聞いても教えてくれませんでした。
Re: ユーザー定義でわからないところがあります
Posted: 2016年7月12日(火) 21:26
by mikko
入力された日付が正しい形式かそうでないかによって、1か1以外(例えば777)のいずれか一方を返せば良いということで、戻り値は1つだと思いますよ。
Re: ユーザー定義でわからないところがあります
Posted: 2016年7月12日(火) 21:28
by みけCAT
あっくん さんが書きました:ユーザー定義で複数の戻り値を返すのは可能なのですか?
複数の戻り値を返すのは不可能だと思いますが、複数の値がセットになった構造体を返すことはできます。
あっくん さんが書きました:そもそも1で返すとか1以外で返すとかの意味がわかりません。
1
を返すとか1以外
を返すとかの間違いでしょう。
あっくん さんが書きました:ポインタは使わないものとしてください。
ポインタを使わずに標準関数のscanfを使って入力を得るのは不可能です。
関数を呼び出してもいいなら(()演算子を用いた関数の呼び出しは、関数を指すポインタを使います)、getchar関数を用いて入力を読み込み、「scanf」はローカル変数にでも使うといいでしょう。
()演算子を用いた関数呼び出しに必要なポインタの使用もだめなら、インラインアセンブラを用いるといいでしょう。
Re: ユーザー定義でわからないところがあります
Posted: 2016年7月12日(火) 21:53
by あっくん
1を返す、1以外を返すという理解は出来ました。ただどの値を返せばいいのかがわからないです。戻り値があるということはなにか計算が必要なのですか?だとしたらifの中には何が入るのでしょうか
Re: ユーザー定義でわからないところがあります
Posted: 2016年7月12日(火) 22:13
by box
あっくん さんが書きました:1を返す、1以外を返すという理解は出来ました。ただどの値を返せばいいのかがわからないです。戻り値があるということはなにか計算が必要なのですか?だとしたらifの中には何が入るのでしょうか
正しければ1を
正しくなければ1以外の任意の値(1じゃなければ何でもよい)を
返すようにすればよいのでは?
Re: ユーザー定義でわからないところがあります
Posted: 2016年7月12日(火) 22:26
by みけCAT
あっくん さんが書きました:ただどの値を返せばいいのかがわからないです。
うーむ、確かに使用する暦が指定されていないので、わからないですね。
仮にグレゴリオ暦を使えばいいとしても、閏年(2月29日)をどうするか、そもそも入力する「誕生日」に年が入るかどうかがわからないので、わからないですね。
そもそも、一般の日付じゃなくてわざわざ「誕生日」と指定されているということは、何が特別な判定が必要なのかな…?
日本や世界の法律などについて調べないといけないのかな…?
あっくん さんが書きました:戻り値があるということはなにか計算が必要なのですか?
戻り値があっても、計算が必要だとは限りません。
今回は不適切でしょうが、例えば常に0を返す実装も考えられます。
あっくん さんが書きました:だとしたらifの中には何が入るのでしょうか
「ifの中」とは何ががよくわかりませんが、多分条件式と、条件式が真(0と等しいとみなせない)の時に実行する式またはブロックでしょう。
条件式が偽(0と等しいとみなせる)の時に実行する式またはブロックも入るかもしれません。
Re: ユーザー定義でわからないところがあります
Posted: 2016年7月12日(火) 23:45
by box
コード:
// 誕生日の入力時に年は入力しない(つまり、閏年の判定は不要な)前提
#include <stdio.h>
int chk_date(int m, int d)
{
// 年は入力しないという前提なので、2月は29日まであるとする
int days[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
// 月が1~12の範囲になければアウト(0を返す。1でなければ何でもいい)
// 月が1~12の範囲にあっても、日が1~当該月の末日の範囲になければアウト(0を返す。1でなければ何でもいい)
// 月の範囲も日の範囲も正しければ、1を返す
return (m < 1 || 12 < m) ? 0 : (d < 1 || days[m] < d) ? 0 : 1;
}
int main(void)
{
int month, day;
printf("誕生日を、月 日の形式で入力してください:");
scanf("%d%d", &month, &day);
printf("正し%sい日付です\n", chk_date(month, day) == 1 ? "" : "くな");
return 0;
}