Deutsch

Воспоминания, Turbo C 01.06.2024

1767  1 2 все
uscheswoi_82 коренной житель01.06.24 09:35
uscheswoi_82
01.06.24 09:35 

Всем привет! Сегодня уже наступило лето. Я хотел бы вспомнить про Turbo C. В конце 80х на компе был установлен толи Turbo C 1.0, толи 2.0, уже точно не помню. Среда была достаточно примитивна, но если умеешь программировать на Си, то можно было кучу денег заработать. Вот так выглядела лицензионная коробка:


Но после Turbo C, у нас появился дома сначало Borland C++ 3.0, а потом и Borland C++ 4.5 см. https://groups.germany.ru/1299414/f/40785707.html?Cat=&pag.... Turbo C 1.0 и 2.0 мог компилировать только под MS-DOS и в 16 бит. Только Borland C++ 2.0 научился компилировать под Windows, но ещё поддерживал только 16 бит. А вот Borland C++ 4.5 мог компилировать и под Win32s.


Вот так выглядела среда разработки:


Чтобы скопировать блоки в коде, нужно было нажать CTRL+K и B, и перейти на нужное место и нажать на CTRL+K и K. А чтобы вставить код в нужное место, нужно было перейти на нужно место, и нужно было нажать CTRL+K и C. Там была библиотека работы со строками, с памятью, с файлами, с BIOS-ом, графическая библиотека BGI, библиотека работы с консолью. Возможно (но я точно не уверен, т.к. уже толком не помню) там был встроен ассемблер. Так-же там можно было создавать свою библиотеку. А так-же там был отладчик. У тех у кого была голова, те могли разбогатеть. Turbo C можно сказать это как лего, который даёт кирпичики, окна, двери, и потолки, а из них строишь любой дом. Так-же были стороннии библиотеки, спомощью которых упрощалась жизнь программиста на Turbo C.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#1 
uscheswoi_82 коренной житель01.06.24 09:59
uscheswoi_82
NEW 01.06.24 09:59 
в ответ uscheswoi_82 01.06.24 09:35, Последний раз изменено 01.06.24 10:02 (uscheswoi_82)

Так-же забыл перечислить в Turbo C, были библиотеки, спомощью которых можно было управлять вводом с клавиатуры, работа с аппаратным прерыванием. Но если не умел хорошо программировать на Си, в то время можно было испортить даже компьютер. Современная операционная система начиная от Windows NT 3.x и Windows 95, а так-же IBM OS/2 Warp если увидит ошибку в программе просто забьёт процесс. Компилятор Turbo C 1.0 и 2.0, а так-же программы написаны на нём, нельзя запустить на современном компьютере если там стоит современный Windows. Чтобы запустить среду Turbo C 1.0 и 2.0 или написанные на них программы, нужно установить либо FreeDOS или эмулятор DOS. Так-же можно перекомпилировать на современном компиляторе, который совместим с Си.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#2 
uscheswoi_82 коренной житель01.06.24 10:12
uscheswoi_82
NEW 01.06.24 10:12 
в ответ uscheswoi_82 01.06.24 09:59

Вот пару примеров написанные на Turbo C:

Работа с памятью и строками:

#include <stdio.h>
#include <alloc.h>

int main(void) {
  char *buf;
  buf = (char *)malloc(512); /* Резервируем память на 512 байт */
  strcpy(buf, "HELLO"); /* Копируем в переменную buf, слово HELLO */
  strcat(buf, " FROM uscheswoi_82"); /* Добавляем в переменную buf, слово FROM uscheswoi_82 */
  printf("\n%s", buf); /* Выводим содержимое buf на экран */
  free(buf); /* Освобождаем зарезервированную память */
}


Работа с консолью:

#include <conio.h>

int main(void) {
  textattr(BLUE*0x10+WHITE); /* Устанавливаем синий фон, и белые буквы */
  clrscr(); /* Очищаем экран дисплея, фон становится синим, а буквы белыми */
  gotoxy(1, 1); /* Перемещаем курсор на 1 строку, 1 колонку */
  cprintf("HELLO uscheswoi_82"); /* Отображаем HELLO uscheswoi_82 */
}


Работа с файлами:

#include <stdio.h>

int main(void) {
  FILE *f;
  char buf[4096];
  int sz = 0;
  f = fopen("test.txt", "w"); /* Открываем файл test.txt для записи */
  fprintf(f, "%s d", "HELLO uscheswoi_82", 3); /* Пишим в файл HELLO uscheswoi_82 03 */
  fclose(f); /* Закрываем файл */
  f = fopen("test.txt", "r"); /* Открываем файл для чтения */
  /* Если файл существует */
  if(f != NULL) {
    fseek(f, 0L, SEEK_END); /* Перематываем в конец файла */
    sz = ftell(f); /* Получаем текущую позицию, это нужно чтобы знать сколько байт записать в переменную buf */
    fseek(f, 0L, SEEK_SET); /* Перематываем в начало файла */ 
    fread(buf, sz-1, 1, f); /* Считываем текст из файла, т.е. "HELLO uscheswoi_82 03" */
    printf("\n%s", buf); /* Печатаем на экране "HELLO uscheswoi_82 03" */
  }
  fclose(f); /* Закрываем файл */
}


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#3 
uscheswoi_82 коренной житель01.06.24 10:44
uscheswoi_82
NEW 01.06.24 10:44 
в ответ uscheswoi_82 01.06.24 10:12

Благодаря, Turbo C 1.0 / 2.0, Borland C++ 3.0 и 4.5 мы могли себе всё позволить. Некоторые вещи программировать муторно, но всё же, лучше программировать на Си, чем работать токарем, подметать улицы, работать строителем. Если голова есть, то можно работать дома, а это значит спишь когда хочешь, встаёшь когда хочешь. В начале 90х ездить в автобусе на работу это был ад. От дома до работы каждый день 1 час езды, и назад 1 час езды. В начале 90х можно было программу отсылать из дома, спомощью программы Symantec Norton pcAnyWhere и спомощью диал-ап модема 56k см.


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#4 
uscheswoi_82 коренной житель01.06.24 11:23
uscheswoi_82
NEW 01.06.24 11:23 
в ответ uscheswoi_82 01.06.24 10:44

Благодаря Turbo C я изучил язык Си, и попал в немецкий колледж. Т.к. когда я прежде чем поступить в колледж я писал письмо директору, что я хочу поступить в колледж, и я знаю такие-то языки программирования.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#5 
uscheswoi_82 коренной житель01.06.24 12:46
uscheswoi_82
NEW 01.06.24 12:46 
в ответ uscheswoi_82 01.06.24 11:23

Благодаря Си, я смог освоить легко Си++, Java, C#, JavaScript, и PHP. Благодаря знания Си и умение работы со средой Turbo C, мне легко дался в освоение Turbo/Borland Pascal. В Turbo/Borland Pascal некоторые функции один к одному взяты из Си.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#6 
uscheswoi_82 коренной житель04.06.24 06:44
uscheswoi_82
NEW 04.06.24 06:44 
в ответ uscheswoi_82 01.06.24 10:12

В спешки забыл написать return, во всех трёх примерах нужно обязательно написать так:

int main(void) {
...
  return 0;
}
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#7 
uscheswoi_82 коренной житель04.06.24 06:53
uscheswoi_82
NEW 04.06.24 06:53 
в ответ uscheswoi_82 04.06.24 06:44, Последний раз изменено 04.06.24 07:10 (uscheswoi_82)

Итак продолжим наше воспоминание. Вот пример программы, точнее алгоритма, которая/который рисует меню в MS-DOS:

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

#define LEFT    19200 
#define RIGHT   19712
#define ESC     283
#define ENTER   7181
#define MAX_MENUS 4

char *menus[MAX_MENUS] = {"File", "Edit", "Options", "Help"};
int menus_pos[MAX_MENUS] = {1, 10, 20, 30};

int main(void) {
  int key = 0, sel = 0, j = 0;
  textattr(BLACK*0x10+LIGHTGRAY);
  clrscr();

  while(!kbhit()) {
    gotoxy(1, 1);
    textattr(LIGHTGRAY*0x10+BLACK);
    window(1, 1, 1, 80);
    for(j=0; j<80; j++)
      cprintf(" ");

    gotoxy(1, 1);
    for(j=0; j<MAX_MENUS; j++) {
      gotoxy(menus_pos[j], 1);
      cprintf(" %s ", menus[j]);
    }

    gotoxy(menus_pos[sel], 1);
    textattr(GREEN*0x10+YELLOW);
    cprintf(" %s ", menus[sel]);
    key = bioskey(0);
    switch(key) {
      case ENTER:
        gotoxy(1, 2);
        textattr(RED*0x10+YELLOW);
        cprintf("Selected menu: %s", menus[sel]);
      break;
      case ESC:
        return 0;
      break;
      case LEFT:
        if(sel > 0) sel--;
      break;
      case RIGHT:
        if(sel < MAX_MENUS-1) sel++;
      break;
    }
  }
  return 0;
}


Результат работы программы/алгоритма, который я написал на Си:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#8 
uscheswoi_82 коренной житель04.06.24 19:00
uscheswoi_82
NEW 04.06.24 19:00 
в ответ uscheswoi_82 04.06.24 06:53

Продолжим разговор про программирования на Си. Но прежде чем начнём, пару слов об одном форумчане на Казахстанском форуме. Хоть мы были по разную сторону когда я сидел в Казахстанском форуме, т.е. он за Россию, а я за Украину, но вообще он в политику невмешивался, но меня не любил из-за того что я не за Россию, а за Украину, и из-за того что выяснял отношения с другими пользователями. Ну так вот, он несколько дней назад сгорел в Алматы, и ещё погиб его брат. У него не было женщин и детей, был инвалидом как я из-за инсульта, и сидел в форуме ночью, потому-что после инсульта проблемы были якобы со сном. Он многое сделал для Казахстанского форума, был очень добрым, без него бы Казахстанский форум бы загнулся, и администратор Казахстанского форума должен поставить ему золотой памятник за большую заслугу. Вместо заслуги, у него стоит теперь статус в профиле RIP. А так тот форум в Казахстане потихоньку вымерает, т.к. за любую ерунду там можно получить вечный бан, после закрытия vse.kz, многие перебрались в другие русскоязычные форумы, а некоторые сюда. Короче пусть земля будет пухом и покойся с миром.


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

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

#define LINK_BEGIN 0x01 /* Начало ссылки */
#define LINK_END 0x02 /* Конец ссылки */
#define SET_BKCOLOR 0x03 /* Установить цвет фона и цвет текста */
#define GOTOXY 0x04 /* Перейти на X,Y координату */
#define BEGIN_OF_TOPIC 0x10 /* Начало помощи */
#define END_OF_TOPIC 0x11 /* Конец помощи */

typedef struct {
  unsigned char x;
  unsigned char y;
  unsigned char current_page;
  int sz;
  unsigned char jump_to;
} LINK_POS;

int main(void) {
  FILE *f;
  LINK_POS links[4096];
  int link_count = 0;
  int status = 0;
  unsigned char ch;
  unsigned char current_topic = 0;
  unsigned char fg, bg;
  unsigned char x, y;

  textattr(BLACK * 0x10 + LIGHTGRAY);
  clrscr();
  f = fopen("test.hlp", "r+b");
  if(f != NULL) {
    while(1) {
    if(feof(f)) break;
    ch = fgetc(f);
    if(ch == BEGIN_OF_TOPIC) {
    current_topic = fgetc(f);
    printf("Current topic:%d ", current_topic);
    while(1) {
      if(feof(f)) break;
      ch = fgetc(f);
      if(ch == END_OF_TOPIC) {
        fclose(f);
        return 0;
      }
      else if(ch == GOTOXY) {
        x = fgetc(f);
        y = fgetc(f);
        gotoxy(x, y);
      }
      else if(ch == SET_BKCOLOR) {
        fg = fgetc(f);
        bg = fgetc(f);
        textattr(bg * 0x10 + fg);
      }
      else if(ch == LINK_BEGIN) {
        links[link_count].x = wherex();
        links[link_count].y = wherey();
        links[link_count].sz = 0;
        links[link_count].current_page = current_topic;
        ch = fgetc(f);
        links[link_count].jump_to = ch;
         
        while(1) {
          if(feof(f)) break;
          ch = fgetc(f);         
          if(ch == LINK_END) break;
          else cprintf("%c", ch);
          }
        }
        else if(ch == LINK_END) links[link_count].sz = wherey(); 
        else cprintf("%c", ch);
        }
      }      
    }
  }
  fclose(f);
  return 0;
}


Справка, ну или подсказка будет примерно такой:


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#9 
uscheswoi_82 коренной житель04.06.24 19:22
uscheswoi_82
NEW 04.06.24 19:22 
в ответ uscheswoi_82 04.06.24 19:00

Вот код, который генерирует справку в моём придуманном формате HLP, это бинарый файл:

#include <stdio.h>

#define LINK_BEGIN 0x01
#define LINK_END 0x02
#define SET_BKCOLOR 0x03
#define GOTOXY 0x04
#define BEGIN_OF_TOPIC 0x10
#define END_OF_TOPIC 0x11

void begin_of_topic(FILE *f, char unsigned page_id) {
  fputc(BEGIN_OF_TOPIC, f);
  fputc(page_id, f);
}

void write_data(FILE *f, char *buf) {
  fprintf(f, "%s", buf);
}

void new_line(FILE *f) {
  fputc('\n', f);
}

void end_of_topic(FILE *f) {
  fputc(END_OF_TOPIC, f);
}

void goto_xy(FILE *f, char unsigned x, char unsigned y) {
  fputc(GOTOXY, f);
  fputc(x, f);
  fputc(y, f);
}

void set_bkcolor(FILE *f, char unsigned bg, char unsigned fg) {
  fputc(SET_BKCOLOR, f);
  fputc(bg, f);
  fputc(fg, f);
}

void link(FILE *f, char unsigned page_id, char *text) {
  fputc(LINK_BEGIN, f);
  fputc(page_id, f);
  fprintf(f, "%s", text);
  fputc(LINK_END, f);
}

int main(void) {
  FILE *f;
  f = fopen("test.hlp", "w+b");

  begin_of_topic(f, 1);
  write_data(f, "Hello World 1!");
  new_line(f);
  new_line(f);
  link(f, 2, "Goto 2");
  end_of_topic(f);

  begin_of_topic(f, 2);
  write_data(f, "Hello World 2!");
  new_line(f);
  new_line(f);
  link(f, 1, "Goto 1");
  end_of_topic(f);

  fclose(f);
  return 0;
}
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#10 
uscheswoi_82 коренной житель04.06.24 20:17
uscheswoi_82
NEW 04.06.24 20:17 
в ответ uscheswoi_82 04.06.24 19:00

Я забыл выше код:

...
else if(ch == LINK_END) links[link_count].sz = wherey();
...


Нужно добавить имхо вот это:

...
else if(ch == LINK_END) { links[link_count].sz = wherey(); link_count ++; }
...
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#11 
uscheswoi_82 коренной житель04.06.24 22:17
uscheswoi_82
NEW 04.06.24 22:17 
в ответ uscheswoi_82 04.06.24 20:17

Все программы я программирую на моём лицензионном Borland C++ 2.0 см. https://groups.germany.ru/1299414/f/40785707.html?Cat=&pag...












Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#12 
uscheswoi_82 коренной житель04.06.24 22:28
uscheswoi_82
NEW 04.06.24 22:28 
в ответ uscheswoi_82 04.06.24 22:17
Все программы я программирую на моём лицензионном Borland C++ 2.0

Имел ввиду в этой ветке/теме.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#13 
uscheswoi_82 коренной житель05.06.24 23:23
uscheswoi_82
NEW 05.06.24 23:23 
в ответ uscheswoi_82 04.06.24 22:28

Всем добрый вечер!

Программу для отображение справки я продолжу позже, а сейчас сделаю две небольшие программы. Одна программа генерирует и рисует ASCII таблицу, а другая рисует окно в MS-DOS.

Вот программа, которая генерирует ASCII таблицу ascii.c:

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

int main(void) {
  unsigned int a;
  int y=1, x=1;
  clrscr();
  for(a=0; a<256; a++) {
    gotoxy(x, y);
    if(a == 0) { textattr(BLACK*0x10+RED); cprintf("X N |", a); }
    else if(a == 7) { textattr(BLACK*0x10+RED); cprintf("X N |", a); }
    else if(a == 8) { textattr(BLACK*0x10+RED); cprintf("X N |", a); }
    else if(a == '\n') { textattr(BLACK*0x10+RED); cprintf("X N |", a); }
    else if(a == ' ') { textattr(BLACK*0x10+RED); cprintf("X S |", a); }
    else if(a == '\r') { textattr(BLACK*0x10+RED); cprintf("X N |", a); }
    else if(a == '\g') { textattr(BLACK*0x10+RED); cprintf("X B |", a); }
    else { textattr(BLACK*0x10+LIGHTGRAY); cprintf("X %c |", a, a); }
    y++;
    if(y >= 25) { y = 1; x += 7;}
  }
  return 0;
}


Вот результат работы программы:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#14 
uscheswoi_82 коренной житель05.06.24 23:57
uscheswoi_82
NEW 05.06.24 23:57 
в ответ uscheswoi_82 05.06.24 23:23

Вот алгоритм рисования окна на Си window.c:

#include <stdio.h>
#include <conio.h>
#define LINE_VERT    0xBA
#define LINE_HORIZ   0xCD
#define TOP_RIGHT    0xBB
#define BOTTOM_RIGHT 0xBC
#define BOTTOM_LEFT  0xC8
#define TOP_LEFT     0xC9

void draw_window(int l, int t, int r, int b) {
  int j;

  window(l, t, r+1, b+1);
  textattr(BLUE*0x10+WHITE);
  clrscr();

  gotoxy(l, t);
  cprintf("%c", TOP_LEFT);

  gotoxy(r, t);
  cprintf("%c", TOP_RIGHT);
 
  gotoxy(l, b);
  cprintf("%c", BOTTOM_LEFT);
  
  gotoxy(r, b);
  cprintf("%c", BOTTOM_RIGHT);
  
  for(j=2; j<r; j++) {
    gotoxy(j, 1);
    cprintf("%c", LINE_HORIZ);
    gotoxy(j, b);
    cprintf("%c", LINE_HORIZ);
  }

  for(j=2; j<b; j++) {
    gotoxy(l, j);
    cprintf("%c", LINE_VERT);
  
    gotoxy(r, j);
    cprintf("%c", LINE_VERT);
  }
  gotoxy(2, 2);
}

int main(void) {
  textattr(BLACK*0x10+LIGHTGRAY);
  clrscr();
  draw_window(1, 1, 15, 15);
  cprintf("HELLO WORLD");
  return 0;
}


Нам понадобяться такие ASCII символы:



Вуаля! А вот и результат, наше окошко:



Примерно вот так программисты программировали в начале 90х, и зарабатывали неплохие денюжки!

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#15 
uscheswoi_82 коренной житель06.06.24 00:07
uscheswoi_82
NEW 06.06.24 00:07 
в ответ uscheswoi_82 05.06.24 23:57

Всё пошёл спатенькать, завтра возможно начну новую но очень интересную тему. Всё спок ночи всем!

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#16 
uscheswoi_82 коренной житель06.06.24 14:43
uscheswoi_82
NEW 06.06.24 14:43 
в ответ uscheswoi_82 06.06.24 00:07

Улучшил только-что код меню, незаметил while(!kbhit()), а надо while(1):

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

#define LEFT    19200 
#define RIGHT   19712
#define ESC     283
#define ENTER   7181
#define MAX_MENUS 4

char *menus[MAX_MENUS] = {"File", "Edit", "Options", "Help"};
char *menus_help[MAX_MENUS] = {"Create a new file, open an exist file, or save into a file",
                               "Copy, paste, cut, etc.", 
                               "Options of program", 
                               "Help"};
int menus_pos[MAX_MENUS] = {1, 10, 20, 30};

int main(void) {
  int key = 0, sel = 0, j = 0;
  textattr(BLACK*0x10+LIGHTGRAY);
  clrscr();


  while(1) {
    gotoxy(1, 1);
    textattr(LIGHTGRAY*0x10+BLACK);
    for(j=0; j<80; j++) cprintf(" ");


    gotoxy(1, 24);
    textattr(LIGHTGRAY*0x10+BLACK);
    for(j=0; j<80; j++) cprintf(" ");
  
    gotoxy(1, 1);
    for(j=0; j<MAX_MENUS; j++) {
      gotoxy(menus_pos[j], 1);
      cprintf(" %s ", menus[j]);
    }


    gotoxy(menus_pos[sel], 1);
    textattr(GREEN*0x10+YELLOW);
    cprintf(" %s ", menus[sel]);
    gotoxy(1, 24);
    textattr(LIGHTGRAY*0x10+BLACK);
    cprintf(" %s ", menus_help[sel]);
    gotoxy(1, 1);
    key = bioskey(0);
    switch(key) {
      case ENTER:
        gotoxy(1, 2);
        textattr(RED*0x10+YELLOW);
        cprintf("Selected menu: %s     ", menus[sel]);
      break;
      case ESC:
        textattr(BLACK*0x10+LIGHTGRAY);
        clrscr();
        return 0;
      break;
      case LEFT:
        if(sel > 0) sel--; else sel = MAX_MENUS-1;
      break;
      case RIGHT:
        if(sel < MAX_MENUS-1) sel++; else sel = 0;
      break;
    }
  }
  return 0;
}


А вот и результат! Вуаля!:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#17 
uscheswoi_82 коренной житель06.06.24 14:47
uscheswoi_82
NEW 06.06.24 14:47 
в ответ uscheswoi_82 06.06.24 14:43

См. https://i.ibb.co/0tBhjGw/bandicam-2024-06-06-14-35-57-065....

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#18 
uscheswoi_82 коренной житель08.06.24 20:24
uscheswoi_82
NEW 08.06.24 20:24 
в ответ uscheswoi_82 06.06.24 14:47

Всем добрый вечер!

Сегодня не хочу заниматься Embedded, а хочу продолжить разговор про программирование на Си. Давайте сегодня поговорим про библиотеку Turbo C BGI. Это очень классная библиотека, для работы с графикой. Там можно рисовать точки, окружности, прямоугольники, изгибы, 3х-мерные прямоугольники, выводить текст, менять фон и цвет, делать заливку. Я сделаю пример светофора на Си, вот код traficlight.c:

#include <stdio.h>
#include <graphics.h>
#define TRAFICLIGHT_BORDER_COLOR LIGHTGRAY
#define TRAFICLIGHT_BG_COLOR     DARKGRAY

#define TRAFICLIGHT_BG_COLOR_RED RED
#define TRAFICLIGHT_BG_COLOR_YELLOW BROWN
#define TRAFICLIGHT_BG_COLOR_GREEN GREEN

#define TRAFICLIGHT_ON_BG_COLOR_RED LIGHTRED
#define TRAFICLIGHT_ON_BG_COLOR_YELLOW YELLOW
#define TRAFICLIGHT_ON_BG_COLOR_GREEN LIGHTGREEN

int main(void) {
  int color = 0;
  int gdriver = DETECT, gmode, errorcode;

  initgraph(&gdriver, &gmode, "");
  errorcode = graphresult();
  if(errorcode != grOk) return -1;

  setbkcolor(BLUE);
  setcolor(WHITE);
  outtextxy(10, 450, "Press any key to quit...");
  setcolor(TRAFICLIGHT_BORDER_COLOR);
  rectangle(10, 10, 70, 200);
  rectangle(30, 200, 50, 290);
  setfillstyle(SOLID_FILL, TRAFICLIGHT_BG_COLOR);
  floodfill(12, 12, TRAFICLIGHT_BORDER_COLOR);
  setfillstyle(SOLID_FILL, TRAFICLIGHT_BG_COLOR);
  floodfill(32, 202, TRAFICLIGHT_BORDER_COLOR);
  circle(40, 42, 25);
  circle(40, 102, 25);
  circle(40, 162, 25);
  while(!kbhit()) {
    setfillstyle(SOLID_FILL, TRAFICLIGHT_BG_COLOR_RED);
    floodfill(42, 44, TRAFICLIGHT_BORDER_COLOR);
    setfillstyle(SOLID_FILL, TRAFICLIGHT_BG_COLOR_YELLOW);
    floodfill(42, 104, TRAFICLIGHT_BORDER_COLOR);
    setfillstyle(SOLID_FILL, TRAFICLIGHT_BG_COLOR_GREEN);
    floodfill(42, 164, TRAFICLIGHT_BORDER_COLOR);
    if(color == 0) {
      setfillstyle(SOLID_FILL, TRAFICLIGHT_ON_BG_COLOR_RED);
      floodfill(42, 44, TRAFICLIGHT_BORDER_COLOR);
    }
    else if(color == 1) {
      setfillstyle(SOLID_FILL, TRAFICLIGHT_ON_BG_COLOR_RED);
      floodfill(42, 44, TRAFICLIGHT_BORDER_COLOR);
      setfillstyle(SOLID_FILL, TRAFICLIGHT_ON_BG_COLOR_YELLOW);
      floodfill(42, 104, TRAFICLIGHT_BORDER_COLOR);
     }
     else if(color == 2) {
       setfillstyle(SOLID_FILL, TRAFICLIGHT_ON_BG_COLOR_GREEN);
       floodfill(42, 164, TRAFICLIGHT_BORDER_COLOR);
      }
     else color = -1;
  delay(1000);
  color++;
  }
  getch();

  closegraph();
  return 0;
}


Вот результаты работы программы светофор, написаный на языке Си:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#19 
uscheswoi_82 коренной житель13.06.24 23:50
uscheswoi_82
NEW 13.06.24 23:50 
в ответ uscheswoi_82 08.06.24 20:24

Всем добрый вечер! Закрыл группы, потому-что была странная активность, мои посты начали смотреть по 100-200 е в день смущбезум. Сейчас опять открыл. Короче продолжим болтавню программирования на Си. Сделаем симулятор планет, но потом код подправлю. Вот код:

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

#define PI 3.14159265359
#define PLANETS_COUNT 9

void draw_planet(int cx, int cy, int x, int y, float angle, int fg, int bg);
int main(void) {
  float x[PLANETS_COUNT], y[PLANETS_COUNT], angle[PLANETS_COUNT], step[PLANETS_COUNT];
  int planets;
  char buf[80];
  int gdriver = DETECT, gmode, errorcode;

  initgraph(&gdriver, &gmode, "");
  errorcode = graphresult();
  if(errorcode != grOk) return -1;

  for(planets=0; planets<PLANETS_COUNT; planets++) {
    if(planets > 0) { x[planets] = x[planets-1]+15; y[planets]=y[planets-1]+15; }
    else { x[planets] = 40; y[planets]=40; }
  }
  for(planets=0; planets<PLANETS_COUNT; planets++) { angle[planets] = rand() % 50; step[planets] = 1 + rand() %4; }
  while(!kbhit()) {
    setcolor(WHITE);
    circle(250, 250, 20);
    setfillstyle(SOLID_FILL, YELLOW);
    floodfill(252, 252, WHITE);
    for(planets=0; planets<PLANETS_COUNT; planets++) {
      angle[planets] += step[planets];
      if(angle[planets] >= 359) angle[planets] = 0;

      draw_planet(250, 250, x[planets], y[planets], angle[planets], WHITE, BLUE);
      sprintf(buf, "%d %f", planets, angle[planets]);
      outtextxy(10, 20+(planets*10),buf);
    }
  cleardevice();
  }
  getch();
  closegraph();
  return 0;
}

void draw_planet(int cx, int cy, int x, int y, float angle, int fg, int bg) {
  float nx, ny;
  nx = (x * cos(angle*(PI/180))) - (y * sin(angle*(PI/180)));
  ny = (x * cos(angle*(PI/180))) + (y * sin(angle*(PI/180)));
  setcolor(fg);
  circle(cx + nx, cy + ny, 5);
  setfillstyle(SOLID_FILL, bg);
  floodfill(cx+2+nx, cy+2+ny, fg);
}


Улучшу код, а так-же покажу программу в дейтсвие чуть позже.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#20 
uscheswoi_82 коренной житель14.06.24 00:08
uscheswoi_82
NEW 14.06.24 00:08 
в ответ uscheswoi_82 13.06.24 23:50

Результат работы кода, мерцает немножко:


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#21 
uscheswoi_82 коренной житель14.06.24 01:16
uscheswoi_82
NEW 14.06.24 01:16 
в ответ uscheswoi_82 14.06.24 00:08

Улучшил код см.:

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

#define PI 3.14159265359
#define PLANETS_COUNT 8
#define C_PLANET_MERCURY  LIGHTGRAY /* 1 Меркурий */
#define C_PLANET_VENUS    BROWN     /* 2 Венера   */
#define C_PLANET_EARTH    LIGHTBLUE /* 3 Земля    */
#define C_PLANET_MARS     BROWN     /* 4 Марс     */
#define C_PLANET_JUPITER  BROWN     /* 5 Юпитер   */
#define C_PLANET_URANUS   LIGHTCYAN /* 6 Уран     */
#define C_PLANET_NEPTUNE  LIGHTBLUE /* 7 Нептун   */
#define C_PLANET_PLUTO    LIGHTGRAY /* 8 Плутоний  */

#define SUN_X 300 /* Позиция солнце на экране*/
#define SUN_Y 200 /* Позиция солнце на экране */

void draw_planet(int cx, int cy, int x, int y, float angle, int fg, int bg);

int main(void) {
  float x[PLANETS_COUNT], y[PLANETS_COUNT], angle[PLANETS_COUNT], step[PLANETS_COUNT];
  int plant_colors[PLANETS_COUNT] = { C_PLANET_MERCURY, C_PLANET_VENUS,
                                      C_PLANET_EARTH, C_PLANET_MARS,
                                      C_PLANET_JUPITER, C_PLANET_URANUS,
                                      C_PLANET_NEPTUNE, C_PLANET_PLUTO
                                    };
  int planets;
  int gdriver = DETECT, gmode, errorcode;

  initgraph(&gdriver, &gmode, "");
  errorcode = graphresult();
  if(errorcode != grOk) return -1;

  for(planets=0; planets<PLANETS_COUNT; planets++) {
    if(planets > 0) { x[planets] = x[planets-1] + 15; y[planets]=y[planets-1] + 15; }
    else { x[planets] = 40; y[planets]=40; }
  }

  for(planets=0; planets<PLANETS_COUNT; planets++) { angle[planets] = rand() % 50; step[planets] = 1 + rand() % 4; }
  while(!kbhit()) {
    setcolor(WHITE);
    circle(SUN_X, SUN_Y, 20);
    setfillstyle(SOLID_FILL, YELLOW);
    floodfill(SUN_X + 2, SUN_Y + 2, WHITE);
    for(planets=0; planets<PLANETS_COUNT; planets++) {
      angle[planets] += step[planets];
      if(angle[planets] >= 359) angle[planets] = 0;

      draw_planet(SUN_X, SUN_Y, x[planets], y[planets], angle[planets], WHITE, plant_colors[planets]);
    }
    setcolor(WHITE);
    outtextxy(10, 460, "Press any key, to exit...");
    cleardevice();
  }
  getch();
  closegraph();
  return 0;
}

/* Рисует планету */
void draw_planet(int cx, int cy, int x, int y, float angle, int fg, int bg) {
  float nx, ny;
  nx = (x * cos(angle * (PI / 180))) - (y * sin(angle * (PI / 180)));
  ny = (x * cos(angle * (PI / 180))) + (y * sin(angle * (PI / 180)));
  setcolor(fg);
  circle(cx + nx, cy + ny, 5);
  setfillstyle(SOLID_FILL, bg);
  floodfill(cx + 2 + nx, cy + 2 + ny, fg);
}

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#22 
uscheswoi_82 коренной житель14.06.24 02:27
uscheswoi_82
NEW 14.06.24 02:27 
в ответ uscheswoi_82 14.06.24 01:16

Последнее, и я наверное пойду спатенькать. Если помните мы тут см. https://groups.germany.ru/12994140000001/f/41010308.html?C... делали просмоторщик картинок, а так-же программу, которая переконвиртирует фотографию в бинарный формат см.:



Вот код, программа читает бинарный файл, считывает бинарные данные из файла, и выводит изображение на экран:

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

int main(void) {
  int gdriver = DETECT, gmode, errorcode;
  FILE *f;
  int x = 0, y = 0, sx = 0, sy = 0;
  f = fopen("demo.bin", "r+b");
  if(f != NULL) {
    printf("\nSize X?");
    scanf("%d", &sx);
    printf("\nSize Y?");
    scanf("%d", &sy);
    initgraph(&gdriver, &gmode, "");
    errorcode = graphresult();
    if(errorcode != grOk) return -1;

    while(!feof(f)) {
      if(x >= sx) { x = 0; y++; }
      if(y >= sy) { break; }
      putpixel(x, y, fgetc(f));
      x ++ ;
    }
  outtextxy(10, 450, "Press any key to quit...");
  getch();
  closegraph();
  }
}


Вот результат, это изображение которое я закодировал выше написанным софтом:

1. Сначало спрашивает программа какой размер картинки, введём 320 и 200:



2. Вуаля! А вот и наша картинка см:



На последок хотел показать, что одна старая тётка про меня пишит в этом форуме:

Посмеюсь перед сном над ней хаха:



Ну ладно я баенкать пошёл.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#23 
uscheswoi_82 коренной житель14.06.24 02:33
uscheswoi_82
NEW 14.06.24 02:33 
в ответ uscheswoi_82 14.06.24 02:27, Последний раз изменено 14.06.24 02:34 (uscheswoi_82)

Завтра попробуем повернуть картику ну скажем на 30 градусов по формуле:

float nx, ny;
nx = (x * cos(angle*(PI/180))) - (y * sin(angle*(PI/180)));
ny = (x * cos(angle*(PI/180))) + (y * sin(angle*(PI/180)));


Ну ладно, всё теперь точно я спать! Всем спок. ночи!

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#24 
uscheswoi_82 коренной житель14.06.24 18:47
uscheswoi_82
NEW 14.06.24 18:47 
в ответ uscheswoi_82 14.06.24 02:33

С поворотом картинке позже покажу, а вот код в анимации солнечной системы подправил :

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

#define PI 3.14159265359
#define PLANETS_COUNT 8
#define C_PLANET_MERCURY  LIGHTGRAY /* 1 */
#define C_PLANET_VENUS    BROWN     /* 2 */
#define C_PLANET_EARTH    LIGHTBLUE /* 3 */
#define C_PLANET_MARS     BROWN     /* 4 */
#define C_PLANET_JUPITER  BROWN     /* 5 */
#define C_PLANET_URANUS   LIGHTCYAN /* 6 */
#define C_PLANET_NEPTUNE  LIGHTBLUE /* 7 */
#define C_PLANET_PLUTO    LIGHTGRAY /* 8 */
/* #define IS_DEBUG */

#define SUN_X 300
#define SUN_Y 220

void draw_planet(int cx, int cy, int x, int y, float angle, int fg, int bg);
void draw_track(int cx, int cy, int radius, int color);

int main(void) {
  int planets;
  int radius[PLANETS_COUNT] = {56, 77,  98, 120, 140, 163, 185, 205};
  float x[PLANETS_COUNT], y[PLANETS_COUNT], angle[PLANETS_COUNT], step[PLANETS_COUNT];
  int plant_colors[PLANETS_COUNT] = { C_PLANET_MERCURY, C_PLANET_VENUS,
                      C_PLANET_EARTH, C_PLANET_MARS,
                      C_PLANET_JUPITER, C_PLANET_URANUS,
                      C_PLANET_NEPTUNE, C_PLANET_PLUTO
                    };
  int gdriver = DETECT, gmode, errorcode;

  initgraph(&gdriver, &gmode, "");
  errorcode = graphresult();
  if(errorcode != grOk) return -1;

  for(planets=0; planets<PLANETS_COUNT; planets++) {
    if(planets > 0) { x[planets] = x[planets-1] + 15; y[planets]=y[planets-1] + 15; }
    else { x[planets] = 40; y[planets]=40; }
  }
  for(planets=0; planets<PLANETS_COUNT; planets++) { angle[planets] = rand() % 50; step[planets] = 1 + rand() % 4; }
  while(!kbhit()) {
    setcolor(WHITE);
    circle(SUN_X, SUN_Y, 20);
    setfillstyle(SOLID_FILL, YELLOW);
    floodfill(SUN_X + 2, SUN_Y + 2, WHITE);
    for(planets=0; planets<PLANETS_COUNT; planets++) {
      angle[planets] += step[planets];
      if(angle[planets] >= 359) angle[planets] = 0;

      draw_planet(SUN_X, SUN_Y, x[planets], y[planets], angle[planets], WHITE, plant_colors[planets]);
      draw_track(SUN_X, SUN_Y, radius[planets], WHITE);
      }
    setcolor(WHITE);
    outtextxy(10, 460, "Press any key, to exit...");
    #ifndef IS_DEBUG
      delay(1500);
      cleardevice();
    #endif
  }
  getch();
  closegraph();
  return 0;
}

void draw_track(int cx, int cy, int radius, int color) {
  setcolor(color);
  circle(cx, cy, radius);
}

void draw_planet(int cx, int cy, int x, int y, float angle, int fg, int bg) {
  float nx, ny;
  char buf[80];
  nx = (x * cos(angle * (PI / 180))) - (y * sin(angle * (PI / 180)));
  ny = (x * cos(angle * (PI / 180))) + (y * sin(angle * (PI / 180)));
  setcolor(fg);
  circle(cx + nx, cy + ny, 5);
  setfillstyle(SOLID_FILL, bg);
  floodfill(cx + 2 + nx, cy + 2 + ny, fg);
}


Вуаля!

#define IS_DEBUG:




/*#define IS_DEBUG*/:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#25 
uscheswoi_82 коренной житель15.06.24 03:09
uscheswoi_82
NEW 15.06.24 03:09 
в ответ uscheswoi_82 14.06.24 18:47

Всем доброй ночи! Только что посмотрел Форсаж 7, и занимался программирование симуляции движения тела брошенного под углом к горизонту:

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

#define PI 3.14159265359

int main(void) {
  int gdriver = DETECT, gmode, errorcode;
  double vx, vy, t, step, x, y;
  int angle, v0;
  char buf[80];

  printf("v0, angle=");
  scanf("%d %d", &v0, &angle);
  sprintf(buf, "v0=%d angle=%d", v0, angle);
  initgraph(&gdriver, &gmode, "");
  errorcode = graphresult();
  if(errorcode != grOk) return -1;

  step = 0.005;
  t = 0;
  x = 1;
  y = 1;

  vx = v0 * cos((angle * PI) / 180);
  vy = v0 * sin((angle * PI) / 180);
  outtextxy(10, 10, buf);
  while(y > 0) {
    t = t + step;
    vy = vy - t;
    x = x + (vx * step);
    y = y + (vy * step);
    putpixel(x, 350 - y, WHITE);
    delay(20);
  }
  outtextxy(10, 400, "Press any key to exit...");
  getch();
  closegraph();
  return 0;
}


