Моя первая программа на C++

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Моя первая программа на C++

Post by Shaos »

Предлагаю вашему вниманию свою самую первую программу на C++ ( там даже классы есть : )

Code: Select all

// ШАХМАТНАЯ ПРОГРАММА  . Начало 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+)
А до Паскаля было немного Бейсика на ДВК (в последнем классе школы)
А до Бейсика были программируемые калькуляторы...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Моя первая программа на C++

Post by Shaos »

Готовиться к полному переписыванию - строчка за строчкой :mrgreen:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Моя первая программа на C++

Post by Lavr »

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

Так что, если кто хочет освоить написание своих .dll-библиотек, то в архиве материал, по
которому я начинал этому учиться.
TestDLL.zip
Я всегда считал и считаю, чтобы чему-то научиться, нужно посмотреть работоспособный образец.
Он в архиве есть. Он и был моей первой программой на 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:
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Моя первая программа на C++

Post by Lavr »

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)
chua.gif
Ну и я запретил изменять размер окна, чтобы не обрабатывать ситуацию "ресайза".
Эта программа у меня со временем стала тестовой для определения корректности переноса на
другую платформу: если "яйца Чуа" закрутились - скорее всего перенос прошел удачно... :wink:
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Моя первая программа на C++

Post by Shaos »

Задача не перенести на другую платформу (точнее не только перенести), а превратить 32-битный код C++ (да еще и под винду) в 8-битный код C (у компилятора инты скорее всего 16-битные), а это полное переписывание - вот если бы шла речь о переносе назад (со старого C в новый C++), то проблем было бы сильно меньше...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Alekcandr
Doomed
Posts: 665
Joined: 01 Oct 2007 10:30
Location: Ukraine

Re: Моя первая программа на C++

Post by Alekcandr »

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