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

[C] Kalkulator z wykorzystaniem wkaźników.

Ostatnio zmodyfikowano 2015-03-27 19:52
Autor Wiadomość
CoolPrune9
Temat założony przez niniejszego użytkownika
[C] Kalkulator z wykorzystaniem wkaźników.
» 2015-03-27 09:07:39
Pisze program, który ma wykonywać obliczenia matematyczne na przekazanych przez wskaźniki liczbach. Każda operacja ma być osobną funkcja zwracając wartośc logiczną prawdy, gdy operacja wykona sie prawidłowo(nie bardzo rozumiem autora zadania co ma na myśli pisząc wartośc logiczna prawdy ale mniemam, że chodzi po prostu o wynik działania). Na liście argumentów powinny znajdować: się wskaźnik do zmiennej wynikowej jak i wskaźnik/wskaźniki do wartości argumentów. Funkcje powinny uwzględniać możliwość przekazania wskaźnika NULL, jako wartości jednego z argumentów.
Niestety już w początkowym etapie mam problem bo choć che robić to na liczbach zmiennoprzecinkowych, aby dzielnie dawało prawdziwe wyniki to deklarując funkcje jako float program nawet się nie kompiluje. Dodatkowo nie jestem pewny czy dobrze używam wskaźników, i nie wiem jak uwzględnić możliwość przekazania wskaźnika NULL.

tutaj kod mojego programu. Gdy zmienię typy funkcji na int rusza ale siła rzeczy dla liczb float nie daje dobrych wyników.

C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( void ) {
    float a = 0;
    float b = 0;
    int c;
    float d = 0;
    float * pwynik;
    float * wska;
    float * wskb;
   
   
   
    printf( " podaj pierwsza liczbe: \n" );
    scanf( "%f", & a );
   
    printf( " \n wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potegowanie \n" );
    scanf( "%d", & c );
   
    if( c > 5 ) {
        printf( " \nBrak takiego działania wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potęgowanie \n" );
        scanf( "%d", & c );
       
    }
   
    if( c < 1 ) {
        printf( " \nBrak takiego działania wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potęgowanie \n" );
        scanf( "%d", & c );
       
    }
   
    if( c == 5 ) {
        printf( "\n podaj potege do ktorej podniesc liczbe \n" );
    }
    else
         printf( " \n podaj druga liczbe: \n" );
   
    scanf( "%f", & b );
   
    //wska=&a;
    //wskb=&b;
   
    if( c == 1 ) {
        d = dodawanie( * wska, * wskb );
    }
   
    if( c == 2 ) {
        d = odejmowanie( & a, & b );
    }
   
   
   
    if( c == 3 ) {
        d = mnozenie( & a, & b );
    }
   
   
   
    if( c == 4 ) {
        d = dzielenie( & a, & b );
    }
   
   
   
    if( c == 5 ) {
        d = potega( & a, & b );
    }
   
   
    pwynik =& d;
   
    printf( "wynik działania: %f", * pwynik );
   
    return 0;
   
}

float dodawanie( float * a, float * b ) {
    return( * a ) +( * b );
   
}

float odejmowanie( float * a, float * b ) {
    return( * a ) -( * b );
   
}

float mnozenie( float * a, float * b ) {
    return( * a ) *( * b );
   
}

float dzielenie( float * a, float * b ) {
    float d;
    d =( * a ) /( * b );
    return d;
}

float potega( float * a, float * b ) {
    return pow( * a, * b );
}

Jeśli ktoś mógłby pomóc i naprowadzić mnie na miejsca, w których robię błąd i jaki to błąd byłbym bardzo wdzięczny.


tutaj wklejam log z kompilacji.

Compiling single file...
--------
- Filename: D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c
- Compiler Name: TDM-GCC 4.8.1 64-bit Release

Processing C source file...
--------
- C Compiler: C:\Program Files (x86)\Dev-Cpp\MinGW64\bin\gcc.exe
- Command: gcc.exe "D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c" -o "D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.exe"  -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.8.1\include" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc
D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c:79:7: error: conflicting types for 'dodawanie'
 float dodawanie (float *a,float *b){
       ^

D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c:45:5: note: previous implicit declaration of 'dodawanie' was here
   d=dodawanie(*wska,*wskb);
     ^
D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c:84:7: error: conflicting types for 'odejmowanie'
 float odejmowanie (float *a,float *b){
       ^
D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c:49:5: note: previous implicit declaration of 'odejmowanie' was here
   d=odejmowanie(&a,&b);
     ^
D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c:89:7: error: conflicting types for 'mnozenie'
 float mnozenie (float *a,float *b){
       ^
D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c:55:5: note: previous implicit declaration of 'mnozenie' was here
   d=mnozenie(&a,&b);
     ^
D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c:94:7: error: conflicting types for 'dzielenie'
 float dzielenie (float *a,float *b){
       ^
D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c:61:5: note: previous implicit declaration of 'dzielenie' was here
   d=dzielenie(&a,&b);
     ^
D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c:100:7: error: conflicting types for 'potega'
 float potega(float *a,float *b){
       ^
D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c:67:4: note: previous implicit declaration of 'potega' was here
  d=potega(&a,&b);
    ^
D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c: In function 'potega':
D:\politechnika\programowanie\politechnika\II semestr\lab 2 dom 2.c:101:9: warning: incompatible implicit declaration of built-in function 'pow' [enabled by default]
  return pow(*a,*b);
         ^


Compilation results...
--------
- Errors: 5
- Warnings: 1
- Compilation Time: 0,17s

Kompiluje w Dev-C++.
P-129243
Quirinnos
» 2015-03-27 09:28:01
Te menu zrób w switchu.
Jak funkcja ma zwracać wartość logiczną, no to ma zwracać wartość logiczną (czyli bool), nie float.
Funkcji nie widzi, bo są po main(). Albo przenieś je przed main(), ale daj tam samą deklarację.
pow() wymaga biblioteki <math.h> (pod C)
odkomentuj przypisanie wskaźników.

Skoro funkcja przyjmuje za argumenty wskaźnik, to do funkcji musisz wysłać wskaźnik, a nie wartość spod wskaźnika.
I w poleceniu masz, że na liście argumentów, ma się znajdować wskaźnik do wyniku.

( float * wynik, float * ptr1, float * ptr2 )

P-129247
CoolPrune9
Temat założony przez niniejszego użytkownika
» 2015-03-27 09:42:04
Postaram się zastosować Twoje rady ale jedna rzecz mnie zastanawia. Skoro funkcja ma zwrócić wartość logiczną to wyświetlanie wyniku ma być w funkcji? Nie bardzo rozumiem ten fragment.
P.S. Zastosowałem switch(), przeniosłem deklaracje funkcji przed main i zmieniłem przekazywanie argumentów na przekazywanie wskaźników. Wszystko liczy się ładnie i pięknie, ale nadal nie zrobiłem bool bo nie rozumiem po co to umieszczać w kodzie. Jak dla mnie to nie ma sensu. Funkcja ma coś policzyć i jeśli się policzy to zwrócić bool, ale co z wynikiem. Też ma być zwrócony? Czy może funkcja ma go wyświetlić?. Tak jak i nie wiem jak uwzględnić przekazywanie wskaźnika null. Bo jeśli dobrze przeczytałem w internecie to wskaźnik, który na nic nie wskazuje. Ale wskaźniki mam już przypisane do a i b wiec w najgorszym przypadku a lub b będą miały wartość zero, a to przekazuje sie bez problemu. Jeśli ktoś rozumie w jakim to celu i jak ma działać byłbym wdzięczny za wytłumaczenie.

Tutaj kod po modyfikacjach :
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
float dodawanie( float * a, float * b );
float odejmowanie( float * a, float * b );
float mnozenie( float * a, float * b );
float dzielenie( float * a, float * b );
float potega( float * a, float * b );

int main( void ) {
    float a = 0;
    float b = 0;
    int c;
    float d = 0;
    float * pwynik;
    float * wska;
    float * wskb;
   
   
   
    printf( " podaj pierwsza liczbe: \n" );
    scanf( "%f", & a );
   
    printf( " \n wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potegowanie \n" );
    scanf( "%d", & c );
   
    if( c > 5 ) {
        printf( " \nBrak takiego działania wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potęgowanie \n" );
        scanf( "%d", & c );
       
    }
   
    if( c < 1 ) {
        printf( " \nBrak takiego działania wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potęgowanie \n" );
        scanf( "%d", & c );
       
    }
   
    if( c == 5 ) {
        printf( "\n podaj potege do ktorej podniesc liczbe \n" );
    }
    else
         printf( " \n podaj druga liczbe: \n" );
   
    scanf( "%f", & b );
   
    wska =& a;
    wskb =& b;
    switch( c ) {
       
       
    case 1:
        d = dodawanie( wska, wskb );
        break;
       
    case 2:
        d = odejmowanie( wska, wskb );
        break;
       
       
    case 3:
        d = mnozenie( wska, wskb );
        break;
       
       
       
    case 4:
        d = dzielenie( wska, wskb );
        break;
       
       
       
    case 5:
        d = potega( wska, wskb );
        break;
    }
   
   
    pwynik =& d;
   
    printf( "wynik dzialania: %f", * pwynik );
   
    return 0;
   
}

float dodawanie( float * a, float * b ) {
    return( * a ) +( * b );
   
}

float odejmowanie( float * a, float * b ) {
    return( * a ) -( * b );
   
}

float mnozenie( float * a, float * b ) {
    return( * a ) *( * b );
   
}

float dzielenie( float * a, float * b ) {
    float d;
    d =( * a ) /( * b );
    return d;
}

float potega( float * a, float * b ) {
    return pow( * a, * b );
}
P-129249
Wronski
» 2015-03-27 13:11:28
Każda operacja ma być osobną funkcja zwracając wartośc logiczną prawdy, gdy operacja wykona sie prawidłowo

wartosc logiczna hmm.... bool, zwraca true jezeli operacja sie wykona hmm

 Funkcje powinny uwzględniać możliwość przekazania wskaźnika NULL, jako wartości jednego z argumentów.

do funckji nie koniecznie musza zostac przekazane 2 argumenty

Jak to zsumujesz to wychodzi, ze w przypadku mniej niz 2 argumentow, operacji nie da sie wykonac prawidlowo wiec zwracamy false,
a jezeli 2 argumenty, operacje da sie wykonac i zwracamy true.

Tak, ja bym zrobil wyswietlenie wyniku w funkcj.
Pamietaj jednak, zeby nie próbować odwoływać się do komórki wskazywanej przez wskaźnik o wartości NULL
P-129253
Monika90
» 2015-03-27 14:08:56
Tak, ja bym zrobil wyswietlenie wyniku w funkcj.
Nie o to chodzi w zadaniu.

Na liście argumentów powinny znajdować: się wskaźnik do zmiennej wynikowej jak i wskaźnik/wskaźniki do wartości argumentów.
P-129257
CoolPrune9
Temat założony przez niniejszego użytkownika
» 2015-03-27 15:50:53
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>



float dodawanie( float * a, float * b, float * wynik );
float odejmowanie( float * a, float * b, float * wynik );
float mnozenie( float * a, float * b, float * wynik );
float dzielenie( float * a, float * b, float * wynik );
float potega( float * a, float * b, float * wynik );

int main( void ) {
    float a = 0;
    float b = 0;
    int c;
    int e;
    float d;
    float * pwynik;
    float * wska;
    float * wskb;
   
   
    do { system( "cls" );
       
        printf( " podaj pierwsza liczbe: \n" );
        scanf( "%f", & a );
       
        printf( " \n wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potegowanie \n" );
        scanf( "%d", & c );
       
        if( c > 5 ) {
            printf( " \nBrak takiego działania wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potęgowanie \n" );
            scanf( "%d", & c );
           
        }
       
        if( c < 1 ) {
            printf( " \nBrak takiego działania wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potęgowanie \n" );
            scanf( "%d", & c );
           
        }
       
        if( c == 5 ) {
            printf( "\n podaj potege do ktorej podniesc liczbe \n" );
        }
        else
             printf( " \n podaj druga liczbe: \n" );
       
        scanf( "%f", & b );
       
        wska =& a;
        wskb =& b;
        pwynik =& d;
       
        switch( c ) {
           
           
        case 1:
            dodawanie( wska, wskb, pwynik );
            break;
           
        case 2:
            odejmowanie( wska, wskb, pwynik );
            break;
           
           
        case 3:
            mnozenie( wska, wskb, pwynik );
            break;
           
           
           
        case 4:
            dzielenie( wska, wskb, pwynik );
            break;
           
           
           
        case 5:
            potega( wska, wskb, pwynik );
            break;
        }
       
       
       
       
        printf( "wynik dzialania: %f", d );
       
        printf( " \n czy cchesz dalej liczyc (1=tak;2=nie)" );
        scanf( " \n %i", & e );
    }
    while( e == 1 );
   
    return 0;
   
}

float dodawanie( float * a, float * b, float * wynik ) {
    * wynik =( * a ) +( * b );
   
}

float odejmowanie( float * a, float * b, float * wynik ) {
    * wynik =( * a ) -( * b );
   
}

float mnozenie( float * a, float * b, float * wynik ) {
    * wynik =( * a ) *( * b );
   
}

float dzielenie( float * a, float * b, float * wynik ) {
   
    * wynik =( * a ) /( * b );
   
}

float potega( float * a, float * b, float * wynik ) {
    * wynik = pow( * a, * b );
}

coś w tym stylu? nadal nie mam pomysłu na wprowadzenie do kodu bool. Rozumiem, że bool ma zwracać true gdy funkcja dokona obliczeń, np dla dodawania deklaracja powinna być taka ?
C/C++
bool dodawanie( float * a, float * b, float * wynik ) {
    * wynik =( * a ) +( * b );
    return true;
}




P.S.
Powstawiałem bool i funkcje zwracają true tylko nie rozumiem co z tym dalej zrobić. Uzależnić wyświetlenie wyniku od wartości bool?

Oto kod poprawionego progrmu
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>



bool dodawanie( float * a, float * b, float * wynik );
bool odejmowanie( float * a, float * b, float * wynik );
bool mnozenie( float * a, float * b, float * wynik );
bool dzielenie( float * a, float * b, float * wynik );
bool potega( float * a, float * b, float * wynik );

int main( void ) {
    float a = 0;
    float b = 0;
    int c;
    int e;
    float d;
    float * pwynik;
    float * wska;
    float * wskb;
   
   
    do { system( "cls" );
       
        printf( " podaj pierwsza liczbe: \n" );
        scanf( "%f", & a );
       
        printf( " \n wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potegowanie \n" );
        scanf( "%d", & c );
       
        if( c > 5 ) {
            printf( " \nBrak takiego działania wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potęgowanie \n" );
            scanf( "%d", & c );
           
        }
       
        if( c < 1 ) {
            printf( " \nBrak takiego działania wybierz działanie \n 1.dodawanie \n 2.odejmowanie\n 3.mnozenie\n 4.dzielenie\n 5.potęgowanie \n" );
            scanf( "%d", & c );
           
        }
       
        if( c == 5 ) {
            printf( "\n podaj potege do ktorej podniesc liczbe \n" );
        }
        else
             printf( " \n podaj druga liczbe: \n" );
       
        scanf( "%f", & b );
       
        wska =& a;
        wskb =& b;
        pwynik =& d;
       
        switch( c ) {
           
           
        case 1:
            dodawanie( wska, wskb, pwynik );
            break;
           
        case 2:
            odejmowanie( wska, wskb, pwynik );
            break;
           
           
        case 3:
            mnozenie( wska, wskb, pwynik );
            break;
           
           
           
        case 4:
            dzielenie( wska, wskb, pwynik );
            break;
           
           
           
        case 5:
            potega( wska, wskb, pwynik );
            break;
        }
       
       
       
       
        printf( "wynik dzialania: %f", d );
       
        printf( " \n czy cchesz dalej liczyc (1=tak;2=nie)" );
        scanf( " \n %d", & e );
    }
    while( e == 1 );
   
    return 0;
   
}

bool dodawanie( float * a, float * b, float * wynik ) {
    * wynik =( * a ) +( * b );
    return true;
}

bool odejmowanie( float * a, float * b, float * wynik ) {
    * wynik =( * a ) -( * b );
    return true;
}

bool mnozenie( float * a, float * b, float * wynik ) {
    * wynik =( * a ) *( * b );
    return true;
}

bool dzielenie( float * a, float * b, float * wynik ) {
   
    * wynik =( * a ) /( * b );
    return true;
}

bool potega( float * a, float * b, float * wynik ) {
    * wynik = pow( * a, * b );
    return true;
}
P-129259
Wronski
» 2015-03-27 17:01:10
to moze odpowiedz sobie na pytanie kiedy operacja nie wykona sie prawidlowo, a kiedy nie ?
Zwroc wtedy odpowiednio true i false i zadanie skonczone
P-129265
CoolPrune9
Temat założony przez niniejszego użytkownika
» 2015-03-27 17:19:35
Jeszce nie udało mi się zmusić do tego programu. gdy jako jeden z argumentów podam np. ciąg liter to traktuje to jak zero i podaje wynik. Jedyna różnica to, że po tym zabiegu nie da się kontynuować liczenia. Cokolwiek nacisnę program się wyłącza. Jakby ktoś mógł pokazać na przykładzie jak wykorzystać bool w tej funkcji byłbym ogromnie wdzięczny.
P-129266
« 1 » 2
  Strona 1 z 2 Następna strona