【问题标题】:Using arithmetic with arrays对数组使用算术
【发布时间】:2018-05-26 17:23:07
【问题描述】:
  1. 如果

    ,则称两个量 u 和 v 成直角

    nuv = u1v1 + u2v2 + u3v3 + u4v4 +………… + unvn = 0

编写一个计算 u 和 v 是否成直角的函数。如果你愿意,你可以使用数组。该函数可以假设向量具有相同的维度(例如,n),但是这个数字应该作为参数传递给函数。

我的程序中有一些错误。我很感激一些帮助,因为我是初学者。错误告诉我:

在函数'void function(int*,int*)'
cpp 26:预期错误';'在“}”标记之前
cpp 29: 错误;赋值左操作数所需的值

#include <iostream> 

using namespace std; 

const int n = 5;

void function(int array[n],int array2[n]);

int main(){

    int array[n] = {5, 3 , -4, 2, 8};
    int array2[n] ={-7, -9, 5, 2, 9};

    function(array, array2);

    return 0;
}

void function(int array[n], int array2[n]){

    int multiple;

    for(int i=0; i <=5, i++)
    {
        (array[i]*array2[i]) + (array[i+1]*array2[i+1]) = multiple;
    }

    cout << multiple << endl;
}

【问题讨论】:

  • 将多个初始化为零;然后是多个 += (..)
  • 不要调用你的函数function。将其命名为有意义的名称,例如 DotProduct
  • i &lt;=5 您访问的数组越界。

标签: c++ arrays pointers assignment-operator


【解决方案1】:

您的 for 循环格式错误。您需要使用&lt; 代替&lt;=,使用n 代替5,并使用; 代替,

您对multiple 的分配是倒退的。 = 运算符右侧的值分配给= 左侧的变量。您正在尝试将 multiple 的值(未初始化)分配给自己没有显式变量的动态计算值。您应该将计算值分配给 multiple

此外,您没有遵循说明中的“此数字 [数组维度] 应作为参数传递给函数”的要求。

试试这个:

#include <iostream>   
using namespace std; 

const int n = 5;

void function(const int *array1, const int *array2, const int size);

int main()
{
    int array1[n] = { 5,  3, -4, 2, 8};
    int array2[n] = {-7, -9,  5, 2, 9};

    function(array1, array2, n);

    return 0;
}

void function(const int *array1, const int *array2, const int size)
{
    int multiple = 0;

    for(int i = 0; i < size; i++)
    {
        multiple += (array1[i] * array2[i]);
    }

    cout << multiple << endl;
}

【讨论】:

    【解决方案2】:

    语法错误是您以这种方式使用for 循环的地方:

    for(int i=0;i<=5,i++)
    

    改用这个:

    for(int i=0; i <= 5; i++)
    

    【讨论】:

    • 谢谢,我刚刚纠正了这个问题,我仍然对 void 函数 (int* int*) 和 29 左值作为赋值的左操作数有问题
    • @ProgrammingNoob: 那是因为你对multiple 的分配是倒退的
    • 是的,这也是问题所在。
    【解决方案3】:

    函数可以假设向量具有相同的维度 (n, 说),但是这个数字应该作为参数传递给 功能

    这个函数声明

    void function(int array[n],int array2[n]);
    

    不包含指定数组维度的参数。

    上面的声明等价于

    void function(int *array,int *array2);
    

    因为按值传递的数组被隐式转换为指向其第一个元素的指针。

    这个for语句有一个错字和一个bug

    for(int i=0; i <=5, i++)
                 ^^^^^^
    

    应该有

    for ( int i=0; i < n; i++)
    

    变量multiple

    int multiple;
    

    没有初始化,这个赋值

    (array[i]*array2[i]) + (array[i+1]*array2[i+1]) = multiple;
    

    没有意义,与条件没有任何共同点

    nuv = u1v1 + u2v2 + u3v3 + u4v4 +………… + unvn = 0
    

    看来你的意思是如下

    #include <iostream>
    
    bool function( const int array[], const int array2[], size_t n ) 
    {
    
        long long int product = 0;
    
        for ( size_t i = 0; i < n; i++)
        {
            product += array[i] * array2[i];
        }
    
        return product == 0;
    }
    
    int main()
    {
        const size_t N = 5;
        int array[N]  = { 5, 3 , -4, 2, 8 };
        int array2[N] = { -7, -9, 5, 2, 9 };
    
        std::cout << "array and array2 are "
            << (function(array, array2, N) ? "" : "not ")
            << "at right angles"
            << std::endl;
    
        return 0;
    }
    

    这些数组

        int array[N]  = { 5, 3 , -4, 2, 8 };
        int array2[N] = { -7, -9, 5, 2, 9 };
    

    不是直角,

    但是这些数组

        int array[N]  = { 5, 3 , -4, 1, 9 };
        int array2[N] = { -7, -9, 5, 1, 9 };
    

    是直角。试试看。

    【讨论】:

      【解决方案4】:

      替代方案:尝试 C++ 方式。使用知道它的长度的 std::array 。使用标准库提供的算法,例如 std::inner_product。

      #include <iostream>
      #include <algorithm>
      #include <array>
      #include <numeric>
      
      int main()
      {
        using arr_t = std::array<int,5>;
      
        arr_t arr1 = {5, 3 , -4, 2, 8};
        arr_t arr2 = {-7, -9, 5, 2, 9};
      
        int mult = std::inner_product( begin(arr1), end(arr1), begin(arr2), 0,
                       std::plus<>(), std::multiplies<>() );
      
        std::cerr << mult << "\n";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 2021-11-20
        • 2017-03-30
        • 1970-01-01
        • 2014-12-24
        • 2020-05-21
        相关资源
        最近更新 更多