Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
2 / 2 / 0
Регистрация: 01.04.2013
Сообщений: 46

Оптимизация кода. Или, как сделать более легкую программу?

03.04.2013, 04:51. Показов 3038. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый товарищи. Имею программу, которая берет из файла текст, ищет в нем определенный кусок текста "g 9999999" и сравнивает его со вторым таким же куском, если нашлось совпадение, она сравнивает с 3 таким куском текста такого же типажа, и с 4-ым. Если находит нужное количество совпадений во всех 4-х, то сохраняет в массив для дальнейшего использования. Программа то работает, и очень облегчает мне труд, который я в принципе сделать не смогу, но при загрузке больших файлов, более 300 штук комбинаций, программа просто зависает и затрачивает времени для обработки довольна долго, для таких простейших операций. Если кому не сложно, гляньте код, возможно я наделал чего лишнего или что то можно написать по другому. Товарищей с критикой не имеющей хотя бы 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
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
108
109
procedure TForm1.Button1Click(Sender: TObject);
var
inp,out:textfile;
mA:array[1..2000] of string;
mB:array[1..2000] of string;
mC:array[1..2000] Of integer;
mM:array[1..2000] of string;
 
tA,z,tb,td,te,tc,tf,tg,th,tj,tk,tl,tq,l,s,tz,ty,tt,jet:integer;
p,o,m,n,b,t,y,u,i,x,c:string;
begin
Image5.Visible:=true;
Image3.visible:=false;
For tt:=1 to 2000 do
   Begin
   mA[tt]:='';
   mB[tt]:='';
   mM[tt]:='';
   mC[tt]:=0;
   end;
label6.Caption:=IntToStr(0);
p:='';o:='';m:='';n:='';b:='';t:='';y:='';u:='';i:='';x:='';c:='';
tA:=0;z:=0;tb:=0;td:=0;te:=0;tc:=0;tf:=0;tg:=0;th:=0;tj:=0;tk:=0;tl:=0;tq:=0;l:=0;s:=0;tz:=0;ty:=0;
Z:=StrToInt(edit1.Text);
AssignFile(inp,'inGos.txt');
Reset(inp);
while not eof(inp) do  {считываем в массив все строки из файла}
   Begin
   readln(inp,p);
   tA:=tA+1;
   mA[tA]:=P;
 
   end;
CloseFile(inp);
For tB:=1 to tA do  {Цикл поиска}
   begin
   o:=mA[tB];
   For tC:=1 to 20 do
      Begin
      If o[tC]='g' then
         Begin
         tD:=tC+1;
         tF:=tF+1;
         For tE:=1 to 7 do
            begin
            X:=mB[tF];
            c:=o[tD+tE];
            mB[tF]:=x+c;
            end;
         end;
      end;
   end;
      Edit2.Text:=IntToStr(tf);
For tG:=1 to tF-3 do   {Цикл поиска совпадений}
   Begin
   S:=0;
   For tH:=tG+1 to tF-2 do
      begin
      For tJ:=1 to 7 do
         begin
         m:=mB[tG];
         n:=mB[tH];
         if m[tJ]=n[tJ] then
            begin
            For tK:=tH+1 to tF-1 do
               begin
               b:=mB[tK];
               If m[tJ]=b[tJ] then
                  Begin
                  For tL:=tK+1 to tF do
                     Begin
                     tZ:=0;
                     For tQ:=1 to 7 do     {окончательное сравнивание}
                        begin
                        T:=mB[tG];
                        Y:=mB[tH];
                        U:=mB[tK];
                        I:=mB[tL];
                        If (t[tq])=(y[tq]) then begin
                           If (y[tq])=(i[tq]) then begin
                              if (i[tq])=(u[tq]) then begin
                              tZ:=tZ+1;
                        end;
                     end;
                  end;
               end;
               If tZ>=Z then      {условие, если найдено ,что все 4 совпали}
                  Begin
                  S:=1;
                  mM[1]:=t;
                  mM[2]:=y;
                  mM[3]:=u;
                  mM[4]:=i;
                  End;
               end;
            end;
         end;
      end;
   end;
end;
   If S=1 then   {Сохраняем в массив найденные}
      Begin
      tY:=tY+1;
      mE[tY]:='g '+mM[1]+'; g '+mM[2]+'; g '+mM[3]+'; g '+mM[4]+';';
      HR:=ty;
      End;
end;  {Конец цикла поиска совпадений}
 
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2013, 04:51
Ответы с готовыми решениями:

Оптимизация кода, структуры базы, или что еще можно сделать что бы быстрее работало!?
Всем привет! Господа, выручайте. Не пойму как еще оптимизировать... Есть куча связанных таблиц. Нужно выводить статистику используя...

Оптимизация кода запроса, или как обойтись без запроса?
Здравствуйте! Решаю задачу по автоматизации отгрузки товаров. Надо для проведенным заказам определенного клиента создать реализации...

Как можно сделать программу более компактнее
решил использовать новый способ в программе. так вот как можно этот код сделать болие компактнее: #include <iostream> #include...

35
2 / 2 / 0
Регистрация: 01.04.2013
Сообщений: 46
29.07.2013, 17:52  [ТС]
Студворк — интернет-сервис помощи студентам
Спасибо большое, подогнал, работает!
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
29.07.2013, 17:56
Я забыл добавить, что при желании можешь менять количество сравнений динамически. Например через значение, заданное в Edit. Вставляешь 2 значения в строку 126 моего последнего кода вместо 16-ок.
0
2 / 2 / 0
Регистрация: 01.04.2013
Сообщений: 46
29.07.2013, 21:02  [ТС]
проверил полностью.
Если ввожу что мне нужно, 3-ое совпадение в числах 123**** , то начинает искать бесконечное число комбинаций.
дошло уже до 300 000 комбинаций, а процесс бар всего в 5%.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
29.07.2013, 21:40
Ты сейчас говоришь о совпадении 3-х цифр в 16-ти комбинациях?
Выложи кусочек из результата. Несколько строк.

Добавлено через 18 минут
Кажется, догадываюсь.
Изменение процесс бара идёт по индексу просмотра первого уровня, а там ещё 15 уровней перебираются. Я обращал внимание, что если там подходящих комбинаций 1000, например, то будут выданы все варианты комбинаций по 16 из 1000.
Тебе, наверное, нужно как-то условие поиска изменить. Или объяснить конкретно, что ты хочешь делать. Я тогда переделаю.

Добавлено через 7 минут
У тебя там промелькнула фраза:
а на данном этапе мне нужно, чтобы удалялись те строки, которые мы уже запихнули в Outgos'число'
Если ты имел в виду, что найденные варианты изымаются из дальнейшего поиска, - напиши, переделаю.

Не по теме:

И, кажется, ты забыл, что нужно обновлять страницу.

0
2 / 2 / 0
Регистрация: 01.04.2013
Сообщений: 46
29.07.2013, 22:39  [ТС]
Насчет удаления строк, мы кажется уже решили этот вопрос.

Обьясню на пальцах:
нужно чтобы все работало как и раньше, но в замен 3 или 4 , которые ты помог мне уже сделать, мне теперь нужно чтобы он искал 16х комбинаций с одинаковыми цифрами. А количество цифр я хочу задавать сам.
В принципе программа ищет на 4-е совпадения в строках, но если поставить 3, то уходит , на мой взгляд, в бесконечный цикл. Потому что из 3-ех тысяч строк, она умудряется найти более 300 000 комбинаций, что в принципе невозможно. еще заметил, что при 16-ти одинаковых строках, она выдаст 16 комбинаций одинаковых.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
29.07.2013, 22:58
Всё равно мне не всё понятно. Например у тебя есть 18 комбиначий цифр у которых совпадают, например искомые 3. Если удалять из поиска те, которые уже найдены. Тогда будет найдена последовательность из 16-ти комбинаций, эти 16 комбинаций удаляются, а оставшиеся 2 - остаются не при делах. Так и должно быть?
А насчёт 300 000 комбинаций из 3000 строк. Так я объяснял, что программа фактически составляет сочетания из найденных по 16. Я из исходного файла удалял комбинации, которые уже выданы в OutGos. Но не удалял их из поиска. Именно по той причине, о которой написал выше. И из твоей фразы насчёт удаления строк, я понял, что они должны удаляться именно из исходного файла, а не из поиска.
4-х совпадений гораздо меньше, поэтому сочетаний меньше - выборка быстрее.
0
2 / 2 / 0
Регистрация: 01.04.2013
Сообщений: 46
30.07.2013, 01:09  [ТС]
я думаю, лучше будет как ты написал, чтобы 2 оставались ни при делах. а 16 удалялись из поиска.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
30.07.2013, 07:19
Я уже запутался со всеми разновидностями. В результате тебе нужны полные строки со всеми данными или только выбранные 16 комбинаций?
g 3547384; g 5648345; g 3045328; g 1641362; и т.д.
0
2 / 2 / 0
Регистрация: 01.04.2013
Сообщений: 46
30.07.2013, 13:37  [ТС]
полные

Добавлено через 19 минут
т.е. вывод мне нужен такой
g 3334567;123456-|-g 3335678;123456-|-g 3336789;123456-|- и так далее еще 13 раз..
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
30.07.2013, 15:17
Вы меня конечно великодушно прости те но на C# данная задача решается не в пример легче

C#
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
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
 
namespace Ingos
{
    public partial class Ingos : Form
    {
        public Ingos()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            PerformDataProcessing();
        }
 
        private void performdataprocessingToolStripMenuItem_Click(object sender, EventArgs e)
        {
            PerformDataProcessing();
        }
 
 
        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            (new AboutBox()).ShowDialog();
        }
 
        private void closeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }
 
        private void EnabledButton(string text)
        {
            button1.Enabled = !button1.Enabled;
            button1.Text = text;
        }
 
        private void PerformDataProcessing()
        {
            EnabledButton("Обработка данных, подождите...");
            openFileDialog.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
            saveFileDialog.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
            if (openFileDialog.ShowDialog() == DialogResult.OK)
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    string pattern = @"g \d{7}";
                    string data = File.ReadAllText(openFileDialog.FileName);
                    Dictionary<int, StringCollection> dictionary = new Dictionary<int, StringCollection>();
                    MatchCollection matchCollection = Regex.Matches(data, pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
                    foreach (Match match in matchCollection)
                    {
                        string stringKey = match.Value.Replace("g ", string.Empty).Substring(0, Convert.ToInt32(numericUpDown1.Value));
                        int key = Convert.ToInt32(stringKey);
                        if (!dictionary.ContainsKey(key))
                            dictionary[key] = new StringCollection();
                        dictionary[key].Add(match.Value);
                    }
                    StringBuilder result = new StringBuilder();
                    foreach (int key in dictionary.Keys)
                    {
                        foreach (string value in dictionary[key])
                            result.AppendFormat("{0}; ", value);
                        result.AppendLine();
                    }
                    File.WriteAllText(saveFileDialog.FileName, result.ToString());
                    MessageBox.Show("Обработка завершена!!!");
                }
            EnabledButton("Выполнить обработку данных");
        }
    }
}
Писалось на MS Visual Studio 2012 + .NET 3.0 для совместимости, скорость обработки вашего файла 1-2 секунды
Ниже прикрепляю проект и отдельно exe файл, если у вас Windows Vista/7 то он должен запуститься без проблем
если же не она то скорее всего вам придется поставить .Net Framework 3.0
Вложения
Тип файла: zip IngosSrc.zip (91.6 Кб, 0 просмотров)
Тип файла: zip Ingos.zip (85.1 Кб, 1 просмотров)
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
30.07.2013, 15:24
5 минут на правку истекли поэтому выкладываю отдельным сообщением результат работы программы, сравнение идет по первым 3 символам
Вложения
Тип файла: txt result.txt (9.0 Кб, 4 просмотров)
0
30.07.2013, 15:31

Не по теме:

агерон, а чегой-то вы в наш монастырь? кадилом давно не получали? :) холивары в другом разделе а тут человеку надо было оптимизировать код в среде делфи, а не переделать на си...

0
30.07.2013, 15:39

Не по теме:

Так- то оно так, и C# слабо относиться к Delphi :(, несмотря на то что C# разрабатывали знатоки Оберона, если не ошибаюсь :-D, просто человеку нужен был результат - быстрая обработка его файла, и кажется по срокам на "вчера" вот я и подсобил на C# :). На счет Delphi сильно не пинайте я последнею на нем программу писал под Delphi7 и это было давно и не правда :)
P. S. за чистоту кода не пинайте писал быстро и на коленке :-D

0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
30.07.2013, 19:48
агерон, Я в Си не понимаю - не могу оценить код и проверить алгоритм. Но по условию задачи нужно искать в этих числовых комбинациях совпадение (допустим 3-х) символов в соответствующих позициях. Не обязательно первых. И группировать допустим, тройками (на сегодня по 16).
Пример:
g 3547384; g 3187287; g 3567585;

Добавлено через 2 часа 9 минут
Вот:
Кликните здесь для просмотра всего текста
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
procedure TForm1.Button1Click(Sender: TObject);
Type
  TArrayOfInteger = Array Of Integer;
Var
  sl,sl1,sk1 : TStringList;
  i,j,n,z,tim,timee,timerr : Integer;
  Arr : Array[0..9999] Of LongWord;
  s : String;
  ArrIndex : TArrayOfInteger;
//-------------------------------------------------------------
//BegNesting - Количество вложений (нужное)
//CurNesting - Текущее вложение (при передаче уменьшается)
//Index - Индекс с которого начинать поиск
//ResComparison - результат сравнения на предыдущих уровнях
//AccumulStr - строка, накапливающая результат
//ArrIndex - Массив для передачи индексов выбранных элементов с уровня на уровень
Function FindHit(BegNesting,CurNesting:Byte;Index:Integer;
         ResComparison:LongWord;AccumulStr:String;Var ArrIndex:TArrayOfInteger):Boolean;
Var
  i,j,n,t,tZ : Integer;
  a,b : LongWord;
  s : String;
Begin
  Result:=False;
  SetLength(ArrIndex,Length(ArrIndex)+1);
  For i:=Index To sl.Count-CurNesting Do
  If Arr[i]<>$FFFFFFF Then
  Begin
    Result:=False;
    If CurNesting=BegNesting Then
    ProgressBar1.Position:=i;
 
    a:=ResComparison;
    If Index<>0 Then
    Begin
      a:=ResComparison Or (Arr[Index-1] Xor Arr[i]);
      tZ:=0;
      b:=$F;
      For t:=1 to 7 do     {окончательное сравнивание}
      Begin
        If (a And b)=0 Then tZ:=tZ+1;
        If tZ>=Z then Break;
        If (tZ+(7-t))<Z Then Break;
        b:=b Shl 4;
      End;
      if tZ<Z then Continue;
    End;
 
    ArrIndex[High(ArrIndex)]:=i;
 
    s:=sl[i];
    If AccumulStr<>'' Then s:='-|-'+s;
 
    If CurNesting=1 Then
    {условие, если найдено ,что совпали на всех уровнях}
    Begin
      sl1.Add(AccumulStr+s);
      Timee:=Timee+1;
      Edit3.Text:=IntToSTR(timee);
      For j:=0 To High(ArrIndex) Do
      Begin
        n:=sk1.IndexOf(sl[ArrIndex[j]]);
        If n>=0 Then sk1.Delete(n);
        Arr[ArrIndex[j]]:=$FFFFFFF;
      End;
      Result:=True;
      Break;
    End;
 
    Result:=FindHit(BegNesting,CurNesting-1,i+1,a,AccumulStr+s,ArrIndex);
 
    If Result And (CurNesting<>BegNesting) Then Break;
 
    Application.ProcessMessages; //Чтобы форма не зависала
    If EndProcess Then Break;
  End;
  SetLength(ArrIndex,Length(ArrIndex)-1);
End;
//-------------------------------------------------------------
begin
image3.Visible:=false;
Image5.Visible:=true;
  sl:=TStringList.Create;
  sl.LoadFromFile(
  ExtractFilePath(Application.ExeName)+'inGos.txt');
 
  ProgressBar1.Max:=sl.Count-16;
  ProgressBar1.Position:=0;
 
  z:=StrToIntDef(Edit1.Text,3); //Количество знаков совпадения
  If z>7 Then z:=7;
  If z=0 Then z:=1;
  Edit1.Text:=IntToStr(z);
  //Обработка...
 
  //Находим все обрабатываемые части текста
  i:=0;
  While i<sl.Count Do
  Begin
    j:=Pos('g ',sl[i]);
    If j=0 Then
    Begin
      sl.Delete(i);
      Continue;
    End;
    s:=Copy(sl[i],j+2,7); //Взяли только рабочую часть
    //Занесём данное в массив, преобразовав в число (двоично-десятичный формат)
    Arr[i]:=0;
    For n:=1 To 7 Do
    Begin
      Arr[i]:=Arr[i] Shl 4;
      Arr[i]:=Arr[i] Or (Ord(s[n])-Ord('0'));
    End;
 
    //Избавимся от лишних символов в строке
    s:='';
    For n:=1 To Length(sl[i]) Do
    If sl[i][n] In ['g','0'..'9',';',','] Then
    s:=s+sl[i][n];
    sl[i]:=s;
 
    Edit2.Text:=IntToStr(sl.count);
    Inc(i);
  End;
 
  sk1:=TStringList.Create;
  sk1.Assign(sl);
 
  sl1:=TStringList.Create;
 
  EndProcess:=False;
  SetLength(ArrIndex,0);
  FindHit(16,16,0,0,'',ArrIndex);
  Finalize(ArrIndex);
 
  sl1.SaveToFile(ExtractFilePath(Application.ExeName)+'OutGos'+IntToStr(z)+'.txt');
  sk1.SaveToFile(ExtractFilePath(Application.ExeName)+'Outgosfull.txt');
  Edit4.Text:=IntToStr(sl1.Count);
  sl1.Free;
  sl.Free;
  sk1.free;
end;
1
2 / 2 / 0
Регистрация: 01.04.2013
Сообщений: 46
30.07.2013, 22:13  [ТС]
работает! отлично!. спасибо большое.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
31.07.2013, 00:15
простите спал , но для твоей задачи отлично подойдет битовая маска + TDictionary<longint, TStringList>
если тебе еще нужно то я изменю свою программу под твои условия
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.07.2013, 00:15

Как сделать данную программу более эффективной?
public class NestedLoops { public static void main(String args) { for (int i = 2; i&lt;=20; i++){ ...

Оператор Goto или оптимизация кода
Доброго времени суток, уважаемые форумчане. Хотелось бы обратиться с вопросом по поводу оптимизации куска кода, очень уж это дело громоздко...

Как редактировать таблицу из кода или сделать привязку?
Доброго дня! Вопрос в следующем: Делаю приложение, которое готовит печатную форму. Где всё без изменений - проблем не вызывает. Но вот...

Как сделать так, что бы программа не работала когда вводишь одно или более двух слов на Java
Как делать так, что бы программа не работала когда вводишь одно или более двух слов на Java package com.company; import...

Разделение кода на две или более пользовательских функции
Нужно разбить код для подсчета уравнения, на две или более пользовательские функциии (например ввода и подсчета) используя public static ,...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru