Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 09.05.2015, 07:40   #1
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,175
Репутация: 117
По умолчанию Ввод числа с клавиатуры

В задачниках по программированию все задачи требуют ввод чисел.
В учебнике по Visual C++ 6.0 нет ни слова о том, как вводить число с клавиатуры. Но в учебнике под MS-DOS (20 лет назад) это объяснялось в первых же уроках (функция scanf ()).
Поэтому я написал собственную программу, в которую можно ввести три целых числа. У меня ушло на это 15 лет. На вторую версию – 1,5 месяца. Прошу заценить.
https://yadi.sk/d/bmwYbfm-gVCDs
jura_k вне форума   Ответить с цитированием
Старый 09.05.2015, 07:57   #2
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,815
Репутация: 6850
По умолчанию

Что исходник за 15 лет так и не рассекретели в спецслужбах?
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 09.05.2015, 08:01   #3
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,175
Репутация: 117
По умолчанию

У меня исходник на другом компьютере. На другом компьютере стоит Windows 2000, под него и программировал. Но похоже, эти программы работают под любой 32-битной Windows.
Исходник показать пока проблематично. Для этого надо выкинуть из текста все стандартные строки, генерируемые средой Visual C++. Займусь как-нибудь попозже и напишу пост.
jura_k вне форума   Ответить с цитированием
Старый 09.05.2015, 08:11   #4
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,815
Репутация: 6850
По умолчанию

Цитата:
Для этого надо выкинуть из текста все стандартные строки, генерируемые средой Visual C++
Кокой ужос О_о... Ну хорошо что это хотя бы не Орхиважный Орхиватор... Будем ждемс...
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 09.05.2015, 10:14   #5
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,175
Репутация: 117
По умолчанию

Файл "p3Doc.h"
Код:
class CP3Doc:public CDocument
{
protected:
	char aa [50];   //   место для вводимых символов
	int ba, bb, bc;   //   исходные данные - целые числа
	int ca, cb;   //   указатель ввода в строку данных, <Enter>
	int da [1];   //   место хранения данных для вывода на экран
	int ea, eb;

	void fa ();   //   перевод данных из символьной формы в цифровую
	void fb ();
}
-------------------------
Файл "p3Doc.cpp"
Код:
CP3Doc::CP3Doc ()
{
	aa [0] = 0;
	ba = bb = bc = 0;
	ca = cb = 0;
	da [0] = 0;
}

void CP3Doc::fa ()
{
	cb = 1;
	ea = 0;
	
	while ((aa [ea] < '0'  ||  aa [ea] > '9')  &&  aa [ea] != '-'  &&  aa [ea]) ea++;
	fb ();
	ba = eb;

	while ((aa [ea] < '0'  ||  aa [ea] > '9')  &&  aa [ea] != '-'  &&  aa [ea]) ea++;
	fb ();
	bb = eb;

	while ((aa [ea] < '0'  ||  aa [ea] > '9')  &&  aa [ea] != '-'  &&  aa [ea]) ea++;
	fb ();
	bc = eb;
}

void CP3Doc::fb ()
{
	int a;

	eb = 0;
	a = 1;
	if (aa [ea] == '-') {a = -1; ea++;}
	while (aa [ea] >= '0'  &&  aa [ea] <= '9')
	{
		eb = eb * 10 + aa [ea] - '0';
		ea++;
	}

	eb *= a;
}
-------------------------
Файл "p3View.cpp"
Код:
void CP3View::OnDraw (CDC *pDC)
{
	CP3Doc *pdoc = GetDocument ();
	ASSERT_VALID (pdoc);
	CString a;

	pDC -> TextOut (5, 5, "Введите три целых числа:");
	pDC -> TextOut (5, 30, pdoc -> aa);
	a.Format ("code = %i", pdoc -> da [0]);
	pDC -> TextOut (5, 55, a);
	if (pdoc -> cb)
	{
		a.Format ("%i %i %i", pdoc -> ba, pdoc -> bb, pdoc -> bc);
		pDC -> TextOut (5, 80, a);
	}
}

void CP3View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	CP3Doc *pdoc = GetDocument ();
	ASSERT_VALID (pdoc);

	pdoc -> da [0] = nChar;
	if (nChar == 8)
	{
		if (pdoc -> ca) {pdoc -> ca--; pdoc -> aa [pdoc -> ca] = 0;}
		goto aaa;
	}

	if (nChar == 13)
	{
		pdoc -> fa ();
		goto aaa;
	}
	
	if (pdoc -> ca < 49)
	{
		pdoc -> aa [pdoc -> ca] = nChar;
		pdoc -> aa [pdoc -> ca + 1] = 0;
		pdoc -> ca++;
	}

aaa:
	Invalidate ();
	CView::OnChar (nChar, nRepCnt, nFlags);
}
Вообще-то программа получится намного длиннее. Первая попавшаяся задача из задачника требует ввести три целых числа. Я собираюсь решить в этой программе ещё несколько задач, и тогда получится куча функций.
Принцип работы программы такой. Нажатия клавиш перехватываются и направляются в символьный массив. Можно использовать <Backspace>.
После нажатия <Enter> массив отправляется на обработку.
Одновременно выводится код нажатой клавиши – но это уже для меня, чтобы знать, какое число вставить в программе.
Программа распознаёт минус и цифры. Все остальные буквы и символы считаются мусором и служат разделителями между целыми числами.

Последний раз редактировалось Stilet; 09.05.2015 в 12:16.
jura_k вне форума   Ответить с цитированием
Старый 31.05.2015, 09:00   #6
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,175
Репутация: 117
По умолчанию

Модификация программы. Теперь приступаем к решению задач (из-за чего всё и затевалось). Скачать программу, текст программы и задачи можно здесь:
https://yadi.sk/d/supY_8Jsgy92y
Задачи записаны в формате программы "Open office 1.0", но вряд ли кто-то будет возражать.
Цитата:
3. (p19-1) Угол задан в градусах, минутах и секундах. Найти его величину в радианах с максимально возможной точностью. Рекомендуется проверить работоспособность программы для углов, больших развёрнутого, а также для отрицательных углов.

4. (p19-3) Длина отрезка задана в дюймах, 1 дюйм = 2,54 см. Перевести значение длины в метрическую систему, то есть выразить её в метрах, сантиметрах и миллиметрах. Так, например, 21 дюйм = 0 м 53 см 3,4 мм.

5. (p20-6) Коммерсант, имея стартовый капитал k рублей, занялся торговлей, которая ежемесячно увеличивает капитал на p%. Через сколько лет он накопит сумму s, достаточную для покупки собственного магазина?
Текст программы. Со временем программы будут становиться всё длиннее, длиннее и длиннее.
Файл p3Doc.h
Код:
class CP3Doc:public CDocument
{
protected:
	CP3Doc ();
	DECLARE_DYNCREATE (CP3Doc);
	char aa [50];   //   место для вводимых символов
	int ba, bb, bc;   //   исходные данные - целые числа
	int ca, cb;   //   указатель ввода в строку данных, <Enter>
	int da [3];   //   место хранения данных для вывода на экран
	double db [3];
	int ea, eb;

	void fa ();   //   перевод данных из символьной формы в цифровую
	void fb ();
	void fc ();   //   Задача p19 - 1 (3)
	void fd ();   //   Задача p19 - 3 (4)
	void fe ();   //   Задача p20 - 6 (5)
};
Файл p3Doc.cpp
Код:
#include "stdafx.h"
#include "math.h"
#include "p3.h"
#include "p3Doc.h"

CP3Doc::CP3Doc ()
{
	aa [0] = 0;
	ba = bb = bc = 0;
	ca = cb = 0;
	da [0] = 0;
}

void CP3Doc::fa ()
{
	cb = 1;
	ea = 0;
	
	while ((aa [ea] < '0'  ||  aa [ea] > '9')  &&  aa [ea] != '-'  &&  aa [ea]) ea++;
	fb ();
	ba = eb;

	while ((aa [ea] < '0'  ||  aa [ea] > '9')  &&  aa [ea] != '-'  &&  aa [ea]) ea++;
	fb ();
	bb = eb;

	while ((aa [ea] < '0'  ||  aa [ea] > '9')  &&  aa [ea] != '-'  &&  aa [ea]) ea++;
	fb ();
	bc = eb;
	fc (); fd (); fe ();
}

void CP3Doc::fb ()
{
	int a;

	eb = 0;
	a = 1;
	if (aa [ea] == '-') {a = -1; ea++;}
	while (aa [ea] >= '0'  &&  aa [ea] <= '9')
	{
		eb = eb * 10 + aa [ea] - '0';
		ea++;
	}

	eb *= a;
}

void CP3Doc::fc ()
{
	int a;
	double b;

	a = ba;
	if (ba < 0)  a = -a;
	b = ((bc / 60. + bb) / 60 + a) / 180 * 3.14592653589;
	if (ba < 0)  b = -b;
	db [0] = b;
}

void CP3Doc::fd ()
{
	int a, b;
	double c;

	c = ba * .0254;
	if (c < 0)  c = 0;
	a = (int) c;
	c = (c - a) * 100;
	b = (int) c;
	c = (c - b) * 10;
	da [1] = a;
	da [2] = b;
	db [1] = c;
}

