Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 740

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
В чем ошибка
; not allowed before 'else'

Приложение:
  1. for k:= a to (e[2]) do
  2. begin
  3. x3[k] :=x3[k]+k;
  4. for n1:= a to (e[2]+e[1]) do
  5. begin
  6. begin
  7. if ((s[x3[k]+e[1]-z2[n1]])>0) then
  8. M[k,n1]:=(x3[k])+(C2[n1+a])+(s[x3[k]+e[1]-z2[n1]]);
  9. min:=M[k,0];
  10. begin
  11. if M[k,n1]<min then
  12. min:=M[k,n1]
  13. else;
  14. end;
  15.  
  16. else;
  17. Writeln('M=',M[k,n1]);
  18. end;
  19.  
  20. end;
  21.  
  22.  
  23. end;


MaxWooD Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: MaxWooD (статус: Посетитель)
Вопрос отправлен: 6 мая 2009, 21:26
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Ну всё правильно. Перед else точка с запятой не ставится, ибо if ... then ... else — это одна лексическая конструкция.
Я поглядел (правда, сначала переформатировал) твой код. Не знаю, что делает сей алгоритм, но полное незнание азов налицо. Попробовал переделать, не вдаваясь в сам алгоритм. Вот что получилось (сравни со своим):

for k:= a to e[2] do
  begin
    x3[k]:= x3[k] + k;
 
    for n1:= a to e[2] + e[1] do
      begin
        if s[x3[k] + e[1] - z2[n1]] > 0
          then begin
                 M[k, n1]:= (x3[k]) + (C2[n1 + a]) + (s[x3[k] + e[1] - z2[n1]]);
 
                 min:= M[k, 0];
                 if M[k, n1] < min
                   then min:= M[k, n1]
                   else; // <--- что тут быть-то должно?
               end // then
          else; // <--- что тут быть-то должно?
 
        Writeln('M = ', M[k, n1]);
      end; // for
  end; // for

Если по ветке else у тебя ничего не запланировано, то и писать её не надо.
Согласись, что отформатированный мной код, выглядит гораздо читабельнее, несмотря на однобуквенные переменные. Это, конечно, не есть пример, как надо форматировать исходники, просто я ТАК пишу.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 6 мая 2009, 22:39


Мини-форум вопроса

Всего сообщений: 20; последнее сообщение — 7 мая 2009, 22:48; участников в обсуждении: 4.
Паровоз

Паровоз (статус: 10-ый класс), 6 мая 2009, 22:30 [#1]:

Ошибка в том, в чем написано - перед else точка с запятой не ставится.
MaxWooD

MaxWooD (статус: Посетитель), 6 мая 2009, 22:47 [#2]:

задача состоит чтобы из массива выбрать минимальное значение
По поводу читабельности всё исправлю, извеняйте-не профи!
MaxWooD

MaxWooD (статус: Посетитель), 6 мая 2009, 22:56 [#3]:

program Project1;
{$APPTYPE CONSOLE}
var
a,b,n,n1,n2,k,k1,c,x1,x4,Y,y1,i,h,min:integer;
z1:array [0..100] of integer;
z2:array [0..100] of integer;
z3:array [0..100] of integer;
x2:array [0..100] of integer;
x3:array [0..100] of integer;
c2:array [0..100] of integer;
c3:array [0..100] of integer;
e:array [0..100] of integer;
s:array [0..100] of integer;
M:array [0..100,0..100] of integer;

{t:array [0..100] of integer;}

begin
Write('x1 ');Readln(x1);
Write('Chislo elementov En ');
Readln(k); // число элементов En

for n:=1 to k do
begin
write('Element#',n,' ');
readln(e[n-1]);
end;

z2[0]:=0;
x3[0]:=0;
a:=0{x1-e[0]};
y1:=0;

for y:=0 to k-1 do
begin
y1:=y1+(e[y]);
{ Writeln('y1=',y1); } //
end;

b:= y1-e[0];
{ Writeln('b=',b);} //конечный предел х2




for n:= a to b do //пределы z1,z2,x2,x3
begin
z1[n]:=n+(e[0]-x1); //считаем z1 !верно!
z2[n]:=n+a; //пределы z2 !верно!
Writeln('z2[n]=',z2[n]);
x2[n]:=(x1+z1[n]-e[0]); //считаем x2 !верно!
{ begin
if (x3[n]<=6)then
x3[n]:=n+a
else
x3[n]:=x3[n]; //считаем x3 !верно!
Writeln('x3[n]=',x3[n]);
end; }

begin
if (z1[n]>=0) and (z1[n]<=5) then
C:=10*z1[n]
else
begin //условие по функции C(z1)
if (z1[n]>=6) and (z1[n]<=15)then
C:=50+20*(z1[n]-5)
else Write('ne_v_prdelax')
end;
end;

s[n]:=C+x2[n]; // главная диагональ 1 !верно!
Writeln('s[n]=',s[n]);
{ Writeln('z2[n]=',z2[n])} // !верно!

begin
if (z2[n]>=0) and (z2[n]<=5) then
C2[n]:=10*z2[n]
else
begin //условие по функции C(z2)
if (z2[n]>=6) and (z2[n]<=15)then
C2[n]:=50+20*(z2[n]-5)
else Write('ne_v_prdelax');
end;
{ Writeln('C2=',c2[n]);} // !верно!
end;



end;



for k:= a to e[2] do
begin
x3[k]:= x3[k] + k;

for n1:= a to e[2] + e[1] do
begin
if s[x3[k] + e[1] - z2[n1]] > 0
then begin
M[k, n1]:= (x3[k]) + (C2[n1 + a]) + (s[x3[k] + e[1] - z2[n1]]);
min:= M[k,0];
if M[k, n1] < min
then min:= M[k, n1]
else; // <--- что тут быть-то должно?
end // then
else; // <--- что тут быть-то должно?

Writeln('M = ', M[k, n1]);
end; // for
end; // for

x4:=0;
for n:= a to (e[2]) do
begin z3[n]:=n+a;

begin
if (z3[n]>=0) and (z3[n]<=5) then
C3[n]:=10*z3[n]
else
begin //условие по функции C(z3)
if (z3[n]>=6) and (z3[n]<=15)then
C3[n]:=50+20*(z3[n]-5)
else Write('ne_v_prdelax')
end;
end;


h:=(C3[n1+a])+(M[k,n1]);
end;


{write ( 'x2= ',x2[n]:2,' z1= ',z1[n]:2,' sum= ',s[n]:4,' C(z1)= ',c,'t=',t,'c2=',c2[n],'X3=',x3[k]); //главнвя диаганаль матрицы или сумма
readln; }

readln;
end.





Если честно я его сам-то боюсь иногда, Если можете, то где про оформление можно почитать?
Не выбирает минимальное значение в массиве!
Дайте оценку моему коду, последний раз 3 года назад программировал, но теперь прийдется всегда писать.
min@y™

min@y™ (статус: Доктор наук), 6 мая 2009, 22:58 [#4]:

Цитата:

чтобы из массива выбрать минимальное значение

Да я бы ни за что не поверил, что это поиск минимального элемента массива! На мой взгляд это ващще загадка американского хирурга + египетская надпись на пирамиде. От обилия переменных рябит в глазах.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 6 мая 2009, 23:01 [#5]:

Ойпля!... Какой ужос!
Распечатай этот исходник на мягкой бумаге формата А4,... ну а потом, я думаю, ты примешь правильное решение, как его применить.

А если серьёзно, дай хоть задание посмотреть.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 6 мая 2009, 23:04 [#6]:

Сдаётся мне, что else тут вообще не нужен. MaxWooD, не ставь их, если команд нет.
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 6 мая 2009, 23:08 [#7]:

2 All:
У меня на работе старые тётки до сих пор так код свой форматируют, хотя пишут на С++. Когда я смотрю/редактирую их код, у меня волосы на жопе шевелятся.
Я пару лет назад им америку открыл, прикиньте, типа, что в С/С++ есть не только комментарии "/* текст */", но и "// текст". У меня были глаза, как у кота, которому наступили на яйца! Они по 20-30 лет работают с сишником и не знают про string-comment!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MaxWooD

MaxWooD (статус: Посетитель), 6 мая 2009, 23:10 [#8]:

for k:= a to e[2] do
begin
x3[k]:= x3[k] + k;

for n1:= a to e[2] + e[1] do
begin
if s[x3[k] + e[1] - z2[n1]] > 0
then begin
M[k, n1]:= (x3[k]) + (C2[n1 + a]) + (s[x3[k] + e[1] - z2[n1]]);
min:= M[k,0];
if M[k, n1] < min
then min:= M[k, n1]
else ; // <--- ничего быть не должно-я уберу
end // then
else; // <--- ничего быть не должно- я уберу

Writeln('M = ', M[k, n1]);
end; // for
end; // for

Вот в этом месте надо выбрать мин значение массива. На бумаге печатал-не помогает-поэтому к вам и обратился!
А переменных можно и по меньше сделать?
min@y™

min@y™ (статус: Доктор наук), 6 мая 2009, 23:14 [#9]:

А, забыл привести пример. Выглядит это вот так:
/* ПРОГРАММА ВЫДАЧА ДАННЫХ В РЭМ1 БЕЗ РЕГИСТРАЦИИ ОТКАЗА
(ФАЙЛ j7vdm3.c,ФУНКЦИЯ j7vdm3) */
#include

j7vdm3(ak,ap,av,reg,abuf,n)
unsigned int ak; /* адрес контроллера ISA-КСС */
int ap; /* адрес РЭМ1 на прием */
int av; /* адрес РЭМ1 на выдачу */
int reg; /* адрес регистра РЭМ1 */
char *abuf; /* адрес буфера данных для РЭМ1 */
int n; /* число байтов данных для РЭМ1 */
{
extern FILE *j4df;
extern int j1otladka;
extern int j4zbuf;
extern int j1kolpov;
extern int j1npov1;
extern char j7rskss;
extern char j7rsb;

char sb[2];
int d,d1,i;

if(j4zbuf&&j1otladka)
{
j4zfp();
fprintf(j4df," Выдача данных в РЭМ с КР с инкрементом адреса регистра\n");
}
/* Формирование служебных данных */
sb[0]=0x16; /* КОП выдать байты с КР с инкрементом адреса регистра */
sb[1]=reg; /* адрес регистра */

/* Цикл обмена с повтором при отказах */
for(i=0;i {
j7rskss=0; j7rsb=0;
d1=0;
/* определение числа повторов */
if(i) j1npov1++;
/* адресация РЭМ1 на прием */
d=j4adr(ak,ap); if(d) break;
/* выдача служебных данных */
if(j4zbuf&&j1otladka)
{
j4zfp();
fprintf(j4df,"Служебные байты: КОП, адрес регистра \n");
}
d=j4out(014,sb,2);
if(d==0)
{
/* выдача данных в РЭМ1 */
if(j4zbuf&&j1otladka)
{
j4zfp();
fprintf(j4df,"Байты данных \n");
}
d=j4out(015,abuf,n);
/* kонтроль обмена */
if(d==0)
{
d1=j7kossm(ak,ap,av);
if(d1==0) break;
}
}
}
/* Разадресация */
if(d==0) d=j4radr(ak);
if(d) return d;
if(d1) return d1;
return 0;
}

Тоже не особо напрягаются на счёт имён переменных. :)))))) Хорошо хоть комменты ставят, и то спасибо. Пришлось скачать утилиту автоформатирования С++ кода. Помогло.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 6 мая 2009, 23:18 [#10]:

Цитата:

А переменных можно и по меньше сделать?

Ну ясен пень! Надо оформить поиск минимального элемента массива простой функцией, которая и будет возвращать индекс этого элемента. Я не буду твой исходник читать, это приведёт к раку мозгов. А они мне ещё нужны (у меня семья, двое детей и вообще, я ещё молод, чтобы умирать).

Просто напиши, что там в задании.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MaxWooD

MaxWooD (статус: Посетитель), 6 мая 2009, 23:19 [#11]:

Спасибо за пример, но как же мне быть с выбором минимального значения из массива в цикле?
min@y™

min@y™ (статус: Доктор наук), 6 мая 2009, 23:27 [#12]:

Так, начнём пытать: что за массив? Какой размерности?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 6 мая 2009, 23:33 [#13]:

// Пример
 
const
  N = 100; // Размер массива
 
type
  TMyArray = array[0..N - 1] of Integer;
 
// Функция, возвращающая номер первого минимального элемента массива
function GetMinElement(const M: TMyArray): Integer;
var
  Index, Min: Integer;
begin
  Min:= 2147483647;
  Result:= Low(TMyArray);
 
  for Index:= Low(TMyArray) to High(TMyArray) do
    if Min > M[Index]
      then begin
             Min:= M[Index];
             Result:= Index;
           end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MaxWooD

MaxWooD (статус: Посетитель), 6 мая 2009, 23:38 [#14]:

Массив M[k, n1]. размерность(не пойму что такое) числовой целый integer
k от а до e[2]; n1 от a до e[2] + e[1]
Сначало считаем M[1, 1] M[1, 2] M[1, 3]-> min
M[2, 1] M[2, 2] M[2, 3]-> min
Показать min M[1, ?] M[2, ?]
Надеюсь изложил правильно!
min@y™

min@y™ (статус: Доктор наук), 6 мая 2009, 23:52 [#15]:

Цитата:

Надеюсь изложил правильно!

Сам-то понял? Я - нет.

Пример правильно поставленной задачи.
-------------------------------------
Дан массив из 100 случайных целых чисел. Найти среди них первый минимальный элемент и вывести этот элемент и его индекс на экран.
-------------------------------------
Заметь, никаких упоминаний о переменных. Попробуй по этому примеру сформулировать свою задачу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 6 мая 2009, 23:53 [#16]:

Я спать пошёл. Не знаю, как там у тебя, а у меня 23:52, а завтра праздник. Надо выспаться.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MaxWooD

MaxWooD (статус: Посетитель), 6 мая 2009, 23:56 [#17]:

Массив представляет собой матрицу состоящюю из строк и столбцов например 100 на 100 M[№ столбца,№строки]
min@y™

min@y™ (статус: Доктор наук), 7 мая 2009, 08:15 [#18]:

Цитата:


Массив представляет собой матрицу состоящюю из строк и столбцов например 100 на 100 M[№ столбца,№строки]


Ну и что с этой матрицей делать? Найти минимальный элемент?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MaxWooD

MaxWooD (статус: Посетитель), 7 мая 2009, 14:37 [#19]:

begin
for k:= a to e[2] do //считаем массив столбец
begin
x3[k]:= x3[k] + k;
min:= 1000;
for n1:= a to e[2] + e[1] do // считаем массив строка
begin
if ((s[x3[k]+e[1]-z2[n1]])>0) then
M[k, n1]:= (x3[k]) + (C2[n1 + a]) + (s[x3[k] + e[1] - z2[n1]]); // значения в строке
{Writeln('M = ', M[k, n1]);}
if ((s[x3[k]+e[1]-z2[n1]])>0) then
if min > M[k, n1]
then ((min:= M[k, n1])and (t[n1]:=M[k, n1]));
t[n1]:=min;
end; // then
Writeln('x3= ':3, x3[k],'S2= ':7, Min:3,'t= ':7, t[n1]:3{,'z2*= ':7, z2[n]{,'z2*= ':7, z2[n]}); // минимальное значение в строке
end; // for
end; // then

writeln ( ' '); // разделитель

x4:=0;
for n:= a to (e[2]) do
begin z3[n]:=n+a;

begin
if (z3[n]>=0) and (z3[n]<=5) then
C3[n]:=10*z3[n]
else
begin //условие по функции C(z3)
if (z3[n]>=6) and (z3[n]<=15)then
C3[n]:=50+20*(z3[n]-5)
else Write('ne_v_prdelax')
end;
h[n]:=(C3[n+a])+z3[n]+(t[n1]);

writeln ( 'z3= ',z3[n],'c3= ':7,c3[n]:2,'S3= ':7,h[n]{,' C(z1)= ',c,'t=',t,'c2=',c2[n],'X3=',x3[k]}); //главнвя диаганаль матрицы или сумма
end;
end;

нужно (t[n1]) присвоить мин значение массива
min@y™

min@y™ (статус: Доктор наук), 7 мая 2009, 22:48 [#20]:

ДА НЕ БУДУ Я ЧИТАТЬ ТВОЙ ЖУТКИЙ ИСХОДНИК!!!! Ну сформулируй ты вопрос по-человечески! Без переменных, просто абстрактно сформулируй: дано вот это, надо найти вон то и всё.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 23 февраля 2020, 02:21
Выполнено за 0.03 сек.
Рейтинг@Mail.ru