program pomija std::cin

0

Cześć wam, proszę o sprawdzenie kodu. Teoretycznie nie ma błędu, natomiast program "pomija" strumień wejściowy, nie mam pojęcia gdzie szukać błędu, proszę o wskazówkę.

Czy istnieje możliwość aby zmienna licznik nie była zmienną globalną?

 #include "stdafx.h"
#include <iostream>
#include <cmath>
#include <math.h>
#include <conio.h>
using namespace std;
# define M_PI        3.1415926535897932384626433832795029L
/* wartość funkcji --------------------------------------------------------------*/
int licznik=0;

double wartosc(double x, int numer_funkcji) { 
	double wynik=0;
	if (numer_funkcji = 1) {
		double wynik = sin(x)*cos(x) + 5 * x + 1;
	}
	if (numer_funkcji = 2) {
		double wynik = (M_PI - x*x + sin(x)) / sqrt(25 - x);
	}
	if (numer_funkcji = 3) {
		double wynik = exp(-1.5*x) - 0.3*x*x;
	}
	return wynik;
}
//--------------------------------------------------------------------------------
/*funkcja bisekcja*/
double metodab(double x, double y, double E, int numer_funkcji) {
	double z;
	if (wartosc(x,numer_funkcji ) == 0) {
		return x;
	}
	if (wartosc(y, numer_funkcji) == 0) {
		return y;
	}
	do {
		z = (x + y) / 2;
		if (wartosc(z, numer_funkcji) == 0) {
			return z;
		}
		
		if ((wartosc(x, numer_funkcji)*wartosc(z, numer_funkcji)) < 0) {
			y = z;
		}		
			x = z;
		licznik++;
	} while (abs(x - y) >= E);
	return z;
}
//-------------------------------------------------------------------------------
int menu() {
	cout << "Wybierz jedną z funkcji którą mam policzyć" << endl;
	cout << "1.Pierwiastek funkcji f(x)=sin(x)cos(x)+5x+1" << endl;
	cout << "2.Pierwiastek funkcji f(x)=(pi-x^2+sinx)/sqrt(25-x)" << endl;
	cout << "3.PIerwiastek funkcji f(x)=((e^-1.5x)-0,3x^2)" << endl;
	cout << "4.Koniec programu" << endl;
	return 0;	
}
int _tmain(int argc, _TCHAR* argv[])
{
	int x, y, ponowne_uruchomienie,numer_funkcji;
	double E;
	cin.clear();
	cin.sync();
	do {
		menu();
		cin >> numer_funkcji;
		if (numer_funkcji == 4) { return 0; }
		cout << "Podaj dokładność z jaką mam policzyć" << endl;
		cin >> E;
		cout << "Podaj zakres przedziału funkcji (x i y)" << endl;
		cin >> x;
		cin >> y;
		cout << "Miejsce zerowe to " << metodab(x, y, E, numer_funkcji);
		cout << "Liczba Iteracji" << licznik << endl;
		cout << "jescze raz ? 1/0";
		cin >> ponowne_uruchomienie;
	} while (ponowne_uruchomienie == 0);
	_getch();
	return 0;
}

0

1.= to operator przypisania, == to operator porównania.
2.Masz dwa mainy (jedno C++-owe, drugie Borland-owe).
3.W ogóle ten kod wygląda jak dwa losowe kody źródłowe połączone ze sobą...

0

gdzie są dwa main'y ? mam jednego main'a i jedną funkcję menu().
ok poprawione w funkcji wartosc() faktycznie w if'ach był przypisujący a nie porównujący znak, ale to wciaż nie to :S

0

Faktycznie, mój błąd - to menu wyglądało trochę jak main :P
Co nie zmienia faktu, że w funkcji wartosc (cóż za elokwentna nazwa) pomyliłeś najpewniej operator przypisania z tym od porównywania.

  • co to znaczy "pomija strumień wejściowy" i co na to debugger?
0

debugger nie wskazuje błędów, program normalnie się odpala natomiast w momencie kiedy powinien poprosić o wprowadzenie a i b leci dalej i wypisuje miejsce zerowe funkcji nie wiadomo skąd. uruchamiane w visual studio 2013

0

Ech, sugerowałem, abyś przedebugował kod linijka po linijce i patrzył na wartości zmiennych etc.

0

Tak się dzieje kiedy niepoprawnie wprowadzasz E
Podaj zamiast E: 1E-8

0
_13th_Dragon napisał(a):

Tak się dzieje kiedy niepoprawnie wprowadzasz E
Podaj zamiast E: 1E-8

Dziękuje problem rozwiązany.
Rozumiem że podając w konsoli potęgę jako "^" nie uzyskamy zamierzonego efektu.

Jeszcze proszę o informację czy mogę zmienną globalną "licznik" zrobić lokalną tak aby nie straciła na funkcjonalności ?

0

To jest bardzo skomplikowana operacja i bez doktoratu z Visuala nie da się tego zrozumieć. Jak zobaczysz na ekranie:
Podaj dokładność z jaką mam policzyć
To:

  1. wciskasz przycisk na którym napisano '1'
  2. wciskasz przycisk na którym napisano 'E'
  3. wciskasz przycisk na którym napisano '-'
  4. wciskasz przycisk na którym napisano '8'
  5. wciskasz przycisk na którym napisano 'Enter'
0

Czy istnieje możliwość aby zmienna licznik nie była zmienną globalną?

/* 1 */
void Fun(){
    static int licznik = 0;
    ...
    ++licznik;
}

/* 2 */
struct App{
    int licznik;
    App() : licznik(0){}
    void Fun(){
        ++licznik;
    }
};

/* 3 */
void fun(int &licznik){
    ++licznik;
}
 
/* 4 */
void fun(int *licznik){
    ++*licznik;
}

0
_13th_Dragon napisał(a):

To jest bardzo skomplikowana operacja i bez doktoratu z Visuala nie da się tego zrozumieć. Jak zobaczysz na ekranie:
Podaj dokładność z jaką mam policzyć
To:

  1. wciskasz przycisk na którym napisano '1'
  2. wciskasz przycisk na którym napisano 'E'
  3. wciskasz przycisk na którym napisano '-'
  4. wciskasz przycisk na którym napisano '8'
  5. wciskasz przycisk na którym napisano 'Enter'

nie bardzo rozumiem po co ta szydera tym bardziej że nie o to pytałem,

0

A mi się wydawało że normalni ludzi cytują to o co pytają.
Przepraszam że się pomyliłem.

0

never mind, zostałem skutecznie zniechęcony do korzystania z Twojej pomocy, nie mniej jednak dziękuje za dotychczas poświęcony czas

można zamknąć, zakopać, czy co wy tu robicie.

0

Jeśli chcesz aby program nie pomijał tego std::cin, to usuń po prostu "return 0;" z funkcji menu, gdyż returnem zamykasz program XD

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