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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

Q&A

解決済

6回答

5224閲覧

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

masuter0413

総合スコア50

C

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

0グッド

0クリップ

投稿2018/05/12 11:37

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

c

1#include<stdio.h> 2 3int add(int a, int b); 4int sub(int a, int b); 5int mul(int a, int b); 6int divi(int a, int b); 7 8int main() { 9 int cond; 10 int x, y; 11 int(*pA)(int a, int b); 12 int(*pS)(int a, int b); 13 int(*pM)(int a, int b); 14 int(*pD)(int a, int b); 15 pA = add; 16 pS = sub; 17 pM = mul; 18 pD = divi; 19 printf("Please Input num1 :"); 20 scanf("%d", &x); 21 printf("Please Input num2 :"); 22 scanf("%d", &y); 23 printf("Please Input Operator :"); 24 scanf("%d", &cond); 25 if (cond == 1) { 26 printf("num1 + num2 = %d \n", (*pA)(x, y)); 27 } 28 else if (cond == 2) { 29 printf("num1 - num2 = %d \n", (*pS)(x, y)); 30 } 31 else if (cond == 3) { 32 printf("num1 * num2 = %d \n", (*pM)(x, y)); 33 } 34 else if (cond == 4) { 35 if (y == 0) { 36 printf("error\n"); 37 38 } 39 else { 40 printf("num1 ÷ num2 = %d \n", (*pD)(x, y)); 41 } 42 } 43 else { 44 printf("error \n"); 45 return -1; 46 } 47 48 return 0; 49} 50 51int add(int a, int b) { 52 return a + b; 53} 54int sub(int a, int b) { 55 return a - b; 56} 57int mul(int a, int b) { 58 return a * b; 59} 60int divi(int a, int b) { 61 return a / b; 62}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

こんにちは。

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

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

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

投稿2018/05/12 14:26

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2018/05/12 12:53

ikapy

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

投稿2018/05/12 11:46

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2018/05/12 11:45

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2018/05/12 13:29

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 を使いますが、
確保したメモリや、開いたファイルの後処理などしないかもしれないので、
普通は使わないほうが良いと思われます。

投稿2018/05/12 12:35

編集2018/05/12 12:39
PingHermit

総合スコア478

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問