imiona z pliku

0

Witam

Mam taki problem, że:
W pliku mam zapisane imiona, jedno pod drugim. Tylko żeby było ciekawiej między imionami są znaki minus i są pisane różnymi literami np.:

J--A-n
al---a
to-Me-k

I teraz muszę policzyć ile jednakowych imion jest na liście. Poradziłem sobie z pozbyciem się znaków minus i zamieniłem wszystkie znaki na duże litery, teraz trzeba tylko pewnie jakiś warunek napisać, ale za cholerę mi to nie wychodzi. Stworzyłem coś takiego w Virtual Pascalu (poniżej) troszkę tam strasznie namieszane jest, może ma ktoś pomysł na prostrze tego rozwiązanie, bardzo bym prosił o jakies przykłady. Pozdrawiam:

program shit_ver_robocza_0_0_0_0_0_1;
uses crt;
type wskaznik_listy1 = ^skladnik_listy1;
skladnik_listy1 = record
dane :string[20];
wskaznik: wskaznik_listy1;
end;

var pierwszy_skladnik, skladnik_biezacy: wskaznik_listy1;
dane,x :string;
dana0 : string;
znak:char;
plik:text;
i,j,k,p,d,a:integer;
procedure dolisty1 (var element :string;
var skladnik_biezacy: wskaznik_listy1);
var poprzedni_skladnik, nastepny_skladnik: wskaznik_listy1;
begin
if skladnik_biezacy<>nil
then begin
poprzedni_skladnik:=skladnik_biezacy;
nastepny_skladnik:=skladnik_biezacy^.wskaznik
end
else begin
poprzedni_skladnik:=nil;
nastepny_skladnik:=nil
end;
new(skladnik_biezacy);
with skladnik_biezacy^ do
begin
dane:=element;
wskaznik:=nastepny_skladnik
end;
if poprzedni_skladnik<>nil
then poprzedni_skladnik^.wskaznik:=skladnik_biezacy
end;
procedure zlisty1 (var element : string;
var pierwszy_skladnik, skladnik_biezacy:wskaznik_listy1);
var poprzedni_skladnik, nastepny_skladnik: wskaznik_listy1;
begin
if (pierwszy_skladnik<>nil) and (skladnik_biezacy<>nil)
then if pierwszy_skladnik<>skladnik_biezacy
then begin
poprzedni_skladnik:=pierwszy_skladnik;
nastepny_skladnik:=poprzedni_skladnik^.wskaznik;
if nastepny_skladnik<>skladnik_biezacy
then repeat
poprzedni_skladnik:=nastepny_skladnik;
nastepny_skladnik:=poprzedni_skladnik^.wskaznik
until nastepny_skladnik=skladnik_biezacy;
with skladnik_biezacy^ do
begin
element:=dane;
poprzedni_skladnik^.wskaznik:=wskaznik
end;
dispose(skladnik_biezacy);
skladnik_biezacy:=poprzedni_skladnik
end
else begin
with pierwszy_skladnik^ do
begin
element:=dane;
pierwszy_skladnik:=wskaznik
end;
dispose(skladnik_biezacy);
skladnik_biezacy:=pierwszy_skladnik
end
end;

begin
{clrscr;}

skladnik_biezacy:=nil;
j:=0;

assign(plik,'c:/Freepascal/imiona.txt');
reset(plik);
while not eoln(plik) do
begin
read(plik,j);
end;
writeln(j);
j:=0;

 while not seekeof(plik) do
begin
j:=j+1;
while not seekeoln(plik) do
begin
read(plik,znak);
if znak<>'-' then
dane:=dane+upcase(znak);
end;

{ write(dane);}
dolisty1 (dane,skladnik_biezacy);

if i=1 then pierwszy_skladnik:=skladnik_biezacy;

dane:='';
end;

j:=j;
writeln('Ilosc wszystkich imion na liscie: ', j);
write(skladnik_biezacy^.dane);

readln;
end.

0

Zrob sobie funkcje ktorej wynikiem jest imie bez np.

function tform1.odczytajImie(Imie:string):string;
var i,j:integer;
begin
result:=imie;
for j:=1 to length(imie) do
for i:=1 to length(imie) do
if (result[i]='-')or(result[i]=' ') then
begin
result[i]:=result[i+1];
result[i+1]:=' ';
end;
end;

Nie napisales w jaki sposob chcesz porownywac te imiona wiec nie bardzo moge ci pomoc.Tzn czy chces je poronywac z innymi zapisanymi w tym pliku czy z jakims innym wzorcowym, a z twojego kodu naprwade nie chce mi sie tego rozszyfrowywac ;P

