0xE110w

Drugio_efektas

Nov 6th, 2016
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.53 KB | None | 0 0
  1. //Drugio efektas
  2. // 3 lygis, 1 pamokele, 4 uzduotis
  3. /******************************************************
  4. * Parasykite programa, kuri isspausdintu ilgiausia zodziu grandinele, sudaryta is pradiniu duomenu zodziu.
  5. * Jei egzistuoja keletas vienodo ilgio zodzių grandineliu, rezultatu faile isveskite pirmaja.
  6. *******************************************************/
  7. #include <iostream>
  8. #include <iomanip>
  9. #include <cmath>
  10. #include <fstream>
  11. #include <string>
  12.  
  13. using namespace std;
  14. //---------------------------------------------------------
  15. //Programoje naudojamos konstantos
  16. const int MAKSIMALUS_ZODZIU_SKAICIUS = 100;
  17. //---------------------------------------------------------
  18. //Programoje naudojamu funkciju prototipai
  19. void Skaityti(string zodziai[], int &zodziuSkaicius);
  20. void Spausdinti(string ilgiausiaZodziuGrandinele);
  21. string Grandineles_Sudarymas(string zodziai[], int zodziuSkaicius, int index, int ilgis[]);
  22. bool Tikrinimas(string zodis1, string zodis2);
  23. string ILgiausia(string z[], int n, int ilgis[]);
  24. //---------------------------------------------------------
  25. int main()
  26. {
  27.    int zodziuSkaicius = 0;
  28.    string zodziai[MAKSIMALUS_ZODZIU_SKAICIUS];
  29.    string ilgiausiaZodziuGrandinele;
  30.    //Kitu programoje naudojamu kintamuju aprasymai
  31.    string grandineles[MAKSIMALUS_ZODZIU_SKAICIUS]; // grandineliu variacijos
  32.    int ilgis[zodziuSkaicius];                      // kiekvienos grandineles ilgis
  33.    bool ar_eina;                                   // ar eina sudaryti grandinele
  34.    //Programos veiksmai
  35.    Skaityti(zodziai, zodziuSkaicius);
  36.  
  37.    for(int i = 0; i<zodziuSkaicius; i++)
  38.      ilgis[i] = 0;
  39.  
  40.    // Siunciami skirtingi zodziai kaip pirmieji sudarantys grandinele:
  41.    for(int i = 0; i<zodziuSkaicius; i++){
  42.        grandineles[i] = Grandineles_Sudarymas(zodziai, zodziuSkaicius, i, ilgis);
  43.        if(!ar_eina && grandineles[i]>zodziai[i]) ar_eina = true; // grandinele eina sudaryti
  44.        cout << ar_eina << " --> " << grandineles[i] << "   " << ilgis[i] << endl;
  45.    }
  46.    if(ar_eina) ilgiausiaZodziuGrandinele = ILgiausia(grandineles, zodziuSkaicius, ilgis);
  47.    else ilgiausiaZodziuGrandinele = zodziai[0]; // jei grandineles sudaryti neimanoma, atspausdinamas
  48.    Spausdinti(ilgiausiaZodziuGrandinele);       // pirmaiss duomenu failo zodis
  49.  
  50.    return 0;
  51. }
  52. //---------------------------------------------------------
  53. // Zodziu nuskaitymo funckija
  54. void Skaityti(string zodziai[], int &zodziuSkaicius)
  55. {
  56.     ifstream fd("U1.txt");
  57.     while(!fd.eof()){
  58.         fd >> zodziai[zodziuSkaicius];
  59.         zodziuSkaicius++;
  60.     }
  61.     fd.close();
  62. }
  63. //---------------------------------------------------------
  64. // Funkcija, sudaranti zodziu grandinele
  65. // index - pirmasis zodis, kuriuo pradedama grandinele
  66. string Grandineles_Sudarymas(string zodziai[], int zodziuSkaicius, int index, int ilgis[])
  67. {
  68.     string kriterijus = zodziai[index];        // kriterijus, pagal kuri ieskoma atitinkamu zodziu grandinelei
  69.     string Grandinele = zodziai[index] + '-';  // formuojama zodziu grandinele
  70.     string AtsZodz[zodziuSkaicius];            // atsarginis zodziu masyvas
  71.  
  72.     for(int i = 0; i<zodziuSkaicius; i++)
  73.         AtsZodz[i] = zodziai[i];
  74.     AtsZodz[index] = "";                       // nebereikalingas zodis
  75.  
  76.     for(int i = 0; i<zodziuSkaicius; i++){     // dvigubas ciklas, kad butu griztama prie ankstesniu
  77.         for(int j = 0; j<zodziuSkaicius; j++){ // zodziu, tokiu atveju, jei sarasas yra nerikiuotas
  78.             if(Tikrinimas(kriterijus, AtsZodz[j])){ // rastas sekantis zodis
  79.               kriterijus = AtsZodz[j];              // naujas paieskos kriterijus
  80.               Grandinele += AtsZodz[j] + '-';       // kuriama grandinele
  81.               AtsZodz[j] = "";                      // pasalinama zodzio reiksme
  82.               ilgis[index]++;                       // didinamas grandineles ilgis
  83.             }
  84.         }
  85.     }
  86.     return Grandinele.substr(0, Grandinele.length()-1);
  87. }
  88. //---------------------------------------------------------
  89. // Tikrinama, ar zodis zodziai tenkina salyga
  90. bool Tikrinimas(string zodis1, string zodis2)
  91. {
  92.     /**
  93.     * Kiekvienas grandinėlę sudarantis žodis nuo savo kaimyno gali skirtis tik vienu simboliu.
  94.     * Vadinasi, gali tas zodis buti vienu simboliu didejantis, pvz.: lapas --> lapasa --> lapasas
  95.     **/
  96.  
  97.     string ilg, tru; // ilgiausias ir trumpiausias zodis
  98.     if(zodis1>zodis2){
  99.         ilg = zodis1;
  100.         tru = zodis2;
  101.     }else{
  102.         ilg = zodis2;
  103.         tru = zodis1;
  104.     }
  105.  
  106.     int kiek = 0;                               // lapas <--> lapad; lapas <--> lapasa
  107.     if(ilg.length() - tru.length() <= 1){       // zodziai arba vienodo ilgio (skiriasi viduje), arba
  108.         for(int i = 0; i<tru.length(); i++){    // antrasis zodis yra simboliu ilgesnis
  109.             if(ilg[i] != tru[i]) kiek++;
  110.         }
  111.     }else return false;
  112.     if((kiek==1 && ilg.length()==tru.length()) || (kiek==0 && ilg.length()-tru.length()==1)) return true;
  113.     else return false;
  114. }
  115. //---------------------------------------------------------
  116. // Surandama ir grazinama ilgiausia grandinele
  117. string ILgiausia(string z[], int n, int ilgis[])
  118. {
  119.     /**
  120.     * Daugiau '-' - ilgesne grandinele
  121.     **/
  122.     int max_ilg = 0;
  123.     string grandinele = "";
  124.     for(int i = 0; i<n; i++){
  125.         if(ilgis[i] > max_ilg){
  126.           grandinele = z[i];
  127.           max_ilg = ilgis[i];
  128.         }
  129.     }
  130.     return grandinele;
  131. }
  132. //---------------------------------------------------------
  133. void Spausdinti(string ilgiausiaZodziuGrandinele)
  134. {
  135.    cout << ilgiausiaZodziuGrandinele;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment