【问题标题】:Scalar by vector multiplication in CC中的向量乘法标量
【发布时间】:2014-11-24 11:02:33
【问题描述】:

我有这段代码用于将标量乘以 n 维向量;它编译但崩溃了,我不知道出了什么问题,有什么想法吗?

 #include <stdio.h>
    int main()
    {
        int i,n,A[n]; float k,B[n];
        printf ("\n Enter vector dimension \n");
        scanf ("%d",&n);
        for (i=1; i<n+1; i++)
            { printf ("\n Enter a%d",i);
              scanf ("%d", &A[i]);
            }
        printf ("\n Enter value of scalar \n");
        scanf ("%f", &k);  
            for (i=1; i<n+1; i++)
            {B[i]=k*A[i];
            }
            for (i=1; i<n+1; i++)
            { printf ("\n B[%f]=%f",i,B[i]);
            }
        getch();
        return 0;
    }

【问题讨论】:

  • C 数组从偏移量 0 开始,而不是从 1 开始 - 以 for(i=0; i&lt;n; i++) 进行循环
  • int i,n,A[n];此时,n的值是多少?或者它甚至是已知的?那么,A[n] 的大小是多少?您是否希望它足够大以容纳稍后在初始化 n 时输入的项目(但 A 的大小没有发生任何变化)?
  • 它崩溃是因为写入 A[n] 正在写入数组边界之外的内存位置。
  • 同理,B的大小是多少?
  • @PaulRoub -- 正确 -- 在声明 A[n] 时未定义 n -- 所以这也不起作用。

标签: c vector scalar


【解决方案1】:

在此声明中

   int i,n,A[n]; float k,B[n];

变量 n 未初始化。它有一个未指定的值。所以程序有未定义的行为。您必须首先为 n 输入一个值,然后才能声明数组 A[n] 和 B[n]。

还要考虑到数组的索引从 0 开始。因此,如果您有一个包含 n 个元素的数组,那么索引的有效范围将是 0, n-1

如果使用支持 C99 的编译器进行编译,程序的外观如下。

#include <stdio.h>


int main(void) 
{
    int n;

    printf( "\n Enter vector dimension: " );
    scanf( "%d", &n );

    int a[n];
    float b[n];

    for ( int i = 0; i < n; i++ )
    { 
        printf( "Enter a%d ", i );
        scanf( "%d", &a[i] );
    }

    printf( "\n Enter value of scalar " );

    float k;
    scanf( "%f", &k );

    for ( int i = 0; i < n; i++ ) b[i] = k * a[i];

    for ( int i = 0; i < n; i++ ) printf( "\n b[%d] = %f", i, b[i] );

    //getch();

    return 0;
}   

如果输入将接受以下数据

3
1 2 3
0.5

然后输出将是

b[0] = 0.500000
b[1] = 1.000000
b[2] = 1.500000

【讨论】:

  • 我将 n 初始化为 0,现在它运行了,谢谢(:现在,当返回向量 B=kA 时,它会返回零
  • @MarieC 您首先必须为 n 输入值,然后才能定义数组。数组的大小可能不为零。查看我更新的帖子。
  • 谢谢,这对我帮助很大(:
【解决方案2】:

问题:

  1. 代码在分配值之前使用变量 n。第一行。

    int i,n,A[n];浮动 k,B[n];

您可能希望在第一次 scanf 调用后初始化这些数组。

所以你想要这样的 sn-p。

#include <stdio.h>
#include <conio.h>  // I don't have this library.  
int main()
{   
    int n;

    printf ("\n Enter vector dimension \n");

    scanf ("%d",&n);

    int i,A[n]; 
    float k,B[n];

    for (i=1; i<n+1; i++)
        { printf ("\n Enter a%d",i);
          scanf ("%d", &A[i]);
        }

    printf ("\n Enter value of scalar \n");

    scanf ("%f", &k);  
        for (i=1; i<n+1; i++)
        {B[i]=k*A[i];
        }
        for (i=1; i<n+1; i++)
        { printf ("\n B[%f]=%f",i,B[i]);
        }

    gets();

    return 0;
} 

【讨论】:

  • 谢谢,运行正常,仍然返回 B=0
猜你喜欢
  • 2020-03-16
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多