Вуаля! А вот и результат:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#26 
uscheswoi_82 коренной житель15.06.24 03:12
uscheswoi_82
NEW 15.06.24 03:12 
в ответ uscheswoi_82 15.06.24 03:09

Посмеюсь хаха


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#27 
uscheswoi_82 коренной житель18.06.24 13:35
uscheswoi_82
NEW 18.06.24 13:35 
в ответ uscheswoi_82 15.06.24 03:12, Последний раз изменено 18.06.24 13:36 (uscheswoi_82)

Всем привет! Продолжим болтавню. Сегодня реализуем алгоритм пузырчатой сортировки.

Алгоритм поиска больше:

#include <stdio.h>
int main(void) {
  int a = 3, b = 2;
  if(a > b)
    printf("%d больше, чем %d", a, b);
  return 0;
}


Алгоритм поиска меньше:

#include <stdio.h>
int main(void) {
  int a = 2, b = 3;
  if(a < b)
    printf("%d меньше, чем %d", a, b);
  return 0;
}


Алгоритм поменять местами 2 элемента:

if(z[a] > z<b>) {
  temp = z<b>;
  z<b> = z[a];
  z[a] = temp;
}


Вот так нужно представлять себе алгоритм с тремя чашками и водой:



А теперь сам алгоритм сортировки полностью, с маленького числа, в большое:

#include <stdio.h>
#define COUNT  10
int main(void) {
  int z[COUNT] = {10, 5, 4, 6, 1, 2, 7, 9, 3, 8};
  int temp;
  int a, b;
  for(a=0; a<COUNT; a++) printf("%d ", z[a]);
  printf("\n");
  for(a=0; a<COUNT; a++) {
    for(b=a; b<COUNT; b++) {
      if(z[a] > z<b>) {
        temp = z<b>;
        z<b> = z[a];
        z[a] = temp;
      }
    }
  }
  for(a=0; a<COUNT; a++) printf("%d ", z[a]);
  return 0;
}


Результат работы алгоритма:

10 5 4 6 1 2 7 9 3 8
1 2 3 4 5 6 7 8 9 10


Посмеёмся хахаулыб



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#28 
uscheswoi_82 коренной житель18.06.24 13:39
uscheswoi_82
NEW 18.06.24 13:39 
в ответ uscheswoi_82 18.06.24 13:35

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

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#29 
uscheswoi_82 коренной житель18.06.24 15:36
uscheswoi_82
NEW 18.06.24 15:36 
в ответ uscheswoi_82 18.06.24 13:39

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

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#30 
uscheswoi_82 коренной житель19.06.24 22:44
uscheswoi_82
NEW 19.06.24 22:44 
в ответ uscheswoi_82 18.06.24 15:36

Завтра нарисую спомощью BGI солнце, облака, машину и дом. Чтобы это нарисовать, я написал программу, которая рисует сетку.

Вот код:

#include <graphics.h>
#include <conio.h>
#include <stdio.h>
int main(void) {
  int gdriver = DETECT, gmode, errorcode, j;
  char buf[80];
  initgraph(&gdriver, &gmode, "");
  errorcode = graphresult();
  if(errorcode != grOk) return -1;
  setcolor(WHITE);
  for(j=25; j<getmaxy() - 25; j+=27) {
    sprintf(buf, "%d", j);
    outtextxy(1, j - 5, buf);
    line(25, j, getmaxx()-25, j);
  }
  line(25, j - 3, getmaxx()-25, j - 3);
  for(j=25; j<getmaxx() - 25; j+=27) {
    sprintf(buf, "%d", j);
    outtextxy(j - 5, 5, buf);
    line(j, 25, j, getmaxy() - 25);
  }
  line(j - 4, 25, j - 4, getmaxy() - 25);
  getch();
  closegraph();
  return 0;
}


Вот результат:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#31 
uscheswoi_82 коренной житель19.06.24 22:46
uscheswoi_82
NEW 19.06.24 22:46 
в ответ uscheswoi_82 19.06.24 22:44

Посмеёмся хаха


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#32 
uscheswoi_82 коренной житель22.06.24 23:35
uscheswoi_82
NEW 22.06.24 23:35 
в ответ uscheswoi_82 19.06.24 22:46

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

#include <stdio.h>
char splits[10][250];  
int split_str(char *buf, char del, int idx);
int main(void) {
  int cnt;
  for(cnt=0; cnt < split_str("HELLO FROM uscheswoi_82", ' ', 3) + 1; cnt++)
    printf("\n%s", splits[cnt]);
  return 0;
}
int split_str(char *buf, char del, int idx) { 
  int j=0, i=0, k=-1; 
  for(j=0; j<idx; j++) splits[j][0] = '\0';
  for(j=0; j<strlen(buf); j++) {
    k++;
    splits[ i ][k] = buf[j];
    if(buf[j] == del) {
      splits[ i ][k] = '\0';
      i++;
      k=-1;
    }
 }
 splits[ i ][k+1] = '\0';
 return i; 
}


Результат работы программы:

HELLO
FROM
uscheswoi_82

Посмеёмся:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#33 
uscheswoi_82 коренной житель23.06.24 16:59
uscheswoi_82
NEW 23.06.24 16:59 
в ответ uscheswoi_82 22.06.24 23:35

Тут см. https://groups.germany.ru/12994140000001/f/41061285.html?C... воспоминания про Zortech C++/Symantec C++ который нам дали после Turbo C 2.0 или Borland C++ 3.0

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#34 
1 2 все