Jump to content

Problema Palindromuri Si Fisiere


ldd.man25

Recommended Posts

Salut tuturor, am o problema in manualul de info de cls a X-a care nu imi da si nu stiu daca e gresit problema sau nu ii gasesc eu solutia potrivita.

Vreau sa o rezolv doar cu materia invatata pana acum, adica doar cu if, while, for.

Fara vectori. 

" Din fisierul palindrom.in se citeste un numar natural nenul n, iar de pe urmatoarea linie se citesc n numere naturale nenule, separate prin cate un spatiu. In fisierul palindrom.out, sa se afiseze pe prima linie sirul citit, pe urmatoarele linii numerele care sunt palindromuri, iar pe ultima linie cate palindromuri s-au gasit sau un mesaj corespunzator. (un palindrom este un nr simetric, de exemplu 15451, 121)

 

Stiu cum sa rezolv in mare parte problema, nu reusesc sa afizes sirul de numere citit pe primul rand (asa cum cere) si apoi sa afizes in jos pe randuri diferite doar numerele care sunt palindromuri. 

 

O simpla idee, s-au sa-mi spuneti daca e posibil sau nu ar fi de folos, multumesc anticipat.

 

Ce am facut pana acum:

#include<fstream>
using namespace std;
int main()
{ int x,n,c,nr,copy,i,j=0,y;
ifstream f("palindrom.in");
ofstream g("palindrom.out");
f>>n; //aici citesc numarul de numere din fisierul palindrom.in

for(i=1;i<=n;i++)
{
 f>>x;         //aici citesc numarul
 g<<x<<' '; //afisez pe primul rand toate numerele.
 copy=x; nr=0;  //ii fac o copie pe care o folosesc la aflarea inversului
 while(copy!=0)  
  {
      c=copy%10;
      nr=nr*10+c; // inversul numarului este in variabila "nr" 
      copy/=10;
  }
     if(x==nr) // daca numarul original este egal cu inversul..
    {
        j++; // cu 'j' contorizez cate palindromuri am gasit
        g<<'n'<<x;  //afisez pe celalalt rand palindromul, dar stiu ca aici e buba.
    }

}

if(j>0)g<<'n'<<"S-au gasit "<<j<<" palindromuri."; //afisez pe ultimul rand cate palindromuri am gasit.
else g<<'n'<<"Nu s-a gasit niciun palindrom.";




f.close();g.close();
return 0;}


Apropo,

 

de exemplu, in palindrom.in am datele astea:

 

4
101 20 202 14541

si in palindrom.out, dupa rularea programului imi afiseaza:

 

101
10120 202
20214541
14541
S-au gasit 3 palindromuri.

Link to comment
Share on other sites

Daca fisierul de intrare ar arata asa: 1 12 33 41 2222 23123 454 , atunci fisierul de iesire ar arata asa:

 

1 12 33 41 2222 23123 454

1 12 33 2222 454

5 Numere gasite

 

?

 

fara vectori e putin mai intortocheat. In problema nu zice niciunde sa nu citesti fisierul de intrare de 2 ori. De ce nu il citesti odata pe tot, afisezi in fisierul de iesire toate numerele citite, si apoi parcurci din nou de la inceput fisierul de intrare, si acu afisezi doar palindroamele.. Eu cel putin asa as face, fara sa folosesc vectori sau chestii de genu.

  • Upvote 1

love is a verb
Love is a doing word

Link to comment
Share on other sites

Daca fisierul de intrare ar arata asa: 1 12 33 41 2222 23123 454 , atunci fisierul de iesire ar arata asa:

 

1 12 33 41 2222 23123 454

1 12 33 2222 454

5 Numere gasite

 

?

 

Exact asta ar trebui sa se afiseze daca fisierul de intrare este asa. (doar ca inainte de '1', ar trebui sa ai un '7', ca sa citeasca 7 numere)

Nu eram sigur ca pot (nu daca am voie, ci daca merge) sa citesc aceleasi valori de doua ori dintr-un fisier.

M-am gandit si eu, sa fac un 

for(i=1;i<=n;i++) 
{f>>x;g<<x<<' ';}            

Si apoi mai fac iar acelasi for, de unde selectez palindromurile si le afisez.

Exista o problema totusi:

primul numar citit, este numarul de numere care trebuie citite, deci, daca la sfarsitul for-ului de mai sus, nu se termina numerele din acel fisier, programul e gresit :D

Exista vreo comanda sa inceapa sa citeasca valorile din fisier, de la capat? asa ar merge.

Sau sa le afisez si in alt fisier, de unde sa le citesc iar si sa le verific daca sunt palindromuri. Problema e ca nu cred ca merge sa citesc si si afisez intr-un acelasi fisier (am incercat si nu am reusit)

Link to comment
Share on other sites

dai f.close(); si ifstream f("palindrom.in"); iarasi.


sau uitanduma aici:

http://www.cplusplus.com/doc/tutorial/files/

 

vad ca file.seekg (0, ios::beg);ar trebui sa mute cursorul inapoi la inceputul fisierului..vei citi N iarasi, dar il poti ignora (faci o citire inafara FORului).

 

 

App nu inteleg o chestie.. ai zis

"primul numar citit, este numarul de numere care trebuie citite, deci, daca la sfarsitul for-ului de mai sus, nu se termina numerele din acel fisier, programul e gresit  :D". Nu inteleg la ce te referi

love is a verb
Love is a doing word

Link to comment
Share on other sites

 

App nu inteleg o chestie.. ai zis

"primul numar citit, este numarul de numere care trebuie citite, deci, daca la sfarsitul for-ului de mai sus, nu se termina numerele din acel fisier, programul e gresit  :D". Nu inteleg la ce te referi

 

daca in fisierul de intrare sunt numerele: 

 

3

22 33 44 51 66 78

trebuie citite si verificate doar primele 3, pt ca '3' e primul nr.

daca fac un FOR doar pt a le citi si afisa pe toate (toate 3), dupa daca as mai face iar un FOR, ar continua sa citeasca pe 51, 66...

si eu vreau sa le citeasca de la capat, or sa incerc cu f.close(); si ifstream f din nou, sa vad daca le citeste de la inceput.

 

vad ca file.seekg (0, ios::beg);ar trebui sa mute cursorul inapoi la inceputul fisierului

aici nu prea inteleg eu ce vrea sa inseamne asta :))

uite aici, am scris iar, dar imi da eroare daca fac cum ai zis, vezi ca am scris niste comentarii noi 

#include<fstream>
using namespace std;
int main()
{ int x,n,c,nr,copy,i,j=0,y;
ifstream f("palindrom.in");
ofstream g("palindrom.out");
f>>n; //citesc primul numar din fisier

for(i=1;i<=n;i++) //afisez pe primul rand din fisierul de iesire, cele 'n' numere.
{
 f>>x;         
 g<<x<<' '; 
}
f.close(); //dau f.close cum ai zis tu.
ifstream f("palindrom.in"); //aici da eroare: " redeclaration of 'std::ifstream f' " 
f>>n; 
for(i=1;i<=n;i++)  //asta e FORul pentru citirea numerelor de la capat
{                       // si aflarea inversului, daca este palindrom, il afisez pe rand nou
    f>>x;              // problema e ca nu merge sa citesc fisierul de la capat, pt ca a dat eroarea de mai sus
    copy=x; nr=0;  
 while(copy!=0)
  {
      c=copy%10;
      nr=nr*10+c; 
      copy/=10;
  }
     if(x==nr) 
    {
        j++; 
        g<<'n'<<x;  
    }

}

if(j>0)g<<'n'<<"S-au gasit "<<j<<" palindromuri."; //afisez pe ultimul rand cate palindromuri am gasit.
else g<<'n'<<"Nu s-a gasit niciun palindrom.";




f.close();g.close();
return 0;}

Link to comment
Share on other sites

Salut tuturor, am o problema in manualul de info de cls a X-a care nu imi da si nu stiu daca e gresit problema sau nu ii gasesc eu solutia potrivita.

Vreau sa o rezolv doar cu materia invatata pana acum, adica doar cu if, while, for.

Fara vectori. 

" Din fisierul palindrom.in se citeste un numar natural nenul n, iar de pe urmatoarea linie se citesc n numere naturale nenule, separate prin cate un spatiu. In fisierul palindrom.out, sa se afiseze pe prima linie sirul citit, pe urmatoarele linii numerele care sunt palindromuri, iar pe ultima linie cate palindromuri s-au gasit sau un mesaj corespunzator. (un palindrom este un nr simetric, de exemplu 15451, 121)

 

Stiu cum sa rezolv in mare parte problema, nu reusesc sa afizes sirul de numere citit pe primul rand (asa cum cere) si apoi sa afizes in jos pe randuri diferite doar numerele care sunt palindromuri. 

 

O simpla idee, s-au sa-mi spuneti daca e posibil sau nu ar fi de folos, multumesc anticipat.

 

Salut ! Uita-te peste programul de mai jos, si spune-mi daca ai vreo nelamurire.

Eu mi-am dat niste teste pe care, din fericire, a mers. :)

#include <fstream>

using namespace std;

ifstream fin("date.in");
ofstream fout("date.out");

int x, xinvers, n, i, total, aux;

int main() {
    fin >> n;

    for(i = 1;i <= n;i++) {
        fin >> x;

        fout << x << ' ';
    }

    fout << 'n';

    fin.close();

    ifstream fin("date.in");

    fin >> n;

    for(i = 1;i <= n;i++) {
        fin >> x;

        aux = x;
        xinvers = 0;

        while(aux != 0) {
            xinvers = xinvers * 10 + aux % 10;
            aux /= 10;
        }

        if(x == xinvers) {
            fout << x << ' ';
            total++;
        }
    }

    if(total > 0) fout << 'n';

    if(total > 0) {
        fout << "S-au gasit: " << total << " numere palindroamen";
    }
    else {
        fout << "Nu s-a gasit niciun numar palindrom!n";
    }

    fin.close();
    fout.close();

    return 0;
}
  • Upvote 1

Daca iti iese un program din prima, inseamna ca ceva e gresit...

Link to comment
Share on other sites

#include<fstream>
using namespace std;
int main()
{ int x,n,c,nr,copy,i,j=0,y;
ifstream f("palindrom.in");
ofstream g("palindrom.out");
f>>n; //citesc primul numar din fisier

for(i=1;i<=n;i++) //afisez pe primul rand din fisierul de iesire, cele 'n' numere.
{
 f>>x;
 g<<x<<' ';
}
f.close();  //inchid f.
ifstream h("palindrom.in");  //deschid iar
h>>n; //acum se citesc numerele de la capat din palindrom in.
for(i=1;i<=n;i++)   //citesc cele n numere
{
    h>>x;              //le prelucrez si verific daca sunt palindromuri
    copy=x; nr=0;
 while(copy!=0)
  {
      c=copy%10;
      nr=nr*10+c; //in "nr" se salveaza inversul numarului citit
      copy/=10;
  }
     if(x==nr)   // daca inversul este egal cu numarul initial (=palindrom)
    {                //il afisez
        j++;
        g<<'n'<<x;
    }

}

if(j>0)g<<'n'<<"S-au gasit "<<j<<" palindromuri."; //afisez pe ultimul rand cate palindromuri am gasit.
else g<<'n'<<"Nu s-a gasit niciun palindrom.";




h.close();g.close();
return 0;}

Acum imi merge, acolo e ce am rezolvat eu, nu am mai avut timp sa postez / rezolv asta saptamana trecuta 

Oricum, multumesc pentru ajutor tuturor.

Link to comment
Share on other sites

  • Moderators
#include <fstream>
#include <cmath>
#include <vector>

using namespace std;

ifstream in("intrare.txt");
ofstream out("iesire.txt");

bool palindrom ( unsigned int numar )
{
    int l = log10 (numar) + 1;
    int i, j;
    for ( i = 1 , j = l  ; i < (int) l / 2 , j >= i ; i++, j-- )
    {
        if (numar / (int) pow (10.0, (double) l - i) % 10  !=  numar / (int) pow (10.0, (double) l - j) % 10 )
            return false;
    }
    return true;
}

int main (void)
{
    vector < int > v;
    int n, i, x;
    in >> n;
    for (i = 1 ; i <= n ; i++)
    {
        in >> x;
        out << x << ' ';
        if ( palindrom( x ) )
        {
            v.push_back( x );
        }
    }
    out << 'n';
    for ( i = 0 ; i < v.size() ; i++ )
        out << v.at( i ) << 'n';
    out << "S-au gasit " << v.size() << " elemente palindrom";
    return 0;
}
  • Upvote 1
Link to comment
Share on other sites

Mai flacai...

Mi-a dat la teza urmatoarul exercitiu:

"Din fisierul date.in se citeste un sir de numere naturale nenule, sa se afiseze pe ecran CMMDC-ul tuturor numerelor."

Trebuia sa citesc toate numerele din acel fisier si sa afisez CMMDC-ul tuturor.

Am stiut sa fac CMMDC-ul, dar nu stiam pana cand sa tot citesc, asa ca am facut pana cand se citeste 0, avand in vedere ca in acel fisier sunt numere naturale nenule si in speranta ca o data citite toate numerele, or sa se opreasca.

Am facut niste teste acum si nu prea a fost asa :))

#include<iostream>
#include<fstream>
using namespace std;
int main()
{  unsigned a,b,c;
ifstream in("date.in");
in>>a;
while(a!=0) 
{
    cout<<a<<'n';in>>a;
}
    return 0;
}

Daca in date.in am DOAR urmatoarele date:

 

1 2 3

De ce el tot continua sa citeasca si de unde citeste restul numerelor pe care le afiseaza? 

La exemplul asta, se afiseaza

 

2

2

2

2

la infinit

Care e comanda sa citesc pana cand se termina toate numerele din fisier? 

Stiu ca trebuie sa fie ceva cu "eof", gen while(!eof..."

Link to comment
Share on other sites

#include <fstream>

using namespace std;

ifstream fin("date.in");
ofstream fout("date.out");

int cmmdc(int a, int b);

int a, b;

int main() {
    fin >> a;

    while(fin >> b) {
        a = cmmdc(a, b);
    }

    fout << "CMMDC - ul numerelor din fisier este: " << a << 'n';

    fin.close();
    fout.close();

    return 0;
}

int cmmdc(int a, int b) {
    int r;

    while(b) {
        r = a % b;
        a = b;
        b = r;
    }

    return a;
}

Daca ai vreo nelamurire in legatura cu sursa, trebuie doar sa intrebi :D

Daca iti iese un program din prima, inseamna ca ceva e gresit...

Link to comment
Share on other sites

  • 4 weeks later...
#include <fstream>

using namespace std;

ifstream fin("date.in");
ofstream fout("date.out");

int cmmdc(int a, int b);

int a, b;

int main() {
    fin >> a;

    while(fin >> b) {
        a = cmmdc(a, b);
    }

    fout << "CMMDC - ul numerelor din fisier este: " << a << 'n';

    fin.close();
    fout.close();

    return 0;
}

int cmmdc(int a, int b) {
    int r;

    while(b) {
        r = a % b;
        a = b;
        b = r;
    }

    return a;
}

Daca ai vreo nelamurire in legatura cu sursa, trebuie doar sa intrebi :D

 

Multumesc pentru raspuns si timpul acordat, dar nu inteleg nimic din ce ai scris inainte de int.main() si dupa return 0;

Si de aici rezulta ca nici ce ai scris intre int main si return 0 nu prea au sens pt mine :))

Nu mai conteaza, stiu sa rezolv problema aia acum.

edit: o rezolv acum pe limba mea sa vezi cam la ce nivel sunt.

Link to comment
Share on other sites

  • Moderators

Multumesc pentru raspuns si timpul acordat, dar nu inteleg nimic din ce ai scris inainte de int.main() si dupa return 0;

Si de aici rezulta ca nici ce ai scris intre int main si return 0 nu prea au sens pt mine :))

Nu mai conteaza, stiu sa rezolv problema aia acum.

edit: o rezolv acum pe limba mea sa vezi cam la ce nivel sunt.

 

http://tutorialeplusplus.blogspot.ro/2013/06/tutoriale-c-functii-subprograme.html

 

http://89.121.249.92/2010-2011/Catedre/Informatica/11/Subprograme.pdf

Link to comment
Share on other sites

Uite aici, cum arata mai pe romaneste la mine.

Si multumesc Courage pt link-uri, momentan cu clasa am ajuns la vectori si vreau sa ii inteleg bine, acum or sa ma uit si peste subprogramele alea.

#include<iostream>
#include<fstream>
using namespace std;
int main()
{int a,b;
ifstream in("date.in");
ofstream out("date.out");
in>>a;
while(in>>b)
{
    while(a!=b)
    if(a>b)a=a-b;
    else b=b-a;
}
cout<<"nnCMMDC-ul tuturor numerelor este: "<<a;

return 0;}

Link to comment
Share on other sites

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.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.