実現したいこと
・switch~case文と同様の処理を関数ポインタの一次元配列を使ってサブ関数を呼ぶプログラムを作成する。
・キーボードから0~15の自然数1つを入力する。
・入力した数字が1なら”みかん”、2か3なら”りんご”4なら”ばなな”、5なら”スイカ”、6なら”いちご”、7なら”メロン”、8なら”ぶどう”、それ以外の場合は”該当するものがありません。”を表示する。
・ビジュアルスタジオを使用しています
前提
ここに質問の内容を詳しく書いてください。
(例)
TypeScriptで●●なシステムを作っています。
該当のソースコード
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> /*プロトタイプ宣言*/ int sub(int* , int ); void main(void) { /*変数の宣言*/ int* pointer[16]; int input = 0; int ret; int(*jump)(int* pointer, int input); /*関数ポインタ*/ /* 表示関数のアドレスを関数ポインタに代入 */ jump = ⊂ /* 関数ポインタを使って関数コール */ ret = sub(pointer,input); /* 0を入力で表示を終了します */ int end = 0; do { printf("\n表示を終了する場合、0を入力してください\n"); scanf("%d", &end); rewind(stdin); } while (0 != end); } /*switch~case文と同様の処理関数*/ int sub(int* pointer ,int input) { /*データ入力*/ printf("0~15の自然数を1つを入力\n"); scanf("%d", &input); if (input == 1) { printf("みかん\n"); } else if (input >= pointer[2] && pointer[3] >= input) { printf("りんご\n"); } else if (input == pointer[4]) { printf("ばなな\n"); } else if (input == pointer[5]) { printf("スイカ\n"); } else if (input == pointer[6]) { printf("いちご\n"); } else if (input == pointer[7]) { printf("メロン\n"); } else if (input == pointer[8]) { printf("ぶどう\n"); } else { printf("該当するものがありません。\n"); } }
試したこと
関数ポインタを使用したときの関数のコードがわからなく、つまずいています。普通の関数であれば
if (input == 1) { printf("みかん\n"); }
上記のように書いていいと思うのですが、関数ポインタを使用したときの紐づけがわからなくアドレス等を頂ければ幸いです。
> int(*jump)(int* pointer, int input); /*関数ポインタ*/
> /* 表示関数のアドレスを関数ポインタに代入 */
> jump = ⊂
> /* 関数ポインタを使って関数コール */
> ret = sub(pointer,input);
関数ポインタを使っていませんね。
おそらく求められている仕様を勘違いしているのでは。
jump を配列化して jump[input](~) 的な呼び出しで switch と同じことをするというのではないでしょうか。
「switch~case文と同様の処理を関数ポインタの一次元配列を使ってサブ関数を呼ぶ」という意味が理解できてないようですね。ということは自分でこういうプログラムを書いてみようと思いついたのではなく、与えられた課題だと思いますが、
課題が求めている方向と関係ないプログラムを書いています。このままプログラムを改善しても意味が無いです。
課題を出した人に「課題の意味がわからない」と質問することは可能ですか?
(授業や研修であれば可能と思いますが、書籍だと無理でしょうね)

回答2件
あなたの回答
tips
プレビュー