Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как написать код программы, подбирающей магический квадрат 5х5 перебором?

Здравствуйте!
Прошу помощи. Не знаю, как написать код программы, подбирающей магический квадрат 5х5 перебором для VBA. Помогите, пожалуйста.
Есть наработки ниже
ПРОГРАММА ПОСТРОЕНИЯ МАГИЧЕСКИХ КВАДРАТОВ
Разработанная программа на языке Turbo Pascal позволяет строить магические квадраты любой четности при n≤19. Можно брать и большие значения n, но при n>19 квадрат не помещается на экране монитора).
Pascal
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
Program MagicSquares; 
 
{Построение магических квадратов} 
 
Uses CRT; 
Type a_type=array[1..50,1..50] of integer; 
Var i,j,n:integer; 
a:a_type; 
t:boolean; 
{логическая переменная true (правда) или false (ложь)} 
x,y:integer; 
Label 1; 
{метка} 
Procedure Print(n:integer; a:a_type); 
{процедура вывода} 
Var i,j:integer; 
Begin 
for i:=1 to n do begin 
for j:=1 to n do write(a[i,j]:4); 
writeln(''); 
end; 
end; 
Procedure WinSh(x1,y1,x2,y2,col1,col2:word); 
{процедура вывода окна} 
Begin 
TextBackGround(black); 
Window (x1+1,y1+1,x2+1,y2+1); 
{тень - черный прямоугольник} 
ClrScr; 
TextBackGround(col1); 
Window(x1,y1,x2,y2); 
ClrScr; 
TextColor(col2); 
{рисование рамки} 
GotoXY(2, 1); write('г'); 
for i:=1 to x2-x1-2 do write('='); 
GotoXY(x2-x1,1); write('='); 
GotoXY(2,y2-y1+1); 
write('L'); for i:=1 to x2-x1-2 do write('='); 
GotoXY(x2-x1,y2-y1+1); write('-'); 
for j:=2 to y2-y1 do begin 
 GotoXY(2,j); write('¦'); 
 GotoXY(x2-x1,j); write('¦'); 
 end; 
End; 
Procedure OddMagic(n:integer; var a:a_type); 
{Процедура формирования магического квадрата при нечетном n. Описание алгоритма в сопроводительной записке } 
Var 
i,j,k:integer; 
p,l:integer; 
Begin 
for i:=1 to n do 
for j:=1 to n do a[i,j]:=0; 
j:=n div 2 +1; p:=sqr(n); i:=1; a[i,j]:=1; 
for l:=2 to p do begin 
i:=i-1; 
j:=j+1; 
if (i=0) and (j<>n+1) then i:=n; 
if (j=n+1) and (i<>0) then j:=1; 
if ((i=0) and (j=n+1)) or (a[i,j]<>0) then 
{важен порядок условий!} 
begin 
 i:=i+2; 
 j:=j-1; 
 end; 
a[i,j]:=l; 
end; 
end; 
Procedure Two (n:integer; var a:a_type); 
{Процедура построения квадрата при n обычной четности: n=6,10,14,18...} 
Var 
u,i,j,k,m,z:integer; 
b:a_type; 
Begin 
u:= n div 2; 
m:=(u-1) div 2; 
OddMagic(u,b); 
{вызов процедуры построения квадрата при нечет-ном u} 
k:=u*u; 
for i:=1 to n do 
for j:=1 to n do begin 
if (i>=1) and (i<=u) and (j>=1) and (j<=u) then a[i,j]:=b[i,j]; 
if (i>=u+1) and (i<=n) and (j>=u+1) and (j<=n) then a[i,j]:=b[i-u,j-u]+k; 
if (i>=1) and (i<=u) and (j>=u+1) and (j<=n) then a[i,j]:=b[i,j-u]+2*k; 
if (i>=u+1) and (i<=n) and (j>=1) and (j<=u) then a[i,j]:=b[i-u,j]+3*k; 
end; 
for i:=1 to u do 
if i=u div 2+1 then begin 
j:= u div 2+1; 
for k:=1 to m do begin 
z:=a[i,j]; 
{обмен данными} 
a[i,j]:=a[i+u,j]; 
a[i+u,j]:=z; 
j:=j-1 
end; 
end 
else begin 
j:=1; 
for k:=1 to m do begin 
z:=a[i,j]; 
{обмен данными} 
a[i,j]:=a[i+u,j]; 
a[i+u,j]:=z; 
j:=j+1 
end; 
end; 
j:=n; 
for k:=1 to m-1 do begin 
for i:=1 to u do begin 
z:=a[i,j]; a[i,j]:=a[i+u,j]; a[i+u,j]:=z; 
{обмен данными} 
end; 
j:=j-1 
end; 
end; 
Procedure Four(n:integer; var a:a_type); 
{Процедура построения квадрата при n двойной четности: n=4,8,12,16...} 
Var i,j,k:integer; 
p,l:integer; 
i1,j1,x,y:integer; 
Begin 
l:=1; p:=n*n; 
for i:=1 to n do 
for j:=1 to n do begin 
a[i,j]:=l; 
inc(l) 
{l:=l+1} 
end; 
i:=2; 
while i<=n-2 do begin 
if i mod 4=0 then j:=4 
else j:=2; 
while j<=n-2 do begin 
for i1:=0 to 1 do 
for j1:=0 to 1 do begin 
y:=i+i1; x:=j+j1; 
a[y,x]:=p-a[y,x]+1; 
end; 
j:=j+4; 
end; 
i:=i+2 
end; 
k:=4; 
while k<=n-4 do begin 
a[1,k]:=p-a[1,k]+1; a[1,k+1]:=p-a[1,k+1]+1; 
a[n,k]:=p-a[n,k]+1; a[n,k+1]:=p-a[n,k+1]+1; 
a[k,1]:=p-a[k,1]+1; a[k+1,1]:=p-a[k+1,1]+1; 
a[k,n]:=p-a[k,n]+1; a[k+1,n]:=p-a[k+1,n]+1; 
k:=k+4 
end; 
a[1,1]:=p-a[1,1]+1; 
a[n,n]:=p-a[n,n]+1; 
a[1,n]:=p-a[1,n]+1; 
a[n,1]:=p-a[n,1]+1; 
end; 
Procedure Test(n:integer; a:a_type; var t:boolean; var x,y:integer); 
{Процедура проверки сумм по строкам, столбцам и диагоналям квад-рата} 
Var s,z:array [1..50] of integer; 
{массивы для записи сумм по строкам и столбцам} 
sd,zd:integer; 
i,j,k:integer; 
sum:integer; 
Begin 
sum:=n*(n*n+1) div 2; 
for k:=1 to n do begin 
s[k]:=0; 
z[k]:=0 
end; 
sd:=0; zd:=0; 
for i:=1 to n do 
for j:=1 to n do begin 
s[i]:=s[i]+a[i,j]; 
z[j]:=z[j]+a[i,j] 
end; 
for k:=1 to n do begin 
sd:=sd+a[k,k]; 
zd:=zd+a[k,n-k+1]; 
end; 
k:=1; t:=true; 
while (k<=n) and (t) do begin 
if s[k]<>sum then begin 
t:=false; 
{ошибка по строкам} 
y:=1; 
x:=k 
{номер строки} 
end; 
k:=k+1 
end; 
if (t) then begin 
k:=1; 
while (k<=n) and (t) do begin 
if z[k]<>sum then begin 
t:=false; 
{ошибка по столбцам} 
y:=2; 
x:=k 
{номер столбца} 
end; 
k:=k+1 
end; 
end; 
if (t) then if sd<>sum then begin 
t:=false; 
{ошибка по главной диагонали} 
y:=3; 
x:=0; 
end; 
if (t) then if zd<>sum then begin 
t:=false; 
{ошибка по побочной диагонали} 
y:=4; 
x:=0; 
end; 
if t then writeln('Тест прошел успешно'); 
End; 
 
Begin 
{Основная программа} 
1: 
TextBackGround(blue); 
ClrScr; 
WinSh(20,3,60,6,blue,white); 
GotoXY(9,2); write('Магический квадрат'); 
GotoXY(10,3); write('(c) 2006 г.'); 
Window(1,1,80,25); TextColor(yellow); TextBackGround(blue); 
GotoXY(60,18); write(' 8 ¦ 1 ¦ 6'); 
GotoXY(60,19); write('===+===+==='); 
GotoXY(60,20); write(' 3 ¦ 5 ¦ 7'); 
GotoXY(60,21); write('===+===+==='); 
GotoXY(60,22); write(' 4 ¦ 9 ¦ 2'); 
TextColor(white); TextBackGround(white); 
for x:=2 to 79 do begin 
GotoXY(x,25); 
write(' '); 
end; 
GotoXY(5,25); 
write('Размерность =0 - конец работы программы. Рекомендуем размерность от 3 до 19'); 
Winsh(30,10,50,12,cyan,white); 
repeat 
TextColor(white); 
GotoXY(4,2); write('Размерность=');readln(n); 
until (n<>1) and (n<>2); 
{квадрат для n=1 и для n=2 строить нельзя} 
if n=0 then halt; 
{выход из программы} 
{Если n-нечетно, то OddMag, иначе ...} 
if odd(n) then OddMagic(n,a) 
else if n mod 4=0 then Four(n,a) 
else Two(n,a); 
TextBackGround(blue); 
Window(1,1,80,25); 
ClrScr; 
TextColor(yellow); 
ClrScr; 
{вывод} 
Writeln('Магический квадрат ',n,'x',n); 
Print(n,a); 
writeln(''); 
Test(n,a,t,x,y); 
{Процедура тестирования квадрата} 
if (t) then 
writeln('Суммы по столбцам, строкам и диагоналям =',n*(n*n+1) div 2) 
else begin 
writeln('Ошибка'); 
case y of 
1: writeln('Ошибка в строке ',x); 
2: writeln('Ошибка в столбце ',x); 
3: writeln('Ошибка по главной диагонали'); 
4: writeln('Ошибка по побочной диагонали') 
end; 
end; 
readln; 
goto 1; 
End.
Добавлено через 6 часов 26 минут
Сообщение от Alex77755
Это противоречит главному принципу магического квадрата!
Alex77755, покажите нам новичкам, пожалуйста, как задать кодом построение магического квадрата для VBA. Блесните познаниями, если они есть.
Достаточно схемы для матрицы 3х3. Остальное будет по аналогии.

Согласно сумме арифметической прогрессии, определяем сумму ряда (столбца, строки и диагонали) для каждой размерности:
• Матрица 2х2: ((1 + 4) * 4/2)/2 = 2,5 (не целое) — построить магический квадрат нельзя!
• Матрица 3х3: ((1 + 9) * 9/2)/3 = 15 — построить магический квадрат можно!
• Матрица 4х4: ((1 + 16) * 16/2)/4 = 34 — построить магический квадрат можно!
• Матрица 5х5: ((1 + 25) * 25/2)/5 = 65 — построить магический квадрат можно!
• Матрица 6х6: ((1 + 36) * 36/2)/6 = 111— построить магический квадрат можно!
• И т. п. и т. д.
Ответ:
Сообщение от Alex77755
вот примерно составление квадратов 3х3
Alex77755, спасибо. А как Вы так делаете?
Напишите, пожалуйста, код или сделайте вложение.
Очень любопытно.

Добавлено через 8 минут
Сообщение от Catstail
MyExcel_17, помилуйте... Это - не мой код
Catstail, понятно, Вы скромничаете. Столько языков программирования знаете.
Моя мысль равнодушно прошлась по Вашей ссылке. Не за что зацепиться.

Напротив подумал: куда "старому Visual Basic" угнаться "за молодёжью: Python and PHP"?!
Вопрос: Исправление кодировки русских букв в коде программ, выложенных на Cyberforum

Здравствуйте,
В последнее время участились случаи, когда русские буквы в коде программ, в частности в комментариях, превращаются в нечитаемые иероглифы.

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

Но поскольку данная функция может оказаться полезной не только мне, выкладываю ее на форум.

Функция для исправления кодировки русских букв в листингах
Код Visual Basic
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
'Функция декодирует DOS-овскую букву, представленную в кодировке
'Unicode и зашифрованную кодировкой UTF-8. Результатом работы
'функции является Unicode-код декодированной буквы, либо
'отрицательное значение, если точное декодирование невозможно.
'Значение -1 означает "а либо н", а значение -2 означает "Ё либо ё".
Function LetterDecode(ByVal k As Long, ByRef A As Variant, ByRef B As Variant, _
ByRef C As Variant, ByRef D As Variant) As Long
    Select Case k
        Case 42
            LetterDecode = -1
        Case 152
            LetterDecode = 1064
        Case Is < 188
            k = k - 163
            k = 1 + k \ 2 + k \ 9 - 2 * (k \ 18) - Sgn(Abs(k - 20) \ 2)
            If k >= 0 And k < 13 Then LetterDecode = A(k) Else LetterDecode = -3
        Case Is < 1042
            k = k - 1025
            k = k - k \ 13
            If k >= 0 And k < 14 Then LetterDecode = B(k) Else LetterDecode = -3
        Case 1042
            LetterDecode = -2
        Case Is < 1120
            k = k - 1105
            k = k - k \ 13
            If k >= 0 And k < 14 Then LetterDecode = C(k) Else LetterDecode = -3
        Case 1168
            LetterDecode = 1077
        Case 1169
            LetterDecode = 1092
        Case Is < 8251
            k = k - 8211
            Select Case k
                Case Is < 5
                Case Is < 9
                    k = k - 3
                Case Is < 13
                    k = k - 4
                Case Is < 19
                    k = k - 5
                Case Is < 29
                    k = k - 8
                Case Is < 38
                    k = k - 17
                Case Else
                    k = k - 25
            End Select
            If k >= 0 And k < 15 Then LetterDecode = D(k) Else LetterDecode = -3
        Case 8364
            LetterDecode = 1048
        Case 8470
            LetterDecode = 1097
        Case 8482
            LetterDecode = 1065
        Case Else
            LetterDecode = -3
    End Select
