Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > некорректная работа программы


Автор: anatox91 19.2.2008, 10:17
вобщем вопрос тут вот в чем: создал примитивный калькулятор, но работает он неправильно, компилируясь без ошибок. После того, как выбираешь действие и выполняешь его, нужно чтобы программа закрывалась, а она начинает выполнять следующую case-инструкцию и так до последней...подскажите пожалуйста что я не так делаю, вот код:
Код

#include <iostream>
#include <windows.h>
using namespace std;

double f_u(double j) {
       static double k = 1;
       k = k * j;
       return k;
       }

double f_s(double j) {
       static double k = 0;
       k = k + j;
       return k;
       }
       
void umnozhenie() {
       char question[100] = "Сколько чисел вы будете перемножать?\n";
       char str[10] = "Введите ";
       char str1[10] = " число.\n";
       int q_a;
       double number;
       
       ::CharToOem(question, question);
       ::CharToOem(str, str);
       ::CharToOem(str1, str1);
       
       cout << question;
       cin >> q_a;
       cin.ignore();
       
       int counter = 1;
       
       for(int i=0; i < q_a; i++) {
               cout << str << counter << str1;
               cin >> number;
               cin.ignore();
               cout << "Result is " << f_u(number) << "\n\n";
               counter++;
               }
       }

void summation() {
       char question[100] = "Сколько чисел вы будете суммировать?\n";
       char str[10] = "Введите ";
       char str1[10] = " число.\n";
       int q_a;
       double number;
       
       ::CharToOem(question, question);
       ::CharToOem(str, str);
       ::CharToOem(str1, str1);
       
       cout << question;
       cin >> q_a;
       cin.ignore();
       
       int counter = 1;
       
       for(int i=0; i < q_a; i++) {
               cout << str << counter << str1;
               cin >> number;
               cin.ignore();
               cout << "Result is " << f_s(number) << "\n\n";
               counter++;
               
               }
       }

void vychitanie() {
       char question[100] = "Из какого числа вы будете вычитать?\n";
       char question2[100] = "Сколько чисел вы будете вычитать?\n";
       char str[10] = "Введите ";
       char str1[10] = " число.\n";
       int q_a;
       double k;
       double number;
       
       ::CharToOem(question, question);
       ::CharToOem(question2, question2);
       ::CharToOem(str, str);
       ::CharToOem(str1, str1);
       
       cout << question;
       cin >> k;
       cin.ignore();
       
       cout << question2;
       cin >> q_a;
       cin.ignore();
       
       int counter = 1;
       
       for(int i=0; i < q_a; i++) {
               cout << str << counter << str1;
               cin >> number;
               cin.ignore();
               k = k - number;
               cout << "Result is " << k << "\n\n";
               counter++;
               }
       }

int main() {
    SetConsoleTitle("Mini-Calc");
    int choice;
    char str1[30] = "Введите:\n";
    char str2[60] = "1 - если хотите перемножить числа.\n";
    char str3[60] = "2 - если хотите суммировать числа.\n";
    char str4[100] = "3 - если хотите из числа вычесть сколько-то чисел.\n";
    char str5[50] = "\nСмотри что вводишь!\n";
    
    ::CharToOem(str1, str1);
    ::CharToOem(str2, str2);
    ::CharToOem(str3, str3);
    ::CharToOem(str4, str4);
    ::CharToOem(str5, str5);
    
    re:
    
    cout << str1;
    cout << str2;
    cout << str3;
    cout << str4;
    cin >> choice;
    cin.ignore();
    
    switch(choice) {
                   case 1:
                           cout << "\n"; umnozhenie();
                   case 2:
                           cout << "\n"; summation();
                   case 3:
                           cout << "\n"; vychitanie();
                   default:
                           cout << str5;
                           goto re;
                   }
    cin.get();
    return 0;
} 
 

Автор: ama_kid 19.2.2008, 10:23
anatox91, читай хелп по switch и используй break...
Код

    switch(choice) {
                   case 1:
                           cout << "\n"; umnozhenie();
                           break;
                   case 2:
                           cout << "\n"; summation();
                           break;
                   case 3:
                           cout << "\n"; vychitanie();
                           break;
                   default:
                           cout << str5;
                           goto re;
                   }

P.S. рискую развязать холи-вар, но попытайся обойтись без goto (к примеру, организацией бесконечного цикла с условием выхода)

Автор: MAKCim 19.2.2008, 10:27
ama_kid, 
здесь goto вполне логичен и не мешает пониманию кода

Автор: anatox91 19.2.2008, 10:28
ama_kid, спасибо, напомнил склерознику... знал об этом, но напрочь из головы вылетело почему-то  smile 

Автор: virtual09 19.2.2008, 10:34
Цитата(MAKCim @  19.2.2008,  10:27 Найти цитируемый пост)
здесь goto вполне логичен и не мешает пониманию кода 

Не согласен, потому что надо искать метку, а она может быть где угодна. Лучше do while().

Автор: anatox91 19.2.2008, 11:17
virtual09, MAKCim говорит именно про этот код, а тут по-моему отыскать метку не так уж и сложно... это в больших кодах другое дело... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)