Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

[C++] İki satır karşılaştırma


Öne çıkan mesajlar

Mesaj tarihi:
c++ sorularım aynı hızla devam ediyor:P

şimdi arkadaşlar elimde iki ayrı dosya var. bu iki ayrı dosyada hersatırda farklı olmak üzere kelimeler var. ve bu kelimelerden bazıları her iki dosyada farklıyerlerde var. benim bu kelimeleri bulup (iki dosyada da bulunan) bir deque'in içine doldurup ekrana bu deque i bastırmam gerek.

ne yazık ki ilerlemem iki dosyanın çıktılarını almaktan öteye gidemedi:)

şekil a;

#include <fstream>
#include <string>
#include <iostream>

using namespace std;

int main(void)
{
fstream file("test1.txt");

string s;
file>> s;

while(!file.eof())
{
//cout<<s<<endl;
file>>s;
}


fstream file2("test2.txt");

string k;
file2>> k;

while(!file2.eof())
{
//cout<<k<<endl;
file2>>k;
}
file2.close();
file.close();


system("PAUSE");
return 0;
}
Mesaj tarihi:
MrLevie said:
c++ sorularım aynı hızla devam ediyor:P

şimdi arkadaşlar elimde iki ayrı dosya var. bu iki ayrı dosyada hersatırda farklı olmak üzere kelimeler var. ve bu kelimelerden bazıları her iki dosyada farklıyerlerde var. benim bu kelimeleri bulup (iki dosyada da bulunan) bir deque'in içine doldurup ekrana bu deque i bastırmam gerek.

ne yazık ki ilerlemem iki dosyanın çıktılarını almaktan öteye gidemedi:)

şekil a;

#include <fstream>
#include <string>
#include <iostream>

using namespace std;

int main(void)
{
fstream file("test1.txt");

string s;
file>> s;

while(!file.eof())
{
//cout<<s<<endl;
file>>s;
}


fstream file2("test2.txt");

string k;
file2>> k;

while(!file2.eof())
{
//cout<<k<<endl;
file2>>k;
}
file2.close();
file.close();


system("PAUSE");
return 0;
}

anlamam hiç. sadece gülen suratların çıkmasını sevmedim
Mesaj tarihi:
tam anlamadım ama
bi dosyadaki kelimeleri tree veya hash table'da kaydedip sonra diğer dosyadaki kelimeleri tek tek o datayla karşılaştırabilirsin

ne kdr büyük dosyalar bunlar kaç kelime var her birinde
Mesaj tarihi:
C++ pek anlamam ama yapman gereken dosyalardan birinden sırayla kelimeleri alacaksın. aldığın her kelimeyi diğer dosyada baştan aşağı karşılaştıracaksın. aynıysa yazdıracaksın.
söylemesi kolay yazması zor tabi kod olarak :D
Mesaj tarihi:
MrLevie said:
ben de dedim aha bu adam ilah galiba anında çözdü:P

keşke mr levie... keşke

amerikan filmi standartları ile okuyun. arada bi sn duraklayım sonra ikinci keşkeyi söyleyin. tabii bu esnada yüzlerde sıkıntılı bir ifade var.

bi kere daha uplayalım da cevap gelir belki. en azından öyle faydam dokunsun
Mesaj tarihi:
dosya iceriklerini n 'e gore parcalayip iki ayri diziye atip sonra karsilastirma/arama fonksiyonlari ile eslestirme yapabilirsin.

su deque dediginin ne oldugunu anlamadim. anladigimi yaziyorum anca =)
Mesaj tarihi:
dediğim gibi yapabilirsin
class fln yazman gerekir ilk dosyayı alır okursun baştan sonra koyarsın kelimeleri sonra da diğer dosyadan her kelime için o yapıda arama yaparsın
n^2 time olur tabi ama yapcak bişi yok:D
Mesaj tarihi:
di, deque = double ended queue

Scheriff'in dediği iyi bir çözüm.

Kelime karşılaştırmalarını kolayca yapabileceğin bir veri yapısı oluştur. B-Tree çok iyidir mesela. Nerdeyse tüm veritabanlarının alt katmanlarında B-Tree ve varyasyonları kullanılır. Hashtable da iyidir ama her string unique eşleştirilmediği için yanlış sonuçlara karşı önlem alman lazım. STL içinde vardır bu tip şeyler.

Sonra dosyanın birini satır satır oku. Her satırı bu veri yapısına ekle.

İkinci dosyayı okumaya başla. Okuduğun her satırın bu veri yapısında olup olmadığına bak. Eğer string ve B-Tree/Hashtable kullanıyorsan performansı kafana takman gerekmez. On binlerce veri içeren bir yapı içinde bile en fazla bir kaç denemede bulur olup olmadığını.
Mesaj tarihi:
hashtable ve Btree nin ne olduğunu bilmiyorum:)

ikincisi zaten düşüncem önce birinciyi okuyup sonra ikincidekiyle karşılaştırmak zaten de;

while loopun neresine sokacağıma karar veremedim.
while loopu darmağın etti
Mesaj tarihi:
veri yapısı kullanmadan yapcam diyorsun
kolay gelsin diyorum:)

ek:aslında iç içe 2 while çözer snrm sorunu ilk while'da 1. dosyadan bi kelimeyi alcan 2. while'da o kelimeyi 2. dosyanın tamamıyla karşılaştırcan varsa aynısı alcan işte yoksa ilk while yeni bi kelime alcak falan filan
Mesaj tarihi:
Veri yapısı kullanmadan yapmaya kalkarsan kompleksite karesel artar. Ama yapması zor değil. Bubblesort ile aynı mantık:


foreach line A in file 1
{
// İlk dosyadaki her satır için ikinci dosyadaki
// her satırı tek tek kontrol etceksin.
foreach line B in file 2
{
if (A equals B) add A to deque
break;
}
}


Edit: Güneş gözlüklü amcayı sildim.
Mesaj tarihi:

fstream file("test1.txt");
fstream file2("test2.txt");
string s;
file>> s;
string k;
file2>> k;

while(!file.eof())
{
file>>s;
while(!file2.eof())
{
file2>>k;
if(k==s)
{
cout<<k<<endl;
break;
}

}
}


bunu yazdım fakat sadece tek kelime ve çok ilginç

atıyorum ilk dosyanın ilk üç kelimesi;
aaa
bbb
ccc

ikinici dosyanın kelimeleri;
ttt
xxx
bbb
fff
aaa

olsun;
çıktı olarak
bbb
geliyor.
aaa
yı atlıyor.omg?
Mesaj tarihi:
Veri yapısı içinde veri barındıran bir yapı desem daha beter kızacaksın. Ama öyle yahu. Verilerin için bir konteyner.

En basitinden array bir veri yapısıdır mesela. Deque bir veri yapısıdır. Liste, Tablo, Ağaç vb şeyler veri yapısıdır. Verileri düzenli olarak saklamak, aramak, sıralamak, karşılaştırmak ve benzeri işler için kullanılır.

Bence sen şimdi yapmakta olduğun programa biraz ara verip bu tür temel şeyleri oku. Yürümeyi öğrenmeden koşmaya çalışıyorsun.
Mesaj tarihi:
haa vector falan kullanmayı biliyorum evet.

valla zaman olsa neden olmasın diyeceğim de yarına yetişmesi gerek:)

edit: durun bakalım vectore yerleştirip vectorleri karşılaştırmayı deniyim eniyisi.
Mesaj tarihi:
aaa yi atlıyo çunku sen daha while looplara girmeden ilk kelimeleri alıyorsun ve onları karşılaştırmadan while loopun içinde 2. kelimeleri alıyorsun

kısaca while ın dışındaki file>>k ve s i sil
Mesaj tarihi:
şöle ki
sen 2. while loopta kontrol ettikten sonra o dosyayı sıfırlaman lazım. imleç son bıraktığı yerde kalıyor. ilk while loopta 2. kelimeyi alıp içteki while loopa geldiği zaman bir önceki kaldığı yerden devam ediyor.
bi fonksiyon vardı bu imleci başa getirme işleminin hatırlamıorum bulursam yazarım

break le alakası yok hatanın onu yaz tekrar boşuna kontrol etmesin bütün dosyayı

ek:buldum seekg kullanımı için seekg
0 pozisyonuna getirirsen olucak snrm
Mesaj tarihi:
neyi for loopa çevircen?
bahsettiğim şey get pointerın değeri
file2>>k satırında yaptığın işlemde kullanılan bir parametre onu sıfırlaman lazım
seekg(0) kullan olcak fazla kurcalamaya gerek yok
breakle cout arasında yaz seekg yi
Mesaj tarihi:
of kafayı yiyecem

kendi kafamı yerken size de kafayı yedirecem:)

while(!file.eof())
{
file>>s;
while(!file2.eof())
{
file2>>k;

if(k==s)
{
cout<<k<<endl;
file2.seekg(0);
break;

}


}
}


bu halde sadece 2 tane çıktı veriyor.

edit: gereksiz bi kod kalmış kenarda
×
×
  • Yeni Oluştur...