在计算 c 中的标量积的程序中的第一个循环'for'后忽略第二个'for'循环



我正在尝试扫描键盘上的两个矢量输入,然后创建一个函数,该函数将返回两个矢量的标量乘积。但是,当我运行该程序时,一旦它扫描第一个 for 循环中的第一个向量,程序就会结束,标量积为 0。我不明白为什么它不允许我扫描第二个矢量。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
double scalarproduct(double *v, double *w, int n){
double vw[n];
for(int i = 0; i < n; i++){
vw[i] = (v[i] * w[i]); 
}
double scalprod = 0; 
for(int i = 0; i < n; i++){
scalprod += vw[i];
}
return scalprod;
}
int main(){
int n;
scanf("%d", &n);
double *v; 
v = (double *) malloc(sizeof(double) * n);
double *w;
w = (double *) malloc(sizeof(double) * n);
for(int i = 0; i < 0; i++){
scanf("%lf", &v[i]);       
}  
for (int i = 0; i < n; i++){
scanf("%lf", &w[i]);
}
printf("Scalar product=%lfn", scalarproduct(v,w,n));
return 0; 
}

这是输入应该的样子:

3
1.1
2.5
3.0
1.0
1.0
1.0

但是,它只允许我输入直到 3.0,然后程序跳过第二个 for 循环到 print 语句。我该如何解决这个问题?

第一个for循环有一个拼写错误:for(int i = 0; i < 0; i++)它立即停止。

它应该是:

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

另请注意以下备注:

  • 您应该检查scanf()的返回值
  • 您应该检查内存分配失败
  • 您不需要将单个产品存储到本地数组中,该数组可能很长并且会带来问题。
  • 您应该释放分配的内存。

以下是更正和简化的版本:

#include <stdio.h>
#include <stdlib.h>
double scalarproduct(double *v, double *w, int n) {
double scalprod = 0; 
for (int i = 0; i < n; i++) {
scalprod += v[i] * w[i]
}
return scalprod;
}
int main() {
int n;
if (scanf("%d", &n) == 1 && n > 0) {
double *v = (double *)malloc(sizeof(double) * n);
double *w = (double *)malloc(sizeof(double) * n);
if (v == NULL || w == NULL) {
printf("cannot allocate memoryn");
return 1;
}
for (int i = 0; i < n; i++) {
if (scanf("%lf", &v[i]) != 1) {
printf("invalid inputn");
return 1;
}
}
for (int i = 0; i < n; i++) {
if (scanf("%lf", &w[i]) != 1) {
printf("invalid inputn");
return 1;
}
}
printf("Scalar product=%fn", scalarproduct(v, w, n));
free(v);
free(w);
}
return 0; 
}

相关内容

  • 没有找到相关文章