Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/75: Рейтинг темы: голосов - 75, средняя оценка - 4.76
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174

Распаковщик псевдо архивов

27.05.2012, 22:26. Показов 15389. Ответов 148
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть такая
Нужно написать распаковщик псевдо архивов.

Выглядит примерно так. Форму создал прописал открытие файлов, вывод (хранения размер)
А дальше стопор.
Встали две основных проблеммы.
Суть проблем такая
1 В окне открываешь файл (любой)
2 В окне открываешь таблицу смещения вида
000016#000020#_file1
000020#000040#_file2
000040#000060#_file3
....
....
в третьем указываешь папку - куда все распаковать.
Жмешь на распаковать
И он разрезает файл согласно заданным смещениям. в файле*.tab
1 вопрос нужно ли добавлять второй диолого на файл с таблицей? Или достаточно 1 -го диалогового окна?
2 вопрос. Не где подобного не нашел. Не плохо бы какойто пример чтоб мне разобратся. А то я встал в тупик.
Примерно выходит так
1 читается первая строчка в *.tab
2 Ищется в файле архива
3 создается файл туда копируется содержимое
4 сохраняется.
Буду примного благодарен за помощь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2012, 22:26
Ответы с готовыми решениями:

хочу узнать вашу мнение о Упаковщик+распаковщик UPX
хочу узнать вашу мнение о Упаковщик+распаковщик UPX

Псевдо raytracing opengl
Существует ли какой-нибудь псевдо raytracing для opengl? (Ибо raytracing-a настоящего для opengl быть не может)

Построение псевдо-фазовой траектории
В универе задали расчетно-графическую работу: написать программу по теме "Построение псевдо-фазовой траектории"... Помогите пожалуста...

148
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
31.05.2012, 18:48  [ТС]
Студворк — интернет-сервис помощи студентам
Подправил самую первую вашу версию(пост #2). Теперь все работает
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DB, DBTables, ExtDlgs, ComCtrls, FileCtrl;
 
type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    ProgressBar1: TProgressBar;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Button4: TButton;
    OpenDialog1: TOpenDialog;
    OpenDialog2: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    Edit1.Text:=OpenDialog1.FileName;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
  begin
  if OpenDialog2.Execute then
    Edit2.Text:=OpenDialog2.FileName;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var
path_dir: string;
begin
if SelectDirectory('Ïóòü ê ïàïêå ','C:\', path_dir) then
Edit3.Text:= (path_dir);
end;
 
procedure TForm1.Button4Click(Sender: TObject);
Var
  f,OutF : File;          //Íåòèïèçèðîâàííûé ôàéë
  StrList : TStringList;  //
  i,IL,II : Integer;      //Ïåðåìåííûå ñìåùåíèÿ
   BegPos : Integer;      // Íà÷àëî ïîçèöèè
   EndPos : Integer;      // Êîíåö ïîçèöèè
        s : String;
  OutFile : String;
      Buf : Array[0..65535] Of Byte;
begin 
  //×èòàåì òàáëèöó...
  StrList:= TStringList.Create;
  StrList.LoadFromFile(OpenDialog2.FileName);
 
  //Ñàìî ðàçðåçàíèå...
  AssignFile(f,OpenDialog1.FileName);
  Reset(f,1);
  For i:=0 To StrList.Count-1 Do
  Begin
    s:=StrList.Strings[i];
    BegPos:=StrToInt('$'+Copy(s,1,Pos('#',s)-1)); //Íà÷àëüíàÿ ïîçèöèÿ â èñõîäíîì ôàéëå
    Delete(s,1,Pos('#',s));
    EndPos:=StrToInt('$'+Copy(s,1,Pos('#',s)-1)); //Êîíå÷íàÿ ïîçèöèÿ â èñõîäíîì ôàéëå
    OutFile:=Copy(s,Pos('#',s)+1,Length(s)-Pos('#',s)); //Èìÿ âûõîäíîãî ôàéëà
 
    AssignFile(OutF,Edit3.Text+'\'+OutFile);
    Rewrite(OutF,1); //Ñîçäà¸ì ðåçóëüòèðóþùèé ôàéë â óêàçàííîé äèðåêòîðèè
 
    Seek(f,BegPos); //Óêàçàòåëü íà íà÷àëüíóþ ïîçèöèþ
    While BegPos<=EndPos Do
    Begin
      If (EndPos-BegPos)>65535 Then IL:=65536 Else IL:=EndPos-BegPos+1;
      BlockRead(f,Buf,IL,II);     //×èòàåì áëîê èç èñõîäíîãî ôàéëà
      BlockWrite(OutF,Buf,II);  //Ïèøåì áëîê â íîâûé ôàéë
      BegPos:=BegPos+II;
    End;
    CloseFile(OutF); //Çàêðûâàåì âûõîäíîé ôàéë
  End;
  CloseFile(f); //Çàêðûâàåì âõîäíîé ôàéë
StrList.Free 
end;
 
end.
Добавлено через 6 минут
Таблица в кодировке ANSI
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
31.05.2012, 21:27
А зачем? У тебя же уже работает прямо с двоичной таблицей.
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
31.05.2012, 21:32  [ТС]
Одиночка,
Для повышения самообразования.

Добавлено через 2 минуты
Delphi
1
2
3
4
5
6
Type
  Zap = Record
             NameF : Array[0..11] Of Byte;
             LengFile : Integer;
             BegPos : Integer;
           End;
Не понятен этот момент. Ведь это обычные переменные, их же можно в var прописать?
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
31.05.2012, 22:08
Это я описываю как выглядит наши данные в буфере. А потом как-бы накладываю эту запись на буфер и вычираю нужные данные в нужном виде. Это не переменная а структурированный тип данных. Если бы в таблице (двоичной) все записи были одинаковые. Тогда можно было описать файл:
Delphi
1
2
3
fTable : File Of Zap;
 
Buf : Array[0..65535] Of Zap;
И спокойно работать с буфером по индексу, например:
Delphi
1
L:=Buf[10].LengFile;
Но поскольку там первая запись - количество файлов, поэтому файл пришлось объявить просто как массив байт. Поэтому я буфер объявил как просто массив неопределённого типа. А потом читаю из файла просто массив байт, а обращаюсь, накладывая свой тип данных и беру через неё нужное данное.
Если бы небыло первых 4 бай - всё было бы немного проще.
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
31.05.2012, 23:34  [ТС]
Так есть же seek - Насколько я помню им можно установить откуда читать. Например ставишь seek(4,параметр). Я как раз про него читаю. Ведь по идее можно создать промежуточные данные. Считать первые 2 байта (количество файлов). А потом при помощи seek перепрыгнуть(пропустить 2 мусорных байта) куда надо. Или я не так понимаю?

Добавлено через 14 минут
Еще не понятно почему буфер 12 байт. Это влазиет только название файла.
NameF : Array[0..11] Of Byte;
А если буфер сделать 20 байт так не проще будет? Так сказать загнать всю строку.
Тут я что то немного не понял?
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
31.05.2012, 23:37
Я тебе говорил о том, как описывать файл, и как потом с ним работать. Там нет необходимости использовать Seek. Первые 4 байта (не 2) - это количество файлов. Мы их просто читаем как переменную Integer.
Но если бы описали файл как файл записей Zap - мы могли бы и обращаться к нему соответственно:
Delphi
1
Read(fTable,VarZap);
Т.е. в переменную VarZap читали бы сразу запись. Или в буфер, как я уже писал. Было бы более изящно. Может более понятно. Хотя можно было эту переменную и так создать, только читать в неё с помощью BlockRead. Да:
Delphi
1
2
3
4
5
6
7
Var
  VarZap : Zap;
 
 
  BlockRead(fTable,VarZap,20,ii);
 
  L:=VarZap.LengFile;
Ну не сообразил сразу.
А Zap - это просто структурированный тип данных. Почитай за них. Согласно структуре нашей записи в файле.
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
03.06.2012, 13:33  [ТС]
А Zap. Я бы поподробней поговорил(про константы и массивы читал, а вот про структурированный тип данных нет.).
Появилось пару вопросов по ходу изучения.
1 тут решил простенько поработать с буфером чтоб набраться опыта.
Простенькая программа
Скриншот.

Тестировал на фале смещений от potera. Через диалоговое окно подключил файл и начал эксперименты. На первом повороте 'покинул трассу'.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Button2Click(Sender: TObject);
var
         f : file; //Нетипизированный файл
       Buf : Array[0..11] Of byte; //Выделяем буфер 12 байт.
         s : integer; //s Целое число
begin
  //Читаем файл...
  AssignFile(f,OpenDialog1.FileName);  //Открываем файл.
  Reset(f,1); // Устанавливаем размер блока (1 байт)
 
  Seek(f,4);           // Перепрыгиваем на 4 байта вперед.
  BlockRead(f,Buf,12); //Читаем следующих 12 байт из файла и записываем в буфер(buf).
  s:=IntToHex(Buf);    // Преобразовываем данные буфера в текст.
  Memo1.Lines.Add(s);  //Добавим преобразованный текст в Memo...
     end;
  CloseFile(f);        //Закрываем входной файл
end.
Ошибку бьет здесь.
Вроде все правильно.
s:=IntToHex(Buf); // Преобразовываем данные буфера в текст.
И пару вопросов:
Buf : Array[0..11] Of byte; //Выделяем буфер 12 байт.
Буфер(Buf)Можно задать любыми переменными(A, B, C)
Пример:
A : Array[0..11] Of byte; //Выделяем буфер 12 байт.
C : Array[0..11] Of byte; //Выделяем буфер 12 байт.
Или там определенные переменные?
Сколько можно задать Буферов(Buf) в одной программе?
Buf : Array[0..11] Of byte; //Выделяем буфер 12 байт.
Можно ли в буфере сделать подчеркнутую цифру - переменной? Например, чтоб изменять ее можно было бы через окно Edit?
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.06.2012, 13:54
Во-первых по ошибке:
Функция IntToHex(Value:Integer; Digits:Integer); преобразует целое число в строковое выражение 16-ричного представления числа. Digits - задаёт количество знаков выходного числа - для байта 2 - 16-ричных цифры, для других типов в зависимости от размера. А ты в обращении к функции задаёшь массив параметром. Для преобразования массива - делай в цикле - перебирай по очереди.
Дальше. Buf - это обыкновенный массив. И естественно идентификатор может быть любым, допустимым идентификатором. Я его назвал буфером - так как в нашем случае он служит промежуточным буфером для чтения данных из одного файла и запись в другой.
Указать другую размерность массива во время выполнения программы можно. Но для этого массив нужно описывать как динамический. Но тут рассказывать долго, поэтому почитай сам на форуме. Есть отличное описание работы с динамическими массивами.
В одной программе массиво можно описывать сколько угодно. Наверное есть ограничения, но для нас это можно считать бесконечностью. Размерность массива имеет ограничения, но там порядка до 2 Гб может быть ёмкость. Точнее не скажу.
1
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
03.06.2012, 14:34  [ТС]
Тупанул не то написал
s:=IntToHex(Buf); // Преобразовываем данные буфера в текст.
В текст надо преобразовать
Я писал так
s:=IntToStr(Buf,12); //Преобразовываем данные буфера в текст.
Про массив и цикл понятно. Но сейчас мне нужно вывести только одно слово.(12 байт)
Ошибка
[Warning] Unit1.pas(7): Unit 'FileCtrl' is specific to a platform
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.06.2012, 14:48
Почитай ещё раз внимательно за IntToHex.
Нужно писать так:
Delphi
1
2
s:='';
For i:=Low(Buf) To High(Buf) Do s:=s+' '+IntToHex(Buf[i]);
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
03.06.2012, 15:22  [ТС]
Все вроде теперь встало на свои места. Я его сделал(Массив) но не объявил.
С массивами еще надо поупражняться.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.06.2012, 15:31
Кстати, сразу не обратил внимания. Мне тоже иногда выдаёт:
Code
1
[Warning] Unit1.pas(7): Unit 'FileCtrl' is specific to a platform
Я не знаю причины, но оно не влияет на работу. Не обращай внимания.
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
03.06.2012, 17:24  [ТС]
Дело в том что у меня на ней останавливается при запуске и программа дальше не идет.(не запускается не компилируется.)
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.06.2012, 17:27
У меня нормально происходит компиляция и запуск. Там же нет сообщения ?:
Code
1
Cold not compile ...
или есть? Может есть другие ошибки?
Вот советуют вставить:
Delphi
1
{$WARN UNIT_PLATFORM OFF}
Наверное перед Uses.
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
03.06.2012, 18:09  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
У меня нормально происходит компиляция и запуск. Там же нет сообщения ?:
Code
1
Cold not compile ...
или есть? Может есть другие ошибки?
Вот советуют вставить:
Delphi
1
{$WARN UNIT_PLATFORM OFF}
Наверное перед Uses.
Нет все нормально. Просто не туда глянул как и у тебя проскакивает.

Добавлено через 28 минут
Займемся склеиванием
А со склеиванием вообще не понятки. Алгоритм ясен. А код нет.
Читаем из таблицы 1 строчку. Ищем, записываем в файл. (склеивание должно быть строго по таблице). Ищем в таблице второй файл читаем. Создаем и объядиняем с предыдущем и т.д. Если такой алгаритм будет то мы можем изменять размеры файлов.

Перерыл много сайтов. Нашел только подобное этому.
Сортировка
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var
  Form1: TForm1;
  tmp: array of string;
 
 ...
 
(* Открываем файлы, которые нужно склеить *)
procedure TForm1.SelectStickFileClick(Sender: TObject);
var
  i: integer;
begin
   OpenDialog.Options := OpenDialog.Options + [ofAllowMultiSelect];
   if OpenDialog.Execute then
   begin
      // Устанавливаем длинну массива
      SetLength( tmp, OpenDialog.Files.Count );
      // Заполняем массив
      for i := Low( tmp ) to High( tmp ) do
         tmp[i] := OpenDialog.Files.Strings[i];
      // Обязательно сортируем
      Sort( tmp );
      // Выводим результат
      for i := Low( tmp ) to High( tmp ) do
         ListBoxForStick.Items.Add( tmp[i] );
      EditStickDir.Text := ExtractFilePath( OpenDialog.FileName );
   end;
end;
Склейка.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
(* Функция для склейки файла *)
function StickFileStream( inFiles: array of string; outDir: string;
                          PB: TProgressBar = nil ): boolean;
var
  inStream: TFileStream;  // Входной файловый поток
  outStream: TFileStream; // Выходной файловый поток
  outFileName: string;    // Шаблон выходного имени файла
  recFirstFile: boolean;  // Признак записи первого файла
  i: integer;             // Цикловая переменная
begin
   // Инициализируем переменные
   if PB <> nil then
   begin
      PB.Position := 0;
      PB.Max := GetSizeAllFiles( inFiles );
   end;
   recFirstFile := false;
   outFileName := outDir + ExtractFileNameEx( inFiles[0] );
 
   // Здесь происходит склейка файлов
   for i := Low( inFiles ) to High( inFiles ) do
   begin
      inStream := TFileStream.Create( inFiles[i], fmOpenRead );
 
      // При записи первой части файла выходной файл создается,
      // при записи всех последующих выходной файл открывается на запись
      if recFirstFile then
         outStream := TFileStream.Create( outFileName, fmOpenWrite )
      else
      begin
         outStream := TFileStream.Create( outFileName, fmCreate );
         recFirstFile := true;
      end;
 
      outStream.Position := outStream.Size;
      outStream.CopyFrom( inStream, inStream.Size );
 
      if PB <> nil then
         PB.Position := outStream.Size + inStream.Size;
 
      outStream.Free;
      inStream.Free;
      Application.ProcessMessages;
   end;
 
   if PB <> nil then PB.Position := 0;
   Result := true;
end;
Но это не подходит. Так как там файлы одного размера и выставлены по именам.
fale001
fale002
fale003
У нас для проверки будет такая таблица
000000#03b3ff#file1.dat
03b400#0a42ef#file4.dat
0a42f0#0efb6f#file3.dat
0efb70#1142e9#file2.dat
Кодировка таблицы ansi.tbl
Я все с юникода перенес на анси вариант (самый ваш первый.) Но юникодовскую тоже оставил на всякий случай.
0
03.06.2012, 18:11

Не по теме:

Извини. Можно позавтракаю? Потом продолжим.

1
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
03.06.2012, 18:14  [ТС]
Как удобней будет. А я пойду поужинаю.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.06.2012, 19:37
Давай начнём с начала. Постановка задачи:
1. У нас есть множество файлов разного размера.
2. Эти файлы нужно объединить в один.
3. Все эти файлы находятся в одной директории, которую мы будем указывать.
4. Либо в этой директории нет других файлов, либо есть какой-то признак, по которому нам можно отличить файл для склеивания, от какого-то левого файла, случайно попавшего в эту директорию.
3. Имея только эти данные можно поступить следующим образом:
3.1 Объединяем файлы в том порядке, в котором они попадаются в указанной директории.
3.2 Объединяем без добавления пустого места между ними.
3.3 Формируем таблицу распаковки, согласно структуре, которая была дана для распаковки.
3.4 Всё
4. Имеется таблица склейки.
4.1 Согласно этой таблице выбираем файлы и склеиваем их. Сортировка не обязательна.
4.2 Откуда берётся эта таблица?
0
4 / 4 / 0
Регистрация: 27.05.2012
Сообщений: 174
03.06.2012, 19:52  [ТС]
Они должны склеиваться строго по таблице в том порядке в котором разобрали.()
Размер разный. и имена не по парядку
000000#03b3ff#file1.dat
03b400#0a42ef#file4.dat
0a42f0#0efb6f#file3.dat
0efb70#1142e9#file2.dat
Вот пример архива и таблицы
1. У нас есть множество файлов разного размера.
2. Эти файлы нужно объединить в один.
3. Все эти файлы находятся в одной директории, которую мы будем указывать.
4. Либо в этой директории нет других файлов, либо есть какой-то признак, по которому нам можно отличить файл для склеивания, от какого-то левого файла, случайно попавшего в эту директорию.
Да
3.1 Объединяем файлы в том порядке, в котором они попадаются в указанной директории.
Нет - только строго таблице которую использовали при распаковке.
1 распаковываем архив согласно распаковщику который написан ранее.
2 собираем его обратно (согласно таблице которую написали для распаковке.)
Для примера таблицу и файл прикрепляю
DeArxiver.7z
3.2 Объединяем без добавления пустого места между ними.
Да. Место пустое не нужно(согласно таблице написанной для распаковки.)
4.2 Откуда берётся эта таблица?
Таблица пишется для распаковки (название таблицы.tab)
По ней распаковываем, по ней и собираем.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.06.2012, 20:00
Так мы можем взять ту же таблицу, немного подправим алгоритм и получим склеенный файл. Так? Я имю в виду, наш алгоритм для распаковки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.06.2012, 20:00

Псевдо-вирус (Delphi глазами хакера )
Кому будет интересно &quot;поприкалываться&quot; или посмотреть как сделана подобная штука. Итак, при запуске файла появляется некоторое (конечное)...

Можно ли загружать файлы из архивов?
Вот возникло у меня несколько вопросов: 1) Можно ли загружать файлы из архивов??? Чтобы картинки проги хранить не в папке, а в архиве...

Нужен компонент для создания архивов
Привет всем! В общем цель задачи такова: необходимо написать прогу, которая будет по расписанию архивировать выбранную папку (именно...

Помогите понять формат игровых архивов и карт
Здравствуйте! Я занимаюсь написанием конвертера карт из формата игры Doom 2D Forever в формат карт Doom 2D Multiplayer. Проблема вот в...

Bash-распаковщик архивов
Доброго времени суток! Есть такое задание: 1) Поднять ftp. 2) Распаковать все архивы форматов *.zip, *.rar в папках и подпапках, затем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru