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

C и C++


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

И да, к C/C++ этот вопрос не имеет отношения. Не очевидно даже что программа написана на ком-то из них :unsure:
Uuchu no Chikara, Laburadoraito!~
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

 

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

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

 

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

 

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

Если долго всматриваться в бездну, можно неплохо провести время.

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

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

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

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

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

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

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

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

 

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

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

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

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

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

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

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

 

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

 

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

 

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

 

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

 

 

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

 

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

 

 

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

 

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

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

Если долго всматриваться в бездну, можно неплохо провести время.

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

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

 

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

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

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

 

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

 

 

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

 

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

 

 

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

 

 

Если долго всматриваться в бездну, можно неплохо провести время.

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

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

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

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

 

Например.

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

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

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

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

- Как бы вы перевели Amagami SS?

- Ласково Кусь.

- Поздравляю, вы приняты в русский фансаб.

 

[Maschera Team]

 

Мои отзывы и анимелист.

 

Doki Doki Literature Club - лучшая новелка в стиме. Да и вообще лучшая.

 

Группа с моими обзорчиками различной манги.

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

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

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

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

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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."

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

 

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

Изменено пользователем 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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

 

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

 

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

 

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

Читаю книжку по языку 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...);

 

Изменено пользователем 初音ミクこんばんは (смотреть историю редактирования)
for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

А что эти примеры должны иллюстрировать и вообще делать?

- Как бы вы перевели Amagami SS?

- Ласково Кусь.

- Поздравляю, вы приняты в русский фансаб.

 

[Maschera Team]

 

Мои отзывы и анимелист.

 

Doki Doki Literature Club - лучшая новелка в стиме. Да и вообще лучшая.

 

Группа с моими обзорчиками различной манги.

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

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

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Загрузка...

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

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