Pereiti prie turinio

Rekomenduojami pranešimai

Sveiki, turiu uzduoti ir man reikia igyvendinti 2 punkus. T.Y rasti

1)ilgiausių žodžių, kuris yra abejuose failuose, sąrašą (ne daugiau nei 10 žodžių) ir jų pasikartojimo

skaičių kiekviename iš failų;

2) ilgiausių žodžių, kurie yra tik faile Knyga1.txt, bet nėra faile Knyga2.txt, sąrašą (ne daugiau nei

10 žodžių) ir jų pasikartojimo skaičių;

Knyga1.txt

Laikykis atokiau nuo žmonių, kurie siekia sumenkinti tavo tikslus, svajones.

Menkaverčiai žmonės taip elgiasi, o didieji - padeda tau patikėti, kad tu irgi gali būti sėkmingas.

Knyga2.txt

Gyvenime reikia laikykis atokiau nuo žmonių, kurie siekia sumenkinti kito tikslus ir svajones.

Taip elgiasi tik menkaverčiai žmonės, o didieji - padeda tau patikėti, kad tu irgi gali būti sėkmingas.

Esu pasirases siokia tokia programa, kuri bando realizuoti pirma punkta. Beda ta kad niekaip nusugalvoju kaip rasti vienodu zodziu pasikartojimo skaiciu kiekviename is failu. + butu smagu suzinoti kaip isjungti skirtumus tarp didziuju ir mazuju raidziu (kiek zinau tokia galimybe yra tik <regex> inklude ;/)

Mano kodas:

http://pastebin.com/3ZBhAQRm visas tikrinimas vyksta nuo 59 iki 89 eilutes :)

Redagavo deividas707
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki, turiu uzduoti ir man reikia igyvendinti 2 punkus. T.Y rasti

1)ilgiausių žodžių, kuris yra abejuose failuose, sąrašą (ne daugiau nei 10 žodžių) ir jų pasikartojimo

skaičių kiekviename iš failų;

2) ilgiausių žodžių, kurie yra tik faile Knyga1.txt, bet nėra faile Knyga2.txt, sąrašą (ne daugiau nei

10 žodžių) ir jų pasikartojimo skaičių;

Knyga1.txt

 

Knyga2.txt

 

Esu pasirases siokia tokia programa, kuri bando realizuoti pirma punkta. Beda ta kad niekaip nusugalvoju kaip rasti vienodu zodziu pasikartojimo skaiciu kiekviename is failu. + butu smagu suzinoti kaip isjungti skirtumus tarp didziuju ir mazuju raidziu (kiek zinau tokia galimybe yra tik <regex> inklude ;/)

Mano kodas:

http://pastebin.com/UPKYVs9Z visas tikrinimas vyksta nuo 59 iki 89 eilutes :)

Su mazosioms/didziosioms tarkovis funkcijos toupper ir tolower, viena keicia is mazuju i didziasias, kita atvirksciai (ta prasme toupper(stringas1) == toupper(stringas2) ir nebera skirtumo tarp stringu raidziu dydziu). Pati algoritma realizuociau taip, pirma susirasciau visus zodzius, kurie yra abejuose failuose, tada ta masyva (ar kitokia duomenu talpykla) isrikiuociau mazejimo tvarka ir tada pirmus 10 zodziu (arba maziau, jeigu ju aplamai tiek nebus) pasitikrinciau kiek kartu pasikartoja ir turetumem rezultatus. Antra uzduotis analogiskai, tik pirmas punktas butu susirast visus zodzius, kurie yra tik vienam faile, o nera kitam.

Redagavo hafnis1324
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Su mazosioms/didziosioms tarkovis funkcijos toupper ir tolower, viena keicia is mazuju i didziasias, kita atvirksciai (ta prasme toupper(stringas1) == toupper(stringas2) ir nebera skirtumo tarp stringu raidziu dydziu). Pati algoritma realizuociau taip, pirma susirasciau visus zodzius, kurie yra abejuose failuose, tada ta masyva (ar kitokia duomenu talpykla) isrikiuociau mazejimo tvarka ir tada pirmus 10 zodziu (arba maziau, jeigu ju aplamai tiek nebus) pasitikrinciau kiek kartu pasikartoja ir turetumem rezultatus. Antra uzduotis analogiskai, tik pirmas punktas butu susirast visus zodzius, kurie yra tik vienam faile, o nera kitam.

Savo kode parases

for(int i=0;i<nmax;i++){
   if(tolower(Rasti(CD2, max[i]) == true)){ // true
      rf2 << max[i] << " " << max[i].length() << endl;
   }
}

tolower nesuveikia, nemeta vieno zodzio. Gal kazka ne taip panaudojau? + kiek ziurau mao variante nelabai net eitu kiekvieno pasikartojancio zodzio kieki paskaiciuoti :D kazkaip visai nepagalvojes apie tai dariau, tai taip iseina, kad nauja algoritma turiu rasyti? :(

Redagavo deividas707
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Savo kode parases

for(int i=0;i<nmax;i++){
   if(tolower(Rasti(CD2, max[i]) == true)){ // true
      rf2 << max[i] << " " << max[i].length() << endl;
   }
}

tolower nesuveikia, nemeta vieno zodzio. Gal kazka ne taip panaudojau? + kiek ziurau mao variante nelabai net eitu kiekvieno pasikartojancio zodzio kieki paskaiciuoti :D kazkaip visai nepagalvojes apie tai dariau, tai taip iseina, kad nauja algoritma turiu rasyti? :(

tolower grazina stringa/simboli su visom raidem mazosiom, tas tikrinimas ar true nelabai ten kokia prasme turi. Pvz. string stringas = "AAAA"; cout << tolower(stringas); ekrane matysi "aaaa"

Nuoroda į pranešimą
Dalintis kituose puslapiuose

tolower grazina stringa/simboli su visom raidem mazosiom, tas tikrinimas ar true nelabai ten kokia prasme turi. Pvz. string stringas = "AAAA"; cout << tolower(stringas); ekrane matysi "aaaa"

Suprantu, kad jis grazina viska is mazuju raidziu. Mano uzduotyje didziosios/maziosios raides neturi prasmet t.y jei zodziai "Menkinti"

"menkinti" ir "MENKINTI" yra visiskai vienodi. Parases tolower savo tikrinime

bool Rasti(string f){
ifstream fd(CD2);
string eil;
while(!fd.eof()){
	getline(fd, eil);
	if(tolower(eil.find(f) != -1)){
		return true;
	}
}
fd.close();
return false;
}

negaunu visiskai jokio rezultatu pasikeitimu, o jie turetu buti.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Atsiprasau labai, bet pats busiu pervertines tolower ir toupper galimybes, sitos funkcijos dirba tik su char'ais, stringu "nevalgo". Sioks toks pasiulymas butu pasirasyt tokia f-ja:

void mazinti (string & eilute) {
for (int i = 0; i < eilute.length(); i++)
    eilute[i] = tolower(eilute[i]);
}

Ir kiekviena kart nuskaicius eilute nusiusti ja i sita f-ja (t.y. po getline(fd, eil) parasyti tokia eilute: mazinti(eil); ), taip ji taps su visom mazosiomis raidemis.

Redagavo hafnis1324
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Atsiprasau labai, bet pats busiu pervertines tolower ir toupper galimybes, sitos funkcijos dirba tik su char'ais, stringu "nevalgo". Sioks toks pasiulymas butu pasirasyt tokia f-ja:

void mazinti (string & eilute) {
for (int i = 0; i < eilute.length(); i++)
    eilute[i] = tolower(eilute[i]);
}

Ir kiekviena kart nuskaicius eilute nusiusti ja i sita f-ja (t.y. po getline(fd, eil) parasyti tokia eilute: mazinti(eil); ), taip ji taps su visom mazosiomis raidemis.

Labai labai aciu! :) va rezultatai pasikeite :), tik ar mano metodu butu imanoma suskaiciuoti ta pasikartojanciu zodziu kieki? nes as sprendimo niekaip nesugebu pamatyti

Redagavo deividas707
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tiksliau viena ideja turiu, tik nezinau ar ji cia labai tinkama

int Kiekis(string k){
ifstream fd2(CD2);
string eil2;
int kiek = 0;
while(!fd2.eof()){
	getline(fd2, eil2);
	if(tolower(eil2.find(k) != -1)){ // cia tikrinu ar anttro tekstinio failo eiluteje yra zodis k
		kiek++;
	}
}
return kiek;
}

esme ta kad tikrinu ar eiluteje yra zodis (k) tik nezinau kur tiksliai sia funkcija issikviesti. Kvieciuosi cia

void AnalizuotiEilute(string eil, string skyr, int & ind, string max[]){
string zodis;
   int zpr = 0, zpb = 0;
   while ((zpr = eil.find_first_not_of(skyr, zpb)) != string::npos){
       zpb = eil.find_first_of(skyr, zpr);
       zodis = eil.substr(zpr, zpb - zpr);
    if(ind!=10){
		max[ind++] = zodis;
		//cout << Kiekis(max[ind]) << endl;
	}else{
		for(int i=0; i<ind; i++){
			if(max[i].length() < zodis.length()){
				max[i] = zodis;
				//cout << Kiekis(max[i]) << endl;
				break;
			}
		}
	}
}
}

Greiciausiai cia yra visiska nesamone, nes kito varianto nematau, gal kas turit ideju kaip kitaip daryti?

Redagavo deividas707
Nuoroda į pranešimą
Dalintis kituose puslapiuose

	if(tolower(eil2.find(k) != -1)){ // cia tikrinu ar anttro tekstinio failo 
}

 

Nesąmonė yra čia. Tu į tolower paduodi visą tą expressioną:

eil2.find(k) != -1

Kadangi yra palyginimo operatorius, tai žinoma, kad to rezultatas bus bool (true/false). tolower tam neskirtas. Turi daryti

eil2.find(tolower(k)) != -1

tolower naudoji simboliui, tada jau to numažinto simbolio ieškai.

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nesąmonė yra čia. Tu į tolower paduodi visą tą expressioną:

eil2.find(k) != -1

Kadangi yra palyginimo operatorius, tai žinoma, kad to rezultatas bus bool (true/false). tolower tam neskirtas. Turi daryti

eil2.find(tolower(k)) != -1

tolower naudoji simboliui, tada jau to numažinto simbolio ieškai.

Bet sitas tolower konvertuoja tik viena simboli jei nelystu, todel man meta errora: tolower : cannot convert parameter 1 from 'std::string' to 'int

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Bet sitas tolower konvertuoja tik viena simboli jei nelystu, todel man meta errora: tolower : cannot convert parameter 1 from 'std::string' to 'int

A, tavo "k" – stringas. :) Nu tada tau jau davė pavyzdį funkcijos, kuri sukonvertuoja visą stringą. Elementaru ten.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

A, tavo "k" – stringas. :) Nu tada tau jau davė pavyzdį funkcijos, kuri sukonvertuoja visą stringą. Elementaru ten.

Tai kiek suprantu mano pirminis variantas nebuvo klaidingas. Jei taip, tai galbut funkcija ne toje vietoje issikvieciu, kad man rezultatus

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

meta

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kiek skaiciau teorijos apie string::find, tai kiek supratau jis skaiciuoja pasikartojanciu zodziu kieki eiluteje. Bet jei yra daugiau pasikartojanciu zodziu eiluteje funkcija juos ignoruoja ir nebeskaiciuoja. Tad kiek suvokiu sis budas nera tinkamas mano norimam veiksmui atlikti, ar yra kokiu pasiulymu, funkciju, kurios darytu to ko as noriu?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

sveikas, pabandžiau pirmu bandymu padaryti abu punktus. Turbūt labai primityvu viskas, bet vis tiek gal rasi kokią idėją, kurią sau pritaikysi. Su tais dviem tavo failais berods veikia, netikrinau atidžiai :)

 


#include <iostream>
#include <fstream>
#include <vector>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;

struct PalygintiStr {
   bool operator()(const string& s1, const string& s2) {
       return s1.size() > s2.size();
   }
};

void atrinktiZodzius(string s, vector<string>& v) {
   char tmp[1000];
   strcpy(tmp, s.c_str());
   char *p;
   p = strtok(tmp," ,.-\t\n");
   while (p != NULL) {
       string konv(p);
       for (int i = 0; i < konv.size(); i++) {
           konv[i] = tolower(konv[i]);
       }
       v.push_back(konv);
       p = strtok (NULL, " ,.-");
   }
}

void zodisPasikartoja(string z, int& p, int& a, const vector<string>& v1, const vector<string>& v2) {
   for (int i = 0; i < v1.size(); i++) {
       if (z == v1[i]) {
           p++;
       }
   }
   for (int i = 0; i < v2.size(); i++) {
       if (z == v2[i]) {
           a++;
       }
   }
}

bool yraZodis(string zodis, const vector<string>& z) {
   vector<string>::const_iterator it = find(z.begin(), z.end(), zodis);
   if (it != z.end()) return true;
   return false;
}

void ilgiausiZodziai(const vector<string>& v1, const vector<string>& v2) {
   int max = 0;
   vector<string> abu; // sujungsiu abu vektorius i viena, kad patogiau butu atrinkti
   abu.reserve(v1.size() + v2.size());
   abu.insert(abu.end(), v1.begin(), v1.end());
   abu.insert(abu.end(), v2.begin(), v2.end());
   PalygintiStr pal;
   sort(abu.begin(), abu.end(), pal);
   vector<string> ilgiausi; // atrinktieji 10 zodziu
   for (int i = 0; i < abu.size(); i++) {
       if (ilgiausi.size() == 10) {
           break;
       }
       if (!yraZodis(abu[i], ilgiausi)) {
           ilgiausi.push_back(abu[i]);
       }
   }
   for (int i = 0; i < ilgiausi.size(); i++) {
       int p = 0;
       int a = 0;
       zodisPasikartoja(ilgiausi[i], p, a, v1, v2);
       cout << "Zodis: " << ilgiausi[i] << " pirmam: " << p << " antram " << a << endl;
   }
}

void ilgiausiPirmam(const vector<string>& v1, const vector<string>& v2) {
   vector<string> ilgiausi;
   for (int i = 0; i < v1.size(); i++) {
       if (ilgiausi.size() == 10) {
           break;
       }
       if (!yraZodis(v1[i], v2) && !yraZodis(v1[i], ilgiausi)) {
           ilgiausi.push_back(v1[i]);
       }
   }
   for (int i = 0; i < ilgiausi.size(); i++) {
       int kiek = 0;
       for (int j = 0; j < v1.size(); j++) {
           if (ilgiausi[i] == v1[j]) {
               kiek++;
           }
       }
       cout << "Zodis: " << ilgiausi[i] << " kartojasi: " << kiek << endl;
       kiek = 0;
   }
}

int main() {
   ifstream fin1("Knyga1.txt");
   ifstream fin2("Knyga2.txt");
   string k1, k2;
   while (!fin1.eof()) {
       k1.push_back(fin1.get());
   }
   while (!fin2.eof()) {
       k2.push_back(fin2.get());
   }
   vector<string> kn1;
   vector<string> kn2;
   atrinktiZodzius(k1, kn1);
   atrinktiZodzius(k2, kn2);
   PalygintiStr pal;
   sort(kn1.begin(), kn1.end(), pal);
   sort(kn2.begin(), kn2.end(), pal);
   cout << "1) uzd.\n\n";
   ilgiausiZodziai(kn1, kn2);
   cout << "\n2) uzd.\n\n";
   ilgiausiPirmam(kn1, kn2);
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Labas, labai tau aicu, zinau kad sitas dalykas pravers ateityje, nes kolkas su vektoriais neesu susipazines(jau turejau minti pats juos savarankiskai ismokti,nes kiek zinau jis labai naudingas irankis programavime :) Taciau kazkaip noretusi padaryti viska savaip, nes turiu siokia tokia ideja tik nezinau ar jos realizacija imanoma :) todel ir prasau cia pagalbos :). Dar karta dekoju ;)

Redagavo deividas707
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kiek skaiciau teorijos apie string::find, tai kiek supratau jis skaiciuoja pasikartojanciu zodziu kieki eiluteje.

Nu ot nė velnio :)

Searches the string for the first occurrence of the sequence specified by its arguments.

Nuo pradžios (rfind – nuo pabaigos) ieško, kur pirmą kartą bus tavo duotas stringas ir grąžina to indeksą. Toliau nebeeina. Tolimesnius pasikartojimus gali surasti vėl kviesdamas, tik pridėdamas dar vieną argumentą, nurodantį, nuo kur eiti)

string tekstas = "labas as krabas, o ne kebabas";
// tekstas.find("bas") == 2, nes tekstas[2] == 'b'; tekstas[3] == 'a'; tekstas[4] == 's'

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Matau nieko man gero neisena cia... Susiamsciau dar viena kiekio skaciavimo funkcija

int Kiek(string eil){
ifstream fd2(CD2);
string eil2;
int kiek = 0;
while(!fd2.eof()){
	size_t startAt = 0;
	getline(fd2, eil2);
	while(true){
		startAt = eil2.find(eil, startAt);
		if(startAt != string::npos){
			startAt = startAt + eil.length();
			kiek++;
			continue;
		}
		break;
	}
}
return kiek;
}

Bet nieko gero ji man nemete, iskvietus ja skaityme gavau rezultatus 0 0. Kas netingit ir galit parasyti kiekio algoritma kuris tiktu mano funkcijai? Buciau labai dekingas, nes matau, kad paciam sunkiai cia sekasi, o atrodo reikia visai nesunkaus dalyko.

Redagavo deividas707
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Greiciausiai kas yra blogiausia, kad as negaliu savo eiluciu sudeti i masyva ar kazka panasaus... Destytojas to neleido, nes tekstiniame faile gali buti milijonai eiluciu, o su tokiu duomenu kiekiu mano programa tiesiog uzlustu! Kazkokia nesamone gaunasi, nes taip iseina kad i funkcika Kiek galiu kreiptis tik is skaitymo, nes kitaip paduos tik paskutinia eilute... Viskas pasidaro itin komplikuota ir gaunasi suvarzymas, nes kreiptis galima tik vinoj funkcijoj... Ar yra kokia speciali funkcija ar kazkas panasaus kas galetu isspresti sita problema (zinau kad sito jau klausiau), bet man ne tik reikia, kad programa veiktu, bet jau ir idomu kaip ta funkcija turi atrodyti :D

Redagavo deividas707
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tikrindmas, supratau, kad mano algoritmas blogai veikia. Parasiau nauja, bet viskas sudejau i masyva, nes kitos iseities paprasciausiai nesugalvojau... Taciau su kiekiu vis dar bedos

void Vykdyti(string ilgiausiZodziai[], int & n, const char CD1[], const char CD2[], int ilgiausias){
string eil;
string zodziai[CMAX];
while (ilgiausias != 0 || n < 10){
	ifstream fd(CD1);
	while (!fd.eof() && ilgiausias != 0 && n < 10){
		int kiek = 0;
		getline(fd, eil);
		Mazinti(eil);
		EiluciuAnalize(eil, zodziai, kiek);
		for(int i = 0; i < kiek; i++){
			if(zodziai[i].length() == ilgiausias && NeraIrasytas(ilgiausiZodziai, n, zodziai[i]) && n < 10){
				if(YraAntrameTekste(CD2, zodziai[i])){
					ilgiausiZodziai[n++] = zodziai[i];
					 Kiek(ilgiausiZodziai);
				}
			}
		}
	}
	fd.close();
	ilgiausias--;
}
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jau nebereikia... Sugaisau itin daug laiko bet pasidariau, nors teko ismokti naudotis mapais. Bet neblogas irankis, su juo tik pora eiluciu kodo. Jei kazkam reikes ar reikia prasom

void Kiek(string ilgzod[], int n, map<string, int> & kiekis){
for(int j = 0; j < 2; ++j){
	ifstream fd2(j ? CD2 : CD1);
	string eil, zodis;
	int kiek = 0, kk = 0;
	int zpr = 0, zpb = 0, i = 0;
	while( ! fd2.eof() ){
		getline(fd2, eil);
		Mazinti(eil);
		while ((zpr = eil.find_first_not_of(skyr, zpb)) != string::npos){
			zpb = eil.find_first_of(skyr, zpr);
			zodis = eil.substr(zpr, zpb - zpr);
			for(int i = 0; i < n; ++i){
				if(zodis == ilgzod[i]){
					kiekis[zodis]++;
					break;
				}
			}
		}
		zpb = 0;
	}
}
for(map<string, int>::iterator i = kiekis.begin(); i != kiekis.end(); ++i){
	cout << i->first << " - " << i->second << endl;
}
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...