【问题标题】:Second 'for' loop being ignored after first 'for' loop in program that calculate the scalar product in c在计算 c 中的标量积的程序中的第一个“for”循环之后,第二个“for”循环被忽略
【发布时间】:2020-01-31 23:13:52
【问题描述】:

我正在尝试从键盘扫描两个向量输入,然后创建一个函数来返回两个向量的标量积。但是,当我运行程序时,只要它在第一个 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=%lf\n", scalarproduct(v,w,n));
    return 0; 
 }

输入应该是这样的:

3
1.1
2.5
3.0
1.0
1.0
1.0

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

【问题讨论】:

  • for(int i = 0; i &lt; 0; i++) -- 可能想要更改扫描输入以查找第一个向量的循环的限制。 :)
  • 确实是被跳过的第一个循环;)
  • 旁注 - 你想使用 'calloc' 而不是 malloc。这将使分配的内存归零,从而消除许多潜在的陷阱。常用的方法是 'double *v = (double *) calloc(n, sizeof(*v)) ;

标签: c arrays dynamic malloc allocation


【解决方案1】:

第一个for 循环有错字:for(int i = 0; i &lt; 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 memory\n");
            return 1;
        }
        for (int i = 0; i < n; i++) {
            if (scanf("%lf", &v[i]) != 1) {
                printf("invalid input\n");
                return 1;
            }
        }
        for (int i = 0; i < n; i++) {
            if (scanf("%lf", &w[i]) != 1) {
                printf("invalid input\n");
                return 1;
            }
        }
        printf("Scalar product=%f\n", scalarproduct(v, w, n));
        free(v);
        free(w);
    }
    return 0; 
}

【讨论】:

    猜你喜欢
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多