nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 14:32



Reply to topic  [ 6 posts ] 
Моя первая программа на C++ 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Предлагаю вашему вниманию свою самую первую программу на C++ ( там даже классы есть : )

Code:
// ШАХМАТНАЯ ПРОГРАММА  . Начало 27 февраля 1994 года.
#include <stdio.h>
#include <conio.h>
enum Col {white,black};      // Цвет поля или фигуры
enum Occ {on,off};           // Атрибут занятости поля
enum Nam {o,p,knight,bishop,rook,queen,king};    // Название фигуры
struct Fig{                  // Структура ФИГУРА
   Col color;
   Nam name;
   };
struct Field{                // Структура ПОЛЕ
   Occ occupy;
   Fig figure;
   void Occupy(Occ o,Col c,Nam n);
   Fig Getf(void){return figure;};
   Occ Geto(void){return occupy;};
   Field(){occupy=off;figure.name=o;};         // Конструктор
};
void Field::Occupy(Occ o=off,Col c=white,Nam n=p)
{                     //   Захват-освобождение поля
   occupy=o;
   figure.color=c;
   figure.name=n;
};
          // Класс ПОЗИЦИЯ
class Pos{
private:
   Field k[8][8];    // Шахматная доска
public:
   char head[10];
   int num;
   Col mov;
   void Occupy(char a[3],Occ o,Col c,Nam n);
   void Occupy(int i,int j,Occ o,Col c,Nam n);
   Fig GetF(char a[3]);
   Fig GetF(int i,int j){return k[i-1][j-1].Getf();};
   Occ GetO(char a[3]);
   Occ GetO(int i,int j){return k[i-1][j-1].Geto();};
   Col Cl(int i,int j);
   char *Conv(int i,int j);
   void State(void);
   Pos(int n);
};
void Pos::Occupy(char a[3],Occ o=off,Col c=white,Nam n=p)
{                    // Захват-освобождение поля **
      int ii=a[0]-65,jj=a[1]-49;
      k[ii][jj].Occupy(o,c,n);
}
void Pos::Occupy(int i,int j,Occ o=off,Col c=white,Nam n=p)
{                   // Захват-освобождение поля (i,j)
   k[i-1][j-1].Occupy(o,c,n);
};
Col Pos::Cl(int i,int j)
{                    // Выдача цвета поля (i,j)
     int a=i+j;
     if (a-a%2*2) return(white);
     else return(black);
};                   // Выдача фигуры
Fig Pos::GetF(char a[3])
{
   int ii=a[0]-65,jj=a[1]-49;
   return k[ii][jj].Getf();
};                   // Выдача оккупации
Occ Pos::GetO(char a[3])
{
   int ii=a[0]-65,jj=a[1]-49;
   return k[ii][jj].Geto();
};
char *Pos::Conv(int i,int j)
{ char *a;
   a[0]=i+64;a[1]=j+48;a[2]='\0';
   return a;
};
void Pos::State(void)
{ char *s;
   if(mov==white) s="белых";
   else s="черных";
   printf("\nПозиция %i. %s ход %s\n",num,head,s);
   printf(" БЕЛЫЕ:\n");
   for(int c=0;c<2;c++){
   for(int j=1;j<9;j++){
   for(int i=1;i<9;i++){
      if (GetO(i,j)==on&&GetF(i,j).color==c){
      switch (GetF(i,j).name)
      {
      case 1: s="пешка ";break;
      case 2: s="Конь  ";break;
      case 3: s="Слон  ";break;
      case 4: s="Ладья ";break;
      case 5: s="Ферзь ";break;
      case 6: s="Король";}
      printf("%s на поле %s\n",s,Conv(i,j));
      }
   }}
   getch();
   if(c==0) printf("\n ЧЕРНЫЕ:\n");
   }


};
Pos::Pos(int n=1)  // Конструктор, если (1) или () то начальная позиция
{                  //  если (0) то пустая доска
   head[0]='\0';
   num=1;
   mov=white;
   if(n==1){
     Occupy("A1",on,white,rook);
     Occupy("B1",on,white,knight);
     Occupy("C1",on,white,bishop);
     Occupy("D1",on,white,queen);
     Occupy("E1",on,white,king);
     Occupy("F1",on,white,bishop);
     Occupy("G1",on,white,knight);
     Occupy("H1",on,white,rook);
     Occupy("A2",on);
     Occupy("B2",on);
     Occupy("C2",on);
     Occupy("D2",on);
     Occupy("E2",on);
     Occupy("F2",on);
     Occupy("G2",on);
     Occupy("H2",on);
     Occupy("A8",on,black,rook);
     Occupy("B8",on,black,knight);
     Occupy("C8",on,black,bishop);
     Occupy("D8",on,black,queen);
     Occupy("E8",on,black,king);
     Occupy("F8",on,black,bishop);
     Occupy("G8",on,black,knight);
     Occupy("H8",on,black,rook);
     Occupy("A7",on,black);
     Occupy("B7",on,black);
     Occupy("C7",on,black);
     Occupy("D7",on,black);
     Occupy("E7",on,black);
     Occupy("F7",on,black);
     Occupy("G7",on,black);
     Occupy("H7",on,black);
   }
};

class Figure:public Fig      // Класс ФИГУРА наследует структуру ФИГ
{
private:
   int X,Y,N;
public:
   int Move(int n,int l);
   Figure();

};

main()
{
Pos p1(1);
p1.State();
}


Как можно видеть освоение объектно-ориентированного программирования в феврале 1994 я начал не с чего попало, а прямо с интеллектуальной шахматной программы :)
Правда мой запал иссяк как только я добился рисования начального положения доски ;)
Так что я C++ программист с 25 летним стажем уже :mrgreen:
А до этого я сидел на Паскале года 3 (и тогда же было некоторое количество баз данных в виде FOXBASE+)
А до Паскаля было немного Бейсика на ДВК (в последнем классе школы)
А до Бейсика были программируемые калькуляторы...

_________________
:dj: https://mastodon.social/@Shaos


11 May 2019 19:58
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Готовиться к полному переписыванию - строчка за строчкой :mrgreen:

_________________
:dj: https://mastodon.social/@Shaos


12 May 2019 08:28
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Предлагаю вашему вниманию свою самую первую программу на C++ ...

А я начал писать на C++ только под Windows, поскольку, почитав разное, пришел к выводу,
что писать под Windows .dll-библиотеки на C++ всё же менее муторно, нежели на Ассемблере.
И мне повезло, что писать свои .dll-библиотеки приспичило под Windows 95...98 - там это
реально менее муторно, чем под Windows 3.1 ... 3.11.

Так что, если кто хочет освоить написание своих .dll-библиотек, то в архиве материал, по
которому я начинал этому учиться.
Attachment:
TestDLL.zip [4.43 KiB]
Downloaded 307 times

Я всегда считал и считаю, чтобы чему-то научиться, нужно посмотреть работоспособный образец.
Он в архиве есть. Он и был моей первой программой на C++.
А дальше - можно добавлять в рабочий образец что-то своё, и смотреть, что получиться...
dll-библиотека под Windows на C++ - это в основном всё-таки шаблон программы, а внутри
шаблона страшно-серьёзных ограничений по большому счету и нет.


Собственно, .dll-библиотеки под Windows мне понадобились вынужденно, мне и Visual Basica хватало.
Но, выяснилось сразу на VB 1.0, что M$ изменила стратегию работы с УВВ, и такие полезные вещи,
как IN(...) OUT(...) в ЯВУ больше не существуют (что было надуманным ограничением в то время).
Под Windows 95...98 обращаться напрямую в порты, о которых "не знает" Венда - нет никакого криминала.
Если вы определили своё устройство на адреса платы прототипа $300...30F, и никакой злодей не повесил
там сетевую карту (что бывало), то ничто не должно мешать обратиться к этому устройству командами
IN...OUT напрямую.
Другое дело, что так некорректно обращаться к COM- и LPT-портам, о которых "знает" Windows,
но это уже другая тема для разговора... :wink:

_________________
iLavr


12 May 2019 08:29
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
rw6hrm wrote:
К чему готовиться, что придётся переделывать и вообще?
Готовиться к полному переписыванию - строчка за строчкой :mrgreen:

Вот это меня всегда бесконечно удивляет... вроде же С и С++ позиционируют,
как отличающиеся кроссплатформенностью... :-?

А так получается, по крайней мере из собственного опыта, что Basic-программы более переносимы
меж разными платформами...

Так вот считал я еще во времена "Специалиста" одну задачку, известную как Хаос Чуа.
Считал я, естественно, на его, "Специалиста", Basicе-интерпретаторе, там 3 дифуравнения
и метод интегрирования Рунге-Кутты записаны и вывод графики на экран в 384х256 точек.
Потом это легко перенеслось на "Искру-1030" под DOS и GW-BASIC.
Интересно, что CGA-адаптер не умеет 256 точек по Y, 640x200 он только может...
Но есть оператор "масштаба" WINDOW(0 - 383, 0 - 255), кажется так, и даже вывод графики
переписывать не пришлось, кроме замены PSET-PLOT. Перетаскивал со "Специалиста" программой
из журнала "Радио", она делала некоторые замены автоматически...

Под компилятором Quick Basic 4.5 и на 286-й машине с EGA-адаптером, всё, что работало под
GW-BASIC, пошло просто без изменений!

Ну и, наконец, Винда пришла вместе с P166 и SVGA! :lol:
А под Вендой - надо "дорисовать" всякие кнопочки и тыкалки... но движок-то на 3 дифуравнения
и метод интегрирования Рунге-Кутты остался практически без изменений! :o
Вывод - в графическое окно 384х256... 8)
Attachment:
chua.gif
chua.gif [ 15.47 KiB | Viewed 4772 times ]

Ну и я запретил изменять размер окна, чтобы не обрабатывать ситуацию "ресайза".
Эта программа у меня со временем стала тестовой для определения корректности переноса на
другую платформу: если "яйца Чуа" закрутились - скорее всего перенос прошел удачно... :wink:

_________________
iLavr


12 May 2019 10:05
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Задача не перенести на другую платформу (точнее не только перенести), а превратить 32-битный код C++ (да еще и под винду) в 8-битный код C (у компилятора инты скорее всего 16-битные), а это полное переписывание - вот если бы шла речь о переносе назад (со старого C в новый C++), то проблем было бы сильно меньше...

_________________
:dj: https://mastodon.social/@Shaos


12 May 2019 15:33
Profile WWW
Doomed

Joined: 01 Oct 2007 10:30
Posts: 665
Location: Ukraine
Reply with quote
rw6hrm wrote:
есть трансляторы Aztec-C/BDS C/MIX-C, которые выпущены давно до "плюсов" и используются на 8-битных компах
Если уж связываться, то начинать тогда с единственного для 8-биток ANSI компилятор с поддержкой 32-бит - HI-TECH C 3.09 for CP/M. Или с версии его же для PC - HI-TECH Z80 7.80PL2 C Compiler.

_________________
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru


13 May 2019 01:49
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 6 posts ] 

Who is online

Users browsing this forum: No registered users and 12 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.