Bun venit pe SkullBox!

Bine ai venit, Vizitator. Trebuie să te autentifici sau să îţi creezi un cont.
Ai pierdut sau nu ai primit emailul care conţine codul de activare al contului?

Autentifică-te cu numele de utilizator, parola şi precizează durata sesiunii.
  Pagini: [1]
  Imprimă  
[BAC 2008][C]Varianta nr. 83  (Vizualizari 550)
Archangel
*

Deconectat Deconectat

Mesaje: 1096

[BAC 2008][C]Varianta nr. 83, Iun 04, 2008, 19:55



Memorat

Archangel
*

Deconectat Deconectat

Mesaje: 1096

[BAC 2008][C]Varianta nr. 83, Iun 07, 2008, 21:04

3.
Cod:
#include<iostream.h>
int suma(int n, int v[])
{
int i,s,a,b;
s=0;

for(i=1;i<=n;i++)
{a=v[i]%10;
v[i]=(v[i]-a)/10;
b=(v[i]-v[i]%10)/10;
if(a==b)
s=s+v[i]*10+a;
}

return s;
}

void main()
{
int n,v[100],i;

cout<<"n=";  cin>>n;

for(i=1;i<=n;i++)
cin>>v[i];

cout<<suma(n,v);
}
4.
Cod:
#include<iostream.h>
#include<fstream.h>
void main()
{
unsigned long int n,maxim,max;
int k,i,l,v;

fstream f("numere.in",ios::in);

k=1;
i=1;

while(f>>n)
 {

     if(i==1) max=n;
  else
     if(n>max) max=n;


     if(n!=0)
i++;
  else
{ l=i; i=1; k++;}

     if(k==1) {maxim=max; v=i;}
  else
     if(l < v)  maxim=max;
}
cout<<maxim;
}
Am intalnit ceva ciudat rezolvand problema 4. Prima data am incercat codul de mai jos si imi gasea 4 raduri, cand in numere.in erau 3 si culmea, al 4-lea rand ar fi avut "0" (ma refer la exemplul dat ). Stie cineva care poate fi problema?

Cod:
  while(!f.eof())
  {

i=1;

    do
    {
     f>>n;
       if(i==1) max=n;
else
   if(n>max) max=n;

cout<<n<<" ";
    i++;
}
     while(n!=0);

if(k==1) {maxim=max; l=i-1;}
else
if(i-1<l)
       maxim=max;

  cout<<" max="<<max<<" maxim="<<maxim<<endl;  //max este maximul pe fiecare linie,
k++;                                       //maxim este maximul pe cea mai scurta linie
  }
Ideea era sa retin in 2 variabile maximul pe prima linie si lungimea acesteia si in cazul in care se gasea o linie mai scurta, maximul ei se inlocuia in variabila, dar pana la urma, in varianta finala, am retinut intr-o variabila doar maximul si lungimea fiecarui rand intr-un vector. Daca stie cineva o solutie mai buna, va rog .... Smile
« Ultima modificare: Noi 05, 2008, 19:09 de către emi » Memorat

astan
*

Deconectat Deconectat

Mesaje: 357

[BAC 2008][C]Varianta nr. 83, Iun 07, 2008, 21:48

Problema pe care ai intalnit-o folosind solutia

Cod:
while(!f.eof())
{
...
}
(cand iti gasea 4 randuri in loc de 3 si citeai 0), nu era de fapt o problema. E normal sa se intample asa.

functia eof() (ca si feof() din libraria C) intoarce true daca ultima citire din stream nu a reusit din cauza de end of file.
Nu ca urmatoarea citire din fisier va cauza end of file (cum se intampla, de exemplu in Pascal).

Adica, in cazul nostru, indicatorul EOF al stream-ului este setat de catre o citire din stream care a ajuns la "end of file".
Prima data se face citirea care a ajuns la "end of file", abia dupa aceea indicatorul EOF al stream-ului devine setat (tocmai din cauza ca ultima citire a ajuns la "end of file").

Ceea ce se intampla in cazul tau este ca foloseai ultima valoare pe care ai citit-o cu succes (aceasta fiind 0), dupa ce citisei deja peste "end of file".

Sa exemplific:
- Am urmatorul fisier de intrare, test.txt (nu are nici un new-line la sfarsit):
Cod:
100 200
300 400
500 600
Si urmatorul program:
Cod:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
ifstream f("test.txt", ios::in);
int value;

while (!f.eof())
{
    f >> value;
   
    //if (f.eof())
    // break;
   
    cout << value << endl;
}

return 0;
}
Programul isi propune sa citeasca fiecare numar din fisierul "test.txt" si sa il afiseze pe consola.
Daca il execut, obtin urmatoarele:
Cod:
100
200
300
400
500
600
600
Precum se vede, se afiseaza valoarea 600 de 2 ori. De ce ? Dupa ce am citit ultima valoare din fisier, si urmeaza sa iterez din nou prin bucal "while", eof() nu intoarce true. La ultima iteratie, fac o citire din fisier care nu reuseste si indicatorul EOF al stream-ului devine setat. Dar eu am verificat indicatorul de EOF al stream-ului doar la inceputul buclei "while", cand inca nu era setat.
Numai fac nici o verificare ca el a fost setat tocmai in urma ultimei citiri
Astfel ajung sa folosesc ultima valoare citita cu succes de doua ori

Cum sa repar acest bug ?

Se decomenteza liniile:
Cod:
//if (f.eof())
//break;
Rezultatul rularii pentru programul modificat este:
Cod:
100
200
300
400
500
600
Acum functioneaza pentru ca eu testez ca nu cumva citirea din fisier a fost peste "end of file", inainte sa folosesc ceea ce am citit.
« Ultima modificare: Noi 05, 2008, 19:09 de către emi » Memorat
Archangel
*

Deconectat Deconectat

Mesaje: 1096

[BAC 2008][C]Varianta nr. 83, Iun 09, 2008, 12:23

^ am inteles acum, multumesc mult ! Smile
Memorat

astan
*

Deconectat Deconectat

Mesaje: 357

[BAC 2008][C]Varianta nr. 83, Iun 10, 2008, 00:19

n-ai pt ce Smile
Memorat
DarkByte
*

Deconectat Deconectat

Mesaje: 2441

WWW
[BAC 2008][C]Varianta nr. 83, Iun 10, 2008, 06:46

Well ... I was right, desi nu intelegeam de ce :lol:
Memorat

Light travels faster than sound. This is why some people appear intelligent until they speak.

Quidquid latinum dictum sit, altum viditur.

SkullAds
Ecspert
ReclAmator
* * * * *
Google AdSense

Gen: Bărbat
Mesaje: Multe

Reclama AdSense,
 

 
   


Pagini: [1]
  Imprimă  
 
Schimbă forumul:  

Ethical hacking and programming community
Powered by SMF 1.1.7 | SMF © 2006-2008, Simple Machines LLC
Traducerea în limba română © 2006-2007 www.smf.ro