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

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

Восстановить пароль Регистрация
 
N3sh
1 / 1 / 0
Регистрация: 21.04.2010
Сообщений: 7
22.04.2010, 10:48     Калькулятор #1
Всем привет.Решил учить программирование графических приложений в windows и сразу же застопорился на калькуляторе.Произвести сложение пытаюсь сложив два буфера,а затем вывести результат в третий. Вот такая каша получается.
Если кто знает подскажите пожалуйста,как правильно сделать.Не судите строго я токо начал постигать постигать.
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
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <windows.h>
#include "stdafx.h"
wchar_t buff[16];
wchar_t buff1[16];
wchar_t buff2[16];
HWND edit_p;
HWND edit_h;
HWND edit_y;
// объявление функций
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM RegMyWindowClass(HINSTANCE, LPCTSTR);
 
////////////////////////////////////////////////////////////////////////// 
// функция вхождений программы WinMain
int APIENTRY WinMain(HINSTANCE hInstance,
             HINSTANCE         hPrevInstance,
             LPSTR             lpCmdLine,
             int               nCmdShow)
{
 
  // имя будущего класса
  LPCTSTR lpzClass = TEXT("My Window Class!");
  wchar_t form_class_edit[]=L"edit";
  wchar_t form_class_button[]=L"button";
  wchar_t sTitle_edit[]=L"";
  wchar_t sTitle_button[]=L"Плюс";
  // регистрация класса
  if (!RegMyWindowClass(hInstance, lpzClass))
    return 1;
 
  // вычисление координат центра экрана
  RECT screen_rect;
  GetWindowRect(GetDesktopWindow(),&screen_rect); // разрешение экрана
  int x = screen_rect.right / 2 - 150;
  int y = screen_rect.bottom / 2 - 75;
 
  // создание диалогового окна
  HWND hWnd = CreateWindow(lpzClass, TEXT("калькулятор"), 
    WS_OVERLAPPEDWINDOW | WS_VISIBLE, x, y, 500, 400, NULL, NULL, 
    hInstance, NULL);
 
  edit_y = CreateWindowEx(NULL, form_class_edit, sTitle_edit, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_LOWERCASE |WS_BORDER,
      170,50, 150, 20, hWnd, (HMENU)3, hInstance, NULL);
  edit_p = CreateWindowEx(NULL, form_class_edit, sTitle_edit, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_LOWERCASE |WS_BORDER,
      10,20, 150, 20, hWnd, (HMENU)4, hInstance, NULL);
  edit_h = CreateWindowEx(NULL, form_class_edit, sTitle_edit, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_LOWERCASE |WS_BORDER,
      170,20, 150, 20, hWnd, (HMENU)2, hInstance, NULL);
  CreateWindowEx(NULL, form_class_button, sTitle_button, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_LOWERCASE |WS_BORDER,
      10,50, 100, 20, hWnd, (HMENU)1, hInstance, NULL);
  // если окно не создано, описатель будет равен 0
  if(!hWnd) return 2; 
 
  // цикл сообщений приложения
  MSG msg = {0};    // структура сообщения
  int iGetOk = 0;   // переменная состояния
  while ((iGetOk = GetMessage(&msg, NULL, 0, 0 )) != 0) // цикл сообщений
  {
    if (iGetOk == -1) return 3;  // если GetMessage вернул ошибку - выход
    TranslateMessage(&msg);    
    DispatchMessage(&msg);
  }
 
  return msg.wParam;  // возвращаем код завершения программы
}
 
////////////////////////////////////////////////////////////////////////// 
// функция регистрации класса окон
ATOM RegMyWindowClass(HINSTANCE hInst, LPCTSTR lpzClassName)
{
  WNDCLASS wcWindowClass = {0};
  // адрес ф-ции обработки сообщений
  wcWindowClass.lpfnWndProc = (WNDPROC)WndProc;
  // стиль окна
  wcWindowClass.style = CS_HREDRAW|CS_VREDRAW;
  // дискриптор экземпляра приложения
  wcWindowClass.hInstance = hInst;
  // название класса
  wcWindowClass.lpszClassName = lpzClassName;
  // загрузка курсора
  wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  // загрузка цвета окон
  wcWindowClass.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;
  return RegisterClass(&wcWindowClass); // регистрация класса
}
 
////////////////////////////////////////////////////////////////////////// 
// функция обработки сообщений
LRESULT CALLBACK WndProc(
  HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  // выборка и обработка сообщений
  switch (message)
  {
  case WM_COMMAND:
      
     // реакция на сообщение
      if(wParam == 1) {
      int xs = GetWindowText(edit_p, buff, 10);
      int y  = GetWindowText(edit_h, buff1, 10);
      buff2[16] = buff[16] + buff1[16]; // собственно вот так вот я и пытаюсь сложить два числа
      SetWindowText(edit_y,buff2);
      }
      break;
  case WM_DESTROY:
    PostQuitMessage(0);  // реакция на сообщение
    break;
  default:  
    // все сообщения не обработанные Вами обработает сама Windows
    return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}
Добавлено через 1 час 7 минут
Неужели на таком крутом форуме никто незнает как сделать калькулятор?Даже не сделать,а просто указать на ошибку.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2010, 10:48     Калькулятор
Посмотрите здесь:

Калькулятор на С++ C++
C++ Калькулятор на С
C++ Калькулятор
Калькулятор C++
Калькулятор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
22.04.2010, 11:06     Калькулятор #2
C++
1
buff2[16] = buff[16] + buff1[16];
Да это мил-человек извращение...
Вам необходимо текст из эдитов перевести в числовые значения, сложить их и перевести обратно в строки, и вот тогда уже выводить
N3sh
1 / 1 / 0
Регистрация: 21.04.2010
Сообщений: 7
22.04.2010, 12:33  [ТС]     Калькулятор #3
Можно поподробнее пожалуйста.При помощи функции atoi?Если можно примерчик.

Добавлено через 50 минут
Сделал вот так,ошибку не выдаёт,но и результат тоже:
C++
1
2
3
4
5
6
(int)buff2[16];
      (int)buff1[16];
      (int)buff[16];
      buff2[16] = buff[16] + buff1[16];
      (wchar_t)buff2[16];
      SetWindowText(edit_y,buff2);
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
22.04.2010, 18:22     Калькулятор #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
   // числовые переменные для расчетов
   double a = 0, b = 0;
 
   // переводим строки в числа 
   a = _wtof(buf1);
   b = _wtof(buf2);
 
   // производим операцию
   a += b;
 
   // записываем число в выходной буфер
   swprintf_s(buf3, 16, L"%f", a);
atoi не подойдет по двум причинам:
1 - использовать для калькулятора целочисленные переменные не разумно
2 - в данном примере используют строки юникод
N3sh
1 / 1 / 0
Регистрация: 21.04.2010
Сообщений: 7
22.04.2010, 18:59  [ТС]     Калькулятор #5
Спасибо за помощь.Заработало.
N3sh
1 / 1 / 0
Регистрация: 21.04.2010
Сообщений: 7
23.04.2010, 22:47  [ТС]     Калькулятор #6
У меня тут ещё такая вот незадача вышла.Пытаюсь сделать,чтобы все было в одной форме.Поесню:
Например ввожу я в форму цифру 2 нажимаю плюс и форма освобождается,а цифра 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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <stdlib.h>
#include <windows.h>
#include "stdafx.h"
wchar_t buff[16];
wchar_t buff1[16];
wchar_t buff2[16];
wchar_t buff3[16];
HWND edit_p;
HWND edit_h;
HWND edit_y;
// объявление функций
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM RegMyWindowClass(HINSTANCE, LPCTSTR);
 
////////////////////////////////////////////////////////////////////////// 
// функция вхождений программы WinMain
int APIENTRY WinMain(HINSTANCE hInstance,
             HINSTANCE         hPrevInstance,
             LPSTR             lpCmdLine,
             int               nCmdShow)
{
 
  // имя будущего класса
  LPCTSTR lpzClass = TEXT("My Window Class!");
  wchar_t form_class_edit[]=L"edit";
  wchar_t form_class_button[]=L"button";
  wchar_t sTitle_edit[]=L"";
  wchar_t sTitle_button_p[]=L"+";
  wchar_t sTitle_button_m[]=L"-";
  wchar_t sTitle_button_y[]=L"*";
  wchar_t sTitle_button_d[]=L"/";
  wchar_t sTitle_button_r[]=L"=";
  // регистрация класса
  if (!RegMyWindowClass(hInstance, lpzClass))
    return 1;
 
  // вычисление координат центра экрана
  RECT screen_rect;
  GetWindowRect(GetDesktopWindow(),&screen_rect); // разрешение экрана
  int x = screen_rect.right / 2 - 150;
  int y = screen_rect.bottom / 2 - 75;
 
  // создание диалогового окна
  HWND hWnd = CreateWindow(lpzClass, TEXT("калькулятор"), 
    WS_OVERLAPPEDWINDOW | WS_VISIBLE, x, y, 320, 220, NULL, NULL, 
    hInstance, NULL);
 
  edit_p = CreateWindowEx(NULL, form_class_edit, sTitle_edit, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_LOWERCASE |WS_BORDER,
      30,10, 250, 20, hWnd, (HMENU)3, hInstance, NULL);
 
  CreateWindowEx(NULL, form_class_button, sTitle_button_r, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_LOWERCASE |WS_BORDER,
      130,30, 100, 20, hWnd, (HMENU)2, hInstance, NULL);
  CreateWindowEx(NULL, form_class_button, sTitle_button_p, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_LOWERCASE |WS_BORDER,
      30,30, 100, 20, hWnd, (HMENU)1, hInstance, NULL);
  CreateWindowEx(NULL, form_class_button, sTitle_button_m, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_LOWERCASE |WS_BORDER,
      30,50, 100, 20, hWnd, (HMENU)4, hInstance, NULL);
  CreateWindowEx(NULL, form_class_button, sTitle_button_y, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_LOWERCASE |WS_BORDER,
      30,70, 100, 20, hWnd, (HMENU)5, hInstance, NULL);
  CreateWindowEx(NULL, form_class_button, sTitle_button_d, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_LOWERCASE |WS_BORDER,
      30,90, 100, 20, hWnd, (HMENU)6, hInstance, NULL);
  
  // если окно не создано, описатель будет равен 0
  if(!hWnd) return 2; 
 
  // цикл сообщений приложения
  MSG msg = {0};    // структура сообщения
  int iGetOk = 0;   // переменная состояния
  while ((iGetOk = GetMessage(&msg, NULL, 0, 0 )) != 0) // цикл сообщений
  {
    if (iGetOk == -1) return 3;  // если GetMessage вернул ошибку - выход
    TranslateMessage(&msg);    
    DispatchMessage(&msg);
  }
 
  return msg.wParam;  // возвращаем код завершения программы
}
 
////////////////////////////////////////////////////////////////////////// 
// функция регистрации класса окон
ATOM RegMyWindowClass(HINSTANCE hInst, LPCTSTR lpzClassName)
{
  WNDCLASS wcWindowClass = {0};
  // адрес ф-ции обработки сообщений
  wcWindowClass.lpfnWndProc = (WNDPROC)WndProc;
  // стиль окна
  wcWindowClass.style = CS_HREDRAW|CS_VREDRAW;
  // дискриптор экземпляра приложения
  wcWindowClass.hInstance = hInst;
  // название класса
  wcWindowClass.lpszClassName = lpzClassName;
  // загрузка курсора
  wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  // загрузка цвета окон
  wcWindowClass.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;
  return RegisterClass(&wcWindowClass); // регистрация класса
}
 
////////////////////////////////////////////////////////////////////////// 
// функция обработки сообщений
LRESULT CALLBACK WndProc(
  HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  // выборка и обработка сообщений
  switch (message)
  {
  case WM_COMMAND:
      
     // реакция на сообщение
      if(wParam == 1) {
         GetWindowText(edit_p, buff, 10);
         SetWindowText(edit_p, buff1);
      } if(wParam == 2) {
          GetWindowText(edit_p,buff1,10);
      
      double a = 0,b = 0;
      a = _wtof(buff);
      b = _wtof(buff1);
      a += b;
      swprintf_s(buff2, 16, L"%f", a);
      SetWindowText(edit_p,buff2);
      } if(wParam == 5) {
          GetWindowText(edit_p, buff, 10);
          SetWindowText(edit_p, buff1);
      } if(wParam == 2) {
           GetWindowText(edit_p,buff1,10);
 
      double a = 0,b = 0;
      a = _wtof(buff);
      b = _wtof(buff1);
      a = (a * b);
      swprintf_s(buff2, 16, L"%f", a);
      SetWindowText(edit_p,buff2);
      }
      
      break;
  case WM_DESTROY:
    PostQuitMessage(0);  // реакция на сообщение
    break;
  default:  
    // все сообщения не обработанные Вами обработает сама Windows
    return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}
Работает токо кнопка плюс и умножить,но работает не правильно.Укажите где ошибка пожалуйста,токо начал постигать науку программирования.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.04.2010, 06:44     Калькулятор #7
я бы посоветовал тебе параметр HMENU в функции CreateWindow, описывать как то так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define IDB_PLUS 1
 
// ... 
 
CreateWindowEx(NULL, form_class_button, sTitle_button_r, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_LOWERCASE |WS_BORDER, 130,30, 100, 20, hWnd, (HMENU)IDB_PLUS, hInstance, NULL);
 
// ...
 
switch(uMsg)
{
   case WM_COMMAND:
   {
      switch(LOWORD(wParam))
      {
         case IDB_PLUS:
         // ...
      }
   }
}
 
// ...
зы. Что именно не работает непонятно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2010, 15:53     Калькулятор
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
N3sh
1 / 1 / 0
Регистрация: 21.04.2010
Сообщений: 7
26.04.2010, 15:53  [ТС]     Калькулятор #8
Он считает не правильно и я не могу понять почему.
Yandex
Объявления
26.04.2010, 15:53     Калькулятор
Ответ Создать тему
Опции темы

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