Cod sursa(job #110201)

Utilizator t_ralucaTrofin Raluca t_raluca Data 25 noiembrie 2007 20:27:23
Problema Ordine Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <stdio.h>


char s[26] , ch, final[16000];
long int nrs[4000], i, l, p, j, pfinal;
FILE *f;


void citire(){
p=-1; l=0;
f=fopen("ordine.in", "r");

while(!feof(f)){
   fscanf(f, "%c", &ch);
   if(feof(f)!=0){break;}
   l++;
   if(p==-1){p++; s[p]=ch;nrs[p]=1;}
   else if (s[p]==ch){nrs[p]++;}
   else if(s[p]>ch){
       // gasesc pozitia in tabloul s unde trebuie inserat ch
       i=p;
       while(s[i]>ch && i>=0) {i--;}
       if(s[i]==ch &&i>=0){nrs[i]++;}
       else{
	  p++;
	  for(j=p; j>i+1; j--){
	     s[j]= s[j-1];
	     nrs[j]= nrs[j-1];
	  }

	 s[i+1]=ch;
	 nrs[i+1]=1;
       }
   }
   else if (s[p]<ch && p>=0){ p++; s[p]=ch; nrs[p]=1;}

}
fclose(f);
}


void afisare(){
int gata; char cprec;
gata=0;
pfinal=0;
f=fopen("ordine.out", "w");
//fprintf(f, "%c" , s[0]);
//fprintf(f, "Lungimea finala %ld\n",l );

final[0]=s[0];
cprec=s[0]; nrs[0]--;

while(gata==0){
 i=0;
 while ((i<=p) && (s[i]==cprec || nrs[i]==0) ){
   i++;
 }

 //fprintf(f, "%c", s[i]) ;
if (i<=p) {pfinal++;}
 final[pfinal]=s[i];
 nrs[i]--;
 cprec=s[i];
 if(i>p){gata=1;}
}


 if (pfinal<l){
  i=p;
  while(i>=0 && nrs[i]==0){i--;}
  fprintf(f,"\n caracterul %c pe poz %ld \n", s[i], i);
  char c=s[i];
  j=pfinal;
  /*
  while(j>=0 && final[j]==c){j--; }*/
  pfinal++;
  final[pfinal]=final[pfinal-1];
  final[pfinal-1]=final[pfinal-2];
  final[pfinal-2]=c;
 }

 for(i=0; i<=pfinal; i++){
    fprintf(f, "%c", final[i]);
 }
 fclose(f);
}

int main(){
citire();
afisare();
return 0;
}