KMA
Долгожитель
|
Ошибка в процедуре VVOD;
Code Sample:
for i:=1 to n do begin with r1 do begin writeln('Введите марку машины'); readln(model); writeln('Введите год выпуска'); readln(year); writeln('Введите цвет'); readln(color); writeln('Введите номер'); readln(number); write(f,r1); end; write (f, r1); end;
Вообще суть сортировки ничем не отличается от обычной работы с массивом, и сортировать точно так же его надо. Я покажу просто вид сортировки, а уже выборку по черному ты сделаешь сам. Для вашего удобства возьму пузырьковую... Но если будет желание и другой могу воспользоваться.
Code Sample:
procedure SORT; var _bufArray: array [1..n] of car; _buf: car; _fileOfCars: file of car; i, j, k: byte; Begin assign (_fileOfCars, 'input.dat'); reset (_fileOfCars); k:=1; {заполним массив данными} while not eof (_fileOfCars) do begin read (_fileOfCars, _buf); _bufArray[ k ]:=(_buf); inc (k) end; {сортируем массив по полю номер} for i: = 1 to k - 1 do for j:= i to k-1 do if _bufArray[ j ].nomer< _bufArray [ j+1 ].nomer then begin _buf:=_bufArray [ j ]; _bufArray[ j ]:=_bufArray [ j+1 ]; _bufArray [ j+1 ]:=_buf end; {в итоге у тебя отсортированный массив, а уже его ты можешь юзать куда захочешь} End;
(Сообщение отредактировал KMA 25 дек. 2007 12:36)
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 8 нояб. 2007 20:06 | IP
|
|
xKOSTx
Новичок
|
Огромное спасибо, очень помог.
Code Sample:
read (_fileOfCars, _buf); _bufArray[ k ]:=(_buf); inc (k)
А в процедуре VVOD как раз правильно у меня:
Code Sample:
for i:=1 to n do begin with r1 do begin writeln('Введите марку машины'); readln(model); writeln('Введите год выпуска'); readln(year); writeln('Введите цвет'); readln(color); writeln('Введите номер'); readln(number); write(f,r1); end; write (f, r1); end;
если поставить write после end'а, в файл запишутся только данные о n-ой машине. Попутно нашел еще пару недочетов в работе %). Будем надеятся на хорошую оценку... Спс еще раз. (Сообщение отредактировал xKOSTx 8 нояб. 2007 23:11)
|
Всего сообщений: 2 | Присоединился: ноябрь 2007 | Отправлено: 8 нояб. 2007 22:53 | IP
|
|
nicol
Новичок
|
Пожалуйста, помогите решить задачу. Понимаю, что здесь надо рассматривать последовательноть как массив?А как ограничить перебор? Сосчитайте количество способов расставить 2N различных чиселиз интервала от1 до 2N по кругу так, чтобы никакие два последовательных числа 2i-1 и 2i не стояли рядом. (Сообщение отредактировал nicol 9 нояб. 2007 14:42)
|
Всего сообщений: 1 | Присоединился: ноябрь 2007 | Отправлено: 9 нояб. 2007 12:41 | IP
|
|
KMA
Долгожитель
|
А в процедуре VVOD как раз правильно у меня:
Так дубль два. То что находиться в теле цикла выполняется за 1 итерацию. Если бы ты был по внимательнее, то мог бы заметить, что я добавил к циклу for логические скобки, т. е.
Code Sample:
for i:=1 to n do begin with ... {первый оператор} write (f, r1) {второй оператор} end;
У тебя же был просто цикл с одной операцией with. Может ты не досмотрел. Но ошибка там есть, может и не явная, но у меня на FP не компилируется такого рода код. Тут дело в том, что ты обращаешься к полю r1. У тебя получается r1.r1, что соответственно не верно. А вот про k ты верно подметил. Писал вначале с i, потом передумал, заменил на k. Короче, молодец, здесь верно. Значит понимаешь в чем суть.
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 9 нояб. 2007 20:49 | IP
|
|
bekas
Долгожитель
|
Чем реже встречаются ошибки, тем они ценее.Ежи Лец Особенно в цитировании и особенно в русском языке: ценнее
|
Всего сообщений: 379 | Присоединился: январь 2006 | Отправлено: 10 нояб. 2007 23:43 | IP
|
|
KMA
Долгожитель
|
Особенно в цитировании и особенно в русском языке: ценнее
Ээээ, спасибо... Классно подколол. Мне стыдно... мне действительно очень стыдно. Еще раз спасибо.
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 11 нояб. 2007 12:54 | IP
|
|
Zheka
Новичок
|
А вот и снова я беспокою. Снова не работает программа... Сначала текст задачи: Составьте программу для решения следующей задачи, используя обращение к процедуре и функции. Даны массивы X(8), Y(8), Z(10), W(15), элементы которых определяются по формулам: xi=a1и2-a2(5-i); yi=b1sin(2i)+b2e^i-5; zi=c1(i-4)+c2sin2(1,5i); wi=d1ln(0,1i)+d2cos3(i-2,5). a1a2b1b2c1c2d1d2 2 10 4 6 8 3 5 12 Найдите произведение максимальных отрицательных элементов массивов Y,Z,W. Вот программа: program Lb9; const n=8; m=10; l=4; type raz=1..n; massiv=array[raz] of real; var X,Y,Z,W:massiv; Dobutok,maxY,maxZ,maxW:real; i:integer; procedure Maximum(A:massiv;k:integer; max:real); var i:integer; begin max:=A[1]; for i:=2 to k do if (A[ i ]<0) and (A[ i ]>max) then max:=A[ i ]; end; function Dob(b,c,d:real):real; var P:real; begin P:=b*c*d; end; begin writeln(' ':10,'массив‚ X '); for i:=1 to n do begin X[ i ]:=2*sqr(i)-10*(5-i); write(X[ i ]:4:2,' ':4); end; writeln; writeln; writeln(' ':10,'массив‚ Y '); for i:=1 to n do begin Y[ i ]:=4*sin(2*i)+6*exp(i-5); write(Y[ i ]:4:2,' ':4); end; writeln; writeln; writeln(' ':10,'массив‚ Z '); for i:=1 to m do begin Z[ i ]:=8*(i-4)+3*sqr(sin(1.5*i)); write(Z[ i ]:4:2,' ':2); end; writeln; writeln; writeln(' ':10,массив‚ W '); for i:=1 to l do begin W[ i ]:=5*ln(0.1*i)+12*exp(3*ln(cos(i-2.5))); write(W[ i ]:4:2,' ':2) end; writeln; writeln; Maximum(Y,n,maxY); Maximum(Z,m,maxZ); Maximum(W,l,maxW); Dobutok:=Dob(maxY,maxZ,maxW); writeln('maxY=',maxY:4:2,'; ','maxZ=',maxZ:4:2,'; ','maxW=',maxW:4:2,'; '); writeln('Dobutok=',Dobutok:4:2); end. В этой программе у меня две неясности: 1) в строке ввода массива W выдаёт ошибку "блуждающая точка" на пятой итерации; 2) даже если исключить предидущую ошибку (уменьшил массив W до 4 итераций) всё равно в результате выводятся одни нули...
|
Всего сообщений: 19 | Присоединился: октябрь 2007 | Отправлено: 13 нояб. 2007 3:54 | IP
|
|
KMA
Долгожитель
|
По поводу второго могу сразу сказать. Учи и смотри тему "Подпрограммы". Смотри:
Code Sample:
procedure your_proc (x, y: integer); begin x:=x+10; y:=y+10 end;
То после выполнения программы:
Code Sample:
a:=20; b:=40; your_proc (a, b); write (a, ' ', b)
Как думаешь, какой результат будет? Если "30 50", то ошибаешься, результат будет "20 40". Почему? Да потому что ты не давал право процедуре изменять эти переменные. А вот если бы процедура была описана так:
Code Sample:
procedure your_proc (var x, y: integer); begin x:=x+10; y:=y+10 end;
То все было бы хорошо и ответ вернули бы "30 50" Далее... Я уже не раз говорил, что нужно быть внимательным, при вычислении функций с ограниченными областями определения. Тем более, что это такое?
wi=d1ln(0,1i)+d2cos3(i-2,5)
и твое в коде:
for i:=1 to l do begin W[ i ]:=5*ln(0.1*i)+12*exp(3*ln(cos(i-2.5))); write(W[ i ]:4:2,' ':2) end;
??? Чего то я логику не улавливаю. И еще одно:
function Dob(b,c,d:real):real; var P:real; begin P:=b*c*d; end;
Я не удивлюсь, если вернет случайное число. и вообще не выдает никакой ошибки, добавь в тело функции:
Code Sample:
dob:=P;
(Сообщение отредактировал KMA 13 нояб. 2007 17:42)
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 13 нояб. 2007 17:41 | IP
|
|
KMA
Долгожитель
|
Еще один прикол заметил. Кто тебе сказал, что первый элемент будет отрицательным? То-то же. Поэтому процедуру максимума надо переписать:
Code Sample:
procedure maximum (A: massiv; const k: integer; var max: real); Var i, j: byte; Begin i:=1; while (A[ i ]>0) and (i<>n) do inc (i); max:=A[ i ]; for j:=i to n do if (max<A[j]) and (A[j]<0) then max:=A[j]; End;
И еще... Уважаемый, вежливость никто не отменял. Все же вы о помощи просите, ведь так? Поэтому используйте слова типа: "Будьте добры", "Пожалуйста", "Заранее спасибо" и т. д. А то создается жуткое впечатление что Вам мы чем-то обязаны. (Сообщение отредактировал KMA 13 нояб. 2007 17:56)
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 13 нояб. 2007 17:52 | IP
|
|
Zheka
Новичок
|
Спасибо большое за указанные ошибки. Да, действительно не разобрался я с описанием переменных в процедуре, поэтому и не заметил грубой ошибки. Что касается второго момента: в формулу я подставил значения которые у меня даны по условию (d1, d2) и ещё я забыл исправить ошибку, в формуле не cos3(i-2,5), а cos^3(i-2,5). Если у меня и есть ошибка в формуле, то я её почему-то не вижу. Ограничения... Даже если они присутствуют, только никак не на пятой итерации (проверял вручную, калькулятор выдаёт нормальное число)... Помоги пожалуйста найти причину ошибки! Ещё раз спасибо за помощь. Основная ошибка как раз была в поиске максимума...Снова я не предусмотрел маленький нюанс из-за которого у меня в результате и выдавало одни нули. Вобщем, в основном наделал я ошибок из-за того, что не до конца разобрался в процедурах и снова был невнимательным Хотя, скажу честно, над этой программой я думал очень долго и чтобы не допустить простых ошибок долго перепроверял программу, но увы, я снова недоглядел. Честно говоря я был очень удивлён, что у меня в программе нашлось столько ошибок
|
Всего сообщений: 19 | Присоединился: октябрь 2007 | Отправлено: 14 нояб. 2007 0:00 | IP
|
|
|