All pastes #537740 Raw Edit

Mine

public text v1 · immutable
·published 2007-06-04 20:45 UTC
rendered paste body
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

int rozm();
int *zlicz(string *tab,int n);
string *tworztab(int n);
string *odczyt(string *tab,int n);
void sortuj(string *tab,int Lewy,int Prawy);
int bisekcja(string *tab,string element,int Lewy,int Prawy,int n);
void zapisz(string *tab,int *tab2,int n);
void wypisz(string *tab,int n);
void wypisz(int *tab,int n);
void wypisz(int liczba);

int main(int argc, char *argv[])
{   int n=rozm();
    string arb;
    string *tablica=tworztab(2*n);
    sortuj(odczyt(tablica,n),0,n-1);
    do 
    {cout << "jakie warzywo dolozyc?\n";
    cin >> arb;
    wypisz(bisekcja(tablica,arb,0,2*n-1,2*n));
    wypisz(tablica,2*n-1);}
    while(arb!="exit");
    zapisz(tablica,zlicz(tablica,2*n),2*n);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
int rozm()
{  ifstream plik;
   char znak;
   int licznik=0;
   plik.open("wyrazy.txt");
    if(plik==NULL) cout << "brak pliku do otwarcia" << endl;
    while (plik.get(znak))
                                    {
                                        if(znak == '\n') licznik++ ;
                                        
                                        } 
   plik.close();
   return (licznik+1);
}
//---------------------
string *tworztab(int n)
{
       string *tab=new string[2*n];
       for(int i=0;i<2*n;i++)
       *(tab+i)="0";
       *(tab+2*n-1)="zzzzzzzzzzzzzzzzzzzzzzzz";
       return tab;
}
//---------------------
string *odczyt(string *tab,int n)
{
       ifstream plik;
       plik.open("wyrazy.txt");
       if(plik==NULL) cout << "brak pliku do otwarcia" << endl;
       for(int i=0;i<n;i++)
       plik >> *(tab+i);
       plik.close();
       
   return tab;
}
//---------------------

void sortuj(string *tab,int Lewy,int Prawy)                     //sortowanie szybkie
    {              
      int i = Lewy;
      int j = Prawy;
      string tmp;
      string x=*(tab+(Lewy+Prawy)/2);
        do
        {
          
          while (*(tab+i) < x) i++;
          while (*(tab+j) > x) j--;
          if (i <= j)
           {
           tmp=*(tab+i);
           *(tab+i)=*(tab+j);
           *(tab+j)=tmp;
           i++;
           j--;
           }
        }
        while(i <= j);
  if (Lewy < j) sortuj(tab,Lewy, j);
  if (Prawy > i) sortuj(tab,i, Prawy);
  
  
}
//----------------------
int *zlicz(string *tab,int n)
{   int *licznik=new int[n];
    for(int i=0;i<n;i++)
    *(licznik+i)=0;
    for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            {
                    //if(i==j) continue;
                    if(*(tab+i)==*(tab+j)) (*(licznik+i))++;
                    }
    return licznik;
}
//----------------------
void zapisz(string *tab,int *tab2,int n)
{
     ofstream plik;
     plik.open("wyrazy2.txt");
     if(plik==NULL) cout << "brak pliku do zapisu" << endl;
     for(int i=1;i<n;i++)
     {       
             if(*(tab+i)==*(tab+i-1) || *(tab+i)=="0") continue;
             plik << *(tab+i) << "\tilosc:" << *(tab2+i) << endl;
             }
             plik.close();
}
//----------------------
void wypisz(string *tab,int n)
{
     for(int i=0;i<n;i++)
     {if(*(tab+i)=="0" || *(tab+i)=="zzzzzzzzzzzzzzzzzzzzzzzz") continue;cout << *(tab+i) << endl;}
}
void wypisz(int *tab,int n)
{
    for(int i=0;i<n;i++)
     cout << *(tab+i) << endl;
}        
void wypisz(int liczba)
{
     cout << liczba << endl;
}       
int bisekcja(string *tab,string element,int Lewy,int Prawy,int n)
{                  
                          
           string tmp;
      string x=*(tab+(Lewy+Prawy)/2);
      int iter=(Lewy+Prawy)/2;           
      int zakres=0;
      for(int i=0;i<n;i++) if(*(tab+i)!="0" && *(tab+i+1)=="0") zakres=i;
      if(element>*(tab+zakres)) *(tab+zakres)=element;
      if(element==x ) {
                                                                              for(int i=n-2;i>iter;i--){
                                                                                                      tmp=*(tab+i+1);
                                                                                                      *(tab+i+1)=*(tab+i);
                                                                                                      *(tab+i+2)=tmp;}
                                                                                                      *(tab+iter+1)=element;
                                                                                                      return iter;
                                                                                                   }                   
      if ((*(tab+(Lewy+Prawy)/2)>=element && *(tab+(Lewy+Prawy)/2-1)<=element) ) {
                                                                              for(int i=n-2;i>iter;i--){
                                                                                                      tmp=*(tab+i+1);
                                                                                                      *(tab+i+1)=*(tab+i);
                                                                                                      *(tab+i+2)=tmp;}
                                                                                                      *(tab+iter)=element;
                                                                                                      return iter;
                                                                                                   }
     
     if(element < x) { Prawy=(Lewy+Prawy)/2;bisekcja(tab,element,Lewy,Prawy,n); }
     if(element > x) { Lewy=(Lewy+Prawy)/2;bisekcja(tab,element,Lewy,Prawy,n);}
       
      
      
}