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

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

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


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

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

Ответ
 
Опции темы
Старый 08.11.2017, 16:54   #41
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,247
Репутация: 93
По умолчанию

Файл «p11Doc.h»
Код:
/*    p11
    Ввод трёх целых чисел
    Язык Visual C++ 6.0   */

class CP11Doc:public CDocument
{
protected:
   CP11Doc ();
   DECLARE_DYNCREATE (CP11Doc);

   int aa, ab, ac;      //   исходные данные - целые числа
   int ad, ae, af;      //   исходные данные - натуральные числа
   int ag, ah;         //   указатель ввода в строку данных, <Enter>
   int ai, aj;         //   внутренние переменные для передачи данных

   char ba [50];      //   место для вводимых символов
   CString bd [10];   //   вывод информации на экран
   int bg [10];

   void ca ();         //   перевод данных из символьной формы в цифровую
   void cb ();
};
Файл «p11Doc.cpp»
Код:
CP11Doc::CP11Doc ()
{
   aa = ab = ac = ag = ah = 0;
   ba [0] = bg [0] = 0;
}

void CP11Doc::ca ()
{
   ah = 1;   //   флаг начала обработки
   ai = 0;      //   временный счётчик символов массива

   while ((ba [ai] < '0'  ||  ba [ai] > '9')  &&  ba [ai] != '-'  &&  ba [ai])  ai++;
   cb ();
   aa = aj;
   while ((ba [ai] < '0'  ||  ba [ai] > '9')  &&  ba [ai] != '-'  &&  ba [ai])  ai++;
   cb ();
   ab = aj;
   while ((ba [ai] < '0'  ||  ba [ai] > '9')  &&  ba [ai] != '-'  &&  ba [ai])  ai++;
   cb ();
   ac = aj;   //   данные занесены
}

void CP11Doc::cb ()
{
   int a;

   aj = 0;   //   целое число, извлекаемое из массива
   a = 1;      //   знак извлекаемого числа
   if (ba [ai] == '-')  {a = -1; ai++;}
   while (ba [ai] >= '0'  &&  ba [ai] <= '9')
   {
      aj = aj * 10 + ba [ai] - '0';
      ai++;
   }

   aj *= a;
}
Файл «p11View.cpp»
Код:
void CP11View::OnDraw (CDC* pDC)
{
   CP11Doc *pdoc = GetDocument ();
   ASSERT_VALID (pdoc);
   CString a;      //   выводимая строка

   pDC -> TextOut (10, 10, "Введите три целых числа:");
   pDC -> TextOut (10, 35, pdoc -> ba);
   a.Format ("code = %i", pdoc -> bg [0]);      //   код вводимого символа
   pDC -> TextOut (10, 60, a);
   if (pdoc -> ah)      //   <Enter>
   {
      a.Format ("%i %i %i", pdoc -> aa, pdoc -> ab, pdoc -> ac);
      pDC -> TextOut (10, 85, a);
   }
}

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

   pdoc -> bg [0] = nChar;
   if (nChar == 8)      //   Обработка <Backspace>
   {
      if (pdoc -> ag)  {pdoc -> ag--; pdoc -> ba [pdoc -> ag] = 0;}
      goto aaa;
   }

   if (nChar == 13)      //   Обработка <Enter>
   {
      pdoc -> ca ();
      goto aaa;
   }

   if (pdoc -> ag < 49)   //   Ограничение на длину вводимой строки
   {
      pdoc -> ba [pdoc -> ag] = nChar;      //   Добавление символа к массиву строки
      pdoc -> ba [pdoc -> ag + 1] = 0;
      pdoc -> ag++;
   }

aaa:
   Invalidate ();
   CView::OnChar (nChar, nRepCnt, nFlags);
}
Вложения
Тип файла: doc p11a.doc (28.0 Кб, 12 просмотров)
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA

Последний раз редактировалось jura_k; 08.11.2017 в 17:29. Причина: Заменил <Tab> на < >
jura_k вне форума   Ответить с цитированием
Старый 09.11.2017, 17:14   #42
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,247
Репутация: 93
По умолчанию

Файл «p11Doc.h»
Код:
/*   p11 (2)
      Биквадратное уравнение
      Язык Visual C++ 6.0   */

class CP11Doc:public CDocument
{
protected:
   CP11Doc ();
   DECLARE_DYNCREATE (CP11Doc);

int aa, ab, ac;      //   исходные данные - целые числа
   int ad, ae, af;      //   исходные данные - натуральные числа
   int ag, ah;         //   указатель ввода в строку данных, <Enter>
   int ai, aj;         //   внутренние переменные для передачи данных

   char ba [50];      //   место для вводимых символов
   CString bd [10];   //   вывод информации на экран
   int bg [10];

   void ca ();      //   перевод данных из символьной формы в цифровую
   void cb ();
   void cd ();      //   решение задач
   CString ce (char *, int, double, double, double, double);      //   корни уравнения (4 шт.)
};
Файл «p11Doc.cpp»
Код:
#include "stdafx.h"
#include "math.h"
#include "p11.h"
#include "p11Doc.h"

CP11Doc::CP11Doc ()
{
   aa = ab = ac = ag = ah = 0;
   ba [0] = bg [0] = 0;
}

void CP11Doc::ca ()
{
   ah = 1;      //   флаг начала обработки
   ai = 0;      //   временный счётчик символов массива

   while ((ba [ai] < '0'  ||  ba [ai] > '9')  &&  ba [ai] != '-'  &&  ba [ai])  ai++;
   cb ();
   aa = aj;
   while ((ba [ai] < '0'  ||  ba [ai] > '9')  &&  ba [ai] != '-'  &&  ba [ai])  ai++;
   cb ();
   ab = aj;
   while ((ba [ai] < '0'  ||  ba [ai] > '9')  &&  ba [ai] != '-'  &&  ba [ai])  ai++;
   cb ();
   ac = aj;   //   данные занесены
cd ();      //   решение задач
}

void CP11Doc::cb ()
{
   int a;

   aj = 0;      //   целое число, извлекаемое из массива
   a = 1;      //   знак извлекаемого числа
   if (ba [ai] == '-')  {a = -1; ai++;}
   while (ba [ai] >= '0'  &&  ba [ai] <= '9')
   {
      aj = aj * 10 + ba [ai] - '0';
      ai++;
   }

   aj *= a;
}

void CP11Doc::cd ()
{
   double a, b, c;

   //   (1) 11.1. Решить уравнение: ax^2 + bx + c = 0.

   if (!aa)
      if (!ab)
         if (!ac)
            bd [0] = ce ("1. ", 5, 0, 0, 0, 0);
         else
            bd [0] = ce ("1. ", 0, 0, 0, 0, 0);
      else
      {
         a = (double) -ac / ab;
         bd [0] = ce ("1. ", 1, a, 0, 0, 0);
      }
   else
   {
      a = ab * ab - 4 * aa * ac;
      if (a < 0)
         bd [0] = ce ("1. ", 0, 0, 0, 0, 0);
      else
         if (!a)
         {
            b = -ab / 2. / aa;
            bd [0] = ce ("1. ", 1, b, 0, 0, 0);
         }
         else
         {
            b = (-ab - sqrt (a)) / 2 / aa;
            c = (-ab + sqrt (a)) / 2 / aa;
            bd [0] = ce ("1. ", 2, b, c, 0, 0);
         }
   }

   //   (2) 11.2. Решить уравнение: ax^4 + bx^2 + c = 0.

   if (!aa)
      if (!ab)
         if (!ac)
            bd [1] = ce ("2. ", 5, 0, 0, 0, 0);
         else
            bd [1] = ce ("2. ", 0, 0, 0, 0, 0);
      else
      {
         a = (double) -ac / ab;
         if (a < 0)
            bd [1] = ce ("2. ", 0, 0, 0, 0, 0);
         else
            if (!a)
               bd [1] = ce ("2. ", 1, 0, 0, 0, 0);
            else
               bd [1] = ce ("2. ", 2, -sqrt (a), sqrt (a), 0, 0);
      }
   else
   {
      a = ab * ab - 4 * aa * ac;
      if (a < 0)
         bd [1] = ce ("2. ", 0, 0, 0, 0, 0);
      else
         if (!a)
         {
            b = -ab / 2. / aa;
            if (b < 0)
               bd [1] = ce ("2. ", 0, 0, 0, 0, 0);
            else
               if (!b)
                  bd [1] = ce ("2. ", 1, 0, 0, 0, 0);
               else
                  bd [1] = ce ("2. ", 2, -sqrt (b), sqrt (b), 0, 0);
         }
         else
         {
            b = (-ab - sqrt (a)) / 2 / aa;
            c = (-ab + sqrt (a)) / 2 / aa;
            if (b < 0)
               if (c < 0)
                  bd [1] = ce ("2. ", 0, 0, 0, 0, 0);
               else
                  if (!c)
                     bd [1] = ce ("2. ", 1, 0, 0, 0, 0);
                  else
                     bd [1] = ce ("2. ", 2, -sqrt (c), sqrt (c), 0, 0);
            else
               if (!b)
                  if (c < 0)
                     bd [1] = ce ("2. ", 1, 0, 0, 0, 0);
                  else
                     bd [1] = ce ("2. ", 3, -sqrt (c), 0, sqrt (c), 0);
               else
                  if (c < 0)
                     bd [1] = ce ("2. ", 2, -sqrt (b), sqrt (b), 0, 0);
                  else
                     if (!c)
                        bd [1] = ce ("2. ", 3, -sqrt (b), 0, sqrt (b), 0);
                     else
                        bd [1] = ce ("2. ", 4, -sqrt (c), -sqrt (b), sqrt (b), sqrt (c));
         }
   }
}

CString CP11Doc::ce (char *a, int b, double c, double d, double e, double f)
{
   CString g, h;

   g.Format (a);
   switch (b)
   {
   case 0: h.Format ("Решений нет."); break;
   case 1: h.Format ("x = %.4g.", c); break;
   case 2: h.Format ("x1 = %.4g, x2 = %.4g.", c, d); break;
   case 3: h.Format ("x1 = %.4g, x2 = %.4g, x3 = %.4g.", c, d, e); break;
   case 4: h.Format ("x1 = %.4g, x2 = %.4g, x3 = %.4g, x4 = %.4g.", c, d, e, f); break;
   default: h.Format ("Решение - любое число.");
   }

   return g + h;
}
Файл «p11View.cpp»
Код:
void CP11View::OnDraw (CDC* pDC)
{
   CP11Doc *pdoc = GetDocument ();
   ASSERT_VALID (pdoc);
   CString a;      //   выводимая строка

   pDC -> TextOut (10, 10, "Введите три целых числа:");
   pDC -> TextOut (10, 35, pdoc -> ba);
   a.Format ("code = %i", pdoc -> bg [0]);      //   код вводимого символа
   pDC -> TextOut (10, 60, a);
   if (pdoc -> ah)      //   <Enter>
   {
      a.Format ("%i %i %i", pdoc -> aa, pdoc -> ab, pdoc -> ac);
      pDC -> TextOut (10, 85, a);
      pDC -> TextOut (10, 125, pdoc -> bd [0]);
      pDC -> TextOut (10, 150, pdoc -> bd [1]);
   }
}

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

   pdoc -> bg [0] = nChar;
   if (nChar == 8)      //   Обработка <Backspace>
   {
      if (pdoc -> ag)  {pdoc -> ag--; pdoc -> ba [pdoc -> ag] = 0;}
      goto aaa;
   }

   if (nChar == 13)      //   Обработка <Enter>
   {
      pdoc -> ca ();
      goto aaa;
   }

   if (pdoc -> ag < 49)   //   Ограничение на длину вводимой строки
   {
      pdoc -> ba [pdoc -> ag] = nChar;   //   Добавление символа к массиву строки
      pdoc -> ba [pdoc -> ag + 1] = 0;
      pdoc -> ag++;
   }

aaa:
   Invalidate ();
   CView::OnChar (nChar, nRepCnt, nFlags);
}
Вложения
Тип файла: doc p12a.doc (43.0 Кб, 16 просмотров)
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA

Последний раз редактировалось jura_k; 09.11.2017 в 17:17. Причина: Добавлен документ *.doc
jura_k вне форума   Ответить с цитированием
Старый 20.11.2017, 20:13   #43
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,247
Репутация: 93
По умолчанию

Продолжаем читать книгу и решать задачи. Решено 16 задач.
Код:
void CP11Doc::cg ()
{
   int a, b, c;
   double d;

   //   (3) 16.4. Дано целое положительное число n. Вычислить n!

   a = 1;
   for (b = 1; b < aa + 1; b++)  a *= b;
   bg [1] = a;

   /*   (4) 18.5. Даны два натуральных числа M и N. Вычислить их наибольший
   общий делитель НОД (M, N).   */

   ad = aa; ae = ab; af = ac;
   if (ad < 0)  ad = -ad;
   if (ae < 0)  ae = -ae;
   if (af < 0)  af = -af;
   if (!ad)  ad = 1;
   if (!ae)  ae = 1;
   if (!af)  af = 1;

   a = ad; b = ae;
   while (a - b) if (a > b) a -= b; else b -= a;
   bg [2] = a;

   /*   (5) 21.3.9. Даны три положительных числа. Составить алгоритм,
   определяющий, могут ли они быть длинами сторон треугольника.   */

   if (aa > 0  &&  ab > 0  &&  ac > 0  &&  aa + ab > ac  &&  aa + ac > ab  &&  ab + ac > aa)
      bd [2].Format ("5. Числа могут быть длинами сторон треугольника.");
   else
      bd [2].Format ("5. Числа не могут быть длинами сторон треугольника.");

   /*   (6) 21.4.10. Пусть компьютер способен выполнять только две
   арифметические операции - сложение и вычитание. Составить алгоритмы:
   а) умножения двух целых чисел;
   б) целочисленного деления двух чисел;
   в) получения остатка от целочисленного деления двух чисел.   */

   a = 0;
   for (b = 0; b < ae; b++)  a += ad;
   bg [3] = a;

   a = ad;
   b = 0;
   while (a >= ae) {a -= ae; b++;}
   bg [4] = b;
   bg [5] = a;

   /*   (7) 21.6.11. Составить алгоритм нахождения НОД трёх натуральных чисел,
   используя вспомогательный алгоритм нахождения НОД двух чисел.   */

   a = ad; b = ae;
   while (a - b) if (a > b) a -= b; else b -= a;
   b = af;
   while (a - b) if (a > b) a -= b; else b -= a;
   bg [6] = a;

   /*   (8) 33.12. "Оттранслируйте" с алгоритмического языка алгоритм выбора
   наибольшего значения из трёх.   */

   a = aa;
   if (a < ab) a = ab;
   if (a < ac) a = ac;
   bg [7] = a;

   /*   (9) 48.9.21. Присвоить целой переменной h значение цифры, стоящей в
   разряде сотен в записи положительного целого числа k. Например, если
   k = 28796, то h = 7.   */

   bg [8] = aa / 100 % 10;

   /*   (10) 48.10.22. Целой переменной S присвоить значение суммы цифр
   трёхзначного целого числа k.   */

   a = aa % 1000;
   bg [9] = a / 100 + a / 10 % 10 + a % 10;

   //   (11) 63.1.31. По длинам трёх сторон треугольника вычислить его площадь.

   d = (aa + ab + ac) / 2.;
   d = d * (d - aa) * (d - ab) * (d - ac);      //   формула Герона
   if (d < 0)  d = 0;
   bj [0] = sqrt (d);

   /*   (12) 64.2.32. Вычислить сумму конечного числа членов гармонического
   ряда: 1 + 1/2 + 1/3 + … + 1/i.
   Суммирование прекращается, когда очередное слагаемое становится меньше
   epsilon или целая переменная i достигает значения maxint.   */

   a = aa;
   if (a > 1000000) a = 1000000;
   if (a < 0) a = 0;
   d = 0;
   while (a)  d += 1. / a--;
   bj [1] = d;

   /*   (13) 65.33. Вычислить сумму целых чисел от M до N путём прямого
   суммирования. Здесь M и N - целые числа.   */

   a = 0;
   for (b = aa; b <= ab; b++)  a += b;
   bg [10] = a;

   /*   (14) 70.1.41. Определите на вашем компьютере величину машинного
   epsilon.   */

   d = 1;
   while (1 + d > 1)  d /= 2;
   bj [2] = d;

   /*   (15) 71.47. Даны два натуральных числа a и b. Определить наибольший
   общий делитель трёх величин: a + b, |a - b|, ab.   */

   a = bg [11] = aa + ab;
   b = bg [12] = aa - ab;
   if (a < 0)  a = -a;
   if (b < 0)  b = -b;
   if (!a)  a = 1;
   if (!b)  b = 1;
   while (a - b) if (a > b) a -= b; else b -= a;

   b = bg [13] = aa * ab;
   if (b < 0)  b = -b;
   if (!b)  b = 1;
   while (a - b) if (a > b) a -= b; else b -= a;
   bg [14] = a;

   /*   (16) 80.3.50. Даны три целых числа. Определить, сумма цифр которого из
   них больше. Подсчёт суммы цифр организовать через подпрограмму.   */

   a = cj (aa); b = cj (ab); c = cj (ac);
   if (a >= b  &&  a >= c)
      bd [3] = "16. Сумма цифр первого числа больше.";
   else
      if (b >= a  &&  b >= c)
         bd [3] = "16. Сумма цифр второго числа больше.";
      else
         bd [3] = "16. Сумма цифр третьего числа больше.";
}

CP11Doc::cj (int a)
{
   int b;

   b = 0;
   if (a < 0)  a = -a;
   while (a) {b += a % 10; a /= 10;}
   return b;
}

- - - - - - - - - - - - - - - - - - - -

//   Файл p11View.cpp

void CP11View::OnDraw (CDC* pDC)
{
   CP11Doc *pdoc = GetDocument ();
   ASSERT_VALID (pdoc);
   CString a;      //   выводимая строка

   pDC -> TextOut (10, 10, "Введите три целых числа:");
   pDC -> TextOut (10, 35, pdoc -> ba);
   a.Format ("code = %i", pdoc -> bg [0]);      //   код вводимого символа
   pDC -> TextOut (10, 60, a);
   if (pdoc -> ah)      //   <Enter>
   {
      a.Format ("%i %i %i", pdoc -> aa, pdoc -> ab, pdoc -> ac);
      pDC -> TextOut (10, 85, a);
      pDC -> TextOut (10, 125, pdoc -> bd [0]);
      pDC -> TextOut (10, 150, pdoc -> bd [1]);
      a.Format ("3. %i! = %i.", pdoc -> aa, pdoc -> bg [1]);
      pDC -> TextOut (10, 175, a);
      a.Format ("4. НОД (%i, %i) = %i.", pdoc -> ad, pdoc -> ae, pdoc -> bg [2]);
      pDC -> TextOut (10, 200, a);
      pDC -> TextOut (10, 225, pdoc -> bd [2]);

      a.Format ("6. %i * %i = %i, %i / %i = %i, %i %% %i = %i.",
         pdoc -> ad, pdoc -> ae, pdoc -> bg [3],
         pdoc -> ad, pdoc -> ae, pdoc -> bg [4],
         pdoc -> ad, pdoc -> ae, pdoc -> bg [5]);
      pDC -> TextOut (10, 250, a);
      a.Format ("7. НОД (%i, %i, %i) = %i.",
         pdoc -> ad, pdoc -> ae, pdoc -> af, pdoc -> bg [6]);
      pDC -> TextOut (10, 275, a);
      a.Format ("8. max (%i, %i, %i) = %i.",
         pdoc -> aa, pdoc -> ab, pdoc -> ac, pdoc -> bg [7]);
      pDC -> TextOut (10, 300, a);
      a.Format ("9. Число сотен равно %i.", pdoc -> bg [8]);
      pDC -> TextOut (10, 325, a);
      a.Format ("10. Сумма цифр трёхзначного числа %i.", pdoc -> bg [9]);
      pDC -> TextOut (10, 350, a);

      a.Format ("11. Площадь треугольника %.4g.", pdoc -> bj [0]);
      pDC -> TextOut (310, 125, a);
      a.Format ("12. Сумма гармонического ряда %.6g.", pdoc -> bj [1]);
      pDC -> TextOut (310, 175, a);
      a.Format ("13. Сумма чисел от %i до %i равна %i.",
         pdoc -> aa, pdoc -> ab, pdoc -> bg [10]);
      pDC -> TextOut (310, 200, a);
      a.Format ("14. Величина машинного epsilon %.6g.", pdoc -> bj [2]);
      pDC -> TextOut (310, 275, a);
      a.Format ("15. НОД (%i, %i, %i) = %i.",
         pdoc -> bg [11], pdoc -> bg [12], pdoc -> bg [13], pdoc -> bg [14]);
      pDC -> TextOut (310, 300, a);
      pDC -> TextOut (310, 325, pdoc -> bd [3]);
   }
}

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

   pdoc -> bg [0] = nChar;
   if (nChar == 8)      //   Обработка <Backspace>
   {
      if (pdoc -> ag) {pdoc -> ag--; pdoc -> ba [pdoc -> ag] = 0;}
      goto aaa;
   }

   if (nChar == 13)      //   Обработка <Enter>
   {
      pdoc -> ca ();
      goto aaa;
   }

   if (pdoc -> ag < 49)   //   Ограничение на длину вводимой строки
   {
      pdoc -> ba [pdoc -> ag] = nChar;   //   Добавление символа к массиву строки
      pdoc -> ba [pdoc -> ag + 1] = 0;
      pdoc -> ag++;
   }

aaa:
   Invalidate ();
   CView::OnChar (nChar, nRepCnt, nFlags);
}
Вложения
Тип файла: doc p11f.doc (69.0 Кб, 13 просмотров)
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA
jura_k вне форума   Ответить с цитированием
Старый 13.11.2018, 18:03   #44
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,247
Репутация: 93
По умолчанию

Ну вот, движок построили, теперь на этом движке начинаем решать задачи.
Код:
void CP11Doc::ha ()
{
   int a, b, c;
   int m;
   double d, e, f, g, h, i;
   CString j;

   int p [20];


   if (af == 1)
   {
      /*   67.1.34.18. Получить на экране десятичные коды букв латинского алфавита.   */
      
      ic [4] = "18. ";
      for (a = 'a'; a <= 'z'; a++)
      {
         j.Format ("%c %i", a, a);
         ic [4] += j;
         if (a < 'z') ic [4] += ", ";
      }
   }

   /* * * * * * * * * * * * * * * * * * * * * * * *   1   */



   if (af == 2)
   {
      /*   11.1.1.   */

      ia [0] = ka * kd;
      ia [1] = kb * kc;

      /*   13.1.2. Составить алгоритм решения квадратного уравнения: ax^2 + bx + c = 0.   */

      if (ka == 0)
         if (kb == 0)
            if (kc == 0)
               a = 3;
            else
               a = 0;
         else
         {
            a = 1;
            d = (double) -kc / kb;
         }
      else
      {
         b = kb * kb - 4 * ka * kc;
         if (b < 0)
            a = 0;
         else
            if (b == 0)
            {
               a = 1;
               d = -kb / 2. / ka;
            }
            else
            {
               a = 2;
               d = (-kb - sqrt (b)) / 2 / ka;
               e = (-kb + sqrt (b)) / 2 / ka;
            }
      }

      switch (a)
      {
         case 0: ic [0].Format ("2. Нет решений."); break;
         case 1: ic [0].Format ("2. x = %.4g.", d); break;
         case 2: ic [0].Format ("2. x1 = %.4g, x2 = %.4g.", d, e); break;
         default: ic [0].Format ("2. Решение - любое число.");
      }

      /*   16.1.3. Вычислить n!   */

      a = 1;
      b = ka + 1;
      if (b > 20) b = 20;
      for (c = 1; c < b; c++) a *= c;
      ia [2] = a;

      /*   18.1.4. Даны два натуральных числа M и N. Вычислить их наибольший общий делитель НОД (M, N).   */

      la = ka; lb = kb; lc = kc;
      if (la < 0) la = -la;      if (!la) la = 1;
      if (lb < 0) lb = -lb;      if (!lb) lb = 1;
      if (lc < 0) lc = -lc;      if (!lc) lc = 1;

      a = la; b = lb;
      while (a - b) if (a > b) a -= b; else b -= a;
      ia [3] = a;

      /*   21.1.6. Даны декартовы координаты трёх вершин треугольника на плоскости. Составить алгоритм определения площади треугольника.   */

      d = ma (ka, kb, kc, kd);
      e = ma (ka, kb, ke, kf);
      f = ma (kc, kd, ke, kf);
      ib [1] = mb (d, e, f);

      /*   21.3.8. Даны три положительных числа. Составить алгоритм, определяющий, могут ли они быть длинами сторон треугольника.   */

      if (ka > 0  &&  kb > 0  &&  kc > 0  &&  ka + kb > kc  &&  ka + kc > kb  &&  kb + kc > ka)
         ic [2].Format ("8. Числа могут быть длинами сторон треугольника.");
      else
         ic [2].Format ("8. Числа не могут быть длинами сторон треугольника.");

      /*   21.4.9. Пусть компьютер способен выполнять только две арифметические операции - сложение и вычитание. Составить алгоритмы: а) умножения двух целых чисел; б) целочисленного деления двух чисел; в) получения остатка от целочисленного деления двух чисел.   */

      a = 0;
      for (b = 0; b < lb; b++) a += la;
      ia [4] = a;
      
      a = la;
      b = 0;
      while (a >= lb) {a -= lb; b++;}
      ia [5] = b;
      ia [6] = a;

      /*   21.5.10. Построить алгоритм решения биквадратного уравнения, используя как вспомогательный алгоритм решения квадратного уравнения.   */

      if (ka == 0)
         if (kb == 0)
            if (kc == 0)
               a = 5;
            else
               a = 0;
         else
         {
            d = (double) -kc / kb;
            if (d < 0) a = 0;
            else if (d == 0) {a = 1; f = 0;}
               else {a = 2; f = -sqrt (d); g = sqrt (d);}
         }
      else
      {
         b = kb * kb - 4 * ka * kc;
         if (b < 0)
            a = 0;
         else
            if (b == 0)
            {
               d = -kb / 2. / ka;
               if (d < 0) a = 0;
               else if (d == 0) {a = 1; f = 0;}
                  else {a = 2; f = -sqrt (d); g = sqrt (d);}
            }
            else
            {
               d = (-kb - sqrt (b)) / 2 / ka;
               e = (-kb + sqrt (b)) / 2 / ka;
               if (d < 0)
                  if (e < 0) a = 0;
                  else if (e == 0) {a = 1; f = 0;}
                     else {a = 2; f = -sqrt (e); g = sqrt (e);}
               else
                  if (d == 0)
                     if (e < 0) {a = 1; f = 0;}
                     else {a = 3; f = -sqrt (e); g = 0; h = sqrt (e);}
                  else
                     if (e < 0) {a = 2; f = -sqrt (d); g = sqrt (d);}
                     else if (e == 0) {a = 3; f = -sqrt (d); g = 0; h = sqrt (d);}
                        else {a = 4; f = -sqrt (e); g = -sqrt (d); h = sqrt (d); i = sqrt (e);}
            }
      }

      switch (a)
      {
         case 0: ic [3].Format ("10. Нет решений."); break;
         case 1: ic [3].Format ("10. x = %.4g.", f); break;
         case 2: ic [3].Format ("10. x1 = %.4g, x2 = %.4g.", f, g); break;
         case 3: ic [3].Format ("10. x1 = %.4g, x2 = %.4g, x3 = %.4g.", f, g, h); break;
         case 4: ic [3].Format ("10. x1 = %.4g, x2 = %.4g, x3 = %.4g, x4 = %.4g.", f, g, h, i); break;
         default: ic [3].Format ("10. Решение - любое число.");
      }

      /*   21.6.11. Составить алгоритм нахождения НОД трёх натуральных чисел, используя вспомогательный алгоритм нахождения НОД двух чисел.   */

      a = la; b = lb;
      while (a - b) if (a > b) a -= b; else b -= a;
      b = lc;
      while (a - b) if (a > b) a -= b; else b -= a;
      ia [7] = a;

      /*   33.1.12. Оттранслируйте с алгоритмического языка алгоритм выбора наибольшего значения из трёх.   */

      a = ka;
      if (a < kb) a = kb;
      if (a < kc) a = kc;
      ia [8] = a;

      /*   48.9.21.13. Присвоить целой переменной h значение цифры, стоящей в разряде сотен в записи положительного целого числа k (например, если k = 28796, то h = 7).   */

      ia [9] = ka % 1000 / 100;

      /*   48.10.22.14. Целой переменной S присвоить значение суммы цифр трёхзначного целого числа k.   */

      a = ka % 1000;
      ia [10] = a / 100 + a / 10 % 10 + a % 10;

      /*   63.1.31.15. По длинам трёх сторон треугольника a, b, c вычислить его площадь.   */

      ib [2] = mb (ka, kb, kc);

      /*   65.1.33.17. Вычислить сумму целых чисел от M до N путём прямого суммирования. Здесь M и N - целые числа.   */

      a = 0;
      for (b = ka; b <= kb; b++) a += b;
      ia [11] = a;

      /*   71.7.47.21. Даны два натуральных числа a и b. Определить наибольший общий делитель трёх величин: a + b, |a - b|, ab.   */

      a = ka + kb;
      b = ka - kb;
      c = ka * kb;
      if (b < 0) b = -b;
      if (a < 2  ||  b < 2  ||  c < 2) ia [14] = 1;
      else
      {
         while (a - b) if (a > b) a -= b; else b -= a;
         while (a - c) if (a > c) a -= c; else c -= a;
         ia [14] = a;
      }

      /*   80.1.48.22. Составить программу вычисления площади кольца по значениям внутреннего и внешнего радиусов, используя подпрограмму вычисления площади круга (2 варианта: с процедурой и с функцией).   */

      ib [4] = 3.141592653589 * (kb * kb - ka * ka);

      /*   80.2.49.23. По координатам вершин треугольника вычислить его периметр, используя подпрограмму вычисления длины отрезка, соединяющего две точки.   */

      ib [5] = ma (ka, kb, kc, kd) + ma (ka, kb, ke, kf) + ma (kc, kd, ke, kf);
}
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA
jura_k вне форума   Ответить с цитированием
Старый 04.12.2018, 19:10   #45
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,247
Репутация: 93
По умолчанию

Продолжение того же самого.
Код:
void copy (char *a, char *b);      //   копирование строки b в строку a
void insert (char *a, int b, int c, char *d);   //   в строку 'd' добавить 'c' символов из строки 'a', начиная с символа 'b'

void CP88Doc::ha ()
{
   int a, b, c;
   double d, e, f, g;
   CString j, k;

   char m [30], n [20];
   int p [20];

   if (af == 1)
   {
      /*   88.1.1. Рекуррентная последовательность определена следующим образом: a(i) = 1, если i = 0; a(i) = a(i-1) * i + 1 / i, если i > 0. Для данного натурального n получить значение a(n).   */

      d = 1;
      for (a = 1; a <= ka  &&  a < 101; a++) d = d * a + 1. / a;
      ib [0] = d;

      /*   101.3.10. Составить программу, которая формирует символьную строку, состоящую из n звёздочек.   */

      copy (m, "10. ");
      for (a = 0; a < ka  &&  a < 20; a++) insert ("*", 0, 1, m);
      ic [3] = m;

      /*   119.4.12. Составить программу подсчёта количества различных значащих цифр в десятичной записи натурального числа.   */

      for (a = 0; a < 10; a++) p [a] = 0;
      a = ka;
      while (a > 0)
      {
         p [a % 10]++;
         a /= 10;
      }

      a = 0;
      for (b = 0; b < 10; b++) if (p [b] == 1) a++;
      ia [0] = a;
   }

   if (af == 2)
   {
      /*   88.2.2. Дана последовательность: a(i) = 1, если i = 0, i = 1; a(i) = a(i-2) + a(i-1) / (i - 1), если i > 1. Вычислить произведение элементов с 1-го по 20-ый.   */

      d = e = 1;      //   f - следующий элемент
      g = 1;         //   g - искомое произведение элементов
      for (a = 3; a <= 20; a++)
      {
         f = d + e / (a - 1);
         g *= f;
         d = e;
         e = f;
      }

      ib [1] = g;

      /*   88.5.5. Вычислить и вывести все члены числового ряда, превышающие значение 10^-5: 1, 1/2!, 1/3!, …, 1/N!.   */

      ic [0] = "5. ";
      a = 1;
      d = 1;
      while (1)
      {
         j.Format ("%g", d);
         ic [0] += j;
         d /= ++a;
         if (d < .00001) break;
         ic [0] += ", ";
      }

      /*   70.1.7. Определите на вашем компьютере величину машинного epsilon.   */

      d = 1;
      while (1 + d > 1) d /= 2;
      ib [5] = d;

      /*   101.1.8. Из слова "величина" составить слово "наличие".   */

      copy (m, "величина");
      copy (n, "8. ");
      insert (m, 6, 2, n);
      insert (m, 2, 4, n);
      insert (m, 1, 1, n);
      ic [1] = n;

      /*   101.2.9. Из слова "строка" составить слово "сетка".   */

      copy (m, "строка");
      copy (n, "9. ");
      insert (m, 0, 1, n);
      insert ("е", 0, 1, n);
      insert (m, 1, 1, n);
      insert (m, 4, 2, n);
      ic [2] = n;

      /*   111.3.11. В одномерном массиве X из N элементов произвести перестановку значений так, чтобы они расположились по возрастанию, то есть X(1) <= X(2) <= … <= X(N).   */

      k = "11.";
      for (a = 0; a < 20; a++)
      {
         p [a] = rand () % 100;
         j.Format ("  %i", p [a]);
         k += j;
      }

      ic [4] = k;
      for (a = 0; a < 19; a++)
         for (b = 0; b < 19 - a; b++)
            if (p [b] > p [b + 1])
            {
               c = p [b];
               p [b] = p [b + 1];
               p [b + 1] = c;
            }

      k = "";
      for (a = 0; a < 20; a++)
      {
         j.Format ("%i", p [a]);
         k += j;
         if (a < 19) k += "  ";
      }

      ic [5] = k;
   }

   /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *   2   */


   if (af == 3)
   {
      /*   88.3.3. Используя рекуррентный подход, вычислить сумму многочлена 10-ой степени по формуле Горнера, где x - данное вещественное число: 10x^10 + 9x^9 +8x^8 + … + 2x^2 + x = ((…((10x + 9)x + 8)x + … + 2)x + 1)x.   */

      d = 0;
      for (a = 10; a; a--) d = (d + a) * ca;
      ib [2] = d;

      /*   88.4.4. Для данного вещественного x и натурального N вычислить цепную дробь: x / (1 + x / (2 + x / (3 + x / (… / (N + x))…).   */

      d = ca;
      b = (int) cb;
      if (b > 100) b = 100;
      for (a = b; a > 0; a--)
      {
         e = a + d;
         if (!e) break;
         d = ca / e;
      }

      ib [3] = d;

      /*   88.6.6. Функцию y = sqrt (x) можно вычислить как предельное значение последовательности, определяемой рекуррентной формулой: y(k) = 1 / 2 (y(k-1) + x / y(k-1)); k = 1, 2, … . Начальное значение y(0) задаётся произвольно (желательно ближе к sqrt (x)). За приближённое значение корня с точностью epsilon берётся первое y(k), для которого выполняется условие: |y(k) - y(k-1)| < epsilon. Составить программу вычислений.   */

      //   ca = x, cb = y(0), cc = epsilon.
      e = d = cb;
      a = 0;
      while (1)
      {
         if (!d) break;
         e = .5 * (d + ca / d);
         if (cc <= 0) break;
         if (fabs (e - d) < cc) break;
         d = e;
         if (a++ > 100) break;
      }

      ib [4] = e;
   }
}


void copy (char *a, char *b)
{
   int c = 0;
   do a [c] = b [c]; while (b [c++]);
}

void insert (char *a, int b, int c, char *d)
{
   int e, f;

   e = f = 0;
   while (d [e]) e++;   //   e - длина строки 'd'
   while (f < c) {d [e + f] = a [b + f]; f++;}
   d [e + f] = 0;
}
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA
jura_k вне форума   Ответить с цитированием
Старый 04.12.2018, 20:37   #46
vasek123
Заблокирован
 
Регистрация: 21.11.2008
Адрес: IP адрес: 198.7.62.204 | Адрес:United States United States, Manassas | Провайдер: LeaseWeb | ищите..
Сообщений: 4,988
Репутация: 1588

icq: 590966827
skype: vasek12314
По умолчанию

Цитата:
Сообщение от jura_k Посмотреть сообщение
а "goto" используется лишь для разбиения программы на логические участки.
Можно подумать что все были похожи на тебя и ни кто не знал про другие операторы... Извини, но у меня иной раз возникает вполне резонный вопрос- что ты куришь?

Цитата:
Сообщение от jura_k Посмотреть сообщение
Я с 1990-го года не смотрю телевизор и не в курсе, что происходит. Правда, в последнее полугодие я смотрю Юрия Пронько на Ютубе.
Умные люди, зомбоящик в 90- х не врубали, но, почему то, кто хотел, тот нашел способ. К тому же, если я не ошибаюсь, в то время, как раз, начали появляться мобильники с поддержкой GPRS/ EDGE так что, найти необходимую инфу можно было спокойно, но, видать, вы сами не захотели, вам же интернет нужен только для ютуба и аниме...

Цитата:
Сообщение от jura_k Посмотреть сообщение
Я превзошёл своих учителей...
Угу, заметно(Задорнов нервно курит в сторонке)...

Цитата:
Сообщение от jura_k Посмотреть сообщение
Перепакуйте его как *.zip. *.rar не открывается.
WinRar не судьба поставить?

Последний раз редактировалось vasek123; 04.12.2018 в 20:56.
vasek123 вне форума   Ответить с цитированием
Старый 05.12.2018, 12:40   #47
_Bers
Профессионал
 
Регистрация: 16.12.2011
Адрес: Москва
Сообщений: 2,324
Репутация: 1138
По умолчанию Ввод числа с клавиатуры

Цитата:
Сообщение от vasek123 Посмотреть сообщение
WinRar не судьба поставить?
ты точно профессиональный сисадмин?

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

реально, жмайловская почта может завернуть письмо,
если оно содержит rar-архив.

это связанно с тем,
что антивирусная система не может разжать и провалидировать такой архив.

есть православный zip, который умеют практически все кофеварки,
не говоря уже о форточках или пингвинах.

нафига вы пихаете свой rar?

нафига вы вынуждаете людей
чего-то там дополнительно выкачивать/устанавливать?

сжать общедоступным зипом,
и не создавать проблем ни себе, ни людям - не судьба?

Перенесено в http://www.programmersforum.ru/showthread.php?t=324907

Последний раз редактировалось Alex11223; 05.12.2018 в 15:17.
_Bers вне форума   Ответить с цитированием
Старый 05.12.2018, 18:05   #48
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,247
Репутация: 93
По умолчанию

Тот пост давно устарел и неактуален. Я на него не отвечаю. Незачем мусолить тему.
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA
jura_k вне форума   Ответить с цитированием
Старый 05.12.2018, 20:55   #49
vasek123
Заблокирован
 
Регистрация: 21.11.2008
Адрес: IP адрес: 198.7.62.204 | Адрес:United States United States, Manassas | Провайдер: LeaseWeb | ищите..
Сообщений: 4,988
Репутация: 1588

icq: 590966827
skype: vasek12314
По умолчанию

Цитата:
Сообщение от jura_k Посмотреть сообщение
Тот пост давно устарел и неактуален. Я на него не отвечаю. Незачем мусолить тему.
Ну и правильно- кому это нужно? К тому же, вряд ли кто то возьмется читать этот код- вы, хотя бы переменным какие либо осмысленные имена начали давать прежде чем что то выкладывать.
vasek123 вне форума   Ответить с цитированием
Старый 26.05.2019, 09:18   #50
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,247
Репутация: 93
По умолчанию

Повторение того же самого. Листал старые бумаги; перевел программу с DOS на Windows. Программа расчета дуг окружностей различных радиусов.
Код:
/*   p1
      Язык Visual C++ 6.0
      Консольное приложение
      Радиус   */

#include <math.h>
#include <stdio.h>

main ()
{
   int a, b, c, d;
   FILE *g;

   /*   a - радиус, для которого ведётся расчёт
          b - максимальное значение, для которого считается квадратный корень
          c - счётчик
          d - рассчитанное значение границы окружности   */

   g = fopen ("1.txt", "w");
   for (a = 1; a < 61; a++)   /*   внешний радиус 1/8 окружности   */
   {
      b = (int) (a / sqrt (2) + 2);   /*   верхняя граница расчётов   */
      fprintf (g, "r = %i\n", a);
      for (c = 0; c < b; c++)
      {
         if (c == a) break;
         d = (int) (sqrt (a * a - c * c - .0001) + 1);
         if (d < c) break;
         if (d == a) continue;
         fprintf (g, "%i - %i\n", c, d);
      }

      fprintf (g, "\n");
   }

   fclose (g);
   return 0;
}
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA
jura_k вне форума   Ответить с цитированием
Ответ

Опции темы

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

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


00:12.


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