ユーザー定義でわからないところがあります

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あっくん

ユーザー定義でわからないところがあります

#1

投稿記事 by あっくん » 7年前

C言語について

main関数のところでscanfを使って誕生日を入力して、ユーザー定義で、入力された数字が誕生日に適しているか(13月とか32日と打たれてないか)を判断する。
もし適しているなら1、正しくないなら1以外を返す。という課題を出されたのですがユーザー定義で複数の戻り値を返すのは可能なのですか?そもそも1で返すとか1以外で返すとかの意味がわかりません。ポインタは使わないものとしてください。

先生に聞いても教えてくれませんでした。

mikko

Re: ユーザー定義でわからないところがあります

#2

投稿記事 by mikko » 7年前

入力された日付が正しい形式かそうでないかによって、1か1以外(例えば777)のいずれか一方を返せば良いということで、戻り値は1つだと思いますよ。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ユーザー定義でわからないところがあります

#3

投稿記事 by みけCAT » 7年前

あっくん さんが書きました:ユーザー定義で複数の戻り値を返すのは可能なのですか?
複数の戻り値を返すのは不可能だと思いますが、複数の値がセットになった構造体を返すことはできます。
あっくん さんが書きました:そもそも1で返すとか1以外で返すとかの意味がわかりません。
1返すとか1以外返すとかの間違いでしょう。
あっくん さんが書きました:ポインタは使わないものとしてください。
ポインタを使わずに標準関数のscanfを使って入力を得るのは不可能です。
関数を呼び出してもいいなら(()演算子を用いた関数の呼び出しは、関数を指すポインタを使います)、getchar関数を用いて入力を読み込み、「scanf」はローカル変数にでも使うといいでしょう。
()演算子を用いた関数呼び出しに必要なポインタの使用もだめなら、インラインアセンブラを用いるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あっくん

Re: ユーザー定義でわからないところがあります

#4

投稿記事 by あっくん » 7年前

1を返す、1以外を返すという理解は出来ました。ただどの値を返せばいいのかがわからないです。戻り値があるということはなにか計算が必要なのですか?だとしたらifの中には何が入るのでしょうか

box
記事: 2002
登録日時: 13年前

Re: ユーザー定義でわからないところがあります

#5

投稿記事 by box » 7年前

あっくん さんが書きました:1を返す、1以外を返すという理解は出来ました。ただどの値を返せばいいのかがわからないです。戻り値があるということはなにか計算が必要なのですか?だとしたらifの中には何が入るのでしょうか
正しければ1を
正しくなければ1以外の任意の値(1じゃなければ何でもよい)を
返すようにすればよいのでは?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ユーザー定義でわからないところがあります

#6

投稿記事 by みけCAT » 7年前

あっくん さんが書きました:ただどの値を返せばいいのかがわからないです。
うーむ、確かに使用する暦が指定されていないので、わからないですね。
仮にグレゴリオ暦を使えばいいとしても、閏年(2月29日)をどうするか、そもそも入力する「誕生日」に年が入るかどうかがわからないので、わからないですね。

そもそも、一般の日付じゃなくてわざわざ「誕生日」と指定されているということは、何が特別な判定が必要なのかな…?
日本や世界の法律などについて調べないといけないのかな…?
あっくん さんが書きました:戻り値があるということはなにか計算が必要なのですか?
戻り値があっても、計算が必要だとは限りません。
今回は不適切でしょうが、例えば常に0を返す実装も考えられます。
あっくん さんが書きました:だとしたらifの中には何が入るのでしょうか
「ifの中」とは何ががよくわかりませんが、多分条件式と、条件式が真(0と等しいとみなせない)の時に実行する式またはブロックでしょう。
条件式が偽(0と等しいとみなせる)の時に実行する式またはブロックも入るかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

Re: ユーザー定義でわからないところがあります

#7

投稿記事 by box » 7年前

コード:

// 誕生日の入力時に年は入力しない(つまり、閏年の判定は不要な)前提
#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;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る