Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 1
Регистрация: 16.01.2012
Сообщений: 13

Перевод программы с Pascal

22.04.2012, 15:14. Показов 2220. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите перевести программу на VBA, пожалуйста.

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
program riski;
uses crt;
type mas=array[1..10] of real;
     mas2=array[1..10,1..10] of real;
var a:real;
     m,be,bm:mas;
     B,E,b1,e1:mas2;
     i,k,c,v,l,j,n:integer;
     mp,ebe,mbm,ebm,x,mbe:real;
 
 procedure base;
     begin
       for i:=1 to n do        {обращение матрицы B}
       begin
           for c:=1 to n do            {дублирование матриц}
             begin
               for v:=1 to n do
                 begin
                 B1[c,v]:=B[c,v];
                 e1[c,v]:=e[c,v];
                 end;
             end;
         for k:=1 to n do
           begin
             B[i,k]:=B1[i,k]/b1[i,i];         {делим строки на разрешающий элемент}
             E[i,k]:=E1[i,k]/b1[i,i];for l:=1 to n do
               begin                 {находим остальные элементы}
                if l<>i then
                  begin
                    B[l,k]:=(B1[l,k]-(B1[l,i]*B1[i,k]/B1[i,i]));
                    E[l,k]:=(E1[l,k]-(B1[l,i]*E1[i,k]/B1[i,i]));
                  end;
               end;
           end;
      end;
 
      for i:=1 to n do    {суммирование по строкам, формирование вектора-столбца Be}
      begin
         for j:=1 to n do
           begin
             be[i]:=be[i]+e[i,j];
           end;
      end;
 
      for i:=1 to n do     {формирование вектора-столбца Bm}
      begin
        for j:=1 to n do
        begin
          Bm[i]:=Bm[i]+m[j]*e[i,j];
        end;
      end;
 
      for i:=1 to n do
      begin                 {нахождение констант}
        ebe:=ebe+be[i];  {суммирование по стоблцу}
        ebm:=ebm+bm[i];
        mbm:=mbm+m[i]*bm[i];
        mbe:=mbe+m[i]*be[i];
      end;
      end;
 procedure vvod ;
      label out1, out2, out3, out4, out5;
      var z:real; mi,ma:real;
   begin
      writeln;
      writeln('                        КУРСОВОЙ ПРОЕКТ');
      writeln;
      writeln;
      writeln(' ПО ДИСЦИПЛИНЕ МАТЕМАТИЧЕСКИЕ МЕТОДЫ ФИНАНСОВО-ЭКОНОМИЧЕСКОГО АНАЛИЗА');
      writeln;
      writeln('    АВТОР:  Иванов');
      writeln;
      writeln('    ТЕМА:   ЗАДАЧА ОПТИМИЗАЦИИ РИСКОВОГО ПОРТФЕЛЯ.');
      writeln;
      writeln;
      writeln;
      out1:
      writeln;
      writeln('  Введите количество видов ценных бумаг, из которых вы хотите ');
      write('     сформировать портфель (не более 10):  ');
      readln(n);
      if (n<=0) or (n<>int(n)) or (n>10) then
      begin
        writeln('  Ошибка ввода! Число должно быть натуральным и меньше 10 ! ');
        goto out1;
      end;
      writeln;
 
      writeln('  Введите эффективности (доходности) ценных бумаг:');
     for i:=1 to n do
     begin
        E[i,i]:=1;
        out2:
        write(' ',i,'-ого вида :  ');
        readln(m[i]);
        if (m[i]<0) then
        begin
        writeln('  Ошибка ввода! Число должно быть положительным! ');
        goto out2;
        end;
     end;
     writeln;
     writeln('!!! При вводе рисков и совместных вариаций ценных бумаг следует');
     writeln('    быть внимательным, так как программа не расчитана на линейную');
     writeln('    связь доходностей ценных бумаг. Поэтому рекомендуется не вводить');
     writeln('    пропорциональные риски и совместные вариации ценных бумаг!!!');
     writeln;
     writeln('  Введите риск (среднее квадратическое отклонение(СКО)) ценных бумаг: ');
     for i:=1 to n do
     begin
        out3:
        write(' ',i,'-ого вида :  ');
        readln(z);
        if (z<0)  then
        begin
        writeln('  Ошибка ввода! Число должно быть положительным! ');
        goto out3;
        end;
        b[i,i]:=z*z;
     end;
 
     writeln;
     writeln(' Введите совместную вариацию (корреляционный момент) ценных бумаг.');
     writeln('  Она не должна быть больше произведения СКО этих бумаг.');
        for i:=1 to n do
        begin
        for j:=i+1 to n do        {ввод матрицы ковариаций}
        begin
          out4:
          write(' ',i,'-го и ',j,'-го вида:  ');
          readln(z);
          if  abs(z)>=sqrt(b[i,i])*sqrt(b[j,j]) then
          begin
          writeln('  Ошибка ввода! Число должно быть положительным и меньше произведения СКО этих бумаг! ');
          goto out4;
          end;
          b[i,j]:=z;
          b[j,i]:=z;
          if i<>j then begin E[i,j]:=0; end;
        end;
        end;
        writeln;
        ma:=0;
        for i:=1 to n do
         begin
            if m[i]>ma then ma:=m[i];
         end;
          mi:=100000000;
        for i:=1 to n do
         begin
            if m[i]<mi then mi:=m[i];
         end;
        writeln('  Введите желаемую эффективность портфеля.  ');
        write('  Она должна быть в пределах эффективностей ценных бумаг: ');
        out5:
        readln(mp);
      if (mp<mi) or (mp>ma) then
        begin
        writeln('  Ошибка ввода!');
        write('  Число должно быть в пределах эффективностей ценных бумаг!:  ');
        goto out5;
        end;
      end;
 
 
 procedure vivod ;
    begin
      writeln;
      writeln('  Структура портфеля. Доли ценных бумаг.');
      for i:=1 to n do
      begin
        x:=((mbm-mp*ebm)*be[i]+(mp*ebe-mbe)*bm[i])/(ebe*mbm-mbe*mbe);
        writeln(' ',i,'-го вида: ',x:6:5);
        if x<0 then
        begin
        writeln('  Так как доля бумаг ',i,'-го вида отрицательна, то необходимо ');
        writeln('  провести сделку "short sale", исключить бумаги этого вида из портфеля');
        writeln('  и решить задачу заново.');
        end;
      end;
      writeln;
      writeln('  Минимальный риск портфеля:  ',sqrt((mp*mp*ebe-2*mp*mbe+mbm)/(ebe*mbm-mbe*mbe)):6:5);
   end;
 
begin
     clrscr;
     textcolor(yellow);
     textbackground(blue);
     vvod;
     base;
     vivod;
     readln;
end.
Добавлено через 5 минут
Дело в том, что я не совсем понимаю на каком языке она написана, и поэтому не могу её сконвертировать((
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.04.2012, 15:14
Ответы с готовыми решениями:

Перевод программы с Pascal в VBA
Помогите, пожалуйста, перевести код Procedure Hord(A,B:Real; E:Real; var X, Fx:Real;n:integer); var X0,Fa,Fb:real; Begin if...

Перевод программы из Pascal в VBA
Помогите перевести в vba 1 program Matrix20; var a:array of real; Mult:real; i,j,M,N:integer; begin Write('N: '); ...

Перевод программы с Pascal в VBA
Помогите перевести в vba Дана действительная квадратная матрица порядка n,где n - нечетное, все элементы которой различны. Найти...

15
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
22.04.2012, 15:21
Цитата Сообщение от Iren_pozitiv Посмотреть сообщение
Дело в том, что я не совсем понимаю на каком языке она написана
если только в этом проблема, то похоже на Паскаль
1
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
22.04.2012, 15:51
Цитата Сообщение от gaw Посмотреть сообщение
похоже на Паскаль
Однозначно - Pascal!
Не мешало бы узнать суть задачи, перед тем как кидаться её переводить...
Возможно, решение и здесь найдётся?
Погуглил - это Программа оптимизации рискового портфеля
Решения на VB(A) пока не нашёл.
Надо исправлять ситуацию
0
0 / 0 / 1
Регистрация: 16.01.2012
Сообщений: 13
22.04.2012, 16:36  [ТС]
Проблема именно в том, что я вообще не знаю Паскаль(( вот и возникли сложности.
Да, это задача Формирования оптимального портфеля ценных бумаг
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
22.04.2012, 17:01
Цитата Сообщение от Iren_pozitiv Посмотреть сообщение
Проблема именно в том, что я вообще не знаю Паскаль
А бейсик знаете? Синтаксис-то очень похожий. Например, строки 37-43
Pascal
1
2
3
4
5
6
7
      for i:=1 to n do    {суммирование по строкам, формирование вектора-столбца Be}
      begin
         for j:=1 to n do
           begin
             be[i]:=be[i]+e[i,j];
           end;
      end;
на VBA переводятся так:
Visual Basic
1
2
3
4
5
      for i=1 to n '    {суммирование по строкам, формирование вектора-столбца Be}
         for j=1 to n
             be(i)=be(i)+e(i,j)
         next
      next
Основная проблема - как организовать ввод/вывод.
0
0 / 0 / 1
Регистрация: 16.01.2012
Сообщений: 13
22.04.2012, 17:10  [ТС]
Бейсик знаю только с книжкой и гуглом.
Про ввод/вывод, это отдельная история, мне еще предстоит это все сделать с использованием UserForm.

Добавлено через 1 минуту
Кто-нибудь подскажет, что означает 2 строка?
0
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
22.04.2012, 17:16
Цитата Сообщение от Iren_pozitiv Посмотреть сообщение
uses crt;
если эта - то подключение модуля,

мнение:, дешевле себе - сформулировать задачу и написать с нуля в необходимой среде
(перевод не всегда рентабелен)
0
0 / 0 / 1
Регистрация: 16.01.2012
Сообщений: 13
22.04.2012, 17:46  [ТС]
А это подключение модуля можно как то на VBA заменить?
Каким типом в VBA заменить "of real"?

Задача то сформулирована, а вот самостоятельное написание мне точно не по силам, поэтому и попробую по аналогии перевести, тока видимо силёнок не хватает.
0
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
22.04.2012, 17:51
Цитата Сообщение от Iren_pozitiv Посмотреть сообщение
А это подключение модуля можно как то на VBA заменить?
ничего менять не надо, просто пропустите эту строку (в вба ее не надо)


Цитата Сообщение от Iren_pozitiv Посмотреть сообщение
"of real"
- действительные числа
Single, (Double)
0
0 / 0 / 1
Регистрация: 16.01.2012
Сообщений: 13
22.04.2012, 18:53  [ТС]
А как поступить с 6,7,11 и 61, 62 строкой?

Pascal
1
2
3
4
5
6
m,be,bm:mas;
B,E,b1,e1:mas2;
procedure base;
 
procedure vvod ;
label out1, out2, out3, out4, out5;
Что вообще обозначает 62 строка?
0
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
22.04.2012, 19:00
Цитата Сообщение от Iren_pozitiv Посмотреть сообщение
label out1, out2, out3, out4, out5;
объявление меток (для вба тоже не надо)

Цитата Сообщение от Iren_pozitiv Посмотреть сообщение
procedure base;
процедура имя


Цитата Сообщение от Iren_pozitiv Посмотреть сообщение
m,be,bm:mas;
m,be,bm типа mas, где mas пользовательский
0
0 / 0 / 1
Регистрация: 16.01.2012
Сообщений: 13
22.04.2012, 20:03  [ТС]
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Хоть как то похоже на правду?

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
Sub Riski()
Dim mas(1 To 10) As Single
Dim mas2(1 To 10, 1 To 10) As Single
Dim a As Single
Dim m, be, bm As Single
Dim B, E, b1, e1 As Single
Dim i, k, c, v, l, j, n As Integer
Dim mp, ebe, mbm, ebm, x, mbe As Single
Sub base()
For i = 1 To n  '    обращение матрицы B
For c = 1 To n '        дублирование матриц
For v = 1 To n
b1(c, v) = B(c, v)
e1(c, v) = E(c, v)
Next
Next
For k = 1 To n
B(i, k) = b1(i, k) / b1(i, i) '         делим строки на разрешающий элемент
E(i, k) = e1(i, k) / b1(i, i)
For l = 1 To n '          находим остальные элементы
If l <> i Then
B(l, k) = (b1(l, k) - (b1(l, i) * b1(i, k) / b1(i, i)))
E(l, k) = (e1(l, k) - (b1(l, i) * e1(i, k) / b1(i, i)))
Next
Next
Next
Next
For i = 1 To n '    ‘    суммирование по строкам, формирование вектора-столбца Be
For j = 1 To n
be(i) = be(i) + E(i, j)
Next
Next
For i = 1 To n '     формирование вектора-столбца Bm
For j = 1 To n
bm(i) = bm(i) + m(j) * E(i, j)
Next
Next
For i = 1 To n '              нахождение констант
ebe = ebe + be(i) '  суммирование по стоблцу
ebm = ebm + bm(i)
mbm = mbm + m(i) * bm(i)
mbe = mbe + m(i) * be(i)
Next
Next
Dim z, mi, ma As String
n = InputBox("Введите количество видов ценных бумаг, из которых вы хотите сформировать портфель (не более 10):  ")
         If (n <= 0) Or (n <> Int(n)) Or (n > 10) Then
MsgBox ("Ошибка ввода! Число должно быть натуральным и меньше 10 !  ")
Next n
z = InputBox("Введите совместную вариацию (корреляционный момент) ценных бумаг. Она не должна быть больше произведения СКО этих бумаг.")
For i = 1 To n
For j = i + 1 To n '     ввод матрицы ковариаций
 
If Abs(z) >= sqrt(B(i, i)) * sqrt(B(j, j)) Then
MsgBox (" (" Ошибка ввода! Число должно быть положительным и меньше произведения СКО этих бумаг!  ")
Next z
0
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
22.04.2012, 20:47
Iren_pozitiv, старайтесь делать отступы в коде, это серьезно улучшит его восприятие
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
22.04.2012, 23:22
Цитата Сообщение от Iren_pozitiv Посмотреть сообщение
Хоть как то похоже на правду?
Не очень. Объявление переменных должно выглядеть так:
Visual Basic
1
2
3
4
5
Dim a#
Dim m#(1 To 10), be#(1 To 10), bm#(1 To 10)
Dim B#(1 To 10, 1 To 10), E#(1 To 10, 1 To 10), b1#(1 To 10, 1 To 10), e1#(1 To 10, 1 To 10)
Dim i&, k&, c&, v&, l&, j&, n&
Dim mp#, ebe#, mbm#, ebm#, x#, mbe#
# - это сокращенная запись As Double, & - сокращение от As Long (забудьте про Single и Integer).
Переменные должны быть уровня модуля, перед ними не должно быть Sub.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
24.04.2012, 23:43
Следующую строку после For - хотябы по +2 отступа. На том же уровне в конце у Вас должна быть заключающая команда Next (т.е. Вы для себя же визуально это делаете).
Sub base() - лишнее.
Программа должна заканчиваться так:
End Sub
Next n - неправильно, так как команды For n = ... такой нет.
Dim B, E, b1, e1 As Single - нужно объявлять отдельно каждую переменную.
MsgBox (" (" лишняя ("
If Abs(z) >= sqrt(B(i, i)) * sqrt(B(j, j)) Then - нет команды End if
Dim z, mi, ma As String - возможно попадет под цикл и приведет к ошибке двойного объявления.
0
0 / 0 / 1
Регистрация: 16.01.2012
Сообщений: 13
02.05.2012, 22:02  [ТС]
Может кто-нибудь за деньги напишет прогу??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.05.2012, 22:02
Помогаю со студенческими работами здесь

Перевод программы с Turbo Pascal на Pascal ABC.NET
написала программу в паскаль турбо на рабочем компьютере. перенесла в паскаль авсNet так как дома стоит эта версия /перестала работать что...

Перевод программы с turbo pascal на Pascal ABC
Есть программа, которая строит треугольник Серпинского методом хаоса, но она конфликтует с графикой ABC. Важен именно этот метод. ...

Перевод программы на Pascal
Здравствуйте друзья. Прошу вас о помощи, помогите с переводом программы с Pascal на C++. Буду неимоверно благодарен тому, кто поможет, в...

Перевод программы из Pascal в C#
Описать функцию InvertDigits(K), меняющую порядок следования цифр целого положительного числа K на обратный. С помощью этой функции...

Перевод программы Pascal -> C++
Помогите на Си++ перевести program a1; uses crt; var s,tmp:string; i,x:longint; code:integer; begin tmp:=''; ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru