Sprawdzenie wystąpienia danych.

0

Witam, mam problem z programem i już nie wiem jak to rozwiązać.
Otóż program tworzy graf, wypisuje do pliku następniki i dodatkowo muszę zrobić żeby porównywał dane, w sensie ile jest oryginalnych następników.
Po ludzku: program w 5 próbach generuje przykładowo takie następniki (dane):
4 5 2 5 3 4
1 5 1 3 4 5
2 3 2 5 1 2
1 3 2 3 4 5
4 5 3 5 2 3
Dane są traktowane jako pary cyfr/liczb (zależy jak podamy) i np. para "1 3" występuje 2 razy, "2 3" nawet 3 razy. Muszę dopisać kod, żeby program liczył ile jest unikalnych par, bez powtórzeń. Nie jest ważne jakie to są pary ale ile ich jest na ile wszystkich wygenerowanych (wszystkie wygenerowane to krep, czyli liczba_krawędziilość powtórzeń).

program Projekt; 
uses dos; 
const nmax=100; kmax=nmax*(nmax-1) div 2; 
type ind=1..nmax; ind1=1..kmax; 
Tpomiar=array[ind] of integer; 
t=array[ind] of integer; 
r=record a,b:integer end; 
t1=array[ind1] of r; { E } 
t2=array[ind,ind] of Boolean; { A } 
alfa=string[15]; 

var Tpor:Tpomiar; E:t1; A:t2; n,rep,i,k,total:integer; p:real; 
key, wariant:integer; h1,m1,s1,ms1:word; 
out:text; dev:alfa; 

procedure czyt1(var n,k,rep:integer); 
begin 
write('n, k, rep ='); read(n, k, rep); 
end; { czyt1 } 

procedure init(n:integer; var E:t1; var total:integer); 
var i,j,h:integer; 
begin 
h:=0; 
for i:=1 to n - 1 do 
for j:=i + 1 to n do 
begin 
h:=h + 1; 
with E[h] do begin a:=i; b:=j end; 
end; 
total:=h; 
end; { init } 

procedure Gnk(n,k,total:integer; var E:t1); 
var i,l,z:integer; x:r; 
begin 
l:=total; 
for i:=1 to k do 
begin 
z:=random(l) + 1; 
x:=E[z]; 
E[z]:=E[l]; 
E[l]:=x; 
l:=l-1; 
end; 
end; { Gnk } 

procedure druk1a(n,k,rep:integer); 
begin 
writeln(out); 
writeln(out, 'Gnk, n =', n:3, ', k =', k:4, ', rep =', rep:5); 
end; { druk1a } 

procedure drukE(n,total:integer; var E:t1); 
var i,h,l:integer; 
begin 
write(out, 'Nastepniki:'); 
h:=0; 
for l:=total downto total - k + 1 do 
with E[l] do 
begin 
h:=h + 1; write(out, a:4, b:3); 
if h mod 10 = 0 then writeln(out) 
end; 
writeln(out); 
end; { drukE } 

procedure pomiar(h1,m1,s1,ms1:word); 
var h2,m2,s2,ms2,sek,msek:word; 
begin 
gettime(h2, m2, s2, ms2); 
sek:=(h2 - h1)*3600 + (m2 - m1)*60 + s2 - s1; 
if (ms2 >= ms1) then msek:=ms2 - ms1 
else begin sek:=sek - 1; msek:=100 + ms2 - ms1; end; 
writeln('Czas wykonywania: ', sek, ' [s] + ', msek, '/100'); 
write(chr(7)); 
end; { pomiar} 

begin 
writeln('Plikiem z wynikami jest plik: wynik.txt'); 
assign(out, 'wynik.txt'); rewrite(out); 
randomize; 
repeat 

begin { Gnk, transEA } 

czyt1(n, k, rep); 
druk1a(n, k, rep); 
gettime(h1, m1, s1, ms1); {zaczynam mierzyc czas} 
init(n, E, total); 
for i:=1 to rep do 
begin 
Gnk(n, k, total, E); 
drukE(n, total, E); 
end; 
end; 
pomiar(h1,m1,s1,ms1); 
writeln('end? 0/1'); readln(key); 
until key=1; 
close(out) 
end.
0

Hmm..
Może dało by się dwa następujące po sobiewyniki łączyć po dwa, tzn. np 3 4 1 2 7 połączyć w 34 41 12 27 i sortować je. Wtedy można by określić ile jest powtarzających się, oraz tych, które się nie powtarzają.

0

szukaj pierwszej cyfry, następnie jak zgodna sprawdź czy następna jest taka sama jak druga szukana cyfra. Jak nie to dale szukaj pierwszej cyfry do przedostatniej w rekordzie. Jak obie się zgadzają to zwiększ index o 1. Zapamiętać szukane liczby i wynik jeżeli jest większy od zera oraz porównywać wynik z następnym szukaniem. Jeżeli wynik jest mniejszy to zmienić liczby na nowe lub dodać do tablicy w nowym wierszu przy tym samym wyniku. W przypadku jeżeli znajdzie liczby z mniejszą ilością występowania jak zapisane w tablicy to czyść tablicę i zapisz nowy rekord z wynikami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1