Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Jak przeniesc zmienne miedzy niepowiazanymi funkcjami?

Ostatnio zmodyfikowano 2015-11-09 01:01
Autor Wiadomość
TandK
Temat założony przez niniejszego użytkownika
Jak przeniesc zmienne miedzy niepowiazanymi funkcjami?
» 2015-11-08 10:31:17
Dzien dobry

Chcialem rozwinac program o mozliwosc liczenia miejsca zerowego dla F(x) wybieranej z menu wielokrotnego wyboru.
Niestety napotkalem na problem przekazania zmiennej jaka uzylem w jednej funkcji programu do innej.
Wiem, ze zmienne "zyja" w obrebie jednej funkcji, nie chce tez deklarowac zmiennej globalnej o ile to mozliwe.


Oto kod mojego programu - ktory oczywiscie nie dziala,

z funkcji (float main) zmienna (int menu) - powinna ustawiac zmienna wbyoru do switch (int war_menu)w funkcji (int wartosc_funkcji) tak aby odwolujac sie do niej z poziomu funkcji (float funkcja_bisekcji) wiedziala ona z ktorego switch ma korzystac

C/C++
#include "iostream"
#include "math.h"
#include "cmath"
#include "conio.h"
#define _USE_MATH_DEFINES
using namespace std;



float wartosc_funkcji( float x ) // Tu licze wartosc funkcji
{
    float wartosc;
    int war_menu = int( float main( int_menu ) ); // tutaj powinna zostac ustawiona wartosc zgodna ze zmienna z funkcji "float main  (int menu)";
    switch( war_menu )
    {
    case 1:
        {
            wartosc =( exp( - 1.5 * x ) -( 0.3 * pow( x, 2 ) ) );
            break;
        }
    case 2:
        {
            x =( x * 3.14 ) / 180;
            wartosc =(( sin( x ) * cos( x ) ) +( 5 * x ) + 1 );
            break;
        }
        default:
        break;
    }
    return wartosc;
   
}

float funkcja_bisekcji( float a, float b, float dokladnosc ) // Licze miejsce zerowe
{
   
    float c;
    int k = 0;
    do
    {
        k = k++;
        c =( b + a ) / 2;
        if( wartosc_funkcji( c ) < 0 )
             a = c;
        else
             b = c;
       
    } while( abs( wartosc_funkcji( c ) ) >( dokladnosc ) );
   
    cout << "ilosc krokow !k! = " << k << endl;
    cout << "wypisany z funkcji pierwiastek = " << c << endl; //dla sprawdzenia czy jest taki sam jak wypisany z poziomu funkcji main
   
    return c;
}

float main()
{
    float p, q;
    float dokladnosc;
    float miejsce_zerowe;
    int menu;
    cout << "Podaj dolna granice przedzialu: ";
    cin >> p;
    cout << "Podaj gorna granice przedzialu: ";
    cin >> q;
    cout << "Podaj dokladnosc: ";
    cin >> dokladnosc;
    cout << "Jaka funkcje chcesz obliczac: " << endl;
    cout << "1. Funkcja exp" << endl;
    cout << "2. Funkcja tryg" << endl;
    cin >> menu;
    if(( wartosc_funkcji( p ) * wartosc_funkcji( q ) ) < 0 )
         cout << "Miejsce zerowe funkcji x = " << funkcja_bisekcji( p, q, dokladnosc );
    else
         cout << "Funkcja nie ma miejsca zerowego w podanym przedziale lub nie jest ciagla" << endl;
   
    system( "pause" );
    return 0;
}
P-139796
wojownik266
» 2015-11-08 10:54:06
Na początek proponowałbym umiescić wszystkie pliki nagłówkowe w nawiasach ostrych np:
C/C++
< iostream >
< cmath >
itd.
P-139799
carlosmay
» 2015-11-08 11:19:21
P-139801
TandK
Temat założony przez niniejszego użytkownika
» 2015-11-08 11:53:25
liczylem na nieco bardziej rozbudowana wypowiedz, no ale forum to w koncu nie miejsce do szukania pomocy ale pokazania jakim to sie jest "super"

Czasami mozna cos przeczytac tysiac razy i nie zauwazyc bledu, trzeba aby ktos go pokaza i cos wytlumaczyl.
Moze kiedys jak bede nieco bardziej zaawansowany postaram sie tutaj powymadrzac na razie widze nie mam czego szukac

Zmienilem podejscie do pisania tego programu - wyglada ze dziala, ale taki uklad jest dosc skomlikowany, wolalbym wybierac funkcje do obliczen z menu wyboru

C/C++
#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
#include <cmath>
#include <conio.h>

using namespace::std;




float wartosc_funkcji1( float x ) // Tu licze wartosc funkcji
{
    float wartosc;
    wartosc = exp( - 1.5 * x ) - 0.3 * pow( x, 2 );
    return wartosc;
}

float wartosc_funkcji2( float x ) // Tu licze wartosc funkcji
{
    float wartosc;
    wartosc =( sin( x ) * cos( x ) ) +( 5 * x ) + 1;
    return wartosc;
}

float wartosc_funkcji3( float x ) // Tu licze wartosc funkcji
{
    float wartosc;
    wartosc =( M_PI - pow( x, 2 ) + sin( x ) ) /( sqrt( 25 - x ) );
    return wartosc;
}

float funkcja_bisekcji( float a, float b, float dokladnosc, float funkcja( float x ) ) // Licze miejsce zerowe
{
   
    float c;
    int k = 0;
    do
    {
        k = k++;
        c =( b + a ) / 2;
        if( funkcja( c ) < funkcja( b ) && funkcja( c ) > 0 )
             b = c;
        else
             a = c;
       
    } while( abs( funkcja( c ) ) > dokladnosc );
   
    cout << "ilosc krokow k = " << k << endl;
    cout << "pierwiastek = " << c << endl; //dla sprawdzenia czy jest taki sam jak wypisany z poziomu funkcji main
   
    return c;
}

float main()
{
    float p, q;
    float dokladnosc;
    float miejsce_zerowe;
    int menu;
    cout << "Podaj dolna granice przedzialu (deg dla funkcji tryg): ";
    cin >> p;
    cout << "Podaj gorna granice przedzialu (deg dla funkcji tryg): ";
    cin >> q;
    cout << "Podaj dokladnosc: ";
    cin >> dokladnosc;
    cout << "Jaka funkcje chcesz obliczac: " << endl;
    cout << "1. Funkcja exp" << endl;
    cout << "2. Funkcja tryg1" << endl;
    cout << "3. Funkcja tryg2" << endl;
    cin >> menu;
    switch( menu )
    {
    case 1:
        {
            if(( wartosc_funkcji1( p ) * wartosc_funkcji1( q ) ) < 0 )
                 cout << "Miejsce zerowe funkcji x = " << funkcja_bisekcji( p, q, dokladnosc, wartosc_funkcji1 );
            else
                 cout << "Funkcja nie ma miejsca zerowego w podanym przedziale lub nie jest ciagla" << endl;
           
            break;
        }
    case 2:
        {
            if(( wartosc_funkcji2( p ) * wartosc_funkcji2( q ) ) < 0 )
                 cout << "Miejsce zerowe funkcji x = " << funkcja_bisekcji( p, q, dokladnosc, wartosc_funkcji2 );
            else
                 cout << "Funkcja nie ma miejsca zerowego w podanym przedziale lub nie jest ciagla" << endl;
           
            break;
        }
    case 3:
        {
            if(( wartosc_funkcji3( p ) * wartosc_funkcji2( q ) ) < 0 )
                 cout << "Miejsce zerowe funkcji x = " << funkcja_bisekcji( p, q, dokladnosc, wartosc_funkcji3 );
            else
                 cout << "Funkcja nie ma miejsca zerowego w podanym przedziale lub nie jest ciagla" << endl;
           
            break; }
    }
   
    system( "pause" );
    return 0;
}
P-139802
FatecCpp
» 2015-11-08 23:39:48
Ogólnie mam dwie propozycje, jak już piszesz w c++ polecam nauczyć się klas i struktur o wiele upraszczaja zabawę z językiem :)
Ale jeśli nie chcesz mieć zmiennych globalnych to stwórz zmienną w obrębie danego bloku, najprościej w main i na liście argumentów funkcji ustaw referencje do tej zmiennej. Dzięki temu możesz używać tej zmiennej w każdej funkcji w której będzie argument z referencja.
P-139830
carlosmay
» 2015-11-09 01:01:41
float zamień na double
double ma większą precyzję. float używaj gdy nie jest wymagana precyzja obliczeń.

Jak działa przekazywanie wartości do funkcji i między nimi.
C/C++
#include <iostream>
#include <conio.h>
using namespace::std;

void fun1( int b ) {
    cout << "fun1: b = " << b << " (przekazanie przez wartosc)" << endl;
    b += 5;
    cout << "w funkcji b = " << b << endl;
}

void fun2( int & c ) {
    cout << "fun2: c = " << c << " (przekazanie przez referencje.)" << endl;
    c += 5;
    cout << "w funkcji c = " << c << endl;
}

void fun3( int & c ) {
    cout << "fun3: c = " << c << " (przekaznie przez raferencje)" << endl;
    c += 5;
    cout << "w funkcji c = " << c << endl;
    cout << "wywolanie fun2 w fun3:" << endl;
    fun2( c ); // przekazanie zmiennej c miedzy funkcjami
}

int main()
{
    int b = 0;
    int c = 0;
   
    fun1( b );
    cout << "Po powrocie z funkcji b = " << b << endl;
    cout << endl;
    fun3( c );
    cout << "Po powrocie do main() c = " << c << endl;
   
    _getch();
}
 
P-139834
« 1 »
  Strona 1 z 1