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

Projekt- Kalkulator

Ostatnio zmodyfikowano 2009-11-28 22:18
Autor Wiadomość
naiL
Temat założony przez niniejszego użytkownika
» 2009-11-19 14:00:43
u nie wiem jak to się stało
P-11669
naiL
Temat założony przez niniejszego użytkownika
» 2009-11-19 14:01:56
C/C++
#include <iostream>
#include <conio.h>
#include <string>
#include "ddtconsole.h"
#include <stdio.h>
#include <stdlib.h>

int main()
{
    using namespace std;
    int klawisz = 256;
    int wprowadzono_przecinek = 0;
    int pierwsze_zero = 0; //1- nie bylo 2- bylo zero na poczatku
    int analiza_znaku = 0;
    int ilosc_cyfr = 0;
    string LiczbaA;
    string cyfra( " " );
    double Liczba_A = 0;
    klawisz = getch();
    while( klawisz != 27 )
   
    {
        cyfra = klawisz;
        cout << "wcisnij klawisz\n";
        cout << klawisz << "\n";
        if( klawisz == 44 && wprowadzono_przecinek == 0 ) analiza_znaku = 1;
       
        if( klawisz == 44 && wprowadzono_przecinek == 1 ) analiza_znaku = 2;
       
        if( klawisz == 48 && pierwsze_zero == 0 && wprowadzono_przecinek == 0 ) analiza_znaku = 3;
       
        if( klawisz == 48 && pierwsze_zero == 0 && wprowadzono_przecinek == 1 ) analiza_znaku = 4;
       
        if( klawisz >= 48 && klawisz <= 57 && pierwsze_zero == 1 && wprowadzono_przecinek == 1 ) analiza_znaku = 5;
       
        if( klawisz > 48 && klawisz <= 57 && pierwsze_zero == 1 && wprowadzono_przecinek == 0 )
        {
            ilosc_cyfr--;
            analiza_znaku = 6;
            cout << "kasuje wprowadzone zero!!\n";
            pierwsze_zero = 0;
        }
        if( klawisz >= 48 && klawisz <= 57 && pierwsze_zero == 0 && wprowadzono_przecinek == 1 ) analiza_znaku = 7;
       
        if( klawisz > 48 && klawisz <= 57 && pierwsze_zero == 0 && wprowadzono_przecinek == 0 ) analiza_znaku = 8;
       
        if( klawisz == 48 && pierwsze_zero == 1 && wprowadzono_przecinek == 0 ) analiza_znaku = 9;
       
        if( klawisz == 8 && ilosc_cyfr > 0 ) analiza_znaku = 11;
       
        if( ilosc_cyfr == 10 )
        {
            analiza_znaku = 10;
            break;
        }
        switch( analiza_znaku )
        {
        case 1:
            cout << "wprowadzono przecinek. \n";
            wprowadzono_przecinek = 1;
            LiczbaA += ".";
            break;
        case 2:
            cout << "przecinek juz zostal wprowadzony wczesniej!!\n";
            break;
        case 3:
            cout << "0,xx powstanie liczba <1\n";
            pierwsze_zero = 1;
            ilosc_cyfr++;
            LiczbaA += cyfra;
            break;
        case 4:
            pierwsze_zero = 1;
            cout << "wprowadzasz 0 dla liczby >1\n";
            ilosc_cyfr++;
            LiczbaA += cyfra;
            break;
        case 5:
            cout << "wprowadzasz cyfry 0-9 dla liczby <1\n";
            ilosc_cyfr++;
            LiczbaA += cyfra;
            break;
        case 6:
            LiczbaA += cyfra;
            break;
        case 7:
            cout << "wprowadzasz cyfry 0-9 dla liczby rzeczywistej>1\n";
            ilosc_cyfr++;
            LiczbaA += cyfra;
            break;
        case 8:
            cout << "poki co liczba bedzie calkowita >1\n";
            ilosc_cyfr++;
            LiczbaA += cyfra;
            break;
        case 9:
            cout << "0.xx juz jest wprowadz przecinek zeby wprowadzic liczbe 0,0x\n";
            break;
        case 10:
            cout << "nie mozna wprowadzic wiecej cyfr\n" << ilosc_cyfr;
            break;
        case 11:
            cout << "cofam o jeden";
            LiczbaA.resize( LiczbaA.size() - 1 );
            ilosc_cyfr--;
            break;
        }
       
        klawisz = getch();
    }
   
    cout << "Bingo!!! typu string liczba to " << LiczbaA;
   
    if( wprowadzono_przecinek == 1 ) ilosc_cyfr++;
   
    char liczba_backup[ ilosc_cyfr ];
    for( int i = 0; i <= ilosc_cyfr; i++ )
    {
        liczba_backup[ i ] = LiczbaA[ i ];
    }
   
    Liczba_A = atof( liczba_backup );
    cout.precision( 10 );
    cout << "\n double= " << Liczba_A;
   
   
    getch();
    getch();
    getch();
    return( 0 );
}
nie wiem jak użyć tego stringstream, czytam sobie cplusplus. :) no czarnoksięstwo. buduję tablicę char liczba_backup to wrzucam do atof(). może jest łatwiejszy sposób na zamianę string->double?
hmm może przesada z tymi if'ami ale mimo starań i tak czasami się "miętoli" i wczytuje więcej niż 10 cyfr.
Pozostało mi dorobić wczytywanie wykładnika i oznaczanie znaku całej liczby. Ale to raczej prosty case. Tak mi sie wydaje. po każdym wczytanym znaku wywoływana będzie funkcja która drukuje na ekranie obiekt 5x7 znaków reprezentujący wybraną cyfrę.

klawisz backspace cofa wprowadzenie.
kurcze patrząc na kod ten z dodawaniem w double masakra.:)
P-11670
Elaine
» 2009-11-19 14:59:40
Jak ten kod może niepoprawnie działać skoro się nawet nie kompiluje?
P-11672
naiL
Temat założony przez niniejszego użytkownika
» 2009-11-19 15:26:56
Nie mam problemu z działaniem. Nie wiem jak używać std::stringstream. Kompiluje sie cacy. na końcu przerzucam pętlą zawartość string do char(liczba_backup) bo inaczej mi atol nie chce przyjąć string(LiczbaA).
P-11674
DejaVu
» 2009-11-19 17:26:22
C/C++
std::stringstream zmienna;
zmienna << cokolwiek;
//zmienna.str(); <= @down - wykomentowałem ;p
double liczba;
zmienna >> liczba; //to nie wiem czy zadziala... - trzeba sprawdzic
P-11679
Elaine
» 2009-11-19 18:12:42
Kompiluje sie cacy.
Nie kłam. Przecież "char liczba_backup[ilosc_cyfr];" nie ma prawa się kompilować.

@up: Po kiego to wywołanie basic_stringstream::str()? Bez niego też działa.
P-11682
DejaVu
» 2009-11-19 19:27:53
@up: sry, rozpędziłem się ;p myślałem nad alternatywnym rozwiązaniem przez atof'a i tak się zamyśliłem, że jedna linijka mi za dużo wpadła ;p

/edit:
Nie kłam.
f.a.l. w dyplomacji używa się sformułowania "Mija się Pan z prawdą" :) brzmi to bardziej wyrafinowanie i nikt Cię nie może posądzić przez dwuznaczność w interpretacji :)
P-11684
naiL
Temat założony przez niniejszego użytkownika
» 2009-11-19 19:59:16
hehehehe... dobre. W sumie to może wcale nie jest takie dziwne. Skoro kompilator to samo zadanie potrafi wyliczyć na dwa różne sposoby, być może właśnie dlatego kompiluje char liczba_backup. W sumie niektóre błędy poprawiam na zasadzie prób i błędów. A może tak, a jak nie to inaczej. Prawda bywa zbyt prosta żeby w nią uwierzyć.

C/C++
double Liczba_A = 0; //mam w kodzie na początku.
stringstream backup; // usingname std;
backup << LiczbaA;
LiczbaA >> Liczba_A;
rozumiem, że to cokolwiek to mój zbudowany string.
->|113|error: aggregate `std::stringstream backup' has incomplete type and cannot be defined|
115|error: no match for 'operator>>' in 'LiczbaA >> Liczba_A'|
pozostanę najwyżej przy tym atof. nie za bardzo potrafię zrozumieć używanie operatorów <</>>. Coś tam liznąłem temat Łale nie wiem czy pora na to odpowiednia. Trochę dla mojego osobistego kompilatora za twarde.
co do uwagi Pana f.a.l.'a. na temat kompilacji w przypadku kodu który wyliczał double z wprowadzanych cyfr jak i tego drugiego nieszczęsnego string. Cały misterny plan na ten kalkulator muszę sobie poprzerabiać pod string. Dzięki temu że DevC++ taki jest :).
przeglądając forum dowiedziałem się o planach modernizacji portalu DDT kursów, forum itd. Więc może sugestia w kierunku przyszłych nowicjuszy portalu DDT, którzy w pierwszych lekcjach odczytają DeVC++ jako niezawszeprawdomówny ;).(moja wersja 4.9.9.2 beta czy coś tam).
PS> Pod Code::blocks zmieniłem char liczba_backup[11] (kompilator VisualC++2005/2008)... no bo niestety. ;)


P-11685
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona