Перейти к содержанию
Обновление форума
Опубликовано
comment_2956854

Тема для обсуждения программ на языке C.

 

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

 

Для рисования окружностей в теме Heroes III нужна программа.

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

Эта программа рассчитывает границу 1/8 окружности заданного радиуса в целых числах. Вот эта программа.

 

http://sa.uploads.ru/t/9hxWu.jpg

 

Скачать:

https://yadi.sk/d/jzUo02Szcaw6g

В архиве:

 

текст программы;

сама программа (работающая!);

итоговый файл данных;

скриншот программы;

откорректированный выходной файл (с косметическими изменениями для удобства работы с ним).

 

Программа написана на языке C под DOS.

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
  • Ответов 91
  • Просмотры 27,6 тыс
  • Создана
  • Последний ответ

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

Популярные посты

  • Юра К, не придуривайся и научись гуглить. Qt - это кроссплатформенный фреймворк с богатым набором библиотек. Сейчас большинство тех, кто программирует на C++, им пользуется, и при поиске работы это уч

  • Ну спрячь его и не показывай, раз не надо. Притом что на самом деле очень часто надо.   Ты программировать учишься? Ну вот и учись. Базовый синтаксис языка освоить -- это даже не полдела, с этим медв

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

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

Опубликовано
  • Автор
comment_3014276

Очередной шедевр программирования. Повторил часть предыдущей программы.

 

/*   p42 - p74
Язык Turbo C 2.0   */

#include <conio.h>
#include <stdio.h>

float ga = 3.1415926;		/*   число пи   */
char gb;					/*   переменная ввода   */

ja ();
jb ();
jc ();
jd (float);
float ka (float);



main ()
{
  int aa, ab;
  int ba, bb;		/*   переменная ввода   */
  float da, db;
  float ea;		/*   переменная ввода   */
  unsigned ma;
  char pa;
  char sa [80], sb [10], sc [10];		/*   массивы ввода   */

  printf ("Введите два целых числа и одно рациональное число: ");
  scanf ("%i%i%f", &ba, &bb, &ea);
  printf ("Введите символ: ");
  gb = getche ();
  printf ("\nВведите строку: ");
  gets (sa); gets (sa);
  printf ("Введите строку: ");
  scanf ("%[0123456789]%s", sb, sc);
  printf ("\n");

  aa = 1996;
  printf ("Сейчас %i год.\n", aa);
  da = ga * 2 * ba;
  printf ("Радиус = %i, длина = %.4g.\n", ba, da);
  da = ga * 2 * ea;
  db = ga * ea * ea;
  printf ("Радиус = %.4g, длина окружности = %.4g, площадь круга = %.4g.", ea, da, db);
  printf ("\n");
  ja (); jb (); jc ();
  da = 5;
  jd (da);
  printf ("Длина окружности радиуса %.4g равна %.4g.\n", da, ka (da));
  for (aa = 10; aa; aa--)  printf ("%i  ", aa);
  printf ("Старт!\n");
  ma = 60000;
  aa = ma;
  printf ("aa = %i, ma = %u.\n", aa, ma);
  je (ba);
  pa = 'c';
  printf ("%c", pa);
  pa = '+';
  printf ("%c%c\n", pa, pa);
  if (gb == 'a')  printf ("1. Вы нажали клавишу 'a'.\n");
  printf ("2. Вы нажали клавишу '%c'.\n", gb);
  printf ("Я знаю ваше имя... ваше имя - '%s'.\n", sa);
  printf ("%s..%s\n", sb, sc);
  printf ("Целая часть %i; остаток от деления %i.\n", ba / bb, ba % bb);
  aa = 5;
  ab = 60;
  aa++;
  ++ab;
  printf ("aa = %i, ab = %i.\n", aa, ab);
  printf ("aa = %i, ab = %i.\n", aa++, ++ab);
  aa = 101 <= 105;
  ab = 101 > 105;
  printf ("true: %i, false: %i.\n", aa, ab);

  getch ();
  printf ("\n\n");
}



ja () {printf ("Вызвали первую функцию.\n");}
jb () {printf ("Вызвали вторую функцию.\n");}
jc () {printf ("Вызвали третью функцию.\n");}
jd (float a) {printf ("Длина окружности радиуса %.4g равна %.4g.\n", a, ga * 2 * a);}

je (int a)
{
  int b;
  for (b = 0; b < a; b++)  printf ("%c", gb);
  printf ("\n");
}

float ka (float a) {return ga * 2 * a;}

 

Скачать текст программы можно тут:

https://yadi.sk/i/ScUvvSJXkSyJy

 

Программы пишутся на IDE HDD 160 Gb под Celeron 333. На нём размечено 0,1 Gb под C: и установлен DOS с русификатором "keyrus.com". Из этих 100 Mb для DOS, Turbo C 2.0 и программы пока что понадобилось около 4 Mb.

Для переноса сюда подцепил второй HDD, с которого запустил Windows 2000 и скопировал текст программы на флэшку. Затем в Vista открыл Wordpad, в нём - текст программы под DOS (есть такая опция!) Дальше – дело техники. Форматирование в Word и выкладывание на Яндекс.Диск.

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
  • 1 месяц спустя...
Опубликовано
  • Автор
comment_3018961

В двадцатый раз стал читать книгу 1999-го года Б.И. Березина, С.Б. Березина "Начальный курс C и C++".

Думал-думал, как же её лучше прочитать? Она написана под DOS, и там есть существенные моменты, которые никак не обойти. То есть под Windows там надо слишком уж извратиться, чтобы реализовать примеры.

Так ничего и не придумал. Стал читать так же, как 22 года назад учил C по другой книжке под названием "Turbo C". Для этого на Celeron 333 со сдохшим вентилятором установил 160 Gb HDD IDE. Разметил там логический диск C размером 0,1 Gb на FAT16. Установил MS-DOS 6.22 и русификатор "keyrus.com". Затем установил Turbo C 2.0. Всё это хозяйство вместе с программами-примерами заняло меньше 5 Mb.

Затем приступил к чтению книги.

Прочитал часть первого раздела, где рассказывалось про C. (Вторая часть посвящена C++.) Остановился в тот момент, когда пошли слишком сложные вещи, которые никогда не применяю на практике: функции с переменным числом параметров, указатели на функцию, нелокальные переходы и т.д. Примеры из книги разделил на функциональные группы по удобству использования; иногда прерывал и начинал сначала, когда программа занимала уже много места (лишь для удобства), хотя ничто не ограничивало их "расти" и дальше. В итоге получилось 7 программ, две последние из которых нефункциональны по своей структуре.

В приведённом файле можно посмотреть эти программы.

https://yadi.sk/i/TZBWu7PdmWDyK

Впоследствии, чтобы достать эти файлы, подключил этот HDD вторым к системе Windows 2000 на том же компьютере. Затем скопировал программы на флешку 1 Gb через USB. С флешки переписал в Windows Vista.

Сменил расширение файлов на *.txt, затем из программы WordPad открыл их как текстовые файлы MS-DOS и сохранил как текстовые файлы Windows. Ну а дальше в Word и в документ.

Теперь настало время думать, какую книгу читать следующей.

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Опубликовано
  • Автор
comment_3019067
Удали функцию getch () в конце программы – просить не будет. Она всё равно только для удобства, чтобы экран сразу не исчезал по окончании работы программы, а то приходится каждый раз переключать на этот экран <Alt> + <F5> (чтобы просмотреть, что же там программа наработала).
for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
  • 2 недели спустя...
Опубликовано
  • Автор
comment_3020455

Очередная книга – А.Г. Юркин, "Задачник по программированию", 2002 г. От теории перехожу к практике. Поскольку Turbo C не нужен, сделал только 5 задач. Критерии отбора задач такие: исходными данными служат три (или меньше) целых числа. Все задачи из первого раздела "Линейные алгоритмы". Но алгоритмы всё равно получились нелинейными. Но рабочими.

Скачать документ для печати можно здесь: https://yadi.sk/i/69OIckzemiYjr

 

А.Г. Юркин. "Задачник по программированию", 2002 г.

 

1.1. Угол 'alpha' задан в градусах, минутах и секундах. Найти его величину в радианах с максимально возможной точностью. Рекомендуется проверить работоспособность программы для углов, больших развернутого, а также для отрицательных углов.

 

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

 

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

 

1.8. За первый год производительность труда на предприятии возросла на p1%, за второй и третий - соответственно на p2% и p3%. Найти среднегодовой прирост производительности (в процентах).

 

1.9. Заданы три корня кубического уравнения x1, x2, x3. Найти коэффициенты этого уравнения.

 

Код:

Скрытый текст

/*   Задачник по программированию   */
/*   Язык Turbo C 2.0   */

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

main ()
{
  int aa, ab, ac;   /*   переменные ввода   */
  int ba, bb;
  double da;
  float ga, gb;
  long ja, jb, jc;

  printf ("Введите три целых числа: ");
  scanf ("%i%i%i", &aa, &ab, &ac);

  /*   1.1 - 1   */
  da = abs (aa) + (abs (ab) + (double) abs (ac) / 60) / 60;
  da = da / 180 * 3.1415926;
  if (aa < 0)  da = -da;
  printf ("1.1. Величина угла в радианах равна %.8g.\n", da);

  /*   1.3 - 2   */
  ga = aa * .0254;
  ba = ga * 1.0001;
  ga = (ga - ba) * 100;
  bb = ga * 1.0001;
  ga = (ga - bb) * 10;
  if (ga < 0)  ga = 0;
  printf ("1.3. Длина отрезка равна %i дюймов = %i м %i см %.2g мм.\n",
     aa, ba, bb, ga);

  /*   1.6 - 3   */
  printf ("1.6. Стартовый капитал - %i руб.\n", aa);
  printf ("Доходность - %i% в месяц.\n", ab);
  printf ("Стоимость магазина - %i руб.\n", ac);
  if (!aa) {ba = 0; goto aaa;}
  ga = ac / aa;
  gb = 1 + ab / 100.;
  if (ga <= 0  ||  gb <= 0) {ba = 0; goto aaa;}
  ga = log (ga) / log (gb) / 12;
  ba = ga;
  if (ga > ba)  ba++;
aaa:
  printf ("Нужная сумма будет накоплена через %i лет.\n", ba);

  /*   1.8 - 4   */
  ga = (1 + aa / 100.) * (1 + ab / 100.) * (1 + ac / 100.);
  if (ga > 0)
     gb = exp (1 / 3. * log (ga));
  else
     gb = 1;

  gb = (gb - 1) * 100;
  printf ("1.8. Среднегодовой прирост производительности %.4g%.\n", gb);

  /*   1.9 - 5   */
  ja = -((long) aa + ab + ac);
  jb = (long) aa * ab + (long) aa * ac + (long) ab * ac;
  jc = -((long) aa * ab * ac);
  printf ("1.9. Кубическое уравнение: x^3 + %li x^2 + %li x + %li = 0.\n",
     ja, jb, jc);

  getch ();
  printf ("\n\n");
}

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Опубликовано
  • Автор
comment_3020639

Пришлось выдумать такую систему, которая:

 

абстрактна

подходит ко множеству разнотипных задач

несамопересекающаяся!

относительно компактна.

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
  • 2 недели спустя...
Опубликовано
  • Автор
comment_3022794

Просто информация в моей памяти не задерживается. Уже лет 20 как. Пришлось завести специальную темку, чтобы хоть как-то отмечать, что же именно я изучил...

 

А то вроде прочитал книжку... и ничего не узнал.

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Опубликовано
  • Автор
comment_3023087

Возвращаюсь обратно к учебнику "Начальный курс C и C++". Прошёл оставшиеся блоки по языку C – несколько заключительных сложных тем, темы про вывод текста в текстовом режиме и темы про вывод графики в графическом режиме. Параметры графического режима: VGA 640x480, 16 colors.

Почитать программы можно здесь: https://yadi.sk/i/c3x1x6zpnhx8r

Единственное, что я не прошёл – тему про структуры и объединения. Это тоже входит в C.

 

Дополнительно к уже созданному диску 100 Mb сделал ещё один диск 100 Mb, куда установил "Borland C++ 3.1". Все программы на C реализовал там. Отличие от "Turbo C 2.0" в том, что буковки стали цветные. Там оконная среда, позволяющая открывать сразу несколько файлов; кроме того, среда распознаёт ключевые слова, идентификаторы, строки препроцессора и комментарии, выделяя их специальным цветом.

Работать намного приятнее. И самое главное – не тормозит в отличие от Windows.

К сожалению, что-то в компьютере не так, и после выхода из этой среды компьютер перестаёт воспринимать клавиатуру. Может, потому что она USB? В общем, приходится после выхода либо нажимать <Reset>, либо выключать компьютер.

 

 

/*   p150 - программы работы с текстом   */

#include <conio.h>

main ()
{
  int a, b;
  char d [288];
  char *e = " Это строка ! ";
  char f;

  clrscr ();
  textmode (C80);
  for (a = BLUE; a <= WHITE; a++)
  {
     textcolor (a);
     for (b = BLACK; b <= LIGHTGRAY; b++)
     {
 textbackground (B);
 cprintf (" ТЕСТ ");
     }
  }

  getch ();
  textcolor (WHITE | BLINK);
  textbackground (BLACK);
  cprintf (" КОНЕЦ ТЕКСТА ");
  textmode (LASTMODE);
  getch ();

textbackground (BLACK);
window (5, 5, 20, 10);
textattr ((GREEN << 4) + RED);
clrscr ();
getch ();

cputs ("\n Привет, мир.\n\n\r");
cputs ("Нажмите любую клавишу.");
getch ();

window (1, 1, 80, 25);
gettext (4, 4, 21, 11, d);
textbackground (BLUE);
textcolor (WHITE);
for (f = 1; f < 23; f++)
{
   gotoxy (1, f);
   cputs (e);
   cputs (e);
   cputs (e);
   cputs (e);
}

	getch ();
	puttext (24, 5, 41, 12, d);
	getch ();
	for (f = 1; f < 5; f++)  movetext (22, 4, 32, 8, 10 * f, 17);
	getch ();
	normvideo ();
	return 0;
}

 

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Опубликовано
comment_3023113
Единственное, что я не прошёл – тему про структуры и объединения.

Лучше бы вместо графического режима (устаревшего как навоз мамонта) разобралося со структурами данных.

Опубликовано
  • Автор
comment_3023158

С ними я разбирался ещё более десяти лет назад. Просто они имеют отношение к классам (очень похоже), а к классам я пока не тороплюсь.

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

Графику я тоже знаю со школьных лет.

Далее по курсу – Visual Basic 5, в котором абсолютно нечего учить. Ну а пока я читаю теорию C и теорию программирования.

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Опубликовано
comment_3023171
Список, дерево и прочее без понятия "структура" строить сложновато. Оно конечно можно все имитировать через разнородные массивы (в конце концов, память компа в классической архитектуре -- массив байтиков), но как-то уныло.
Опубликовано
comment_3023192

тогда нужны кортежи / tuple.

и как только мы заговорим о реализации этих самых структур -- опять выползают структуры и указатели.

  • 1 месяц спустя...
Опубликовано
  • Автор
comment_3034185

Среда программирования IDE, или тайная лаборатория алхимика. Состав: MS-DOS + Turbo C.

 

http://s6.uploads.ru/t/15oSd.jpg

 

http://s6.uploads.ru/t/7TQmA.jpg

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Опубликовано
comment_3034209

турбо-среда в свое время потрясала, да.

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

правда, это привело к утрате навыков работы с debug.exe ...

Опубликовано
  • Автор
comment_3034250

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

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

Отмечу удобную навигацию в программе клавишами <Page-up>, <Page-down>, <Ctrl>+<Home>, <Ctrl>+<End>, а также возможность копирования текста и его выделения. Очень пригодилось. Например, в том участке кода, наверху.

Торможение в процессе программирования сводится, таким образом, к необходимости соображать, а вовсе не к недостаткам IDE.

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Опубликовано
  • Автор
comment_3034251

Программа, которая строит трёхмерные графики функций.

f1 = 3x2 / 5y2

f2 = x2 / y2

f3 = y - x2 / y2

f4 = (6xy + 3x2y2) / (7x - 12y)

 

Скриншоты:

http://s3.uploads.ru/t/HJtzn.png

 

 

Программа:

 

/*   p5
    Алгебра
    Язык Turbo C 2.0    */

#include <conio.h>
#include <graphics.h>
#include <stdio.h>

ga ();   /*   рисует оси 3D-координат   */
gb (int, int, float, int, int, float);   /*   рисует линию в трехмерном пространстве   */
float ha (float, float);   /*   функция, для которой строится график   */
float hb (float, float);
float hc (float, float);
float hd (float, float);



main ()
{
  int aa, ab;
  float da, db, dc, dd;

  detectgraph (&aa, &ab);
  initgraph (&aa, &ab, "");
  ga ();   /*   1   */
  db = 0;

  for (aa = -640; aa < 0; aa += 10)
     for (ab = -640; ab < 0; ab++)
     {
 da = ha (aa / 50., ab / 50.) * 50;
 if (da > 1000)  da = 1000;
 if (da < -1000)  da = -1000;
 if (ab > -640)  gb (aa, ab - 1, db, aa, ab, da);
 db = da;
     }

  getch ();
  ga ();   /*   2   */
  for (aa = -640; aa < 640; aa += 10)
     for (ab = -640; ab < 0; ab++)
     {
 da = hb (aa / 50., ab / 50.) * 50;
 if (da > 1000)  da = 1000;
 if (da < -1000)  da = -1000;
 if (ab > -640)  gb (aa, ab - 1, db, aa, ab, da);
 db = da;
     }

  getch ();
  ga ();   /*   3   */
  for (aa = -100; aa < -9; aa += 10)
     for (ab = 10; ab < 101; ab++)
     {
 da = hc (aa / 50., ab / 50.) * 50;
 if (da > 1000)  da = 1000;
 if (da < -1000)  da = -1000;
 if (ab > 10)  gb (aa, ab - 1, db, aa, ab, da);
 db = da;
     }

  for (ab = 10; ab < 101; ab += 10)
     for (aa = -100; aa < -9; aa++)
     {
 da = hc (aa / 50., ab / 50.) * 50;
 if (da > 1000)  da = 1000;
 if (da < -1000)  da = -1000;
 if (aa > -100)  gb (aa - 1, ab, db, aa, ab, da);
 db = da;
     }

  getch ();
  ga ();   /*   4   */
  for (aa = -640; aa < 640; aa += 10)
     for (ab = -640; ab < 640; ab++)
     {
 dc = aa / 50.;
 dd = ab / 50.;
 if (7 * dc - 12 * dd >= 0) da = -1000; else da = hd (dc, dd) * 50;

 if (da > 1000)  da = 1000;
 if (da < -1000)  da = -1000;
 if (ab > -640  &&  db > -200)  gb (aa, ab - 1, db, aa, ab, da);
 db = da;
     }

  getch ();
  closegraph ();
}



ga ()   /*   рисует оси 3D-координат   */
{
  cleardevice ();
  setcolor (8);
  line (320, 240, 640, 80);
  line (320, 240, 0, 80);
  setcolor (15);
  line (320, 240, 640, 400);
  line (320, 240, 0, 400);
  line (320, 240, 320, 0);
  setcolor (7);
}

gb (int a, int b, float c, int d, int e, float f)
{
  line (320 - a + b, 240 + (a + B) / 2. - c,
 320 - d + e, 240 + (d + e) / 2. - f);
}

float ha (float a, float B) {return 3 * a * a / 5 / b / b;}
float hb (float a, float B) {return a * a / b / b;}
float hc (float a, float B) {return b - a * a / b / b;}

float hd (float a, float B)
{
  return (6 * a * b + 3 * a * a * b * B) / (7 * a - 12 * B);
}

 

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Опубликовано
comment_3034255
В приличном обществе за magic numbers принято бить по рукам тем, что Гатс называет мечом.
[ Last Exile ] [ Моран жив! ] [ Fallout ] [ Админы ] [ Дядьки ] Teams [奇跡を信じて団 ]
Опубликовано
  • Автор
comment_3034258

Согласно математике magic numbers можно использовать.

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

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
Опубликовано
comment_3034259

это называется "воспитывают".

а если запустить твою поделку на древнем CGA, у которого 320*200 ?

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

Опубликовано
comment_3034270

....

 

Уровень знаний + желание учиться + куча свободного времени.

 

Все это отлично подходит для написания курсовых, решения контрольных - особенно для всевозможных непрофильных заочников (типа экономистов-юристов). Там overqualified скорее вреден, трудно объяснять и работы получаются неубедительные.

Когда-то давно этим занимался, но мне было проще найти клиентуру - препод-лаборант. Для начала можно по знакомым пробить тему или в СС поискать - частенько попадаются запросы в стиле - кто поможет.

 

Подработка, общение, повышение собственной квалификации - может куда в 1С потянет, а это уже практично.

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

Опубликовано
  • Автор
comment_3034291

Просто я реализую то, что собирался реализовать где-то году в 1993-ем.

Раньше тоже пытался неоднократно, у меня целая стопка распечаток лежит с начала века.

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

К специалистам меня не подпускают. Обычно они меня гонят. Поэтому я так и пишу.

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
  • 3 недели спустя...
Опубликовано
  • Автор
comment_3038176

Программа построения графика в трёхмерных координатах. Для простоты выбрана функция z = x / y. Управление: поворот графика влево-вправо, вверх-вниз, возврат на место и выход.

Скачать программу, скриншоты и текст программы можно тут: https://yadi.sk/d/i2-Z07Qjqg6bn

Программа написана под MS-DOS. Чтобы снять скриншоты, я запустил её под Windows 95. Для того, чтобы скопировать все материалы сюда (через флешку), я запустил Windows 2000.

Системные требования: 286 и выше, VGA.

Специально для вас я увеличил число комментариев в программе, так что можно считать её документированной.

 

Скриншоты:

http://sg.uploads.ru/t/3t4fo.png

 

То же самое, вид сверху:

http://sg.uploads.ru/t/LYNUg.png

 

Немного повернул график вправо:

http://sg.uploads.ru/t/Y2iVf.png

 

http://s8.uploads.ru/t/EYWrQ.png

 

http://sg.uploads.ru/t/UAFcY.png

 

Текст программы:

 

/*   p6
    Алгебра: построение графика 3D-функции
    Язык Turbo C 2.0   */

#include <bios.h>
#include <conio.h>
#include <graphics.h>
#include <math.h>

float ga, gb, gc;   /*   вектор ориентации в пространстве осей системы координат - определяющий вектор, ось Oz   */
float gd, ge, gf;   /*   ось Ox в 3D   */
float gg, gh, gi;   /*   ось Oy в 3D   */
int ha;             /*   флаг рисования отрезка в 3D:
		 ha = 0; - не рисовать
		 ha = 1; - первая точка отрезка
		 ha = 2; - вторая точка отрезка   */



da ();   /*   рисование системы 3D-координат и графика   */
db (float, float, float, float, float, float);   /*   рисование линии в трехмерном пространстве   */
dc ();   /*   рисование 3D-графика   */
float ea (float, float);   /*   функция, график которой надо построить   */



main ()
{
  int aa, ab;
  float ja, jb;

  detectgraph (&aa, &ab);
  initgraph (&aa, &ab, "");
  ga = gb = gc = 1;

  while (1)
  {
     da ();
     aa = bioskey (0);
     if (aa == 0x11b)   /*   выход из программы <Esc>   */
     {
 closegraph ();
 return 0;
     }

     if (aa == 0x4b00)   /*   смещение наблюдателя влево <Left arrow>   */
     {
 ja = ga * cos (.1) + gb * sin (.1);
 jb = -ga * sin (.1) + gb * cos (.1);
 ga = ja;
 gb = jb;
     }

     if (aa == 0x4d00)   /*   смещение наблюдателя вправо <Right arrow>   */
     {
 ja = ga * cos (.1) - gb * sin (.1);
 jb = ga * sin (.1) + gb * cos (.1);
 ga = ja;
 gb = jb;
     }

     if (aa == 0x4800)   /*   смещение наблюдателя вверх <Up arrow>   */
     {
 ga += gd * sin (.1);
 gb += ge * sin (.1);
 gc += gf * sin (.1);
     }

     if (aa == 0x5000)   /*   смещение наблюдателя вниз <Down arrow>   */
     {
 ga -= gd * sin (.1);
 gb -= ge * sin (.1);
 gc -= gf * sin (.1);
     }

     if (aa == 0x3b00)   /*   возврат в исходную точку наблюдения <F1>   */
     {
 ga = gb = gc = 1;
 gg = 1; gh = gi = 0;
     }
  }
}



da ()
{
  float a, b, c;

  a = sqrt (ga * ga + gb * gb + gc * gc);   /*   нормирование вектора ориентации осей координат   */
  ga /= a;
  gb /= a;
  gc /= a;

  a = ga * gc;   /*   проекция вектора (0, 0, 1) на определяющий вектор   */
  b = gb * gc;
  c = gc * gc;
  gd = -a;   /*   проекция вектора (0, 0, 1) на плоскость, ортогональную определяющему вектору   */
  ge = -b;
  gf = 1 - c;
  a = sqrt (gd * gd + ge * ge + gf * gf);   /*   нормирование вектора оси Ox   */
  if (a == 0)  return;
  gd /= a;
  ge /= a;
  gf /= a;

  a = gb * gf - gc * ge;   /*   вычисление вектора оси Oy   */
  b = gc * gd - ga * gf;   /*   векторное произведение двух других осей   */
  c = ga * ge - gb * gd;
  if (a * gg + b * gh + c * gi < 0)   /*   инверсия левой тройки векторов   */
  {
     gd = -gd; ge = -ge; gf = -gf;
     gg = -a; gh = -b; gi = -c;
  }
  else {gg = a; gh = b; gi = c;}

  cleardevice ();
  setcolor (8);   /*   рисование 3D-графика   */
  dc ();
  setcolor (7);   /*   рисование осей координат в 3D   */
  db (0, 0, 0, -460, 0, 0);
  db (0, 0, 0, 0, -460, 0);
  setcolor (15);
  db (0, 0, 0, 460, 0, 0);
  db (0, 0, 0, 0, 460, 0);
  db (0, 0, 0, 0, 0, 300);
}

db (float a, float b, float c, float d, float e, float f)
{
  float g, h;   /*   первая точка на плоскости   */
  float i, j;   /*   вторая точка на плоскости   */

  g = a * gd + b * ge + c * gf;   /*   скалярное произведение первого вектора и вектора оси Ox   */
  h = a * gg + b * gh + c * gi;   /*   проекция первого вектора на ось Ox   */
  i = d * gd + e * ge + f * gf;   /*   скалярное произведение второго вектора и вектора оси Oy   */
  j = d * gg + e * gh + f * gi;   /*   проекция второго вектора на ось Oy   */
  if (g > 1000)  g = 1000;
  if (g < -1000)  g = -1000;
  if (i > 1000)  i = 1000;
  if (i < -1000)  i = -1000;
  line (320 - h, 240 - g, 320 - j, 240 - i);
}

dc ()
{
  int a, b;
  float d, e, f;

  f = 50;   /*   масштаб   */
  e = 0;
  for (a = -460; a <= 460; a += 20)
  {
     ha = 0;
     for (b = -460; b <= 460; b++)
     {
 d = ea (a / f, b / f) * f;
 if (ha == 2)  db (a, b - 1, e, a, b, d);
 e = d;
     }
  }

  for (b = -460; b <= 460; b += 20)
  {
     ha = 0;
     for (a = -460; a <= 460; a++)
     {
 d = ea (a / f, b / f) * f;
 if (ha == 2)  db (a - 1, b, e, a, b, d);
 e = d;
     }
  }
}

float ea (float a, float B)
{
  float c;

  if (b == 0)  {ha = 0; return 0;}   /*   область определения функции   */
  c = a / b;   /*   функция, график которой надо построить   */
  if (ha < 2)  ha++;
  if (c > 100)  {ha = 0; return 0;}
  if (c < -100)  {ha = 0; return 0;}
  return c;
}

 

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;
  • 2 месяца спустя...
Опубликовано
  • Автор
comment_3046375

У меня есть задачник по программированию. Ну самый обычный задачник - 7 тем, в каждой теме около 36 задач. От простых до самых сложных. Я, естественно, взялся за первый раздел. И у меня 6 дорог. Перечисляю. Эти задачи можно решить 6-ю средствами программирования:

C;

C со структурами;

C с классами (C++);

Visual Basic 5.0;

Visual C++ 6.0;

Visual C++ 7.0.

Все 6 способов мне доступны (по крайней мере, теоретически). По любой из дорог я могу идти. Какую выбрать?

Что делать?

Мне нет смысла решать ВСЕ задачи 6 раз каждую. Но в то же время интересен каждый из этих способов, так как нету практики.

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

Муки выбора...

 

А.Г. Юркин, "Задачник по программированию". 2002 г. ("Юркин задачник")

Часть III. Прикладные математические задачи.

Глава 7. Арифметика. Страница 77, задача 7.1.

 

Натуральное число в p-ичной системе счисления задано своими цифрами, хранящимися в массиве K (n). Проверить корректность такого представления и перевести число в q-ичную систему (возможно, число слишком велико, чтобы получить его внутреннее представление; кроме того, p ≤ 10, q ≤ 10).

 

Скачать программу, её текст и скриншоты:

https://yadi.sk/d/4YZGX3LgsyqyX

Программа совместима с MS-DOS, Windows 95, Windows 2000, Windows Vista 32-bit.

Скриншоты:

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

D:\>cd work

 

D:\WORK>dir

 

Volume in drive D has no label

Volume Serial Number is 0C6D-11F0

Directory of D:\WORK

 

. <DIR> 06-26-16 10:34a .

.. <DIR> 06-26-16 10:34a ..

EGAVGA BGI 5,554 02-18-92 3:00a EGAVGA.BGI

TC BAT 12 06-26-16 10:34a TC.BAT

TCPICK TCP 1,196 07-04-16 1:10p TCPICK.TCP

TCCONFIG TC 1,690 06-26-16 11:03a TCCONFIG.TC

P77 BAK 2,552 07-04-16 1:01p P77.BAK

P77 C 2,720 07-04-16 1:05p P77.C

DONE-1 <DIR> 06-30-16 9:49a DONE-1

P77A C 861 07-01-16 7:40a P77A.C

P77B C 1,800 07-02-16 6:25p P77B.C

P77 OBJ 1,974 07-04-16 1:05p P77.OBJ

P77 EXE 16,907 07-04-16 1:05p P77.EXE

10 file(s) 35,266 bytes

3 dir(s) 104,294,400 bytes free

 

D:\WORK>

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

P77 EXE 16,907 07-04-16 1:05p P77.EXE

10 file(s) 35,266 bytes

3 dir(s) 104,294,400 bytes free

 

D:\WORK>p77

Основание первой системы счисления: 6.

Исходное число:

305003355353403410124202243510302244255011321340001513332510022524343343

Промежуточное число в десятичной системе счисления:

000000000000000055664707093046964168171692001782840499583747901638733679

Основание второй системы счисления: 9.

Конечное число:

24521055280543813208204360708881333086022846352066040662160

 

 

D:\WORK>p77

Основание первой системы счисления: 10.

Исходное число:

5226524812744766010775243555714506442709497767068114642959602539897612

Промежуточное число в десятичной системе счисления:

5226524812744766010775243555714506442709497767068114642959602539897612

Основание второй системы счисления: 8.

Конечное число:

140734644037735311255677172054235673252536724056404004567741205054231626221414

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

 

Текст программы:

 

/*   p77
    Язык Turbo C 2.0
    Задачник по программированию
    Системы счисления              */

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


main ()
{
  int a [100];   /*   исходный массив данных   */
  int b [100];   /*   промежуточный массив данных в десятичной системе счисления   */
  int c [100];   /*   вспомогательный массив данных   */
  int d [400];   /*   целевой массив данных   */
  int f;         /*   основание первой системы счисления   */
  int g;         /*   основание второй системы счисления   */
  int h;         /*   число цифр исходного числа   */

  int k, l, m, n;

  randomize ();
  f = rand () % 9 + 2;
  g = rand () % 9 + 2;
  h = rand () % 100 + 1;
  for (k = 0; k < 100; k++)  a [k] = b [k] = c [k] = 0;
  for (k = 0; k < 400; k++)  d [k] = 0;
  for (k = 0; k < h; k++)  a [k] = b [k] = rand () % f;

  printf ("Основание первой системы счисления: %i.\n", f);
  printf ("Исходное число:\n");
  for (k = h - 1; k >= 0; k--)  printf ("%i", a [k]);
  printf ("\n");

  for (k = 0; k < h - 1; k++)
  {
     /*   Домножаем на основание системы счисления со сдвигом влево   */
     for (l = 0; l <= k; l++)
        c [h - 2 - l] = b [h - 1 - l] * f;

     /*   Складываем с предыдущим разрядом   */
     c [h - 2 - k] += b [h - 2 - k];

     /*   Переносим десятки в следующий разряд   */
     for (l = k; l >= 0; l--)
     {
        m = c [h - 2 - l];
        c [h - 2 - l] = m % 10;
        c [h - 1 - l] += m / 10;
     }

     /*   Переносим данные вверх   */
     for (l = k; l >= -1; l--)
     {
        b [h - 2 - l] = c [h - 2 - l];
        c [h - 2 - l] = 0;
     }
  }

  printf ("Промежуточное число в десятичной системе счисления:\n");
  for (k = h - 1; k >= 0; k--)  printf ("%i", b [k]);
  printf ("\n");

  n = 0;   /*   указатель в целевом массиве данных на заполняемую ячейку данных   */
  while (1)
  {
     l = 0;   /*   остаток от деления предыдущего разряда   */
     for (k = 0; k < h; k++)
     {
        m = l * 10 + b [h - 1 - k];
        c [h - 1 - k] = m / g;
        l = m % g;
     }

     d [n++] = l;   /*   заносим остаток от деления в целевой массив данных   */
     m = 0;
     for (k = 0; k < h; k++)   /*   переносим результат деления вверх для следующего цикла   */
     {
        b [k] = c [k];
        if (b [k])  m = 1;   /*   флаг наличия ненулевых значений в массиве   */
     }

     if (!m)  break;   /*   расчет окончен   */
  }

  printf ("Основание второй системы счисления: %i.\n", g);
  printf ("Конечное число:\n");
  for (k = n - 1; k >= 0; k--)  printf ("%i", d [k]);
  printf ("\n");

  getch ();
  printf ("\n");
}

 

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

for (j = 0; j < 100; j++) a [j] = d [j] = g [j] = 0;

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

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

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

Последние посетители 0

  • Ни одного зарегистрированного пользователя не просматривает данную страницу

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

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.