•claudinho18
Strain
Karma: 0
Deconectat
Mesaje: 7
|
 |
« : Martie 04, 2013, 16:32:56 » |
|
Buna ziua.Am gasit doua probleme cu fisiere carora nu le dau de capat.Poate nu sunt asa de grele insa nu reusesc sa le finalizez. 1.De pe un rand al fisierului exemplu.txt se citeste un text care poate sa contina orice caractere(litere mari, litere mici , cifre, cactere speciale).Sa se tipareasca textul obtinut prin transformarea in litere mici a literelor mari aflate pe pozitii pare in cadrul textului dat. #include <iostream> #include <fstream> using namespace std; int main() {fstream f1("exemplu.txt",ios::in); int i,a[256]; char sir[256]; for(i=0;i<256;i++) f1>>sir[i]; for(i=0;i<256;i++) a[i]=(int)sir[i]; for(i=0;i<256;i++) if(i%2==0) if(a[i]>=65 && a[i]<90 ) a[i]=a[i]+32; for(i=0;i<256;i++) sir[i]=(char)a[i]; for (i=0;i<256;i++) cout<<sir[i]; return 0; }
Asa am gandit eu insa ceva imi scapa .Nu stiu nici daca am ales calea cea buna. 2.Se citeste din fisierul date.in de pe prima linie un sir de caractere care poate sa contina numai litere si cifre.Afisati in fisierul date.out numarul literelor mari, numarul literelor mici si numarul cifrelor din text ,pe randuri diferite. Aici momentan nu am prea multe insa vreau sa stiu daca merge calea cu ascii sau ma complic. Multumesc anticipat daca cineva poate sa imi ofere orice indiciu.
|
|
« Ultima modificare: Martie 04, 2013, 18:08:08 de către Andrei Grigorean »
|
Memorat
|
|
|
|
•romyk
Strain
Karma: 5
Deconectat
Mesaje: 40
|
 |
« Răspunde #1 : Martie 04, 2013, 17:28:05 » |
|
la prima problema ai putea face asa: #include <iostream> #include <fstream> using namespace std; char sir[256]; int main() {fstream f1("exemplu.txt",ios::in); int i,a;
f1.get(sir,256); for(i=0;i<256;i++) if(i%2==0) if(sir[i]>=65 && sir[i]<90) sir[i]+=32; for (i=0;i<256;i++) cout<<sir[i]; return 0; }
La cum ai facut tu programul, mai ai mult de invatat...
|
|
|
Memorat
|
|
|
|
•claudinho18
Strain
Karma: 0
Deconectat
Mesaje: 7
|
 |
« Răspunde #2 : Martie 04, 2013, 17:43:34 » |
|
Scuze acum vad nu s.au copiat vectorii .Era a si sir peste tot.Stiu ca mai am de invatat ,insa nu stiam ca poti sa scrii sir+=32; si am incercat sa transform totul in codurile ASCII si sa pun in vectorul a, pentru ca apoi sa transform invers ,din ASCII in caractere.Multumesc.
ps: nu imi posteaza parantezele patrate indiferent cum le pun
|
|
|
Memorat
|
|
|
|
•fdproxy
Strain
Karma: 10
Deconectat
Mesaje: 30
|
 |
« Răspunde #3 : Martie 04, 2013, 17:48:41 » |
|
- " a[256];" Nu ai nevoie de niciun vector. Citesti caracterul, il convertesti, daca-i cazul si il afisezi. - " fstream f1("exemplu.txt",ios::in);" De ce nu ai folosit "ifstream is("exemplu.txt");"? In mod traditional un stream de intrare se noteaza cu "is". - " f1>>sir" Citeste din f1 pana la primul blanc (exclusiv) - " a=(int)sir;" Ce ai vrut sa faci aici? O rezolvare posibila: #include <fstream> #include <iostream>
using namespace std;
int main() { ifstream is( "exemplu.txt" ); if ( ! is ) return -1; // eroare la deschidere (fisierul nu a fost gasit, de exemplu)
char c; bool is_even = false; while ( is >> c ) // cat timp pot citi din fisierul de intrare { if ( is_even ) cout << char( toupper( c ) ); is_even = ! is_even; }
return 0; }
|
|
|
Memorat
|
|
|
|
•claudinho18
Strain
Karma: 0
Deconectat
Mesaje: 7
|
 |
« Răspunde #4 : Martie 04, 2013, 17:55:46 » |
|
am folosit vectorul "a" pentru a memora codurile ASCII in el , iar prin a = int(sir) am vrut sa transform caracterele in codurile aferente , am inteles de ce nu mergea sa scriu cu paranteze patrarte, trebuia sa selectez secventa cod
deci calea a fost gresita, nu imi placea inceputul care il facusem insa am incercat sa folosesc while (sir != /n ) insa nu am vazut vreo schimbare
|
|
|
Memorat
|
|
|
|
•fdproxy
Strain
Karma: 10
Deconectat
Mesaje: 30
|
 |
« Răspunde #5 : Martie 04, 2013, 18:23:35 » |
|
Din textul problemei: "se citeste un text". Nu spune cate caractere. Secventa: for(i=0;i<256;i++) f1>>sir[i];
citeste primele 256 de caractere sau pana la sfarsitul fisierului daca sunt mai putin de 256. Ceva nu-ti este clar, dar nu am inteles ce anume.
|
|
|
Memorat
|
|
|
|
•claudinho18
Strain
Karma: 0
Deconectat
Mesaje: 7
|
 |
« Răspunde #6 : Martie 04, 2013, 18:38:01 » |
|
am inteles in mare parte , asta intrebam deci am facut alegerea gresita cu codurile ASCII ,mai bine foloseam o functie
imi e neclar 256 ala.. pentru ca nu stiu cate caractere are, poate sa aiba mai multe sau mai putine , incerc sa folosesc indiciile date aici ,sa vad ce iese, multumesc!
|
|
|
Memorat
|
|
|
|
•romyk
Strain
Karma: 5
Deconectat
Mesaje: 40
|
 |
« Răspunde #7 : Martie 04, 2013, 20:25:13 » |
|
am editat putin codul lui fdproxy #include <fstream> #include <iostream>
using namespace std;
int main() { ifstream is( "exemplu.txt" ); if ( ! is ) return -1; // eroare la deschidere (fisierul nu a fost gasit, de exemplu)
char c; bool is_even = false; while ( is >> c ) // cat timp pot citi din fisierul de intrare { if ( is_even ) cout << char( tolower( c ) );//transforma literele mari in litere mici esle cout<<c; is_even = ! is_even;
}
return 0; } iar pentru a doua problema ai putea inlocui ce ai in while cu: if(c>='a'&&c<='z') nr_caractere_mici++; else if(c>='A'&&c<='Z') nr_caractere_mari++; else if(c>='0'&&c<='9') nr_cifre++; si mai declari variabilele folosite. Daca le declari in main() nu uita sa le initialisezi cu 0 ca altfel ele iau o valoare random.
|
|
« Ultima modificare: Martie 04, 2013, 20:37:07 de către Prehari Romica »
|
Memorat
|
|
|
|
•claudinho18
Strain
Karma: 0
Deconectat
Mesaje: 7
|
 |
« Răspunde #8 : Martie 04, 2013, 20:28:24 » |
|
multumesc amandurora!
|
|
|
Memorat
|
|
|
|
•TheNechiz
|
 |
« Răspunde #9 : Martie 04, 2013, 21:52:37 » |
|
1.De pe un rand al fisierului exemplu.txt se citeste un text care poate sa contina orice caractere(litere mari, litere mici , cifre, cactere speciale).Sa se tipareasca textul obtinut prin transformarea in litere mici a literelor mari aflate pe pozitii pare in cadrul textului dat. Nu aș vrea să vă spun asta  , dar cred că citirea ar trebui făcută doar pe primul rând.  (așa cred că era și enunțul). Merge....cu o mică modificare. #include <fstream> #include <iostream>
using namespace std;
int main() { ifstream is( "exemplu.txt" ); if ( ! is ) return -1; // eroare la deschidere (fisierul nu a fost gasit, de exemplu)
char c; bool is_even = false; is.get(c); while ( c != '\n' ) // cat timp nu ai ajuns la capatul randului { if ( is_even ) cout << char( tolower( c ) );//transforma literele mari in litere mici else cout<<c; is_even = ! is_even; is.get(c); }
return 0; }
|
|
|
Memorat
|
|
|
|
•claudinho18
Strain
Karma: 0
Deconectat
Mesaje: 7
|
 |
« Răspunde #10 : Martie 04, 2013, 21:58:04 » |
|
TheNechiz da banuiesc ca de pe primul rand desi cerinta spuen ca de pe un rand.Multumesc tuturor .Sa vad la ce rezultat ajung.Scuzati-mi insistenta si poate greutatea cu care am inteles.
|
|
|
Memorat
|
|
|
|
•TheNechiz
|
 |
« Răspunde #11 : Martie 04, 2013, 22:17:09 » |
|
Dacă nu citești primul rând,ar trebui să ai ca dată de intrare: numărul rândului pe care trebuie să-l citești. Deși ...este puțin probabil. 
|
|
|
Memorat
|
|
|
|
•fdproxy
Strain
Karma: 10
Deconectat
Mesaje: 30
|
 |
« Răspunde #12 : Martie 05, 2013, 14:15:57 » |
|
Scuzati-mi insistenta si poate greutatea cu care am inteles.
N-ai pentru ce-ti cere scuze. Nimeni nu s-a nascut invatat iar fara efort ma indoiesc ca poti realiza ceva. Textul problemei este interpretabil. De exemplu, daca numarul randului ar fi fost specificat, atunci ar fi trebuit sa numeri caracterele "new-line" (sau altul care desemneaza sfarsitul de linie, in functie de formatul fisierului). Cum randul nu este specificat, poate ca vrea o functie care sa ia ca argument numarul randului. Poti anticipa gradul de complexitate al exercitiului in functie de cunostintele predate pana acum. Daca ultima lectie se refera la codurile ASCII, atunci poate ca profesorul se asteapta sa folosesti comparatii in loc de "toupper". Si tot asa. O ultima observatie legata de codul postat de Razvan. Daca ati invata despre "break", poate fi rescris asa: char c; bool is_even = false; while ( is >> c ) // cat timp pot citi din fisierul de intrare { if ( c == '\n' ) break; // iesi din bucla // ... }
Adica, nu e nevoie de niciun "get". Spor la invatat.
|
|
|
Memorat
|
|
|
|
•TheNechiz
|
 |
« Răspunde #13 : Martie 05, 2013, 16:12:58 » |
|
BREAK și CONTINUE sunt utile,dar sunt folosite rar.Dacă le folosim,în cele mai multe cazuri se încalcă principiile programării structurate. is >> c; nu citește caracterele albe,deci chiar cred că acel get(); e necesar. 
|
|
|
Memorat
|
|
|
|
•fdproxy
Strain
Karma: 10
Deconectat
Mesaje: 30
|
 |
« Răspunde #14 : Martie 05, 2013, 17:32:35 » |
|
Corect: sare peste "whitespaces" (blanc, tab, CR, NL). Se poate rescrie asa: while ( is.get( c ) ) { // ...
sau asa (mai complicat): is >> noskipws; while ( is >> c ) { // ...
Codul in care folosesc break mi s-a parut mai usor de inteles decat varianta originala si este mai usor de inteles si decat codul de mai jos (care respecta teorema programarii structurate): is >> noskipws; while ( is >> c && c != '\n' ) { // ...
sau while ( is.get( c ) && c != '\n' ) { // ...
|
|
|
Memorat
|
|
|
|
•claudinho18
Strain
Karma: 0
Deconectat
Mesaje: 7
|
 |
« Răspunde #15 : Martie 11, 2013, 15:13:02 » |
|
multumesc tuturor ! nu am mai putut sa intru o perioada
|
|
|
Memorat
|
|
|
|
|