End Function
'Функция расшифровывает DOS-овский текст, представленный
'в кодировке Unicode и зашифрованный кодировкой UTF-8.
'Результатом работы функции является расшифрованный текст,
'представленный в кодировке Unicode.
Function UTF_8_To_DOS_Decode(ByVal encryptedText As String) As String
    Dim i As Long, j As Long, k As Long, n As Long, m As Long, rgX As Object, mc As Object, isVowel As Boolean
    Dim A As Variant, B As Variant, C As Variant, D As Variant, E As Variant, decryptedText As String
    Dim encryptedWord As String, decryptedWord As String, decryptedWords() As String, otherWords() As String
    Dim encryptedChar As Long, decryptedChar As Long, encryptedCharA As Long, decryptedCharA As Long
    'Заполняем массивы кодов букв.
    A = Array(1076, 1078, 1079, 1081, 1083, 1084, 1086, 1088, 1089, 1093, 1094, 1095, 1099)
    B = Array(1080, 1040, 1041, 1082, 1101, 1090, 1087, 1075, 1050, 1052, 1054, 1053, 1073, 1055)
    C = Array(1096, 1056, 1043, 1098, 1102, 1091, 1103, 1100, 1066, 1068, 1070, 1069, 1074, 1071)
    D = Array(1062, 1063, 1057, 1058, 1042, 1059, 1060, 1044, 1046, 1047, 1061, 1045, 1049, 1051, 1067)
    'E - массив кодов для гласных букв.
    E = Array(1025, 1040, 1045, 1048, 1054, 1059, 1067, 1069, 1070, 1071, 1072, 1077, 1080, 1086, 1091, 1099, 1101, 1102, 1103, 1105)
    'С помощью регулярных выражений выделяем из текста зашифрованный текст,
    'который всегда состоит из пар вида "буква Г - некий символ".
    Set rgX = CreateObject("VBScript.RegExp")
    rgX.Pattern = "(Г.)+"
    rgX.Global = True
    Set mc = rgX.Execute(encryptedText)
    m = mc.Count
    ReDim decryptedWords(0 To m - 1) As String
    'В цикле проходим по коллекции совпадений с регулярным выражением и дешифруем каждое совпадение.
    For k = 0 To m - 1
        encryptedWord = mc(k).Value
        decryptedWord = ""
        n = Len(encryptedWord)
        
        encryptedChar = AscW(Mid(encryptedWord, 2, 1))
        decryptedChar = LetterDecode(encryptedChar, A, B, C, D)
        
        If n > 2 Then
        
            encryptedCharA = AscW(Mid(encryptedWord, 4, 1))
            decryptedCharA = LetterDecode(encryptedCharA, A, B, C, D)
            
            If decryptedChar > 0 Then
                decryptedWord = ChrW(decryptedChar)
 
            'Если имеет место случай "а или н", то смотрим букву,
            'которая следует за данной буквой. Если это гласная,
            'то с большей вероятностью мы имеем букву "н" перед
            'гласной, а если согласная - то с большей вероятностью -
            'букву "а" перед согласной.
            ElseIf decryptedChar = -1 Then
                isVowel = False
                For i = 0 To 19
                    If decryptedCharA = E(i) Then
                        isVowel = True
                        Exit For
                    End If
                Next i
                If isVowel Then decryptedChar = 1085 Else decryptedChar = 1072
                decryptedWord = ChrW(decryptedChar)
                
            'Если имеет место случай "Ё или ё", считаем первую букву слова заглавной.
            ElseIf decryptedChar = -2 Then
                decryptedChar = 1025
                decryptedWord = ChrW(1025)
                
            'Если не удается распознать букву, ставим вместо нее знак подчеркивания.
            Else
                decryptedWord = "_"
            End If
            
            If decryptedCharA > 0 Then
                decryptedWord = decryptedWord & ChrW(decryptedCharA)
 
            'Если имеет место случай "а или н", то смотрим букву,
            'которая находится перед данной буквой. Если это гласная,
            'то с большей вероятностью мы имеем букву "н" после
            'гласной, а если согласная - то с большей вероятностью -
            'букву "а" после согласной.
            ElseIf decryptedCharA = -1 Then
                isVowel = False
                For i = 0 To 19
                    If decryptedChar = E(i) Then
                        isVowel = True
                        Exit For
                    End If
                Next i
                If isVowel Then decryptedCharA = 1085 Else decryptedCharA = 1072
                decryptedWord = decryptedWord & ChrW(decryptedCharA)
                
            'Если имеет место случай "Ё или ё", и буква не первая - считаем ее строчной.
            ElseIf decryptedCharA = -2 Then
                decryptedCharA = 1105
                decryptedWord = decryptedWord & ChrW(1105)
                
            'Если не удается распознать букву, ставим вместо нее знак подчеркивания.
            Else
                decryptedWord = decryptedWord & "_"
            End If
            
            For i = 6 To Len(encryptedWord) Step 2
                decryptedChar = decryptedCharA
                encryptedCharA = AscW(Mid(encryptedWord, i, 1))
                decryptedCharA = LetterDecode(encryptedCharA, A, B, C, D)
                If decryptedCharA > 0 Then
                    decryptedWord = decryptedWord & ChrW(decryptedCharA)
    
                'Если имеет место случай "а или н", то смотрим букву,
                'которая находится перед данной буквой. Если это гласная,
                'то с большей вероятностью мы имеем букву "н" после
                'гласной, а если согласная - то с большей вероятностью -
                'букву "а" после согласной.
                ElseIf decryptedCharA = -1 Then
                    isVowel = False
                    For j = 0 To 19
                        If decryptedChar = E(j) Then
                            isVowel = True
                            Exit For
                        End If
                    Next j
                    If isVowel Then decryptedCharA = 1085 Else decryptedCharA = 1072
                    decryptedWord = decryptedWord & ChrW(decryptedCharA)
                    
                'Если имеет место случай "Ё или ё", и буква не первая - считаем ее строчной.
                ElseIf decryptedCharA = -2 Then
                    decryptedCharA = 1105
                    decryptedWord = decryptedWord & ChrW(1105)
                    
                'Если не удается распознать букву, ставим вместо нее знак подчеркивания.
                Else
                    decryptedWord = decryptedWord & "_"
                End If
            Next i
            
        Else
 
            If decryptedChar > 0 Then
                decryptedWord = ChrW(decryptedChar)
 
            'Если имеет место случай "а или н", то формируем слово "а",
            'так как слова "н", насколько мне известно, не существует.
            ElseIf decryptedChar = -1 Then
                decryptedWord = ChrW(1072)
                
            'Если имеет место случай "Ё или ё", считаем первую букву слова заглавной.
            ElseIf decryptedChar = -2 Then
                decryptedWord = ChrW(1025)
                
            'Если не удается распознать букву, ставим вместо нее знак подчеркивания.
            Else
                decryptedWord = "_"
            End If
 
        End If
        decryptedWords(k) = decryptedWord
    Next k
    'Вставляем распознанные тексты на их места среди прочего текста.
    otherWords = Split(rgX.Replace(encryptedText, "@#$"), "@#$")
    decryptedText = ""
    For k = 0 To m - 1
        decryptedText = decryptedText & otherWords(k)
        decryptedText = decryptedText & decryptedWords(k)
    Next k
    decryptedText = decryptedText & otherWords(k)
    UTF_8_To_DOS_Decode = decryptedText
End Function

Для получения расшифрованного текста вызывайте функцию UTF_8_To_DOS_Decode, в которую в качестве параметра необходимо передать текст из листинга программы. Функция должна вернуть исправленный текст.

Если будут какие-то проблемы с использованием функции - пишите.

С уважением,
Аксима
Ответ:

Не по теме:

Сообщение от Аксима
Код Visual Basic
1
'Если имеет место случай "Ё или ё", и буква не первая - считаем ее строчной.
Даёшь предложения с буквы Ё!

Вопрос: SQL код в код программы

Есть код:
Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
//проверим - есть ли текст в Memo. Если нет, выходим:
  if Memo1.Text = '' then begin
    ShowMessage('Вначале введите запрос!');
    Memo1.SetFocus;
    Exit;
  end;
  //текст есть. Очистим предыдущий запрос в наборе данных:
  ADOQuery1.SQL.Clear;
  //добавим новый запрос из Memo:
  ADOQuery1.SQL.Add(Memo1.Text);
  //открываем набор данных, т.е. выполняем запрос:
ADOQuery1.Open;
В коде описывается что sql запрос берем из memo. Как вписать код sql именно в код программы без memo.
Код sql:
Код SQL
1
2
3
SELECT Tov.Код, Tov.Название, Tov.Цена, Tov.Категория, Tov.[Год выпуска], Tov.[Склад (код)]
FROM Tov
ORDER BY Tov.Цена DESC;
Ответ: Так?
Код Delphi
1
2
3
4
5
6
7
  //текст есть. Очистим предыдущий запрос в наборе данных:
  ADOQuery1.SQL.Clear;
  //добавим новый запрос из Memo:
  ADOQuery1.SQL.Add ('SELECT (Tov.Код, Tov.Название, Tov.Цена, Tov.Категория, Tov.[Год выпуска], Tov.[Склад (код)]) from Tov');
  ADOQuery1.SQL.Add ('ORDER BY (Tov.Цена DESC)');
  //открываем набор данных, т.е. выполняем запрос:
ADOQuery1.Open;
Добавлено через 7 минут
Вот программа, буду признателен за помощь
Вопрос: Пояснение кода программы со стеками

Есть код программы (вырванный из целой проги кусок). В нем используются стеки.
Помогите, пожалуйста, построчно (максимально подробно) объяснить работу программы

Код:

struct stek {
    int value;
    struct stek *next;
};
void push(stek* &NEXT, const int VALUE) {
    stek *MyStack = new stek;
    MyStack->value = VALUE;
    MyStack->next = NEXT;
    NEXT = MyStack;
}

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать )
Модератор
Ответ:
Код:

struct stek {
    int value;			//Полезная нагрузка
    struct stek *next;		//Узел родительский по отношению к данному
};

void push(stek* &NEXT, const int VALUE) //Функция ложит новый узел в стек
					//NEXT текущая вершина стека
					//VALUE полезная нагрузка
{
    stek *MyStack = new stek;		//Выделяем память под новый узел
    MyStack->value = VALUE;		//Записываем полезную нагрузку
    MyStack->next = NEXT;		//Записываем в next прежную вершину стека
    NEXT = MyStack;			//Делаем текущий узел вершиной стека
}

К примеру:
Код:

stek* head = nullptr;	//Фиктивная вершина стека
push(head, 10); 	//Ложим на стек 10

сейчас стек выглядит так (Для наглядности):
head
10 -> nullptr
где (->) - это как-бы наш next, родитель данного узла
надпись head стоит над вершиной стека
если ещё раз вызвать push

Код:

push(head, 2233);

то стек будет выглядеть так:
head
2233 -> 10 -> nullptr
Вопрос: Самомодифицирующийся код программы влияет на скорость программы?

Самомодифицирующийся код программы влияет на скорость программы? Если да, то как и почему?
Ответ: Всё зависит от алгоритма, что, где и как часто меняется в коде. Если в функции меняется раз в час один байт (xor на or или and), то на скорости это не скажется, зато можно получить выигрыш в скорости. И наоборот, если прога каждые тридцать тактов меняет свой код, то тут можно вообще забыть о существовании кэша(он будет вечно сбрасываться), и есессно никакой оптимизации не достичь.

Хотя всё зависит от целей этой самой "самомодификации" - вирусу-полиморфу абсолютно с колокольни на производительность, главное осложнить жизнь отладчикам и пр.
Вопрос: Добавить в код программы обработку исключительных ситуаций

Помогите добавить в код программы обработку исключительных ситуаций, которые могут возникнуть в ходе выполнения программы. В случае возникновения исключения, организовать информативный вывод данных о возникшем исключении на экран с предложением продолжить выполнение, проигнорировав ошибку, или завершить выполнение программы.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication23
{
    internal class Program
    {
        private static void Main()
        {
            int[] x = new int[10], y = new int[10];
            var r = new Random();
            for (int i = 0; i < x.Length; i++)
            {
                x[i] = r.Next(200) - 100;
                y[i] = r.Next(200) - 100;
                Console.WriteLine("({0,3}) + ({1,3})i", x[i], y[i]);
            }
            int maxRe = 0, maxIm = 0;
            foreach (int i in x)
                if (Math.Abs(maxRe) < Math.Abs(i))
                    maxRe = i;
            foreach (int i in y)
                if (Math.Abs(maxIm) < Math.Abs(i))
                    maxIm = i;
            Console.WriteLine("Вектор максимальной длины: ({0,3}) + ({1,3})i,\r\n" +
                              "Его длина составляет {2}", maxRe, maxIm, Math.Sqrt(maxRe * maxRe + maxIm * maxIm));
            Console.ReadKey();
        }
    }
}
программа находит вектор наибольшей длины
Ответ:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication23
{
    internal class Program
    {
        private static void Main()
        {
            try
            {
                int[] x = new int[10], y = new int[10];
                var r = new Random();
                for (int i = 0; i < x.Length; i++)
                {
                    x[i] = r.Next(200) - 100;
                    y[i] = r.Next(200) - 100;
                    Console.WriteLine("({0,3}) + ({1,3})i", x[i], y[i]);
                }
                int maxRe = 0, maxIm = 0;
                foreach (int i in x)
                    if (Math.Abs(maxRe) < Math.Abs(i))
                        maxRe = i;
                foreach (int i in y)
                    if (Math.Abs(maxIm) < Math.Abs(i))
                        maxIm = i;
                Console.WriteLine("Вектор максимальной длины: ({0,3}) + ({1,3})i,\r\n" +
                                  "Его длина составляет {2}", maxRe, maxIm, Math.Sqrt(maxRe * maxRe + maxIm * maxIm));
                Console.ReadKey();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                
 
 
            }
            
            
               
  
 
        }
        
    }
}
Немного не вьехал,то есть если у нас к примеру выход за пределы массива,то программу должна выполняться?? я правильно понял?
ну вообще,по идее
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
                Console.WriteLine("Хотите поизвращаться-нажмите 1");
                Console.WriteLine("Закрыть и не видеть этот ужас нажмите 2");
                int n = 0;
                n = int.Parse(Console.ReadLine());
                switch (n)
                {
                    case 1:
                        Main();
                        break;
                    case 2:
                        Environment.Exit(0);
                        break;
                }
Вопрос: Как будут выглядеть следующие код программы?

Как будут выглядеть следующие код программы полностью ,если делать программу через delphi vcl application.

Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var a :string; m :integer;
begin
Edit1.Text:=Edit1.Text+1;
 m:=StrToInt(Edit1.Text);
  case m of
   1 : a:='Февраль';
   2 : a:='Март';
   3 : a:='Апрель';
   4 : a:='Май';
   5 : a:='Июнь';
   6 : a:='Июль';
   7 : a:='Август';
   8 : a:='Сентябрь';
   9 : a:='Октябрь';
   10 : a:='Ноябрь';
   11 : a:='Декабрь';
   12 : a:='Январь';
 end;
Label1.Caption:=a;
end.
Ответ:
Код Delphi
1
2
3
else showmessage('Такого месяца нет');
end;
Label1.Caption:=a;
Вопрос: Посмотреть исходный код программы

Здравие желаю дорогие форумчане!Делаю обстоит следующим образом: Нам задали проект в универе(1 курс),так вот я его выполнил(написал код,программа интерпретируется без ошибок).Препод сказал принести проект на флешке(говорит ему нужно видеть сам код),но у меня не хватает ума это сделать!Сам код я уже экспортировал в полноценный файл и сохранил на флешку.А как мне показать ему сам код,он говорит что нужно сделать что-то с исходником,то ли с источником!
Заранее благодарен!Среда разр.-Еклипс(Марс)если что
Ответ:
Сообщение от Ryuzaki
А как мне показать ему сам код
открываете флешку, там файлы. Открываете их блокнотом и показываете.
Вопрос: написала код программы для работы с двухмерным массивом, но она работает не так,как должна. помогите, пожалуйста, где ошибка

Дан двумерный массив целых чисел. Определить: а) минимальный номер столбца, состоящего только из нечетных элементов; б) минимальный номер столбца, состоящего только из элементов, больших числа 10; в) минимальный номер столбца, состоящего только из элементов, принадлежащих промежутку от aдо b; г) минимальный номер столбца, состоящего только из элементов, кратных числу b. Во всех случаях принять, что такие столбцы в массиве есть.

Код:

#include<iostream>
#include<ctime>
#include<stdlib.h>
#include <iomanip>

using namespace std;
 int main(){
 	srand(time(NULL));
 	setlocale(LC_ALL,"Russian");
	 
	 
	int arr[50][50];
 	int sr,sb,minn,most,aorb,krb,sc=0,a=10,b=5;
 	cout<<"Введите размер массива"<<endl;
 	cin>>sr;
 	cin>>sb;
 	
 	for(int i=0;i<sr;i++){
 		for(int j=0;j<sb;j++){
 			arr[i][j]=rand() %20;
		 }
	 }
 	   cout<<"Данные массива:"<<endl;
 		for(int i=0;i<sr;i++){
 		for(int j=0;j<sb;j++){
 			cout<<setw (4)<<arr[i][j]<<setw (4);
		 }
		 cout<<endl;cout<<endl;
	 }
	 
 		for(int j=0;j<sb;j++){
 			sc=0;
 		for(int i=0;i<sr;i++){
 			if(arr[i][j]%2!=0)
 			sc++;
		 }
		if(sc==sb){
		minn=j;
		break;
		} 
	 }
	 
	 for(int j=0;j<sb;j++){
 			sc=0;
 		for(int i=0;i<sr;i++){
 			if(arr[i][j]>10)
 			sc++;
		 }
		if(sc==sb){
		most=j;
		break;
		} 
}
	 
	 for(int j=0;j<sb;j++){
 			sc=0;
 		for(int i=0;i<sr;i++){
 			if(arr[i][j]>a && arr[i][j]<b)
 			sc++;
		 }
		if(sc==sb){
		aorb=j;
		break;
		} 
	 }
	 
	 for(int j=0;j<sb;j++){
 			sc=0;
 		for(int i=0;i<sr;i++){
 			if(arr[i][j]%5==0)
 			sc++;
		 }
		if(sc==sb){
		krb=j;
		break;
		} 
	 }
	 
	 cout<<"Мин номер столбца, состоящего только из нечетных-"<<minn<<endl;
	 cout<<"Мин номер столбца, состоящего только из элементов больше 10-"<<most<<endl;
	 cout<<"Мин номер столбца, состоящего только из элементов в промежутке от a до b-"<<aorb<<endl;
	 cout<<"Мин номер столбца, состоящего только из элементов кратных b-"<<krb<<endl;
 }

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать )
Модератор
Ответ:
Цитата:
Сообщение от Diana111
Код:

if(sc==sb){
		minn=j;
		break;
		}

Это неверно. В столбце у Вас sr элементов.
поэтому счётчик во всех случаях и нужно сравнивать с sr

Код:

	if(sc==sr){
		minn=j;
		break;
		}

это раз.

второе. переменные minn,most,aorb,krb нужно обязательно иницилизировать.
при этом я бы иницилизировал из значением, которое ЗАВЕДОМО не может являться номером столбца. Ну, например, -1:
Код:

int minn=-1,most=-1,aorb=-1,krb=-1;

третье.
прежде чем выдать текст:
"Мин номер столбца, состоящего только из ...."
нужно проверить переменную. Если она равна значению, которым иницилизировали, значит, такого столбца в матрице нет.
например:
Код:

if(minn>-1)
	 cout<<"Мин номер столбца, состоящего только из нечетных-"<<minn<<endl;
else
	 cout<<"Нет столбца, состоящего только из нечетных"<<endl;

Вопрос: Нужно перевести код программы с Pascal (игра в карты)

Код программы на Pascal:

Код Pascal
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
uses crt;
const kol:array[1..36] of string[3]=
('6п','7п','8п','9п','10п','Bп','Дп','Кп','Тп',
 '6т','7т','8т','9т','10т','Bт','Дт','Кт','Тт',
 '6б','7б','8б','9б','10б','Bб','Дб','Кб','Тб',
 '6ч','7ч','8ч','9ч','10ч','Bч','Дч','Кч','Тч');
var igr:array[1..6,1..6] of string[3];
    n,i,j,k:byte;
    m:set of byte;
    c:char;
begin
clrscr;
randomize;
repeat
write('Количество игроков от 2 до 6 n=');
readln(n);
until n in [2..6];
m:=[];
for i:=1 to n do
for j:=1 to 6 do
 begin
  repeat
   k:=1+random(36);
  until not(k in m);
  m:=m+[k];
  igr[i,j]:=kol[k];
 end;
if n=6 then c:=igr[n,6][length(igr[n,6])]
else
 begin
  k:=random(4);
  case k of
  0:c:='п';
  1:c:='т';
  2:c:='б';
  3:c:='ч';
  end;
 end;
writeln('Раздача карт');
for i:=1 to n do
 begin
  write('Игрок ',i);
  for j:=1 to 6 do
  write(igr[i,j]:4);
  writeln
 end;
write('Козыри ');
case c of
'п':write('пики');
'т':write('трефы');
'б':write('буби');
'ч':write('червы');
end;
readln
end.
Нужно перевести на VBA.
Ответ: Думаю стоит вот этот момент изменить
Код Pascal
1
2
3
repeat
   k:=1+random(36);
until not(k in m);
Когда у вас 6 игроков, то ждать рандома последних карт колоды можно очень долго. И вообще не дождаться можно.