Перейти к содержанию
Решена проблема отправки писем ×
АнимеФорум

C и C++


Рекомендуемые сообщения

  • Ответов 91
  • Создана
  • Последний ответ

Топ авторов темы

Так после установки Visual C++ как раз появляется кнопочка дебаггера. Он же и запускается.

Причём эта кнопочка появляется в любой виндоус (когда раньше её просто не было).

Вот я и задумался несколько лет назад: что бы там такого подправить, чтобы работало?

Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...

Я посадил дерево написал программу. Она ничего не делает. Но в неё можно ввести три целых числа. Предлагаю вам попробовать. Программа работает под Windows на 32-битной платформе. (Windows 2000, Windows Vista)

Ещё там работают клавиши <Backspace> и <Enter>.

Прошу заценить.

https://yadi.sk/d/bmwYbfm-gVCDs

 

У меня сначала была Debug-версия, и там всё работало. Но когда я стал компилировать Release-версию, вылезли ошибки. Помучившись полчаса, я выяснил, что не там определил пару внутренних функций. Это надо было сделать в другом файле, и линковщик сообщал мне об ошибках. Помогла разобрать ситуацию интуиция...

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Модификация программы. Теперь приступаем к решению задач (из-за чего всё и затевалось). Скачать программу, текст программы и задачи можно здесь:

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);
}

 

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
Ссылка на комментарий
Поделиться на другие сайты

Не стоит называть переменные вот так вот. Все вот эти aa, nChar и прочее. Времена с ограничением до 8 букв давно прошли (ну, в языках общего назначения по крайней мере). Имена переменных должны отображать их смысл, даже если это получается длинно. Благо, автокомплит в и в блокнотах нынче бывает.

 

Без этого тяжело понять, что происходит вообще в программе. Читаемость -- это очень важно для хорошего кода.

Ссылка на комментарий
Поделиться на другие сайты

Я работал со схемотехникой, так там вообще ничего не понятно. И самое главное, никто ничего не объясняет, хотя по работе надо! Так что то, что тут у меня – это ещё по-божески.

А понимать ничего и не надо. Никто не просит вас ковыряться в чужом коде, раз там всё работает. Это же не электротехника, которая может испортиться.

Что касается nChar, так это не я придумал, а Visual C++. Так же как и названия классов – тоже его изобретение. Программа называется по-простому: p3.

А вот представьте, что у вас три независимых задачи, которые никак друг с другом не связаны. Поможет вам там придумывание имён? Оно только запутает. Это всё равно что в одно произведение напихать разные сюжеты. И потом этот винегрет читать.

Автокомплитом не пользуюсь. Пользуюсь языками программирования 1985-го, 1995-го и 2000-го года. Но даже там ограничение на длину переменных, кажется, 32 символа. А может, и больше.

Автокомплит есть в Visual C++ 6.0, на котором написана эта программа. То есть если ввести название класса, автокомплит показывает, какие там переменные-члены и функции, и это очень удобно, так как нет Help'а. А откуда ещё узнать, какие функции в этом стандартном классе. Не все диски можно было достать в далёком 2000-ом. А литература, увы, ограничена... Например, там не сказано было, как ввести число с клавиатуры. Я думал над этим 15 лет. И вот наконец придумал (см. 28-ой пост).

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
Ссылка на комментарий
Поделиться на другие сайты

1) Меня в группы не допускают. А в тех, в которые допускают, программировать вовсе не нужно.

2) Для меня важно "здесь и сейчас". Будущее не определено, оттого оно и будущее.

3) Ошибка возникала при обработке карты первой версии HOM III (Возрождение Эрафии) в редакторе карт HOM III третьей версии (Тень смерти). Что-то там внутри гд-то неправильно перепаковано. Виноват программист – неверное представление данных. Он, конечно, не ожидал, что его старые карты будут загружать в новом редакторе. Вот и не выявил ошибку при тестировании. Махнул рукой – так сойдёт.

 

1) Независимые приложения слишком маленькие – шесть строк оригинального кода. Так не пойдёт. Не стоит из-за шести строк программу делать.

Пересечение наблюдается в получении данных, которое занимает львиную долю программы.

А они и есть модули. В виде функций.

Я ещё не научился компоновать программу из разных файлов. В учебнике не написано, а если и написано, то я до этого ещё не добрался.

Вот когда придётся долго перелистывать программу, тогда задумаюсь о многих модулях. Хотя Visual C++ и в этом отношении упрощает жизнь программисту, – он предоставляет "автокомплит" и быстрый переход к нужной функции класса из окна классов.

2) Да. Но нужно кинуть вперёд, чтобы не мешало. Остальные способы подразумевают фигурные скобки, НО! я следую принципу "не усложнять без необходимости". <Надо вперёд? пошли.>

3) Вопрос именования возникает в больших программах. В мелких модулях использую такой способ.

 

Я уже делал раньше программу под MS-DOS, в которой заключено 50 разных мелких программ, так что опыт имеется. А тут visual-среда, что намного упрощает жизнь.

Ссылка на комментарий
Поделиться на другие сайты

А понимать ничего и не надо. Никто не просит вас ковыряться в чужом коде, раз там всё работает.

 

Ну спрячь его и не показывай, раз не надо. Притом что на самом деле очень часто надо.

 

Ты программировать учишься? Ну вот и учись. Базовый синтаксис языка освоить -- это даже не полдела, с этим медведи в цирке на одноколёсном велосипеде справятся. Мало просто решить задачу. От программиста в подавляющем большинстве случаев требуется чтобы его код был (а) легко читаемый (б) легко модифицируемый. Осмысленные имена переменных -- первый шаг к этому.

 

Собсно, можно по этому повод книгу почитать, к примеру того же МакКоннела, "Совершенный код".

 

 

Что касается nChar, так это не я придумал, а Visual C++. Так же как и названия классов – тоже его изобретение. Программа называется по-простому: p3.

 

А не надо редактору давать за тебя имена изобретать. Он твоих мыслей и назначения переменных не знает.

 

 

И потом этот винегрет читать.

 

Винегрет -- это вот aa и прочее. Со мной программист на AS400 работает, в этой системе нельзя называть переменный длиннее 8 символов. И имена из-за это в духе FCCXMY. Вот он матерится, когда ему нужно программы править. Потому что смотришь на эту загадочную аббревиатуру -- и поди пойми что это и зачем.

Изменено пользователем Shinsaku-To (смотреть историю редактирования)
Ссылка на комментарий
Поделиться на другие сайты

А не надо редактору давать за тебя имена изобретать. Он твоих мыслей и назначения переменных не знает.
Это имя по умолчанию, которое дала Microsoft. Советуете его исправлять? Я предпочитаю не лезть туда, где я не понимаю.

 

Я имена не запоминаю. Они уплывают из моей головы. Поэтому мне приходится аниме 3-4 раза пересматривать, чтобы выучить всё досконально и при этом запомнить, кого как зовут.

А когда я вижу 520-ую программу, в которой даётся имя переменной, которая при этом используется всего пару раз... как в моём примере...

Если это важная переменная, которая проходит через всю программу – тогда можно что-то придумать. Но придумать всё равно нужно покороче, иначе строчка растянется очень надолго.

 

Ну занесите себе в память, что аа - это то, что вы вводите с клавиатуры, ba - это то, что вы из этой строки извлекаете. Легко ведь запомнить - тем более, что я в комментарии записал (для самого себя, чтоб потом не запутаться). А все остальные переменные - временные, используются один-два раза за программу. Их запоминать не надо.

Ссылка на комментарий
Поделиться на другие сайты

Это имя по умолчанию, которое дала Microsoft. Советуете его исправлять? Я предпочитаю не лезть туда, где я не понимаю.

 

 

Чего именно тут можно не понять? Это просто имя. Оно каким угодно может быть. Но гораздо лучше, если оно будет характеризовать переменную. Ну, например, если у тебя есть переменная, которая хранит номер счёта в формате ЦБ, то разумно назвать её не "dd", а "CBAccount". Потому что ты смотришь на неё -- и тебе ясно что это. Не надо ничего вспоминать, прослеживать, откуда она взялась и прочее.

 

Ну занесите себе в память, что аа - это то, что вы вводите с клавиатуры

 

 

Ну и почему бы не назвать её, например, "userInput"? И не нужно правил никаких придумывать. Осмысленные имена как раз для того, чтобы НЕ запоминать и при необходимости НЕ разбираться.

 

 

Ссылка на комментарий
Поделиться на другие сайты

Ну и почему бы не назвать её, например, "userInput"?

Когда я писал программу, в которой было 50 мелких программ (из учебника по C), я впервые столкнулся с конфликтом имён, когда в одной программе переменная означает одно, в другой другое, и у неё другой тип. Так вот чтобы "развести" этот конфликт, я такую систему и придумал. А в дальнейшем лишь слегка модифицировал под текущие нужды.

Твоё предложение разумно, но я уже привык, и ещё от этого увеличивается длина строки. Программа по стилю (в вашем случае) становится ближе к литературному произведению. "Вася пошёл туда-то..."

 

Например.

Попробуйте в этой строке заменить все aa на userInput. Что получится? Многоэтажный... слог.

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

В результате длина программы увеличивается раза в четыре.

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
Ссылка на комментарий
Поделиться на другие сайты

У меня пока планы на будущее. Я не могу прочитать ни одну книгу по программированию. попытаюсь хоть что-то закончить.

У меня есть задачник по программированию, но под MS-DOS его нет смысла заканчивать, с ним я уже лет 15 мучаюсь. Надо переходить под Windows. Только в этом году я понял, как туда вводить переменные.

А полкниги Visual C++ 6.0 посвящено непонятно чему, с задачником никак не связан. Осваивается интерфейс Windows, кнопки, переключатели и прочее. Не очень-то полезно для решения математических задач, неправда ли?

Ссылка на комментарий
Поделиться на другие сайты

Для программирования под Windows можно начать читать Питзольда "Программирование для Виндовс 95". Плюсы изучаю по Шилдту, вроде неплохо, хотя Дейтелы лучше.
Ссылка на комментарий
Поделиться на другие сайты

Литературы у меня навалом. Ни одну прочитать не могу.

Хотя пару книжек прочитал лет 10 назад. Реализовал под MS-DOS на C и C++.

На ООП нормальных задачек нашёл только две, остальные из пальца высосаны.

Одна из задач была похожа на игру "жизнь". Кролики и волки. И у меня работало. Я даже параметры подбирал.

Ссылка на комментарий
Поделиться на другие сайты

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

 

Ну смотри например (по-моему, после char в объявлении должна быть звёздочка, но не помню -- давно очень C++ не трогал. Ну да не суть):

 

       while (userInput[index]) {
           char* currentSymbol = userInput[index];
           if ('0' <= currentSymbol && currentSymbol <= '9')
               break;
           if (currentSymbol == '-')
               break;
           index++;
       }

 

То есть да, какбэ длинно. Но: мы смотрим на этот цикл и просто его читаем, не напрягаясь. Пока не кончился массив userInput (тут у нас, я так понимаю, null-terminated string?) проверяем. Эта цифра от 0 до 9? Если да, нашли нужное место. Иначе: это дефис? Если да, нашли нужное место. Если не нашли -- переходим к следующему символу.

 

А чтобы понять, что твой цикл однострочный делает, пришлось в него минуту потупить. И он не становится лучше от того, что записан одной строкой. Компактность сегодня вообще до лампочки, компилятор от твоего кода только алгоритм оставит да и тот заоптимизирует вусмерть. А вот этими однострочными упражнениями можно таких шарад понаписать, что потом без поллитры не разберёшься. Ну и баг отладчиком в однострочном выражении искать -- то ещё удовольствие.

 

Так что не надо стесняться. Можно писать длинно, экономия места ни к чему.

Изменено пользователем Shinsaku-To (смотреть историю редактирования)
Ссылка на комментарий
Поделиться на другие сайты

По обучению, например, смотри, так: http://www.videosharp.info/

 

Видеокурсы по C# (что гораздо актуальнее чем плюсы по 95 винду) в формате "для самых маленьких" с задачами и проверкой этих задач. Частично бесплатные, частично по цене школьного завтрака. Отличный вариант, как по мне.

Ссылка на комментарий
Поделиться на другие сайты

Ну, например, если у тебя есть переменная, которая хранит номер счёта в формате ЦБ, то разумно назвать её не "dd", а "CBAccount". Потому что ты смотришь на неё -- и тебе ясно что это. Не надо ничего вспоминать, прослеживать, откуда она взялась и прочее.
Как сказал Triela, "Я не буду проще. И не надо ко мне тянуться."

 

Вспоминаю ещё эпизод из своего электротехнического прошлого.

"Что ты делаешь?" - "Схему читаю." - "Ну, почитай нам вслух." - "А. B2. C4, B5."

Вот там действительно всё было непонятно. А тут - так, семечки. Минут десять посидеть, комментарии почитать, что что означает, и всё понятно будет. Главное - определения.

Ссылка на комментарий
Поделиться на другие сайты

Серьёзная проблема программистов в том, что многие из них считают себя достаточно умными, чтобы программировать. Они ошибаются. Нет для этого достаточно умных. Именно поэтому разрабатывают новые технологии и методики -- чтобы компенсировать.

 

Ну а дальше уж -- каждый сам себе злобный баклан.

Изменено пользователем Shinsaku-To (смотреть историю редактирования)
Ссылка на комментарий
Поделиться на другие сайты

Этого нам не говорили. Мне вообще никто ничего не говорил. Программисты вокруг не водятся...

 

Я сам себе программист.

"The wall".

http://amvnews.ru/forum/viewtopic.php?t=4025

"Shift time".

https://www.animeforum.ru/index.php?app=forums&module=forums&section=findpost&pid=2876464

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Вот программа, в которую можно ввести с клавиатуры рациональное число. Скачать:

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);
}

 

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Очередной шедевр программирования.

 

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);
}
}

 

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Свершилось! Я решил 7 задач из задачника. Ввод данных представляет собой довольно длинный, нудный процесс; поэтому, чтобы не повторять его 7 раз, я решил сэкономить и дать исходные данные семи задачам сразу. Это значит, что вы вводите данные (6 целых чисел) для всех задач одним махом. И они начинают считать. Пробуйте!

Программа написана для Windows 32-bit. Работает во всех версиях от Windows 95 до Windows Vista. Скачать программу, текст программы и условия задач можно здесь:

https://yadi.sk/d/_35psXXri4V5H

 

Задачи:

 

1-1. (1) Угол α задан в градусах, минутах и секундах. Найти его величину в радианах с максимально возможной точностью. Рекомендуется проверить работоспособность программы для углов, больших развёрнутого, а также для отрицательных углов.

 

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

 

1-4. (3) Заданы моменты начала и конца некоторого промежутка времени в часах, минутах и секундах в пределах одних суток. Найти продолжительность этого промежутка в тех же единицах измерения.

 

1-5. (4) В такси одновременно сели три пассажира. Когда вышел первый пассажир, на счётчике было p1 рублей; когда вышел второй – p2 рублей. Сколько должен был заплатить каждый пассажир, если по окончании поездки счётчик показал p3 рублей? Плата за посадку составляет p0 рублей.

 

1-6. (5) Коммерсант, имея стартовый капитал k рублей, занялся торговлей, которая ежемесячно увеличивает капитал на p%. Через сколько лет он накопит сумму s, достаточную для покупки собственного магазина?

 

1-10. (6) Найти корни квадратного уравнения, заданного своими коэффициентами, с положительным дискриминантом; подстановкой в уравнение убедиться в погрешности вычислений.

 

1-15. (7) У квадрата ABCD на плоскости известны координаты двух противоположных вершин – точек A и C. Найти координаты точек B и D.

 

Программа:

 

Файл “p1Doc.h”

class CP1Doc:public CDocument
{
protected:
CP1Doc ();
DECLARE_DYNCREATE (CP1Doc);
char aa [50];		//   ìåñòî äëÿ ââîäèìûõ ñèìâîëîâ
int ba, bb, bc, bd, be, bf;	//   èñõîäíûå äàííûå - öåëûå ÷èñëà
int ca, cb;			//   óêàçàòåëü ââîäà â ñòðîêó äàííûõ, <Enter>
int da [10];		//   ìåñòî õðàíåíèÿ äàííûõ äëÿ âûâîäà íà ýêðàí
double db [10];
CString dc [10];
int ea, eb;

void fa ();	//   ïåðåâîä äàííûõ èç ñèìâîëüíîé ôîðìû â öèôðîâóþ
void fb ();
void fc ();	//   Çàäà÷à p19 - 1 (1)
void fd ();	//   Çàäà÷à p19 - 3 (2)
void fe ();	//   Çàäà÷à p19 - 4 (3)
void fg ();	//   Çàäà÷à p20 - 5 (4)
void fh ();	//   Çàäà÷à p20 - 6 (5)
void fi ();		//   Çàäà÷à p21 - 10 (6)
void fj ();		//   Çàäà÷à p22 - 15 (7)
};


Файл “p1Doc.cpp”

#include "stdafx.h"
#include "math.h"
#include "p1.h"
#include "p1Doc.h"

CP1Doc::CP1Doc ()
{
aa [0] = 0;
ba = bb = bc = bd = be = bf = 0;
ca = cb = 0;
da [0] = 0;
}

void CP1Doc::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;
while ((aa [ea] < '0'  ||  aa [ea] > '9')  &&  aa [ea] != '-'  &&  aa [ea]) ea++;
fb ();
bd = eb;
while ((aa [ea] < '0'  ||  aa [ea] > '9')  &&  aa [ea] != '-'  &&  aa [ea]) ea++;
fb ();
be = eb;
while ((aa [ea] < '0'  ||  aa [ea] > '9')  &&  aa [ea] != '-'  &&  aa [ea]) ea++;
fb ();
bf = eb;
fc (); fd (); fe (); fg (); fh (); fi (); fj ();
}

void CP1Doc::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 CP1Doc::fc ()
{
int a;
double b;

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

void CP1Doc::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 CP1Doc::fe ()
{
int a, b, c, d, e, f;

a = ba * 3600 + bb * 60 + bc;
b = bd * 3600 + be * 60 + bf;
c = b - a;
d = c / 3600;
c -= d * 3600;
e = c / 60;
f = c - e * 60;

da [3] = d;
da [4] = e;
da [5] = f;
}

void CP1Doc::fg ()
{
int a, b, c;

a = (ba + bb) / 3;
b = (2 * ba - bb + 3 * bc) / 6;
c = ba + bd - a - b;
da [6] = a;
da [7] = b;
da [8] = c;
}

void CP1Doc::fh ()
{
double a, b;

db [2] = 0;
if (!ba) return;
a = (double) bc / ba;
if (a <= 0) return;
b = 1 + bb / 100.;
if (b <= 0) return;
db [2] = log (a) / log (B);
}

void CP1Doc::fi ()
{
double a, b, c;

dc [1].Format ("");
if (!ba)
{
	if (!bb)
	{
		if (!bc) {dc [0].Format ("p21 - 10. Ðåøåíèå - ëþáîå ÷èñëî."); return;}
		dc [0].Format ("p21 - 10. Ðåøåíèé íåò."); return;
	}

	a = -bc / (double) bb;
	dc [0].Format ("p21 - 10. x = %.4g.", a);
	dc [1].Format ("%i * x + %i = %.4g.", bb, bc, bb * a + bc);
	return;
}

a = bb * bb - 4 * ba * bc;
if (a < 0) {dc [0].Format ("p21 - 10. Ðåøåíèé íåò."); return;}
if (!a)
{
	a = -bb / 2. / ba;
	dc [0].Format ("p21 - 10. x = %.4g.", a);
	dc [1].Format ("%i * x^2 + %i * x + %i = %.4g.", ba, bb, bc, ba * a * a + bb * a + bc);
	return;
}

b = (-bb + sqrt (a)) / 2 / ba;
c = (-bb - sqrt (a)) / 2 / ba;
dc [0].Format ("p21 - 10. x1 = %.4g, x2 = %.4g.", b, c);
dc [1].Format ("%i * x1^2 + %i * x1 + %i = %.4g. %i * x2^2 + %i * x2 + %i = %.4g.",
	ba, bb, bc, ba * b * b + bb * b + bc,
	ba, bb, bc, ba * c * c + bb * c + bc);
}

void CP1Doc::fj ()
{
double a, b, c, d;

a = (ba + bc) / 2.;
b = (bb + bd) / 2.;
c = a - ba;
d = b - bb;

db [3] = a - d;
db [4] = b + c;
db [5] = a + d;
db [6] = b - c;
}


Файл “p1View.cpp”

void CP1View::OnDraw (CDC *pDC)
{
CP1Doc *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 %i %i %i",
		pdoc -> ba, pdoc -> bb, pdoc -> bc, pdoc -> bd, pdoc -> be, pdoc -> bf);
	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 ("p19 - 4. Äëèíà èíòåðâàëà ðàâíà %i ÷ %i ìèí %i ñ.",
		pdoc -> da [3], pdoc -> da [4], pdoc -> da [5]);
	pDC -> TextOut (5, 155, a);
	a.Format ("p20 - 5. Ïåðâûé ïàññàæèð ïëàòèò %i ð., âòîðîé - %i ð., òðåòèé - %i ð.",
		pdoc -> da [6], pdoc -> da [7], pdoc -> da [8]);
	pDC -> TextOut (5, 180, a);
	a.Format ("p20 - 6. Íåîáõîäèìàÿ ñóììà áóäåò íàêîïëåíà ÷åðåç %.4g ëåò.",
		pdoc -> db [2]);
	pDC -> TextOut (5, 205, a);
	pDC -> TextOut (5, 230, pdoc -> dc [0]);
	pDC -> TextOut (5, 255, pdoc -> dc [1]);
	a.Format ("p22 - 15. Êîîðäèíàòû âåðøèí êâàäðàòà: B (%.4g; %.4g), D (%.4g; %.4g).",
		pdoc -> db [3], pdoc -> db [4], pdoc -> db [5], pdoc -> db [6]);
	pDC -> TextOut (5, 280, a);
}
}

void CP1View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags) 
{
CP1Doc *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);
}

 

Ссылка на комментарий
Поделиться на другие сайты

Читаю книжку по языку C 15-летней давности. Внезапно оказалось, что тексты программ "заточены" под операционную систему MS-DOS. Перед этим пытался переписать их под Windows, да не больно-то получалось. Поэтому пришлось всё бросить и начать сначала.

По дороге в книге встретил однострочные примеры. Вот они.

 

/*   p43
    Одиночные строки   */

/*   p43 - p43   */
#include <stdio.h>
/*   Пример 1.   */
main ()
{
int year, month;

/*   p44 - p49   */
year = 1996;
printf ("Сейчас %i год.\n", year);
}
float func (int, float, long double);
float func (int, float, long double);

/*   p50 - p60   */
if (0 < 1) printf ("0 меньше 1");
if (0 > 1) printf ("0 больше 1");
if (0 == 1) printf ("0 равно 1");
printf ("\n");
char str [80];

/*   p63 - p65   */
(float) x / 2;
(float) (x / 2);
printf ("%05d", 15);
scanf ("%i%*c%i", &i, &j);
scanf ("%5s", str);

/*   p65 - p71   */
scanf ("%iplus%i", &i, &j);
scanf ("%10[A-Z1-5]%s", s);
x = x + 1; ++x; x++;
if ((f = x - y) > 0)  printf ("Число x больше, чем y.\n");
a = b = c = x * y;

/*   p72 - p73   */
ch &= 127;
ch |= 128;
if (ch & 4)  printf ("Третий бит содержит 1, состояние \"on\".\n");
max = x > y ? x : y;
abs = x > 0 ? x : -x;

/*   p74 - p80   */
x > y ? x : y = 1;
for (i = 0; i < 10; i++)  printf ("%i\n", i);
for (i = 9; i >= 0; i--)  printf ("%i\n", i);
for (ch = '0'; ch != 'N';)  scanf ("%c", &ch);
for (i = 0; i < 10000; i++);

/*   p83 - p85   */
int a [100];
unsigned arr [40]; long double al [1000]; char ch [80];
char str [11];
strcpy (s1, s2);
strcat (s1, s2);

/*   p86 - p88   */
strcmp (s1, s2);
strlen (s);
int a [3] [5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
int a [3] [5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}};
int a [3] [5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

/*   p88 - p88   */
int a [3] [5] = {{1, 2, 3}, {4, 5, 6, 7, 8}, {9, 10, 11}};
char str [15] = {'B', 'o', 'r', 'l', 'a', 'n', 'd', ' ', 'C', '+', '+'};
char str [15] = "Borland C++";
char str [80] = "Это объявление и инициализация массива символов.";
char str [] = "Это объявление и инициализация массива символов.";

/*   p89 - p92   */
int mass [] = {1, 2, 3, 1, 2, 3, 4};
int arr [] [3] = {1, 2, 3, 5, 6, 7, 8, 9, 0};
int *pi;
p = &x;
p = (int *) &x;

/*   p93 - p94   */
p += 3;
p1 += 10;
int plus [10];
p1 = plus;
p1 = &plus [0];

/*   p95 - p97   */
int *x [10];
x [2] = &y;
char *errors [] = {"Can't open file", "Can't close file",
  "Allocation error", "System error"};
int **point;
f (int x, int y, float z);

/*   p98 - p106   */
f (int x, int y, float z);
register int quick;
float global;
extern float global;
static int count = 10;

/*   p109 - p114   */
swap (5, 10);
main (int argc, char *argv []) {...}
main (int argc, char *argv [], char *env []) {...}
void main (void) {...}
void f (int a, int b, ...);

/*   p114   */
void f (int a, int b...);

 

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
Ссылка на комментарий
Поделиться на другие сайты

Они иллюстрируют правила языка и его использование.

Например, оператор ? :, if, for, объявление массивов и строк.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...

×
×
  • Создать...

Важная информация