Форум программистов, компьютерный форум CyberForum.ru

Калькулятор - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Denis_KID
0 / 0 / 0
Регистрация: 09.09.2012
Сообщений: 5
09.09.2012, 19:53     Калькулятор #1
Всем привет) Начну с того что я не программист...
Но вот решил просто освоить для себя. Выбрал язык Си. Купил книгу начал
читать. Написал первую более менее законченную программу)))

Калькулятор. v 0.2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 #include <windows.h>
#include <conio.h>
#include <stdio.h>
 
int main()
{
 
   textbackground(1);
  textcolor(14);
 
  printf("**************************\n");
  printf("     ELECTRONICS  CO      \n");
  printf("**************************\n");
  printf("   ‚ᥠЇа*ў* §*йЁйҐ**л    \n   „«л Їа®¤®«¦Ґ*ЁҐ        \n   *¦¬ЁвҐ Enter           \n");
  printf("**************************\n");
 
  Beep(294, 1000/8);
  Beep(440, 1000/4);
  Beep(262*2, 1000/4);
  Beep(330*2, 1000/4);
  Beep(415, 1000/8);
  Beep(440, 1000);
 
  getch();
 
  float g;
  int a, b, c, d, e, f, h, i;
  i = 1;
  g = b;
 
  printf ("    ЉЂ‹њЉ“‹џ’Ћђ  v 0.2    \n");
  printf("**************************\n");
 
  textbackground(0);
  textcolor(14);
 
  printf ("„«п б«®¦Ґ*Ёп   **¦¬ЁвҐ   1\n");
  printf ("„«п ўлзЁв**Ёп  **¦¬ЁвҐ   2\n");
  printf ("„«п г¬*®¦Ґ*Ёп  **¦¬ЁвҐ   3\n");
  printf ("„«п ¤Ґ«Ґ*Ёп    **¦¬ЁвҐ   4\n");
  printf ("„«п ў®§ўҐ¤Ґ*ЁҐ ў б⥯Ґ*м 5\n");
 
  scanf ("%d", &a );
 
  while ( a != 1 & a != 2 & a != 3 & a != 4 & a != 5)
  {
     printf ("„«п б«®¦Ґ*Ёп   **¦¬ЁвҐ   1\n");
     printf ("„«п ўлзЁв**Ёп  **¦¬ЁвҐ   2\n");
     printf ("„«п г¬*®¦Ґ*Ёп  **¦¬ЁвҐ   3\n");
     printf ("„«п ¤Ґ«Ґ*Ёп    **¦¬ЁвҐ   4\n");
     printf ("„«п ў®§ўҐ¤Ґ*ЁҐ ў б⥯Ґ*м 5\n");
     scanf ("%d", &a );
  }
 
  if( a == 1 | a == 2 | a == 3 | a == 4)
  {
     printf ("    ‚ўҐ¤ЁвҐ зЁб«*\n");
     scanf ("%d", &b );
     scanf ("%d", &c );
  }
 
  if( a == 5 )
  {
     printf ("‚ўҐ¤ЁвҐ зЁб«®\n");
     scanf ("%d", &b );
     printf ("‚ўҐ¤ЁвҐ б⥯Ґ*м\n");
     scanf ("%d", &c );
  }
 
  h = b;
 
  d = b + c;
  e = b - c;
  f = b * c;
  g = (float)b / c;
 
  while ( i < c )
  {
        i = i + 1;
        h = h * b;
  }
 
  printf ("**************************\n");
 
  if ( a == 1 )
  printf ("ђҐ§г«мв*в : %d", d);
  if ( a == 2 )
  printf ("ђҐ§г«мв*в : %d", e);
  if ( a == 3 )
  printf ("ђҐ§г«мв*в : %d", f);
  if ( a == 4 )
  printf ("ђҐ§г«мв*в : %2f", g);
  if ( a == 5 )
  printf ("ђҐ§г«мв*в : %d\n", h);
 
  getch();
 
  return 0;
}
А так как знакомых программистов на языке Си нет то решил спросить на форуме.
Как доработать код программы так что бы при выводе результата, и при повторном нажатии Enter выбранное действия повторялось бы снова.
Тогда бы не пришлось дописывать выбор действия возведения в степень...

Код компилировал lccwin32.

Вот сома программа 56.rar

Да и ещё вопрос. Как можно оптимизировать код?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2012, 19:53     Калькулятор
Посмотрите здесь:

Калькулятор на С++ C++
C++ Калькулятор на С
C++ Калькулятор
Калькулятор C++
Калькулятор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
10.09.2012, 00:52     Калькулятор #2
Цитата Сообщение от Denis_KID Посмотреть сообщение
Как доработать код программы так что бы при выводе результата, и при повторном нажатии Enter выбранное действия повторялось бы снова.
нужно сделать цикл do...while и предусмотреть выход из него, находясь в программе
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
10.09.2012, 03:46     Калькулятор #3
Цитата Сообщение от Denis_KID Посмотреть сообщение
Да и ещё вопрос. Как можно оптимизировать код?
Не то что оптимизировать, скорее поправить.

в условиях надо писать не так
if(условие_1 & условие_2 & условие_3)
а так
if(условие_1 && условие_2 && условие_3)
& - побитовое "и"
&& - логическое "и"

часть ваших условий вполне можно заменить равносильными. например
C++
1
2
3
4
это
while ( a != 1 && a != 2 && a != 3 && a != 4 && a != 5)
на это
while (a < 1 || a > 5)
а здесь нужно использовать if else if или switch-case
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//if else if  
if ( a == 1 )
  printf ("ђҐ§г«мв*в : %d", d);
else if ( a == 2 )
  printf ("ђҐ§г«мв*в : %d", e);
else if ( a == 3 )
//... 
  
//swicth-case
switch(a)
{
case 1:printf ("ђҐ§г«мв*в : %d", d); break;
//...
}
Здесь возможно деление на ноль - надо делать проверку
C++
1
g = (float)b / c;
Здесь можно заменить возведением в степень
C++
1
2
3
4
5
 while ( i < c )
  {
        i = i + 1;
        h = h * b;
  }
Также старайтесь использовать функции, а не писать весь код в мейне. Объявляйте переменные как можно ближе к месту, где они будут использованы. И называйте переменные по-человечески. Сами ж через неделю забудете, что в вашем коде значит e, а что g.
cmath
Модератор
 Аватар для cmath
2415 / 1634 / 132
Регистрация: 11.08.2012
Сообщений: 3,252
Завершенные тесты: 5
10.09.2012, 05:53     Калькулятор #4
Тема уже обсуждалась здесь.
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
10.09.2012, 08:58     Калькулятор #5
Цитата Сообщение от I.M. Посмотреть сообщение
while ( a != 1 && a != 2 && a != 3 && a != 4 && a != 5)
C++
1
while (a<1 && a>5)
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.09.2012, 09:12     Калькулятор #6
KeyGen, выражение "a<1 && a>5" всегда будет ложным. Вне зависимости от значения a
Denis_KID
0 / 0 / 0
Регистрация: 09.09.2012
Сообщений: 5
11.09.2012, 22:43  [ТС]     Калькулятор #7
Вот что-то сделал, но есть ещё над чем работать...

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<stdio.h>
 
int main()
{
    int a, b, c, d, e;
    
    do
    {
    do    
    {
    printf("Vibirite operaciu\n");
    printf("+ = 1\n- = 2\n* = 3\n/ = 4\n");
    scanf("%d", &a);
    
    if (a >= 1 && a <= 4)
       break;
    }
    while(1);
    
    printf ("Vvedite chisla\n");
       scanf("%d %d", &b, &c);
    do
    {
    if ( a == 1 )
      { b += c;
       printf("rezul'tat %d\t", b); }
    if ( a == 2 )
      { b -= c;
       printf("rezul'tat %d\t", b); }
    if ( a == 3 )
      { b *= c;
       printf("rezul'tat %d\t", b); }
    if ( a == 4 )
      { b /= c;
       printf("rezul'tat %d\t", b); }
       
    printf ("dlia prodolgeie nagmite 2 dlia exit 1\t");
       scanf ("%d", &d);
    if ( d == 1 )
       break;
    }
    while(1);
    
    printf("\nDlia prodolgenia raboti vvedite  2 , dlia vixoda 1\n");
       scanf("%d", &e);
    if ( e == 1)
       break;
    }
    while(1);
    
    return 0;
}
Добавлено через 5 минут
Объявляйте переменные как можно ближе к месту, где они будут использованы. И называйте переменные по-человечески. Сами ж через неделю забудете, что в вашем коде значит e, а что g.
спасибо учтём.
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
11.09.2012, 23:02     Калькулятор #8
Цитата Сообщение от Denis_KID Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
    if ( a == 1 )
      { b += c;
       printf("rezul'tat %d\t", b); }
    if ( a == 2 )
      { b -= c;
       printf("rezul'tat %d\t", b); }
    if ( a == 3 )
      { b *= c;
       printf("rezul'tat %d\t", b); }
    if ( a == 4 )
      { b /= c;
       printf("rezul'tat %d\t", b); }
Это лучше заменить на switch или хотя бы if ... else if ... else if ... else ... В вашем случае проверяется все варианты, какой в этом смысл? Если а = 1 он уже ни как не может быть равно 2...
Denis_KID
0 / 0 / 0
Регистрация: 09.09.2012
Сообщений: 5
12.09.2012, 01:41  [ТС]     Калькулятор #9
Цитата Сообщение от KeyGen Посмотреть сообщение
Это лучше заменить на switch
Спс switch () освоил, и переправил

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<stdio.h>
 
int main()
{
    int a, b, c, d, e;
    
    do
    {
    do    
    {
    printf("Vibirite operaciu\n");
    printf("+ = 1\n- = 2\n* = 3\n/ = 4\n");
    scanf("%d", &a);
    
    if (a >= 1 && a <= 4)
       break;
    }
    while(1);
    
    printf ("Vvedite chisla\n");
       scanf("%d %d", &b, &c);
    do
    {
    switch(a){
    case 1: b += c; break;
    case 2: b -= c; break;
    case 3: b *= c; break;
    case 4: b /= c; break;
    }
    printf("rezul'tat %d\t", b); 
       
    printf ("dlia prodolgeie nagmite 2 dlia exit 1\t");
       scanf ("%d", &d);
    if ( d == 1 )
       break;
    }
    while(1);
    
    printf("\nDlia prodolgenia raboti vvedite  2 , dlia vixoda 1\n");
       scanf("%d", &e);
    if ( e == 1)
       break;
    }
    while(1);
    
    return 0;
}
По swith() возник вопрос... т.е если а=1 то выполняется case 1: b += c; break; а остольные даже не проверяются и тем более не выполняются?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
12.09.2012, 02:10     Калькулятор #10
Цитата Сообщение от Denis_KID Посмотреть сообщение
По swith() возник вопрос... т.е если а=1 то выполняется case 1: b += c; break; а остольные даже не проверяются и тем более не выполняются?
Да, именно так.

В конструкции do-while условие выхода из цикла желательно ставить на соответствующее место. Например
C++
1
2
3
4
5
6
7
 do    
{
   printf("Vibirite operaciu\n");
   printf("+ = 1\n- = 2\n* = 3\n/ = 4\n");
   scanf("%d", &a);
    
}while(!(a >= 1 && a <= 4));
Проще читать код, когда точки входа/выхода локализованы в одном месте

И старайтесь соблюдать некоторое оформление кода - отступы и табуляцию. Это тоже улучшает читаемость. Если смещение кода - это результат копипаста, тогда извините
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
12.09.2012, 07:48     Калькулятор #11
Цитата Сообщение от Denis_KID Посмотреть сообщение
int a, b, c, d, e;
Еще давайте осмысленные названия переменным, на английском - не знаете, знает словарь
Denis_KID
0 / 0 / 0
Регистрация: 09.09.2012
Сообщений: 5
13.09.2012, 00:32  [ТС]     Калькулятор #12
Проще читать код, когда точки входа/выхода локализованы в одном месте
я как-то и не додумался до этого... совет учтён и изменение внесены.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* Программа калькулятор */
#include<stdio.h>
 
int main()
{
    float b, c; /* b, c - Вводимые переменные числа */
    int a, d, e; /* a - переменная выбора рпеоации +, -, *, \, или выход из программы*/
                 /* d - переменная повторения вабронной операции или прекращение */
                 /* e - переменная выбора: возврат к выбору операций или выход из программы */
    
    do
    {
    do    
    {
    printf("Vibirite operaciu\n");
    printf("+ = 1\n- = 2\n* = 3\n/ = 4\nexit = 0\n");
    printf("Vibirite deistviia\t");
    scanf("%d", &a);
    if(a == 0)
    {return 0;}
    }
    while(a > 4);
    
    printf("Vvedite chisla\n");
    scanf("%f %f", &b, &c);
    do
    {
    switch(a){
    case 1: b += c; break;
    case 2: b -= c; break;
    case 3: b *= c; break;
    case 4: b /= c; break;
    }
    printf("rezul'tat %f\t", b); 
       
    printf("Dlia prodolgeie nagmite 2 , dlia exit 1\t");
    scanf("%d", &d);
    }
    while(d > 1);
    
    printf("\nDlia prodolgenia nagmite 2 , dlia exit 1\n");
    scanf("%d", &e);
    }
    while(e > 1);
    
    return 0;
}

1.добавил возможность выйти из программы при выборе действия +, -, *, \...
2.добавлена возможность ввода и вычисление переменных с плавающей точкой.

C
1
2
if(a == 0)
    {return 0;}
Добавлено через 5 минут
Цитата Сообщение от KeyGen Посмотреть сообщение
Еще давайте осмысленные названия переменным, на английском - не знаете, знает словарь
Начнём учить английский
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2012, 01:22     Калькулятор
Еще ссылки по теме:

Калькулятор C++
Калькулятор C++
C++ Калькулятор на C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
13.09.2012, 01:22     Калькулятор #13
Думаю, следующим шагом (раз уж вы упорно не переименовываете переменные) должно стать разбивка программы на функции.
Также у вас до сих пор возможно деление на ноль вот тут
C++
1
case 4: b /= c; break;
А здесь, если пользователь введет -1, то ваша программа отработает некорректно в дальнейшем
C++
1
2
3
4
5
6
7
   scanf("%d", &a);
   if(a == 0)
   {
      return 0;
   }
}
while(a > 4);
Кроме того, если хотите, можете предусмотреть некорректный ввод со стороны пользователя - когда он вводит строку вместо числа. Сейчас ваша программа закрешится в этом случае.
Yandex
Объявления
13.09.2012, 01:22     Калькулятор
Ответ Создать тему
Опции темы

Текущее время: 21:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru