Алгоритм Дейкстры, перевод с Pascal - C#
Формулировка задачи:
есть программа на языке Pascal, реализующий алгоритм Дейкстры, которую нужно переделать под С#
Половину передалал, но затрял на тому, что переменная "w" не присвоенно значеннию.
помогите исправить ошибку, и, если не трудно доделать ее.Буду благодарен за помощь))
вот код на Pascale:
Мой код на C#:
Листинг программы
- Program Dijkstra;
- Uses Crt;
- Label 1,2,3;
- Var
- n,i,j,m,a_0,a_n,sum,k,min,ind,w,v_:Integer;
- S,D,P,V:Array[1..10]of Integer;
- C:Array[1..10,1..10]of Integer;
- SIM:Array[1..10,1..20] Of Char;
- prom:Char;
- simbol:String;
- cifra:Integer;
- Function v_s(ind:Integer):Boolean;
- Var i : Integer;
- Begin
- v_s := False;
- For i:=1 To n Do
- If (s[i]=ind) Then
- v_s:= True;
- End;
- Begin
- ClrScr;
- Write('Введите количество a/п : ');
- Readln (n);
- Write('Введите количество авиалиний : ');
- Readln(m);
- Writeln('');
- Write('V={');
- For i:=1 To n Do
- Begin
- V[i]:=i;
- If (i<>n) Then
- Write(V[i],',')
- Else
- Write(V[i],'}');
- End;
- sum:=0;
- C[1,2] := 10; C[1,4] := 30; C[1,5] := 100;
- C[2,3] := 50;
- C[3,1] := 70; C[3,5] := 10;
- C[4,3] := 20;
- C[5,4] := 60;
- Writeln('');
- For i:=1 To n Do
- For j:=1 To n Do
- Begin
- Write('Введите номер а\п отправления : ');
- Readln(a_0);
- Write(''Введите номер а\п назначения : ');
- Readln(a_n);
- Write('Введите время полёта по авиалинии : ');
- Readln(C[a_0,a_n]);}
- If (C[i,j] <> 0) Then
- sum:=sum+C[i,j];
- writeln;
- End;
- For i:=1 To n Do
- Begin
- If (Round(n/2)=i) Then
- Write ('C=')
- Else
- Write(' ');
- For j:=1 To n Do
- Begin
- If (C[i,j]=0) Then
- Begin
- C[i,j]:=sum;
- Write(' ~',' ');
- End
- Else
- Write(C[i,j],' ');
- End;
- Writeln(' ');
- End;
- S[1]:=1;
- For i:=1 To n Do
- V[i]:=V[i+1];
- For i:=2 To n Do
- Begin
- P[i]:=1;
- D[i]:=C[1,i];
- End;
- For k:=1 To (n-1) Do
- Begin
- min:=sum;
- For i:=2 To n Do
- If ((D[i]<=min)And(Not(v_s(i)))) Then
- Begin
- min:=D[i];
- w:=i;
- End;
- For i:=1 To n Do
- If (S[i]=0) Then
- Begin
- S[i]:=w;
- Goto 1;
- End;
- 1: For i:=1 To n Do
- If (V[i]=w) Then
- Begin
- For j:=i To n Do
- V[j]:=V[j+1];
- Goto 2;
- End;
- 2: i:=1;
- v_:=V[i];
- While (v_<>0) Do
- Begin
- If (D[v_] > (D[w]+C[w,v_])) Then
- Begin
- D[v_]:=D[w]+C[w,v_];
- P[v_]:=w;
- End;
- i:=i+1;
- v_:=V[i];
- End;
- End;
- writeln;
- Write ('D={');
- For i:=2 To n Do
- If (i<>n) Then
- Write(D[i],',')
- Else
- Write (D[i],'}');
- writeln;
- Write('P={');
- For i:=2 To n Do
- If (i<>n) Then
- Write (P[i],',')
- Else
- Write (P[i],'}');
- For i:=2 To n Do
- Begin
- j:=1;
- Str(i,simbol);
- SIM[i,j]:=simbol[1];
- 3:If (j=1) Then
- Begin
- Str(P[i],simbol);
- prom:=simbol[1];
- End
- Else
- Begin
- Val(prom,cifra,cifra);
- Str(P[cifra],simbol);
- prom:=simbol[1];
- End;
- j:=j+1; SIM[i,j]:='>'; j:=j+1; SIM[i,j]:='-'; j:=j+1;
- SIM[i,j]:=prom;
- If (prom<>'1') Then
- Goto 3;
- End;
- Writeln(' ');
- For i:=2 to n Do
- Begin
- Writeln('');
- For j:=20 downto 1 Do
- Write(SIM[i,j]);
- Write(' = ',D[i]);
- End;
- readln;
- End. {Dijkstra}
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Metod_Dijkstra
- {
- class Program
- {
- static void Main(string[] args)
- {
- int n, i, j, m, a_0, a_n, sum, k, min, ind, w, v_;
- int[] V = new int[10];
- int[] S=new int[10];
- int[] D=new int[10];
- int[] P=new int[10];
- int[,] C = new int[10, 10];
- char[,] SIM = new char[10, 20];
- char prom;
- string simbol;
- int cifra;
- Console.Write("Введите количество а/п : ");
- n = int.Parse(Console.ReadLine());
- Console.Write("Введите количество авиалиний : ");
- m = int.Parse(Console.ReadLine());
- Console.Write("V={");
- for (i = 1; i <= n; i++)
- {
- V[i] = i;
- if (i != n)
- {
- Console.Write(V[i]);
- Console.Write(",");
- }
- else
- {
- Console.Write(V[i]);
- Console.WriteLine("}");
- }
- }
- sum = 0;
- C[1, 2] = 10; C[1, 3] = 30; C[1, 4] = 100;
- C[2, 1] = 10; C[2, 4] = 80; C[2, 5] = 50;
- C[3, 4] = 40; C[3, 6] = 10;
- C[4, 6] = 60;
- C[5, 3] = 70;
- C[6, 5] = 20;
- for (i = 1; i <= n; i++)
- {
- for (j = 1; j <= n; j++)
- {
- Console.Write("Введите номер аП отправления : ");
- a_0 = int.Parse(Console.ReadLine());
- Console.Write("Введите номер ап назначения : ");
- a_n = int.Parse(Console.ReadLine());
- Console.Write("Введите время полета по авиалинии: ");
- C[a_0, a_n] = int.Parse(Console.ReadLine());
- if (C[i, j] != 0)
- {
- sum = sum + C[i, j];
- Console.WriteLine();
- }
- }
- }
- for (i = 1; i <= n; i++)
- {
- if (n / 2 == i)
- Console.Write("C=");
- else
- Console.Write(" ");
- for (j = 1; j <= n; j++)
- {
- if (C[i, j] == 0)
- {
- C[i, j] = sum;
- Console.Write("~");
- Console.Write(" ");
- }
- else
- {
- Console.Write(C[i, j]);
- Console.Write(" ");
- }
- }
- Console.Write(" ");
- }
- S[1] = 1;
- for (i = 1; i <= n; i++)
- V[i] = V[i + 1];
- for (i = 2; i <= n; i++)
- {
- P[i] = 1;
- D[i] = C[1, i];
- }
- for (k = 1; k <= n - 1; k++)
- {
- min = sum;
- for (i = 2; i <= n; i++)
- {
- if (D[i] <= min)
- {
- min = D[i];
- w = i;
- }
- }
- for (i = 1; i <= n; i++)
- if (S[i] == 0)
- {
- S[i] = w;//ошибка "переменной w не присвоенно значеннию";
- goto one;
- }
- }
- one:
- for (i = 1; i <= n; i++)
- {
- if (V[i] == w)
- {
- for (j = 1; j <= n; j++)
- {
- V[i] = V[j + 1];
- goto two;
- }
- }
- }
- two:
- i = 1;
- v_ = V[i];
- }
- }
- }
- }
Решение задачи: «Алгоритм Дейкстры, перевод с Pascal»
textual
Листинг программы
- Function v_s(ind:Integer):Boolean;
- Var i : Integer;
- Begin
- v_s := False;
- For i:=1 To n Do
- If (s[i]=ind) Then
- v_s:= True;
- End;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д