Второй цикл for игнорируется после первого цикла for в программе, которая вычисляет скалярное произведение в c - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь отсканировать два вектора ввода с клавиатуры, а затем создать функцию, которая будет возвращать скалярное произведение двух векторов. Однако, когда я запускаю программу, как только она сканирует первый вектор в первом цикле 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к заявлению на печать. Как я могу это исправить?

1 Ответ

0 голосов
/ 03 октября 2019

Первый цикл 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 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; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...