Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Александровна
Статус: Академик
Рейтинг: 8279
∙ повысить рейтинг »
Орловский Дмитрий
Статус: Академик
Рейтинг: 5521
∙ повысить рейтинг »
Гусятинер Леонид Борисович aka lamed
Статус: Академик
Рейтинг: 5419
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Pascal (Паскаль)

Номер выпуска:1191
Дата выхода:12.06.2011, 23:00
Администратор рассылки:Boriss (Академик)
Подписчиков / экспертов:171 / 176
Вопросов / ответов:1 / 1

Вопрос № 183436: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Написать программу, которая по введенному графу составит систему уравнений Колмогорова. Использовать линейные списки, ввод вершин графа осуществляется с клавиатуры по...



Вопрос № 183436:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

Написать программу, которая по введенному графу составит систему уравнений Колмогорова.
Использовать линейные списки, ввод вершин графа осуществляется с клавиатуры по приглашению:
введите количество вершин графа n: (ввод)
введите вершины, исходящие из вершины Si и интенсивность потока aij для каждой вершины (ввод)
и т.д до n-ой вершины

далее нужно вывести на экран полученную систему уравнений.
вот исходный граф


Отправлен: 30.05.2011, 22:32
Вопрос задал: Романенко Татьяна Викторовна (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Сергей Бендер (Практикант) :
Здравствуйте, Романенко Татьяна Викторовна!

Вот решение с линейным списком. Я немного пытался организовать двумерную матрицу, но потом оставил эту затею -- не стоит того. Таким образом, в линейном списке задаётся матрица связности (т.е. список рёбер со значениями инцидентных узлов и весами -- интенсивностями. Задана функция, которая по номерам i и j выдаёт коэффициент матрицы, и сделан текстовый вывод на экран.

Код :
uses crt;

{Элемент линейного списка}
type prebro=^rebro;
     rebro = record
                   {Начальная и конечная вершины ребра}     
                   p1,p2:integer;
                   {Интенсивность}
                   alfa:real;
                   {Ссылка на следующий элемент списка}
                   next:prebro;
             end;

{Добавить ребро с вершинами p1 и p2 и интенсивностью alfa}             
procedure add(var g:prebro;p1,p2:integer;alfa:real);
var q:prebro;
begin
     {Если список пуст}   
     if g=nil
     then begin
          {Создаем первый элемент}
          new(g);
          g^.p1:=p1;
          g^.p2:=p2;
          g^.alfa:=alfa;
          g^.next:=nil;
     end
     {иначе}
     else begin
          {сдвигаемся на конец}
          q:=g;
          while q^.next<>nil do
                q:=q^.next;
          {и дабавляем новый элемент туда}
          new(q^.next);
          q^.next^.p1:=p1;
          q^.next^.p2:=p2;
          q^.next^.alfa:=alfa;
          q^.next^.next:=nil;
     end;
end;

{Расчёт i,j-го коффициента матрицы левой части 
системы уравнений Колмогорова, т.е. коэффициент при 
j-том p в i-том уравнении}
function Aij(g:prebro;i,j:integer):real;
var sum:real;
begin
     sum:=0;
     {при диагональном элементе -- сумма всех исходщих интенсивностей
     со знаком минус}
     if i=j
     then begin
          {перебирается весь список}
          while (g<>nil) do
          begin
               {если встретилось ребро, выходящее из i}
               if g^.p1=i
               then sum:=sum-g^.alfa;
               g:=g^.next;
          end;

     end
     {при остальных элементах -- входящая интенсивность для 
     данной пары вершин i и j.
     Примечание: я не стал исключать возможности нескольких 
     рёбер на одной и той же паре вершин. Это требует лишь 
     добавления break под условие}
     else begin
          while (g<>nil) do
          begin
               if (g^.p1=j) and (g^.p2=i)
               then sum:=sum+g^.alfa;
               g:=g^.next;
          end;
     end;
     Aij:=result;
end;

var graf:prebro;
    n,m,i,j:integer;
    a:real;
begin
     write('Vvedite kolichestvo vershin grafa: ');
     readln(n);
     i:=1;
     while i<=n do
     begin
          writeln('Vershina ',i);
          write('Vvedite nomer smezhnoy vershiny (0 - zakonchit): ');
          readln(m);
          if (m<1) or (m>n)
          then begin
               if m=0
               then inc(i)
               else writeln('Neverny nomer vershiny');
               continue;
          end;
          write('Vvedite intensivnost alfa_',i,'_',m,': ');
          readln(a);
          add(graf,i,m,a);
     end;
     
     {Ниже программно вводится заданный граф. 
     Можно это раскомментарить, а можно стереть  }
     {n:=5;
     add(graf,1,2,1);
     add(graf,1,3,1);
     add(graf,3,2,1);
     add(graf,3,4,1);
     add(graf,4,5,1);
     add(graf,5,3,1);}

    {Вывод на экран}
    clrscr;
    for i:=1 to n do
    begin
         write('dp',i,'(t)/dt = ');
         for j:=1 to n do
         begin
              a:=Aij(graf,i,j);
              {Если коэффициент ненулевой -- слагаемое выводится на экран.
              Если положительное -- добавляется знак плюс }
              if a>0
              then write ('+');
              if a<>0
              then write(a:0:2,'*p',j,'(t) ');
         end;
         writeln;
    end;
    readkey;
end.

Ответ отправил: Сергей Бендер (Практикант)
Ответ отправлен: 09.06.2011, 01:15
Номер ответа: 267649
Тел.: 8-912-761-0437
Организация: Удмуртский ГосУнивеситет. г. Ижевск.
Абонент Skype: ostapbskype

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267649 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное