Форум программистов, компьютерный форум, киберфорум
Наши страницы

Интересные моменты

Войти
Регистрация
Восстановить пароль
Оценить эту запись

Интересные моменты

Запись от Matan! размещена 06.10.2017 в 12:05
Обновил(-а) Matan! 20.12.2017 в 13:12

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

Я не прячу эту запись, чтобы она принесла пользу не только мне.

Задача: реализовать класс Rectangle, найти площадь.
Ответ (с)MrGluck:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
class Rectangle
{
public:
    constexpr Rectangle(const double a, const double b) : m_a(a), m_b(b) {}
    constexpr double Area() const { return m_a * m_b; }
 
protected:
    double m_a, m_b; // две стороны
};
 
int main()
{
    constexpr Rectangle REKT[] = { {3, 1}, {1.2, 2.5}, {1, 2.5} };
    for (const auto &r : REKT)
        std::cout << r.Area() << ' ';
}



Задача: сделать синтаксическую подсветку (html, c++,pascal, ...) в Memo или RichEdit
Ответ (с)HERETIC:
Кликните здесь для просмотра всего текста
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, ComCtrls;
 
type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    procedure RichEdit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure HighLight;
    function CheckList(InString: string): boolean;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function TForm1.CheckList(InString: string): boolean;
const TheList: array[1..13] of string = ('begin', 'or', 'end','end.',
'end;', 'then', 'var', 'for', 'do', 'if', 'to', 'string', 'while');
var X: integer;
begin
  Result := false;
  X := 1;
  InString := StringReplace(InString, ' ', '',[rfReplaceAll]);
  InString := StringReplace(InString, #$A, '',[rfReplaceAll]);
  InString := StringReplace(InString, #$D, '',[rfReplaceAll]);
  while X < High(TheList) + 1 do
  if TheList[X] = lowercase(InString) then
  begin
    Result := true;
    X := High(TheList) + 1;
  end
  else inc(X);
end;
 
procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var WEnd, WStart, BCount: integer;
  Mark: string;
begin
  if (ssCtrl in Shift) and (Key = ord('V')) then Button2Click(Self);
  if (Key = VK_Return) or (Key = VK_Back) or (Key = VK_Space) then
  begin
    if RichEdit1.SelStart > 1 then
    begin
      WStart := 0;
      WEnd := RichEdit1.SelStart;
      BCount := WEnd - 1;
      while BCount <> 0 do
      begin
        Mark := copy(RichEdit1.Text, BCount, 1);
        if (Mark = ' ') or (Mark = #$A) then
        begin
          WStart := BCount;
          BCount := 1;
        end;
        dec(BCount);
      end;
      RichEdit1.SelStart := WEnd - (WEnd - WStart);
      RichEdit1.SelLength := WEnd - WStart;
      if CheckList(RichEdit1.SelText) then
        RichEdit1.SelAttributes.Style := [fsBold]
      else RichEdit1.SelAttributes.Style := [];
      RichEdit1.SelStart := WEnd;
      RichEdit1.SelAttributes.Style := [];
    end;
  end;
end;
 
function SearchFor(WorkSpace, Search: string; Start: integer): integer;
var Temp: string;
begin
  Temp := copy(WorkSpace, Start, length(WorkSpace));
  Result := pos(Search, Temp);
end;
 
procedure TForm1.HighLight;
var WStart, WEnd, WEnd2: integer;
  WorkSpace, SWord: string;
begin
  WStart  :=  1;
  WEnd  :=  1;
  with  RichEdit1 do
  begin
    WorkSpace  :=  Text + ' ' + #$D#$A;
    while WEnd > 0 do
    begin
      WEnd := SearchFor(WorkSpace, ' ', WStart);
      WEnd2 := SearchFor(WorkSpace, #$A, WStart);
      if WEnd2 < WEnd then WEnd := WEnd2;
      SWord := copy(WorkSpace, WStart, WEnd - 1);
      if (SWord <> ' ') and (SWord <>'') then
        if CheckList(SWord) then
        begin
          SelStart  := WStart - 1;
          SelLength := length(SWord);
          SelAttributes.Style := [fsBOLD];
          SelStart := WStart + length(SWord) + 1;
          SelAttributes.Style := [];
        end;
      WStart := WStart + WEnd;
    end;
    SelStart := length(Text);
    SetFocus;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
    HighLight;
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  RichEdit1.PasteFromClipboard;
  HighLight;
end;
 
end.


Задача: Изменить цвет RichEdit и ToolBar
Ответ (с)droider:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
begin
if not ColorDialog1.Execute then Exit;//выбираем цвет через диалог (если не отменили выбор)
Richedit1.Color :=ColorDialog1.Color; //меняем цвет RichEdit-а на выбранный
  with ToolBar1 do
  begin
  DrawingStyle :=dsGradient; //задаем стиль градиентной прорисовки
  //меняем цвет ToolBar-a
 GradientStartColor :=ColorDialog1.Color; //цвет начала границы градиентной заливки
 GradientEndColor :=ColorDialog1.Color; //цвет конца границы
  end;
end;


Задача: Создать класс Point (точка). На его основе создать классы ColoredPoint и Line. На
основе класса Line создать класс ColoredLine и класс PolyLine (многоугольник). Все
классы должны иметь виртуальные методы установки и получения значений всех
координат, а также изменения цвета и получения текущего цвета.
Ответ (с)krapotkin:
Кликните здесь для просмотра всего текста
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
//  interface
TMyPoint=class
private
  FColor : TColor;
  FCrd:array of TPoint;
  function GetCoord(index:integer):TPoint; virtual;
  procedure SetCoord(index:integer; value:TPoint); virtual;
  function GetColor:TColor; virtual;
  procedure SetColor(Value:TColor); virtual;
public
  constructor Create; virtual;
  destructor Destroy; virtual;
  property Coord[index:integer] : TPoint read GetCoord write SetCoord;
  property Color:TColor read GetColor write SetColor;
end;
 
TMyLine=class(TMyPoint)
public
  constructor Create; override;
end;
 
// implementation
function TMyPoint.GetCoord(index:integer):TPoint; 
begin
  result := FCrd[index];
end;
 
procedure TMyPoint.SetCoord(index:integer; value:TPoint); 
begin
  FCrd[index] := value;
end;
 
function TMyPoint.GetColor:TColor;
begin
  result := FColor;
end;
 
procedure TMyPoint.SetColor(Value:TColor); 
begin
  FColor := value;
end;
 
constructor TMyPoint.Create;
begin
  inherited;
  SetLength(FCrd,1);
end;
 
destructor TMyPoint.Destroy;
begin
  SetLength(FCrd,0);
  inherited;
end;
 
constructor TMyLine.Create; 
begin
  inherited;
  SetLength(FCrd,2);
end;


Задача: Получить матрицу размера NxM, заполненную случайными действительными числами от 0 до 25. Указать элементы с наибольшим значением в столбцах. Результат (вид матрицы и наибольшие элементы и их значения);
Ответ (с)Puporev:
Кликните здесь для просмотра всего текста
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
procedure TForm1.Button1Click(Sender: TObject);
var a:array[1..20,1..20] of real;
    n,m,i,j:integer;
    mx:real;
begin
randomize;
n:=strtoint(Edit1.Text); //кол. строк от 1 до 20
m:=strtoint(Edit2.Text); //кол. столбцов от 1 до 20
with StringGrid1 do
 begin
  //оформляем таблицу
  rowcount:=n+2; //+ строка под номера столбцов + строка под максимальные
  colcount:=m+1; //+ столбец под номера строк
  for i:=1 to m do
  cells[i,0]:=inttostr(i);
  for i:=1 to n do
  cells[0,i]:=inttostr(i);
  cells[0,n+1]:='Максимум';
  //создаем матрицу и заносим в таблицу
  for i:=1 to n do
  for j:=1 to m do
   begin
    a[i,j]:=25*random;
    cells[j,i]:=formatfloat('0.00',a[i,j]);
   end;
 end;
//ищем максимумы в столбцах и пишем в последнюю строку таблицы
for j:=1 to m do
 begin
  mx:=a[1,j];
  for i:=2 to n do
  if a[i,j]>mx then mx:=a[i,j];
  StringGrid1.Cells[j,n+1]:=formatfloat('0.00',mx);
 end;
end;


Задача: Вычислить количество отрицательных элементов в каждой строке матрицы(С++)
Ответ (с)gru74ik:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <algorithm>
 
int main()
{
    const int n = 4;
    int arr[n][n] = {
                        { 1,  2, -3, 4 },
                        { 1, -2, -3, 4 },
                        {-1, -2, -3, 4 },
                        { 1, -2, -3, 4 }
                    };
 
    for( int i = 0; i < n; ++i )
        std::cout << std::count_if( arr[i], arr[i]+n, [](int val){return val < 0;} )
                  << std::endl;
 
    std::cin.ignore();
    return 0;
}


Задача: Задается файл сведений об учащихся по следующему формату:
фамилия, имя, отчество, номер группы
Переписать все эти сведения в новый файл, изменив формат следующим образом:
группа, фамилия, имя, отчество
Преобразованные сведения упорядочить по номерам групп. Вывести исходную и преобразованную последовательности вывести на экран.
Ответ (с)D1973:
Кликните здесь для просмотра всего текста

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
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  Windows,
  Classes;
 
procedure Output(L: TStringList);
var
 i: integer;
 s: String;
begin
 Writeln('');
 for i := 0 to L.Count - 1 do
  begin
   s := StringReplace(L.Strings[i], ',', ' ', [rfReplaceAll]);
   Writeln(s);
  end;
 Writeln('');
end;
 
var
 L1, L2, TMP: TStringList;
 i: integer;
 fn, fn_mix, s: String;
begin
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 fn := ExtractFilePath(ParamStr(0)) + 'file.dat';
 fn_mix := ExtractFilePath(ParamStr(0)) + 'file_mix.dat';
 if FileExists(fn) then
  begin
   L1 := TStringList.Create;
   L2 := TStringList.Create;
   TMP := TStringList.Create;
   L1.LoadFromFile(fn);
   L1.Text := Trim(L1.Text);
   for i := 0 to L1.Count - 1 do
    begin
     TMP.CommaText := L1.Strings[i];
     s := TMP.Strings[0];
     TMP.Exchange(0, 3);
     TMP.Delete(3);
     TMP.Insert(1, s);
     L2.Add(TMP.CommaText);
    end;
   TMP.Free;
   L2.Sort;
   L2.SaveToFile(fn_mix);
   Writeln('Старый файл:');
   Output(L1);
   Writeln('Новый файл:');
   Output(L2);
   L1.Free;
   L2.Free;
  end
 else Write('Не найден файл данных. Программа завершает свою работу');
 Readln;
end.


Задача: Проверить справедливость малой теоремы Ферма с использованием датчика случайных чисел.
Ответ (с)D1973:
Кликните здесь для просмотра всего текста

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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    ComboBox1: TComboBox;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
  private { Private declarations }
    p: integer;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function IsPrime(x: integer): boolean;
var i: integer;
begin
 result := false;
 if not Odd(x) and (x <> 2) then Exit;
 i := 3;
 while i <= Sqrt(x) do
  begin
   if x mod i = 0 then Exit;
   inc(i, 2);
  end;
 result := true;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
 Randomize;
 for i := 2 to 10 do
  if IsPrime(i) then ComboBox1.Items.Add(IntToStr(i));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var i, a: integer;
    x: Int64;
    s: String;
begin
 Memo1.Lines.Clear;
 i := 0;
 while i < 10 do
  begin
   a := RandomRange(10, 1000);
   if a mod p = 0 then Continue;
   inc(i);
   x := Trunc(Power(a, p - 1) - 1);
   if x mod p = 0 then s := 'выполняется' else s := 'не выполняется';
   Memo1.Lines.Add(Format('%d. Для А = %d условие теоремы %s', [i, a, s]));
  end;
end;
 
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
 p := StrToInt(ComboBox1.Text);
 Button1.Enabled := ComboBox1.ItemIndex <> -1;
end;
 
end.
Размещено в Без категории
Просмотров 475 Комментарии 0
Всего комментариев 0

Комментарии

 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru