Jump to content
theparasite

Salutări.. Problemă C++

Recommended Posts

Posted

Decât s? vi cu un r?spuns a?a banal ca acesta, mai bine nu te b?ga.

Ce am încercat?

Am nevoie doar de secven?a de citire a unui fi?ier de la coad? pentru rezolvarea a unui program eficient. Nu am nevoie de teoriile tale pentru teme ?i alte rahaturi.

Doar de asta am nevoie, nu am idee care este ?i nici pe internet nu g?sesc mare lucru. De asta am apelat aici, în speran?a c? cineva îmi va spune.

Mul?umesc

  • Downvote 1
  • Active Members
Posted

Bun. Hai sa o luam cu inceputul.

1. Indiferent ca e tema sau nu, iti foloseste, nu ? Nu sunt maica-ta sau altcineva ca sa iti tin eu predici.

2. Esti arogant si ai 4 posturi chiar daca esti de 2 ani pe forum.

3.


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

int main()
{
std::ifstream in("main.txt");

if (in.is_open())
{
std::vector<std::string> lines_in_reverse;
std::string line;
while (std::getline(in, line))
{
lines_in_reverse.insert(lines_in_reverse.begin(), line);
}
}
}

sau


std::vector<std::string> lines_in_order;
std::string line;
while (std::getline(in, line))
{
lines_in_order.push_back(line);
}

Al doilea e mai eficient :)

Posted (edited)

Tu e?ti cel care m-a tratat cu arogan??, nu eu. Eu doar am întrebat, este evident c? mi-am stors capul de idei referitoare la cum a? putea s? o fac, dar nu de?in cuno?tiin?ele necesare.

Apreciez c? ai postat, dar nu în?eleg nimic. Acestea sunt singurele metode?

S? m? explic pu?in.

Am un program care con?ine 10000 numere într-un fi?ier text. Mi se cere afi?area penultimului num?r impar + pozi?ia lui. Am f?cut asta într-un while, dar condi?ia optim? este atunci când citesc s? fac citirea de la cap?t, pentru a nu fi nevoit s? trec prin 10.000 de numere pân? ajung la penultimul impar.

 
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f("BAC.TXT");
int x, ok=0,impar,i=0;
while(...citire de la coad? && ok<2) if(x%2==1) { ok++; impar=x; i++;}
cout<<"Numarul este "<<impar<<" "<<"si pozitia lui este: "<<10000-i;
return 0;
f.close();
}

@S.L.C, îmi po?i da un sfat ?i f?r? s? m? judeci.

Edited by theparasite
Posted

Am un program care con?ine 10000 numere într-un fi?ier text. Mi se cere afi?area penultimului num?r impar + pozi?ia lui.

Ce inseamna pozitia lui?

Linia pe care se gaseste sau un offset in bytes de la inceputul fisierului?

Fisierul e garantat ca are acelasi numar de caractere pe fiecare rand?

Pot sa existe linii goale?

Posted
Tu e?ti cel care m-a tratat cu arogan??, nu eu. Eu doar am întrebat, este evident c? mi-am stors capul de idei referitoare la cum a? putea s? o fac, dar nu de?in cuno?tiin?ele necesare.

Apreciez c? ai postat, dar nu în?eleg nimic. Acestea sunt singurele metode?

S? m? explic pu?in.

Am un program care con?ine 10000 numere într-un fi?ier text. Mi se cere afi?area penultimului num?r impar + pozi?ia lui. Am f?cut asta într-un while, dar condi?ia optim? este atunci când citesc s? fac citirea de la cap?t, pentru a nu fi nevoit s? trec prin 10.000 de numere pân? ajung la penultimul impar.

 
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f("BAC.TXT");
int x, ok=0,impar,i=0;
while(...citire de la coad? && ok<=2) if(x%2==1) { ok++; impar=x; i++;}
cout<<"Numarul este "<<impar<<" "<<"si pozitia lui este: "<<10000-i;
return 0;
f.close();
}

@S.L.C, îmi po?i da un sfat ?i f?r? s? m? judeci.

E de apreciat modul prin care te-ai gândit s? rezolvi problema îns? trebuie s? te dezam?gesc. În contextul unui examen de bacalaureat, optimizarea respectiv? î?i poate aduce 0 puncte deoarece în programa de liceu nu se specific? ceva legat de seeking în fi?iere.

Rezolvarea trebuie s? fie cât se poate de simpl?, chiar mediocr? dac? e s-o privim dintr-un punct de vedere mai critic, astfel nu vor exista probleme la corectur?, unde profesorii sunt de mai multe feluri ?i fiecare are o oarecare libertate în a depuncta anumite linii de cod pe care nu le în?elege.

M? gândesc c? dac? te-ai gândit la varianta cu cititul de la cap la coad?, cu siguran?? ?tii s? rezolvi problema în varianta clasic?.

Toate cele bune :).

Posted
Pozi?ia lui = pozi?ia în fisier. Adic? ultimul num?r reprezint? pozi?ia 1000, penultimul 9999, primul 1, al doilea 2. La asta se refer?.

Con?ine o singur? linie cu 10000 de numere separate printr-un spa?iu. Mi se cere s? afi?ez num?rul ?i pozitia penultimului num?r impar. Trebuie doar s? citesc de la coad? ?i totul se rezolv?, dar nu ?tiu cum...

Metoda de mai sus mi se pare prea complex?, eu având un nivel novice în C++.

@H3xoR, mi se cere s? o fac în mod eficient. S? parcurg clasic nu este eficient. :)

Mul?umesc.

Eficien?a la care face referire problema st? în faptul c? nu trebuie s? folose?ti vectori pentru memorarea datelor citite ?i nici s? faci mai multe parcurgeri. Dac? nu m? crezi, întreab? un profesor :).

Spor.

Posted
@H3xoR

Okay. Tot nu am idee cum a? putea parcurge de la început pân? la final ?i s? afi?ez penultimul element impar + pozi?ia sa, f?r? s? folosesc vectori... Ai vreo idee?

O idee de rezolvare:


#include <iostream>
#include <fstream>

using namespace std;

int main()
{
int nr, a, b = 0;

ifstream in("date.txt");

while (in >> nr)
if (nr % 2 == 1)
{
a = b;
b = nr;
}

in.close();

cout << "Penultimul numar impar este " << a << endl;

return 0;
}

Singura excep?ie ar ap?rea atunci când exist? doar un singur num?r impar în fi?ier, dar m? gândesc c? este specificat undeva c? exist? cel pu?in 2 numere impare. ?i cu toate astea, dac? nu este speficicat, se poate repara.

Salut!

PS: Acum am observat c?-?i cere ?i pozi?ia.

Dac? nu te prinzi cum ai putea s-o descoperi, scrie-mi un PM.

Posted (edited)

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
int ultim = 0, penultim = 0, x, p = 0, p1 = 0, p2 = 0;

fstream f("nr.txt", ios::in);

while (f >> x)
{
p++;

if (x % 2)
{
if (p1)
{
penultim = ultim;
p2 = p1;
cout << penultim << " " << p2 << endl;
}

ultim = x;
p1 = p;

}
}

cout << penultim << " " << p2;

f.close();

system("pause");

return 1;
}

La nivelul nostru mai eficient decat atat nu il poti face decat cu 1, 2 variabile in -.

Multumesc pentru challenge

Edited by MARIUSCS
Posted (edited)

Nu stiu cat de mult ajuta dar incearca:

#include <vector>
#include <string>
#include <fstream>
#include <sstream>
#include <iterator>
#include <iostream>

int main(int argc, char **argv)
{
// Defineste tipul de container pentru a usura munca
// in caz ca dorim sa schimbam ceva mai tarziu
typedef std::vector<int> data;

// Deschide fisierul precizat
std::fstream myfile("data.txt", std::ios_base::in);

// Creaza un container de tip vector (definit mai sus)
data nums;
// Asigurate ca are spatiu initial pentru 10,000 de elemente
// Pentru a evita re-alocarea mai tarziu
nums.reserve(10000);

// Creaza un container de tip string
// pentru a stoca continutul fisierului text
std::string str;

// Du-te la sfarsitul fisierului
myfile.seekg(0, std::ios::end);
// Afla si aloca marimea fisierului in containerul de tip string
// pentru a evita re-alocarea mai tarziu
str.reserve(myfile.tellg());
// Intoarce-te la inceputul fisierului
myfile.seekg(0, std::ios::beg);

// Citeste tot continutul fisierului
// in containerul de tip string alocat mai devreme
str.assign((std::istreambuf_iterator<std::string::value_type>(myfile)), \
std::istreambuf_iterator<std::string::value_type>());

// Deschide containerul de tip string creat mai devreme
// in asa fel incat sa poti extrage numerele precum ar fi un stream
std::istringstream iss(str);

// Variabila temporara de acelasi tip cu cea stocata in vectorul definit mai sus
data::value_type num;

// Citeste numerele din containerul de tip string
// Acum daca datele sunt in memorie totul este mai rapid
while (iss >> num)
nums.push_back(num);

// Defineste si un container pentru pozitii ce poate contine
// poztii suportate de containerul cu numerele
typedef std::vector<data::size_type> positions;

// Alocheaza inca un vector pentru a stoca pozitiile numerelor impare
positions pos;

// Itereaza fiecare numar citit si daca este impar
// stocheaza pozitia lui
for (data::iterator itr = nums.begin(); itr != nums.end(); ++itr) {
if (*itr % 2) // Adaugam pozitia elementului in vectorul cu pozitii
pos.push_back(static_cast<positions::value_type>(itr - nums.begin()));
}

// Verifica daca avem mai multe numere impare
// Nu ai specificat daca pozitia trebuie sa inceapa de la 0 sau 1
if (pos.size() > 1)
// Afiseaza penultimul numar + pozitia lui
std::cout << (pos[pos.size() - 2]+1) << " : " << nums[pos.at(pos.size() - 2)] << std::endl;
else if (pos.size() == 1)
// Avem un singur element deci
std::cout << (pos[0]+1) << " : " << nums[pos.at(0)] << std::endl;
else
// Nu avem nici un numar impar
std::cout << "nici un numar impar" << std::endl;

return 0;
}

Testat pe MinGW GCC 4.9.2

Edited by S.L.C

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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



×
×
  • Create New...