2016-12-13 7 views
-4

コードは以下の通りです。説明をして、出力も与えてください。ここで何が起こっているのかまた出力は何ですか? (手がかりなし)

#include <iostream> 
#include <conio.h> 

using namespace::std; 

int main() { 
// clrscr(); 
    int sum(int(*)(int), int); 
    int square(int); 

    int cube(int); 
    cout << sum(square, 4) << endl; 
    cout << sum(cube, 4) << endl; 
    getch(); 

// return 0; 
} 

int sum(int(*ptr)(int k), int n){ 
    int s = 0; 
    for(int i =1; i <= n; i++){ 
     s +=(*ptr)(i); 
    } 
    return s; 
} 

int square(int k){ 
    int sq; 
    sq =k *k; 
    return k*k; 
} 


int cube(int k){ 
    return k*k*k; 
} 

何も起こりません!このコードを理解するのを手伝ってください。特に機能

int sum(int(*)(int), int); 

上記の構文を特に理解できません。しかし、コード全体を説明するのに役立つだろう。

n = 4は、機能sum(square, 4)が呼び出された場合:

+4

宿題の助けを求める質問には、問題を解決するために今までに行った作業の概要と、解決している問題の説明が含まれている必要があります。 – Slava

+4

デバッガと呼ばれるツールがあります。コードを一行ずつ進んで実行することができます。 'type(* possible_name)(parameters)'は関数ポインタです。 – NathanOliver

+1

不思議な見た目のコードは、関数のパラメータ自体がint型の1つのパラメータを持つ別の関数であるという宣言です。このように考えると、関数のアドレスを別の関数に渡しています。呼び出された関数は、そのアドレスを使用して、そのアドレスを指す関数を呼び出すことができます。 –

答えて

0

次はあなたのプログラムが実際に何をするかです。次に

  • これは、0+1を添加1なろうsquare()メソッドを呼び出し、1として
    *ptrの値を計算し、次いでs*ptrは となりました。の値をsquare()メソッドと呼びます。 は1*1を返します。*ptrに割り当てられます。

  • i = 2のとき、再びsquare()メソッドが呼び出され、それは、この場合に方法square() によって返される2*2なので 4の値は(*ptr)(2)に割り当てられます。値4sの値に加算され、1となり、sの値は1+4=5となります。

  • 場合、I = 3、再びsquare()メソッドが呼び出され、それは、この場合に方法square() によって返される3*3なので 9の値は(*ptr)(3)に割り当てられます。 9の値はsの値に加算され、5であり、sの値は5+9=14になります。

  • 最後に、場合I = 4は、再びsquare()メソッドが呼び出され、それは、この場合に方法square() によって返される4*4なので 16の値は(*ptr)(4)に割り当てられます。 9の値はsの値に加算され、14であり、sの値は14+16=30になります。

  • 30は、関数によって返され、これは、このメソッドが呼び出された main()することによって得られます。

sum(cube, 4)の作業は、上記の説明と非常に似ています。唯一の違いは、cube(int)メソッドが呼び出されており、(*ptr)(i)に割り当てられる値はcube()メソッドから返されるi*i*iになります。sの値は、最初にゼロになり、s = 1 (0+1),s = 9 (1+8),s = 36 (9+27)、最後にs=100 (36+64)に加算され、呼び出されたメソッドmain()に戻されます。私はあなたが見ると結果を自分で分析するために、あなたのプログラムのsum()メソッド内forループでstd::coutを使用することを示唆している

#include <iostream> 

int sum(std::string, int); 
int square(int); 
int cube(int); 

int main() { 

    std::cout << sum("square", 4) << std::endl; 
    std::cout << sum("cube", 4) << std::endl; 

    return 0; 
} 

int sum(std::string value, int n) { 
    int s = 0; 
    for (int i = 1; i <= n; i++) { 
     if (value == "square") { 
      s = s + square(i); 
     } else if (value == "cube") { 
      s = s + cube(i); 
     } 
    } 
    return s; 
} 

int square(int k) { 
    return k*k; 
} 

int cube(int k) { 
    return k * k * k; 
} 

:つまり

は、あなたのプログラムは、次のコードに似て動作します。 IDEがサポートしている場合は、デバッガを使用してプログラムのワークフローを表示することもできます。

関連する問題