void CP3Doc::fe ()
{
	double a, b;

	if (ba == 0  ||  bb < 1) {db [2] = 0; return;}
	a = (double) bc / ba;
	if (a <= 0) {db [2] = 0; return;}
	b = 1 + bb / 100.;
	db [2] = log (a) / log (b) / 12;
}
Файл p3View.cpp
Код:
void CP3View::OnDraw (CDC *pDC)
{
	CP3Doc *pdoc = GetDocument ();
	ASSERT_VALID (pdoc);
	CString a;

	pDC -> TextOut (5, 5, "Введите три целых числа:");
	pDC -> TextOut (5, 30, pdoc -> aa);
	a.Format ("code = %i", pdoc -> da [0]);
	pDC -> TextOut (5, 55, a);
	if (pdoc -> cb)
	{
		a.Format ("%i %i %i", pdoc -> ba, pdoc -> bb, pdoc -> bc);
		pDC -> TextOut (5, 80, a);
		a.Format ("p19 - 1. Угол равен %.12g радиан.", pdoc -> db [0]);
		pDC -> TextOut (5, 105, a);
		a.Format ("p19 - 3. %i дюймов = %i м %i см %g мм.", pdoc -> ba, pdoc -> da [1], pdoc -> da [2], pdoc -> db [1]);
		pDC -> TextOut (5, 130, a);
		a.Format ("p20 - 6. Необходимая сумма будет накоплена через %.3g лет.", pdoc -> db [2]);
		pDC -> TextOut (5, 155, a);
	}
}

void CP3View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	CP3Doc *pdoc = GetDocument ();
	ASSERT_VALID (pdoc);

	pdoc -> da [0] = nChar;
	if (nChar == 8)
	{
		if (pdoc -> ca) {pdoc -> ca--; pdoc -> aa [pdoc -> ca] = 0;}
		goto aaa;
	}

	if (nChar == 13)
	{
		pdoc -> fa ();
		goto aaa;
	}
	
	if (pdoc -> ca < 49)
	{
		pdoc -> aa [pdoc -> ca] = nChar;
		pdoc -> aa [pdoc -> ca + 1] = 0;
		pdoc -> ca++;
	}

aaa:
	Invalidate ();
	CView::OnChar (nChar, nRepCnt, nFlags);
}

Последний раз редактировалось jura_k; 31.05.2015 в 09:16.
jura_k вне форума   Ответить с цитированием
Старый 13.06.2015, 21:27   #7
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,175
Репутация: 117
По умолчанию

Вот программа, в которую можно ввести с клавиатуры рациональное число. Скачать:
https://yadi.sk/d/jn9VynjChEb77
Текст программы:

Файл “p46Doc.h”
Код:
class CP46Doc:public CDocument
{
protected:
	CP46Doc ();
	DECLARE_DYNCREATE (CP46Doc);
	char aa [50];	//   место для вводимых символов
	double ba;		//   исходные данные - вещественное число
	int ca, cb, cc;	//   указатель ввода в строку данных, <Enter>, указатель чтения из строки данных
	int da [1];		//   место хранения данных для вывода на экран
	double ea;

	void fa ();		//   перевод данных из символьной формы в цифровую
	void fb ();
};
Файл “p46Doc.cpp”
Код:
CP46Doc::CP46Doc ()
{
	aa [0] = 0;
	ba = 0;
	ca = cb = 0;
	da [0] = 0;
}

void CP46Doc::fa ()
{
	cb = 1;
	cc = 0;

	while ((aa [cc] < '0'  ||  aa [cc] > '9')  &&  aa [cc] != '-'  &&  aa [cc] != '.'
		&&  aa [cc])  cc++;
	fb ();
	ba = ea;
}

void CP46Doc::fb ()
{
	int a;
	double b;

	ea = 0;
	a = 1;
	b = .1;
	if (aa [cc] == '-') {a = -1; cc++;}
	while (aa [cc] >= '0'  &&  aa [cc] <= '9')
	{
		ea = ea * 10 + aa [cc] - '0';
		cc++;
	}

	if (aa [cc] == '.')
	{
		cc++;
		while (aa [cc] >= '0'  &&  aa [cc] <= '9')
		{
			ea += (aa [cc] - '0') * b;
			cc++;
			b /= 10;
		}
	}

	ea *= a;
}
Файл “p46View.cpp”
Код:
void CP46View::OnDraw (CDC *pDC)
{
	CP46Doc *pdoc = GetDocument ();
	ASSERT_VALID (pdoc);
	CString a;

	pDC -> TextOut (5, 5, "Input float:");
	pDC -> TextOut (5, 30, pdoc -> aa);
	a.Format ("code = %i", pdoc -> da [0]);
	pDC -> TextOut (5, 55, a);

	if (pdoc -> cb)
	{
		a.Format ("%g", pdoc -> ba);
		pDC -> TextOut (5, 80, a);
	}
}

void CP46View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	CP46Doc *pdoc = GetDocument ();
	ASSERT_VALID (pdoc);

	pdoc -> da [0] = nChar;
	if (nChar == 8)
	{
		if (pdoc -> ca) {pdoc -> ca--; pdoc -> aa [pdoc -> ca] = 0;}
		goto aaa;
	}

	if (nChar == 13)
	{
		pdoc -> fa ();
		goto aaa;
	}

	if (pdoc -> ca < 49)
	{
		pdoc -> aa [pdoc -> ca] = nChar;
		pdoc -> aa [pdoc -> ca + 1] = 0;
		pdoc -> ca++;
	}

aaa:
	Invalidate ();
	CView::OnChar (nChar, nRepCnt, nFlags);
}

Последний раз редактировалось jura_k; 13.06.2015 в 21:37.
jura_k вне форума   Ответить с цитированием
Старый 29.06.2015, 10:40   #8
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,175
Репутация: 117
По умолчанию

Очередной шедевр программирования.
Код:
void CP42View::OnDraw (CDC *pDC)
{
	int aa, ab, ac, ad;
	unsigned ba;
	char ca;
	CP42Doc *pdoc = GetDocument ();
	ASSERT_VALID (pdoc);
	CString a;

	aa = 1996;
	a.Format ("Now %i year.", aa);
	pDC -> TextOut (5, 5, a);
	a.Format ("Сейчас %i год.", aa);
	pDC -> TextOut (200, 5, a);
	for (aa = 10; aa; aa--)
	{
		a.Format ("%i", aa);
		pDC -> TextOut (5 + (10 - aa) * 30, 30, a);
	}

	a.Format ("Start!");
	pDC -> TextOut (5, 55, a);
	a.Format ("Старт!");
	pDC -> TextOut (200, 55, a);
	ba = 60000;
	aa = ba;
	a.Format ("aa = %i, ba = %u.", aa, ba);
	pDC -> TextOut (5, 80, a);
	ca = 'c';
	a.Format ("%c", ca);
	pDC -> TextOut (5, 105, a);
	ca = '+';
	a.Format ("%c%c", ca, ca);
	pDC -> TextOut (15, 105, a);
	aa = 5;
	ab = 60;
	aa++;
	++ab;
	a.Format ("aa = %i, ab = %i.", aa, ab);
	pDC -> TextOut (5, 130, a);
	a.Format ("aa = %i, ab = %i.", aa++, ++ab);
	pDC -> TextOut (5, 155, a);

	aa = 101 <= 105;
	ab = 101 > 105;
	a.Format ("true - %i, false - %i.", aa, ab);
	pDC -> TextOut (5, 180, a);
	for (aa = 0; aa < 10; aa++)
		for (ab = 0; ab < 10; ab++)
		{
			a.Format ("%i * %i = %i", aa, ab, aa * ab);
			pDC -> TextOut (5 + aa * 100, 230 + ab * 25, a);
		}

	for (aa = 0; aa < 1000; aa++)
	{
		ab = aa * aa * aa;
		if (ab > 10000)  break;
		a.Format ("%i - %i", aa, ab);
		ac = aa % 3;
		ad = aa / 3;
		pDC -> TextOut (5 + ad * 100, 500 + ac * 25, a);
	}

	for (aa = 0; aa < 1000; aa++)
	{
		if (aa % 7) continue;
		a.Format ("%i", aa);
		ab = aa / 7;
		ac = ab % 8;
		ad = ab / 8;
		pDC -> TextOut (5 + ad * 50, 600 + ac * 25, a);
	}
}

Последний раз редактировалось jura_k; 29.06.2015 в 10:44. Причина: Перекодирование Unicode -> кириллица
jura_k вне форума   Ответить с цитированием
Старый 29.06.2015, 12:07   #9
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,175
Репутация: 117
По умолчанию

Ссылка на скачивание (release-версия):
https://yadi.sk/d/eFzutq5XhYHUo
jura_k вне форума   Ответить с цитированием
Старый 29.06.2015, 14:08   #10
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 14,646
Репутация: 2631
По умолчанию

Получше настройте дизассемблер и хекс-рей исходники чуть проще будет читать...
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С клавиатуры вводятся числа, в порядке возрастания их значения. Признаком конца ввода является ввод числа, которое не удовлетворяе Masha Koks Помощь студентам 2 26.11.2013 23:58
Ввод с клавиатуры два целых числа без знака и вывод на экран их сумму. gelya_17 Помощь студентам 5 18.10.2010 10:31
ввод с клавиатуры Sparky Assembler 5 10.09.2009 17:05


13:32.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru