infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Radu Chichi din Martie 12, 2011, 16:57:59



Titlul: Fisiere auxiliare
Scris de: Radu Chichi din Martie 12, 2011, 16:57:59
Este permisa folosirea de fisiere auxiliare la OJI/ONI ?
Spre exemplu, daca doresc sa schimb structurile folosite de program, imi vine mai usor sa fac o afisare intr-un fisier auxiliar , urmand apoi sa le recitesc sub alt format, decat sa fac atribuirile manual. Nu e cea mai eficienta metoda, dar te salveaza de o gramada de eforturi.


Titlul: Răspuns: Fisiere auxiliare
Scris de: Andrei-Bogdan Antonescu din Martie 12, 2011, 17:19:52
Nu este permisa scrierea/citirea in fisiere auxiliare.


Titlul: Răspuns: Fisiere auxiliare
Scris de: Radu Chichi din Martie 12, 2011, 18:37:59
Esti sigur ? Eu m-am uitat peste regulament si nu am sesizat nicio astfel de precizare.
Am trimis niste solutii bazate pe folosirea de fisiere auxiliare atat pe infoarena cat si pe campion, si nu am avut probleme la evaluare.
Exemplu: (Problema Reteta2)
Cod:
#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std;
int i=1,j,n,s=0,nr,inc,ii,sum,tot=0,u2,u,vc[1000];
char v[1020],v2[1000],v3[1000][1000];
int trans(char x)
{
if(x=='9') return 9;
else if(x=='8') return 8;
else if(x=='7') return 7;
else if(x=='6') return 6;
else if(x=='5') return 5;
else if(x=='4') return 4;
else if(x=='3') return 3;
else if(x=='2') return 2;
else if(x=='1') return 1;
else if(x=='0') return 0;
return 10;
}
int check(int x,int y)
{
int z;
z=strlen(v3[x]);
for(i=0;i<=z;i++)
if(v3[x][i]>v3[y][i])
return 2;
else if(v3[x][i]<v3[y][i])
return 3;
return 0;
}
int main()
{

ifstream f("reteta2.in");
while(f>>v[i])
{
i++;
}
//cout<<v[30]<<" ";
for(j=0;j<=i;j++)
if(v[j]==')' && trans(v[j+1])<10)
{
nr=0;
inc=j+1;
while(trans(v[j+1])<10)
{
nr++;
j++;
}
sum=0;
for(ii=inc;ii<=j;ii++)
{
sum=sum*10+trans(v[ii]);
v[ii]=' ';
}
v[inc-1]=' ';
tot+=sum;
}
else if(v[j]=='(' || v[j]==')')
v[j]=' ';

ofstream g("reteta2.out");
g<<tot<<'\n';
//u2=2;
int n=0;
for(j=1;j<=i;j++)
if(v[j]!=' ')
{
n++;
v2[n]=v[j];
}
int tot2=0;
ofstream g2("reteta2.aux");
for(j=1;j<=n;j++)
{
if(trans(v2[j])<10 && trans(v2[j])>=0) u=2;
else u=1;
if(trans(v2[j+1])<10 && trans(v2[j+1])>=0) u2=1;
else u2=2;
if(u==2 && u2==2)
{
g2<<v2[j]<<'\n';
tot2++;
}
else if(u==1 && u2==1)
{
g2<<v2[j]<<" ";
}
else g2<<v2[j];
//else if(u==
}
g2.close();
ifstream f2("reteta2.aux");
for(j=1;j<=tot2;j++)
{
f2>>v3[j]>>vc[j];
// cout<<v3[j]<<" "<<vc[j]<<'\n';
}
int ccc=0,viz[1001],jj,sol[1000],nrrr=0;
for(j=1;j<=tot2;j++)
{
if(!viz[j])
{
nrrr++;
sol[nrrr]=j;
for(jj=j+1;jj<=tot2;jj++)
if(!check(j,jj) && !viz[jj])
{
vc[j]+=vc[jj];
viz[jj]=1;
}
viz[j]=1;
}
}
//for(j=1;j<=nrrr;j++)
//cout<<v3[sol[j]]<<" "<<vc[sol[j]]<<'\n';
int aux;

for(j=1;j<=nrrr;j++)
for(jj=j+1;jj<=nrrr;jj++)
if(check(sol[j],sol[jj])==2)
{
aux=sol[j];
sol[j]=sol[jj];
sol[jj]=aux;
}

for(j=1;j<=nrrr;j++)
g<<v3[sol[j]]<<" "<<vc[sol[j]]<<'\n';

}


Titlul: Răspuns: Fisiere auxiliare
Scris de: Savin Tiberiu din Martie 12, 2011, 20:46:09
Interesant, nu ar trebui sa poti sa faci asa ceva. Nu iti inteleg exact motivatia pentru care vrei sa scrii in fisiere auxiliare (nu inteleg de ce ti-ar fi mai simplu asa), insa acest lucru nu este permis la olimpiade si nu ar trebui sa fie permis nici pe infoarena.


Titlul: Răspuns: Fisiere auxiliare
Scris de: Radu Chichi din Martie 12, 2011, 21:24:34
In problema de mai sus spre exemplu, aveam de transpus un vector de tip char, intr-o matrice de tip char + un vector de tip int. (Alta idee pe langa folosirea unui fisier auxiliar nu mi-a venit. )

Citirea am facut-o cu ajutorul unui vector de tip char:
Fisier.in:
Cod:
(((((((unt 20 ou 4 apa 500)10 rom 100 apa 20 zahar 2 abracadabraabracadab 5)30 zaha 10 abracadabraabracadab 50)99(apa 10 zahar 20 unt 100 apa 999)5)30(a 1 b 1 c 1 apa 25 abracadabraabracadab 5)20)10 abracadabraabracadab 150)4 abracadabraabracadab 52)98

Dupa preprocesare, am facut afisarea (de caractere) in fisierul auxiliar:
fisier.aux
Cod:
unt 20
ou 4
apa 500
rom 100
apa 20
zahar 2
abracadabraabracadab 5
zaha 10
abracadabraabracadab 50
apa 10
zahar 20
unt 100
apa 999
a 1
b 1
c 1
apa 25
abracadabraabracadab 5
abracadabraabracadab 150
abracadabraabracadab 52

Pentru recitire, am folosit o matrice de cuvinte, si un vector de tip int, pentru a retine valorile corespunzatoare fiecarui ingredient (afisate initial sub forma de caractere).
Restul e can-can.
 

Citat din mesajul lui: devilkind
si nu ar trebui sa fie permis nici pe infoarena.
De ce nu ?