質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • C

    3560questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

int型関数の強制終了について

解決済

回答 6

投稿

  • 評価
  • クリップ 0
  • VIEW 208

masuter0413

score 8

学校で関数ポインタの練習をしています。
簡単なプログラムの課題がでたのですが分からないことが1つあります。
void型は"return-1" で強制終了すると思うのですが、int型の関数ではどのようにして強制終了すればよいですか?
課題は、2つの値(int型整数)を受け取って演算を行うというものです。
ユーザは1~4の値入力に
より演算の種類を決定します。
"div関数において0で割り算する場合、エラーを返して強制終了すること"という条件があります。
現在は、printf()でerrorと表示するだけで、特別な値は返していません。
エラーを返して強制終了はしていないと思うのですが、どのような値を返せばいいでしょうか?

#include<stdio.h>

int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int divi(int a, int b);

int main() {
    int cond;
    int x, y;
    int(*pA)(int a, int b);
    int(*pS)(int a, int b);
    int(*pM)(int a, int b);
    int(*pD)(int a, int b);
    pA = add;
    pS = sub;
    pM = mul;
    pD = divi;
    printf("Please Input num1 :");
    scanf("%d", &x);
    printf("Please Input num2 :");
    scanf("%d", &y);
    printf("Please Input Operator :");
    scanf("%d", &cond);
    if (cond == 1) {
        printf("num1 + num2 = %d \n", (*pA)(x, y));
    }
    else if (cond == 2) {
        printf("num1 - num2 = %d \n", (*pS)(x, y));
    }
    else if (cond == 3) {
        printf("num1 * num2 = %d \n", (*pM)(x, y));
    }
    else if (cond == 4) {
        if (y == 0) {
            printf("error\n");

        }
        else {
            printf("num1 ÷ num2 = %d \n", (*pD)(x, y));
        }
    }
    else {
        printf("error \n");
        return -1;
    }

    return 0;
}

int add(int a, int b) {
    return a + b;
}
int sub(int a, int b) {
    return a - b;
}
int mul(int a, int b) {
    return a * b;
}
int divi(int a, int b) {
    return a / b;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+1

強制終了する、というのが意味不明です
どういうことを想定されてますか?

void型の関数というのは戻り値を返さない関数です
return -1;
という記述はできません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

void型は"return-1" で強制終了すると思うのですが、

そんなことはありません。void型の関数は値を返しません。

int型の関数ではどのようにして強制終了すればよいですか?

「強制終了」というのは、普通はプログラムをそこで終了させると言うことなので、exit関数を使います。
exit(1);等と、非ゼロの整数を引数にして呼び出してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

"div関数において0で割り算する場合、エラーを返して強制終了すること"という条件

がありますが「強制終了」という言葉に違和感を感じました。
IT用語辞典では、強制終了の事を以下のように記述しています。
「強制終了とは、実行中のソフトウエアを動作状況にかかわらず強制的に終了させることである。アプリケーションの暴走や停滞などにより、通常の手続きでは終了できなくなった場合に行われる。強制終了すると、保存していない編集中のデータは失われる。」
私もこのIT用語辞典の説明に特段、異議はありません。
質問者さんのコードを見ると割り算計算で分母が0の時の対応(0割チェック)を行っており、正しくプログラム的に制御しているので、通常の手続きで終了できなくなることはありません。
従って、プログラムはゼロ割対応を行っているので、0割チェックの時にreturn -1で返っていないことを除けば大筋では、このままでよいと思います。
質問者さんは「エラーを返して強制終了」に当惑しているのではないでしょうか。
私はこのようなときは「エラーを返して強制終了」ではなく「エラーを返してエラー終了」のような表現にします(エラー終了の反対が正常終了。まあ用語はきちっとしていないのは確かですが)。
せっかく学校に通っていて教えてくれる先生がいるのですから、自分が調べたこと、ここ(teratail)で得た情報などでコミュニケーションを通じて向上することを期待します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

こんにちは。

"div関数において0で割り算する場合、エラーを返して強制終了すること"という条件があります。

多くの処理系では、エラーを表示して強制終了しますよ。
特別なことはしなくても条件は満たすと思います。

ただ、それはあまり好ましいプログラムではありません。その条件の意味が「強制終了してもよい」というものならば処理系の機能に頼っても良いと思います。
そうでない場合は、事前に除数が0であることをチェックして、abortするのが良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

関数を途中で抜けるには、

返却値の無い void 型の関数の場合、return; で、返却値をつけずに抜け出ます。
返却値のある 関数の場合、return 1; などの数値等の返却値をつけて抜け出ます。
int add(int a, int b) {
return a + b;
}
の場合、a + b の部分が数値等になります。
int max(int a, int b) {
if ( a > b) return a; 
return b;
}
の様に複数個所で、抜け出せる様にしてかまいません。

プログラムを途中で正常終了させるのは、
exit 関数を使います。
exit(0); とか exit(1); とか
main関数内で return する時と同じ効果があります。

異常終了させる場合は、abort を使いますが、
確保したメモリや、開いたファイルの後処理などしないかもしれないので、
普通は使わないほうが良いと思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

質問を字面通りに解釈するならば「exit関数を使う」というのが回答です。

が、どうも課題文が変です。「void型は"return-1" で強制終了」というのは意味不明です。void型関数のreturnで値を返すことはありません。exit関数のことならば、これを呼び出す関数の型は関係ありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3560questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。