</delphi>
0

Dopiero teraz doczytalem.Wgraj sobei wszytskie imiona do jakies tablicy a potem je porownoj. A wlasnciwie co masz zobic?? Policzyc ile wystepuje jakies imie , czy czy jakies sie powyatza i wypisac te co sie powtarza i ile razy??
stworz tablice
lista:array[1..100] of rec;

type rec=record
imie:string;
liczbapowtorzen:integer;
end;

procedure sprawdz;
i,j:integer;
begin
for j:=0 to liczbaimion-1 do
for i:=0 to liczbaimion-1 do
if (i<>j)and(Uperrcase(odczytajImie(lista[i].imie))=Upercase(odczytajImie(lista[j].imie))) then lista[i].liczbapowtorzen:=lista[i].liczbapowtorzen+1;
end;

Przy odczytywaniu imion z pliku od razu przypisuj wartosci liczbapowtorzen wartosc 0;

0

Tam ma byc UpperCase. Sorry za blad ale pozna godzina robi swoje

0

I jeszce najpierw ma zliczac i a dopero potem j tiu masz porrawiony ten kod ,nie sprawdzalem ale powienien dzialac

procedure sprawdz;
i,j:integer;
begin
for i:=0 to liczbaimion-1 do
for j:=0 to liczbaimion-1 do
if (i<>j)and(UpperCase(odczytajImie(lista[i].imie))=UpperCase(odczytajImie(lista[j].imie))) then lista[i].liczbapowtorzen:=lista[i].liczbapowtorzen+1;
end;
0

Dzięki za pomoc
Muszę policzyć ile jest jednakowych imion w pliku.
I jeszcze jedno pytanie: Jak zapisać dane z pliku do tablicy??

0
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
 rec=record
              imie:string;
              liczbapowtorzen:integer;
end;
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Label2: TLabel;
    tab: TStringGrid;
    procedure Button1Click(Sender: TObject);
    function odczytajImie(Imie:string):string;
    procedure FormCreate(Sender: TObject);
    procedure przepisz;
    procedure odczytaj;
    procedure sprawdz;
  private
    { Private declarations }
  public
  liczbaimion:integer;
  lista:array[1..100] of rec;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var imie:string;
i:integer;
begin
for i:=1 to liczbaimion do lista[i].liczbapowtorzen:=0 ;
sprawdz;
przepisz;
end;
procedure Tform1.przepisz;
var i:integer;
begin
  for i:=1 to liczbaimion do begin
  tab.cells[1,i]:=lista[i].imie;
  tab.cells[2,i]:=inttostr(lista[i].liczbapowtorzen);
  end;
  end;
  

function tform1.odczytajImie(Imie:string):string;
var i,j:integer;
begin
result:=imie;
for j:=1 to length(imie) do
for i:=1 to length(imie) do
if (result[i]='-')or(result[i]=' ') then
begin
result[i]:=result[i+1];
result[i+1]:=' ';
end;
result:=trim(result);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
odczytaj;
przepisz;
end;

Procedure Tform1.odczytaj;
var
 f:textfile;
i:integer;
bufor:string;
begin
assignFile(F,'plik.txt');

try
Reset(f);
while not eof(f) do
for i:=1 to 100 do
begin
readln(F,bufor);
if bufor<>'' then
      begin
    lista[i].imie:=bufor;
    liczbaimion:=liczbaimion+1;
    end;
end;
finally
closefile(F) ;
end;
end;

procedure Tform1.sprawdz;
var i,j:integer;
imie1,imie2:string;
begin
for i:=1 to liczbaimion do
for j:=1 to liczbaimion do
begin
if (UpperCase(odczytajImie(lista[i].imie))=UpperCase(odczytajImie(lista[j].imie))) then lista[i].liczbapowtorzen:=lista[i].liczbapowtorzen+1;
end;
end;
end.
0

Normalnie bomba sympatyczny kolego.
Tylko jeszcze mam jeden problem: Jak to przełożyć do pascala?? Bo to chyba w delphy napisane. Pozdrawiam.

0

No to jest w delphi.
Mysle ze z przerzuceniem tego do pascala nie powinienems miec wiekszych problemow.
w procedurach wywal Tform1. funkcja odczytajimie, sprawdz i odczytaj bez zmian To co w button1Click wrzuc do programu glownego. A procedure "przepisz" wywal calkiem. A w perogramie glownym w miejsxce jej wywolanie daj
for i:= 1 to liczbaimion do writeln(lista[i].imie+' wystepuje w pliku '+inttostr(lista[i].liczbapowtorzen)+' razy';

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