odczyt znaków z klawiatury i problem ze SWITCHem

0

Witam ponownie,
postanowiłem napisać program-kalkulator, który sczytuje kolejno pierwszą liczbę (numA), drugą liczbę (numB), a następnie znak działania, które ma być na nich przeprowadzone (znak). Switch wymaga posługiwania się integerami, więc poczytałem co nieco i znak działania w programie przedstawiam jako kod ASCII (użytkownik oczywiście wprowadza + - * lub / ).
Po pobraniu w/w danych od użytkownika program wyświetla ułożone działanie i pyta, czy o to chodziło (test).
Z jakichś powodów program wysypuje się nim zdążę wprowadzić wartość t lub n (na potrzeby case'ów przemienione na odpowiedniki ASCII)... Sądzę, że wszystko dobrze zagnieździłem i napisałem, proszę o pomoc.

#include <iostream>
using namespace std;
int main()
{
    int numA, numB, test, znak;
    cout << "\tPodaj dwie liczby...\n";
    cout << endl << "Pierwsza: ";
    cin >> numA;
    cout << endl << "Druga: ";
    cin >> numB;
    cout << endl << "Dzialanie: ";
    cin >> znak;
    cout << endl << numA << " " << znak << " " << numB;
    cout << "\tOK?\t(t/n)";
    cin >> test;
    switch (test)
    {
           case 116:
                switch (znak)
                {
                       case 043:
                            cout << "\n\tWynik: " << numA + numB;
                            cout << endl << endl;
                            break;
                       case 045:
                            cout << "\n\tWynik: " << numA - numB;
                            cout << endl << endl;
                            break;
                       case 042:
                            cout << "\n\tWynik: " << numA * numB;
                            cout << endl << endl;
                            break;
                       case 047:
                            cout << "\n\tWynik: " << numA / numB;
                            cout << endl << endl;
                            break;
                       default:
                               cout << "Blad uzytkownika programu!\n";
                               break;
                }
           case 110:
                cout << "\tPodaj dwie liczby...\n";
                cout << endl << "Pierwsza: ";
                cin >> numA;
                cout << endl << "Druga: ";
                cin >> numB;
                cout << endl << "Działanie: ";
                cin >> znak;
                cout << endl << numA << " " << znak << " " << numB;
                cout << "\tOK?\t(t/n)";
                cin >> test;
                break;
           default:
                   cout << "Blad uzytkownika programu!\n";
                   break;
    }
system ("PAUSE");
return 0;
}
0

Zgodnie ze standardem C/C++ wartość 043 (z zerem na początku) oznacza liczbę ósemkową o wartości 43(oct) = 35(dec). Musisz podawać liczby BEZ zer na początku.
Poza tym, równie dobrze zamiast kodów ASCII możesz pisać same znaki:

case 116: //twoja opcja
case 't': //oznacza to samo, ale jest czytelniejsze
0

Nie wiedziałem, że można tak sobie w apostrofy wpisywać znaki. W dalszym ciągu program nie realizuje części ze SWITCHem. A właściwie to od razu przechodzi do DEFAULT i wyświetla komunikat 'Błąd użytkownika programu!" Kiepsko...

0

Przed:
cin >> test;
wstaw:
cin.sync();

0

Cześć, mam pytanie, a ty się chyba znasz dobrze na C++, otóż: chcę, żeby program pobierał ode mnie dwie zmienne (a oraz b), ale w taki sposób, że na ekranie będę widział (puste miejsce -- z kursorem) k (po wprowadzeniu w 1-szym pustym miejscu, kursor przeskoczy literkę 'k' i pojawi się tu). W pierwsze miejsce wpiszę zmienną a, klepnę Enter, w drugim miejscu wpiszę zmienną b i klepnę Enter i już. Jak to zrobić? Zawsze jak zatwierdzam wprowadzane dane to "kursor" przeskakuje do następnej linijki. Czy w tym przypadku można to powstrzymać?

Chodzi o coś takiego?

          __________________________________
Podaj a: |                                  |
         |__________________________________|
Podaj b: |                                  |
         |__________________________________|

Jeśli tak, polecałbym zainteresować się funkcją WinAPI (z pliku windows.h) o nazwie SetConsoleCursorPosition - bo domyślam się, że program jest na Windows.

0

A ja z ncurses. Bardziej uniwersalna.

0

Zbyt sobie chcę utrudnić życie, teraz pomyślałem, żeby program po moim wprowadzeniu czegoś takiego:
10k12
przypisał liczbę przed 'k' zmiennej a, natomiast to co po 'k' zmiennej b. Coś mi świta, że scanf to dobry pomysł, ale może zbyt debilnie to zapisuję.

0
scanf("%dk%d", &a, &b);
0

Ale zdajesz sobie sprawę z tego, że jeśli chcesz wczytać dwie liczby, to możesz je wczytywać normalnie - a przy wpisywaniu po prostu rozdzielić spacją, prawda?

int a, b;
cout << "podaj liczby: ";
cin >> a >> b;

Podczas działania:podaj liczby: 45 33<ENTER>

0

OK, program działa jak natura chciała, z tym, że chciałem dodać nową funkcjonalność. Bonus dopisywany po rządanym rzucie, który byłby dodawany lub odejmowany do/od końcowej wartości ileWynik. Niestety, program wywala się tak bardzo, że aż wychodzi na pulpit...

#include <iostream>

using namespace std;

    int ileBonus, ileRzutow, ileScian, ileWynik;

int rzutK(int kostka)
{
int wynik;
wynik = (rand() % kostka) +1;
ileWynik += wynik;
return wynik;
}

int main()
{
    srand (time (NULL));
    do
    {
          ileWynik = 0;
          cout << endl << endl << "Rzut:  ";
          scanf ("%dk%d %d", &ileRzutow, &ileScian, ileBonus);
          while (ileRzutow > 0)
          {
          ileRzutow--;
          rzutK(ileScian);
          }
	      cout << endl << "Wynik:  " << ileWynik + ileBonus;
          cout << endl << endl << "-------------";
    }
    while (ileWynik >= 0);

system ("PAUSE");
return 0;
}
0
scanf ("%dk%d %d", &ileRzutow, &ileScian, /* brak znaku & */ &ileBonus);
0

Maniak, pisanie pytania w komentarzu ...

char slowo[128];
scanf ("%127s",slowo);
int len=strlen(slowo);
for(int i=0;i<len;++i) printf("t[%d]='%c';",i,slowo[i]);
0

OK, czyli jest sobie zmienna, która przyjmie co najwyżej 128 znaków, potem pobiera się ciąg znaków od użytkownika, ale skąd to 127 między % a s? Czy to, że po przecinku jest "slowo" nie wystarcza? Potem zmiennej liczbowej len jest przypisywana zwracana przez funkcję strlen liczba znaków wyrazu, a potem tyle razy dzieje się cośz printfem, ile wynosi wartość zmiennej len. Tu na końcu trochę nie kapuję. Wiem, że %d jest też zależne od len, czyli od ilości znaków w wyrazie, a %c to pojedynczy znak... Co robi to "t" przed [%d], czy to tabela? Nie bardzo rozumiem powiązanie %c i slowo[i], chociaż coś mi świta...

Wklepałem to, trochę ogarnąłem, skróciłem "słowo", dodałem sprawdzacza tabeli na końcu [0], żeby wiedzieć, czy to działa, ale to przypisanie int dlugosc wywala błąd, bez względu na to, czy dam powyżej char/int litery(slowo);

#include <iostream>

using namespace std;

int main()
{
    char slowo[64];
    char litery(slowo);
    int dlugosc = litery(slowo);
    scanf ("%63s", slowo);
    for (int i=0; i<dlugosc; ++i)
    printf ("t[%d]='%c';", i, slowo[i]);
    cout << slowo[0];
    system ("PAUSE");
}
0

Mam pytanie co do tego kalkulatora a bardziej dokładnie to do pobierania zmiennych.
Skoro jest możliwość np taka:

for(int i = 0; i < 3; i++)
{
i += i;
} 

To czy jest możliwość czegoś takiego:

int i;
cout << "Podaj 1 liczbe: ";
cin >> i;
cout << "Podaj 2 liczbe: ";
cin >> i+i; 

Że do zmiennej i dodaje nową wpisaną liczbę a nie zastępują ją inną?

0

Sam nie wiem... Raczej nie, bo nie możesz przypisać wartości sumie. W moim przypadku z tym += chodziło o to, by wartość zmiennej była zwiększana o zwracaną wartość pewnej funkcji, pewną ilość razy.

PS Jeśli chcesz, mogę wkleić tu działającą, poprawioną wersję tego kalkulatora (kod C++) Daj znać.

0

Dlaczego moja maszynka do liczenia BMI, a konkretniej zmienna index sprawia mi takie problemy? Podaje jakieś kosmiczne wartości zakończone #INFO, czy coś w tym stylu. Co tu jest nie tak?

#include <iostream>

using namespace std;

int main()
{
    float weight, height, index;
    index = weight / (height * height);
    cout << "\n\tKalkulator BMI (Body Mass Index)\n";
    cout << "\nWaga (kg):  ";
    cin >> weight;
    cout << "\nWzrost (m):  ";
    cin >> height;
    cout << "\nBMI:  " << index;
system ("PAUSE");
}
0

Nie dziw się - wykonujesz operacje na niezainicjalizowanych zmiennych. Obliczenie wartości index wykonaj już po wczytaniu weight i height.

0

Mam jeszcze takie jedno pytanie. Dotyczy innego programu...

#include <iostream>

using namespace std;

int main()
{
    char word[64];
    int count = 0;
    cout << "Wpisz slowo:  ";
    cin >> word;
    cout << endl;
    while (word[count])
        count++;
    cout << "Liczba sylab:  ";
    cout << count;
    cout << endl << endl;
    system ("PAUSE");
    return 0;
}

Jak zrobić, żeby count++ działało w momencie, gdy pętla natrafi na samogłoskę? ('a', 'e', 'i', 'o', 'u', 'y') Próbowałem napisać to używając alternatywy ||, ale wtedy za każdym razem wyskakuje 0, chyba, że wpiszę jedną jedyną samogłoskę jako słowo to wtedy Liczba sylab wynosi 1. Proszę o pomoc.

No, i jeszcze jedna, mam nadzieję, że banalna sprawa...

#include <iostream>

using namespace std;

int bmi(float index);

int main()
{
    float weight, height, formula;
    cout << "\n\tKalkulator BMI (Body Mass Index)";
    cout << endl << endl;
    cout << "\nWaga (kg):  ";
    cin >> weight;
    cout << "\nWzrost (m):  ";
    cin >> height;
    formula = weight / (height * height);
    cout << "\nBMI:  " << bmi(formula);
    cout << endl << endl;
system ("PAUSE");
}

int bmi(float index)
{
    if (index <= 15)
    cout << "wyglodzenie";
    if ((index > 15) && (index <= 17.4))
    cout << "wychudzenie";
    if ((index > 17.4) && (index <= 18.5))
    cout << "niedowaga";
    if ((index > 18.5) && (index <= 24.9))
    cout << "prawidlowe";
    if ((index > 24.9) && (index <= 29.9))
    cout << "nadwaga";
    if ((index > 29.9) && (index <= 34.9))
    cout << "otylosc I-st";
    if ((index > 34.9) && (index <= 39.9))
    cout << "otylosc II-st";
    if ((index > 39.9) && (index <= 40.9))
    cout << "otylosc III-st";
}

Dlaczego program wypisuje ocenę BMI nie tam, gdzie trzeba (obok BMI: ), a w miejscu 'BMI: ' wypisuje jakąś niestworzoną liczbę? Czy ja coś źle ułożyłem w tym kodzie?

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