Pętle while, ciag rzeczywisty

0

Witam mogłbym prosic o pomoc w rozwiązaniu zadania;
Nalezy wczytac ciag liczb rzeczywistych. Wczytywanie należy zakończyc kiedy pojawi sie liczba ujemna. Obliczyc iloczyn odwrotnosci wczytanych liczb.
Napisalem cos takiego i nie wiem dlaczego nie działa ?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float a;
    float iloczyn = 1;
    int count = 1;

    printf("podaj element ciagu \n");
    scanf("%f", &a);

    while (a > 0)

    {
        count++;
        scanf("%f", &a);
        iloczyn *= (1 / a) * iloczyn;
    }
    printf("iloczyn odwrotnosci liczb= %f", iloczyn);

    return 0;
}
2
  1. Piszesz kod w C, w dziale C/C++, w tagach masz C#. To jak w końcu jest?
  2. Zdefiniuj „nie działa” — nie kompiluje się? Z jakim błędem? Wywala błąd przy uruchamianiu? Jaki? Zwraca zły wynik? Jaki i dla jakich danych wejściowych?
3
  • Ignorujesz pierwszą wczytaną liczbę
  • iloczyn *= (1/a)*iloczyn ; nie rozumiesz jak działa operator *=.

Na przyszłość: https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

0
Althorion napisał(a):
  1. Piszesz kod w C, w dziale C/C++, w tagach masz C#. To jak w końcu jest?
  2. Zdefiniuj „nie działa” — nie kompiluje się? Z jakim błędem? Wywala błąd przy uruchamianiu? Jaki? Zwraca zły wynik? Jaki i dla jakich danych wejściowych?

Problem jest w tym ze wyswietla się zły wynik tak jakby w ogóle nie czytało tego iloczynu.
Dopiero zaczynam programować i przed chwila założyłem konto na forum. Z góry dzięki za rady przeczytam regulamin :D

0
kq napisał(a):
  • Ignorujesz pierwszą wczytaną liczbę
  • iloczyn *= (1/a)*iloczyn ; nie rozumiesz jak działa operator *=.

Na przyszłość: https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

Rozumiem czyli po prostu powinienem zapisac tak; iloczyn = (1/a)*iloczyn ;
ale dalej jest tak jakby tego mnożenia nie czytało.

2
iloczyn *= (1 / a) * iloczyn;

Taki zapis jest równoważny czemuś takiemu

iloczyn = ((1 / a) * iloczyn)*iloczyn;

Natomiast zakładam ,że chciałeś osiągnąć taki zapis

iloczyn = (1 / a) * iloczyn

Do takiego czegoś wystarczy

iloczyn *= (1 / a)

Ponieważ zapis w tym stylu oznacza do istniejącej w tej zmiennej wartości dodaj/odejmij itd. pewną inną wartość.

0
Botek napisał(a):
iloczyn *= (1 / a) * iloczyn;

Taki zapis jest równoważny czemuś takiemu

iloczyn = ((1 / a) * iloczyn)*iloczyn;

Natomiast zakładam ,że chciałeś osiągnąć taki zapis

iloczyn = (1 / a) * iloczyn

Do takiego czegoś wystarczy

iloczyn *= (1 / a)

Ponieważ zapis w tym stylu oznacza do istniejącej w tej zmiennej wartości dodaj/odejmij itd. pewną inną wartość.

Tak rozumiem, zmieniłem juz to u siebie w programie, ale dalej otrzymuje zły wynik.
Po wpisaniu np; 2 oraz -2 otrzymuje wynik 0,5 a powinienem otrzymac 0,25. I tutaj nie wiem z czego ten bład moze wynikac

3

Wczytujesz wartość przed pętlą ,następnie pod tą samą zmienną wczytujesz inną wartość a potem dopiero liczysz. Tak na szybko scanf przed pętlą jest zbędny. I wtedy count powinno być ustawione na 0 przy inicjalizacji.

1

Przecież pisałem, że ignorujesz pierwszą wczytaną wartość.

1

Pokusiłem się o własne rozwiązanie

#include <cstdlib>
#include <iostream>
#include <math.h>  

using namespace std;

/*
    Code count revert mul real Numbers.
 */

float revertMul(float *numbers, int length) {
    int counter = 0;
    float result = 1;
    while (counter < length && numbers[counter] > 0) {
        result *= (1 / numbers[counter]);
        counter++;
    }
    return result;
}

/*
    1/1 * 1/2 * 1/3 = 1/6 
    0.166667
 */
void testRevertMul() {
    int length = 5;
    float *numbers{ new float[length] {
            1, 2, 3, -2, 4
        }};
    float expect = 0.166667f;
    float result = revertMul(numbers, length);

    if (fabs(expect - result) < 0.000001f) {
        cout << "testRevertMul Correct !!! " << expect << " == " << result << "\n";
    } else {
        cout << "testRevertMul Not correct !!! " << expect << " != " << result << "\n";
    }
}

int main(int argc, char** argv) {
    testRevertMul();
    return 0;
}


Zaparaszam do testów ;p.
https://code.sololearn.com/cjKwNUh1KPmS/#cpp

1 użytkowników online, w tym zalogowanych: 0, gości: 1