Форум
» Назад на решение задач по физике и термеху
Регистрация | Профиль | Войти | Забытый пароль | Присутствующие | Справка | Поиск

» Добро пожаловать, Гость: Войти | Регистрация
    Форум
    Информационные технологии
        Решение задач на Pascal. Форум 2
Отметить все сообщения как прочитанные   [ Помощь ]
» Добро пожаловать на форум "Информационные технологии" «

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 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 ]
Модераторы: paradise, KMA
  

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

Эта тема закрыта, новые ответы не принимаются

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 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 ]

Форум работает на скрипте © Ikonboard.com