2016-09-11 10 views
-2

これは本当にシンプルなはずですが、私はより高水準の言語に慣れていて何かを見逃しています。私は入力が5つの数字であることを確かめようとしているだけで、最も高い数字を見つけようとしています。残念ながら、その2番目の部分で何かが間違っています。長さの配列の中で最高の数字を見つける5

#include <iostream> 
#include <string> 

bool isFiveDigits(int num) { 
    if (std::to_string(num).length() == 5) { 
     return true; 
    } else { 
     return false; 
    } 
} 

int highestInArr(int *nums) { 
    int highest = nums[0]; 
    for (int i = 1; i < sizeof(nums); i++) { 
     int temp = nums[i]; 
     if (temp > highest) { 
      highest = temp; 
     } 
    } 
    return highest; 
} 

int main() { 
    using namespace std; 
    int num; 
    int nums [5]; 
    cout << "Enter a five digit number!\n"; 
    cin >> num; 
    if (!isFiveDigits(num)) { 
     cout << "Not five digits, can you even count?"; 
     return 1; 
    } 
    string numstr = to_string(num); 
    for (int i = 0; i < numstr.length(); i++) { 
     cout << numstr[i] << " "; 
     nums[i] = (int)numstr[i]; 
    } 
    cout << "\n" << highestInArr(nums); 
} 

これを実行すると、私が手:もちろん

Enter a five digit number! 
12345 
1 2 3 4 5 
1424080487 

を、1,424,080,487[1, 2, 3, 4, 5]ではありません。

+0

'for(int i = 1; i

+1

arrayの代わりに 'std :: vector'を使わないのはなぜですか? – Shravan40

+0

参照:http://stackoverflow.com/questions/18286384/program-to-find-largest-and-smallest-among-5-numbers-without-using-array/18286453#18286453 –

答えて

0

まず、charintに変換するだけでは、(int)numstr[i]と同じように、それに含まれる数字が返されると想定することはできません。あなたがchar '0'を持っている場合

を参照してください、それはASCII同等物は、保存されたように'1'とした場合に049の場合に48あるさであることを意味します。

その数字(0,1,2,...,9)を取得するには、ASCII値から48を引く必要があります。

nums[i] = (int)numstr[i]; 

だから、この行を変更

nums[i] = (int)numstr[i] - 48; // or nums[i] = (int)numstr[i] - '0'; 

そしてもう一つは、あなたのhighestInArr機能では、あなたは、パラメータとしてポインタを取得している、と機能で、あなたの」 sizeofを使用して配列のサイズを決定します。単にそれを行うことはできません。sizeofは、配列のサイズではないint*のサイズを返します。したがって、関数の第2引数としてsizeを渡して、ループで使用する必要があります。このよう

:あなたが関数にポインタを渡すとテンプレート控除せずに、それのサイズを取得することはできません

int highestInArr(int *nums, int size) { 
    // ... 
    for (int i = 1; i < size; i++) { 
     // ... 
    } 
    // ... 
} 
2

。実行時に、すべての関数受信はポインタです。 sizeof(nums)を呼び出すと、元の配列のサイズが取得されません。あなたは単にポインタのサイズを取得しています。これはsizeof(int_ptr)と同じです。代わりに、サイズが動的なコレクションを使用する場合は、std::vectorを使用する必要があります。

さて、あなたはこのような何かをすることによってサイズを受け取ることができます。

#include <iostream> 

template<typename num_t, size_t N> 
num_t max_num(num_t(&arr)[N]) { 
    num_t m = (num_t)0; 
    for (size_t i = 0; i < N; ++i) 
     if (arr[i] > m) 
      m = arr[i]; 
    return m; 
} 

int main(){ 
    int foo[] = { 1, 5, 2, 4, 3 }; 
    int m = max_num(foo); 
    std::cout << m << std::endl; 
    std::cin.get(); 
    return 0; 
} 

しかし、これは必ずしも望ましいものではなく、配列が呼び出し元のスタック上に作成されたことを前提としています。 new[]で作成された動的に割り当てられた配列に対しては機能しません。異なるサイズでこれを複数回実行すると、同じ機能(テンプレートと同じ機能)を複数実装することになります。 std::array<int, N>を使用する場合も同じです。テンプレートパラメータsize_tとしてNを使用すると、同じことが実行されます。

二つの好ましい選択肢があります:

  • 、呼び出し元のサイズのために責任があるように、関数に配列のサイズを送信しますが。
  • std::vectorなどの別のコンテナを使用してください。そのため、呼び出し先がサイズの原因です。

例:is_5_digitsについては

#include <vector> 
#include <iostream> 
#include <algorithm> 

int main(){ 
    std::vector<int> vec{ 1, 5, 2, 4, 3 }; 
    int m = *std::max_element(std::cbegin(vec), std::cend(vec)); 
    std::cout << m << std::endl; 
    std::cin.get(); 
    return 0; 
} 

、あなたは10を底とする対数関数を使用する必要があります。

#include <cmath> 
// ... 
int i = 12345; 
size_t length = (i > 0 ? (int)log10(i) : 0) + 1; 
std::cout << length << std::endl; // prints 5; 
関連する問題