IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Posloupnost_dvepole_bubble

Aktivity
Avatar
Martin Štefánik:10.3.2018 21:18
#include <iostream>
#include <string>
#include <ctime>

using namespace std;

 void VypisPole (int pocet_prvku, int p[]){
      int j;
     cout <<"\n*************************";
     for (j=1; j<=pocet_prvku; j++)
         cout <<"\nHodnota " <<j <<". prvku je: " <<p[j];
     cout <<"\n*************************";
         cout <<"\n\n";
         }

int main () {
    int pocet_prvku1,pocet_prvku2,pocet_prvku3,pocet_prvku;
    cout<<" Jak dlouhe budou obe posloupnosti?";
    cin>>pocet_prvku;
    int p1[pocet_prvku1],p2[pocet_prvku2],p3[pocet_prvku3],i;

    for (i=1;i<=pocet_prvku1;i++) {
        cout<<"Zadej "<<i<<". cislo posloupnosti:";
        cin>>p1[i];
        }

    for (i=1;i<=pocet_prvku2;i++) {
        cout<<"Zadej "<<i<< ". cislo posloupnosti:";
        cin>>p2[i];
        }

VypisPole (pocet_prvku1, p1);
VypisPole (pocet_prvku2, p2);


    //for (i=1;i<=pocet_prvku3;i++)
        //cout<<"\nTreti posloupnost obsahuje prvky:" <<i<<": "<<p1[i]+p2[i];
        //cin>>p3[i];

        int p[pocet_prvku3],j,pom;
        p[i]=p1[i]+p2[i];

   for (i=pocet_prvku;i>1;i--) {
       for (j = 1; j < i; j++) {
           if (p[j]>p[j+1]) {
               pom = p[j+1];
               p[j+1] = p[j];
               p[j] = pom;
               }
                    }
                }
VypisPole (pocet_prvku, p);

        cin.get();cin.get();
        return 0;
}

Dobrý den, přikládám i zadání k úloze. Již si s tím hraji nějakou dobu a stále nemohu najít chybu nebo nějaké řešení. Zatím to zkouším s variantou bubble sortu.

Příklad: Vstup: Dvě stejně dlouhé posloupnosti (pole) celých čísel. Délky posloupností (počet prvků) na vstupu zadáte.

Výstup: Jedna nová posloupnost (pole) jejíž prvky vzniknou jako součet příslušných prvků zadaných posloupností, která bude seřazena vzestupně. Všechny posloupnosti, které se nacházejí v paměti počítače, vypište. Pro výpis použijte samostatnou funkci (podprogram). K setřídění použijte algoritmus BubbleSort, InsertSort a SelectSort, tzn. vytvoříte tři samostatné velmi podobné programy. Třídění řešte vždy jako volanou funkci.

 
Odpovědět
10.3.2018 21:18
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Štefánik
DarkCoder:11.3.2018 3:56
int pocet_prvku1,pocet_prvku2,pocet_prvku3,pocet_prvku;
cout<<" Jak dlouhe budou obe posloupnosti?";
cin>>pocet_prvku;
int p1[pocet_prvku1],p2[pocet_prvku2],p3[pocet_prvku3],i;

Z důvodu toho, že velikosti polí určuješ v průběhu provádění programu, je třeba vytvářet všechna pole dynamicky a nikoli staticky. Navíc proměnné (stačí jedna, jelikož všechny posloupnosti budou stejně dlouhé) představující velikosti polí máš sice deklarované, ale neurčené.

Nahoru Odpovědět
11.3.2018 3:56
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Martin Štefánik:11.3.2018 11:39
#include <iostream>
#include <string>
#include <ctime>

using namespace std;

 void VypisPole (int pocet_prvku, int p[]){
      int j;
          cout <<"\n*************************";
      for (j=0; j<pocet_prvku; j++)
         cout <<"\nHodnota " <<j+1 <<". prvku je: " <<p[j];
         cout <<"\n*************************";
         cout <<"\n\n";
         }

int main () {
    int pocet_prvku;
        cout<<" Jak dlouhe budou obe posloupnosti?";
        cin>>pocet_prvku;
    int p1[pocet_prvku],p2[pocet_prvku],p[pocet_prvku],i;

    for (i=0;i<pocet_prvku;i++) {
        cout<<"Zadej "<<i+1<<". cislo posloupnosti:";
        cin>>p1[i];
        }

    for (i=0;i<pocet_prvku;i++) {
        cout<<"Zadej "<<i+1<< ". cislo posloupnosti:";
        cin>>p2[i];
        }

    VypisPole (pocet_prvku, p1);
    VypisPole (pocet_prvku, p2);


    //for (i=1;i<=pocet_prvku;i++)
        //cout<<"\nTreti posloupnost obsahuje prvky:" <<i<<": "<<p1[i]+p2[i];
        //cin>>p3[i];

        int j,pom;
            p[i]=p1[i]+p2[i];

   for (i=pocet_prvku;i>1;i--) {
       for (j = 1; j < i; j++) {
           if (p[j]>p[j+1]) {
               pom = p[j+1];
               p[j+1] = p[j];
               p[j] = pom;
               }
               }
               }
VypisPole (pocet_prvku, p);

        cin.get();cin.get();
        return 0;
}

Tak došlo k úpravě. Momentálně si myslím, že je chyba někde v rovnici p[i] = p1[i] + p2[i], bohužel nevím kam nebo jak jinak ji zapsat, aby vytvořila novou hodnotu a proházela ji sortem.

 
Nahoru Odpovědět
11.3.2018 11:39
Avatar
Odpovídá na Martin Štefánik
Matúš Olejník:11.3.2018 13:08

V prvom rade by si mal dynamicky alokovať polia

int *p, *p1, *p2;
p = new int[pocet_prvku];
p1 = new int[pocet_prvku];
p2 = new int[pocet_prvku];

Jedna nová posloupnost (pole) jejíž prvky vzniknou jako součet příslušných prvků zadaných posloupností

takže asi treba v cykle prejsť polia a súčet daných prvkov uložiť do nového a nie len ako to máš ty

p[i]=p1[i]+p2[i];

kde i ani nie je inicializované a nechceš spočítať len jeden prvok

for(i = 0; i < pocet_prvku; i++) {
    p[i] = p1[i] + p2[i];
}

takto získaš nové neusporiadané pole a na ňom by som spustil spomínané sorty. No a na koniec hádam že ten úsek kódu na usporiadanie bude tiež potrebné upraviť, ale to skús najprv ty.

Nahoru Odpovědět
11.3.2018 13:08
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Martin Štefánik:11.3.2018 14:11

Děkuji moc, tohle mi pomohlo :). Už jsem to opravil, momentálně to funguje tak jak má. Už tam jen potřebuji prostřídat další dva sorty, (select a insert sort). Tak případně se ještě zeptám, ale jinak zatím děkuji.

 
Nahoru Odpovědět
11.3.2018 14:11
Avatar
Odpovídá na Martin Štefánik
Martin Štefánik:11.3.2018 20:07
#include <iostream>
#include <string>
#include <ctime>

using namespace std;

 void VypisPole (int pocet_prvku, int p[]){
      int j;
          cout <<"\n*************************";
      for (j=0; j<pocet_prvku; j++)
         cout <<"\nHodnota " <<j+1 <<". prvku je: " <<p[j];
         cout <<"\n*************************";
         cout <<"\n\n";
         }

int main () {
    int pocet_prvku;
        cout<<" Jak dlouhe budou obe posloupnosti?";
        cin>>pocet_prvku;
    int i,*p,*p1,*p2;
        p=new int[pocet_prvku];
        p1=new int[pocet_prvku];
        p2=new int[pocet_prvku];

    for (i=0;i<pocet_prvku;i++) {
        cout<<"Zadej "<<i+1<<". cislo posloupnosti:";
        cin>>p1[i];
        }

    for (i=0;i<pocet_prvku;i++) {
        cout<<"Zadej "<<i+1<< ". cislo posloupnosti:";
        cin>>p2[i];
        }

    VypisPole (pocet_prvku, p1);
    VypisPole (pocet_prvku, p2);


    for (i=0;i<pocet_prvku;i++){
        p[i]=p1[i]+p2[i];
        }

        int j,x;

    for(i = 0; i <= pocet_prvku; i++) {
              x = p[i];
              j = i;
        while ((j > 1) && (x <= p[j-1])) {
              p[j] = p[j-1];
              j--;
              }
              p[j] = x;
              }

VypisPole (pocet_prvku, p);

        cin.get();cin.get();
        return 0;
}

Momentálně se snažím o insert sort (select sort byl v pohodě). No a narazil sem na problém, že mi to neseřadí první číslo (neprohází ho posloupností na určenou pozici). Zkoušel sem měnit čísla v insertovém algoritmu, znaménka ale zatím se mi to nedaří. Kdyby si někdo všimnul co je špatně a upozornil mě, budu moc rád.

 
Nahoru Odpovědět
11.3.2018 20:07
Avatar
Matúš Olejník:11.3.2018 20:44
for(i = 0; i <= pocet_prvku; i++) {
    x = p[i];

toto ti hodí chybu v poslednej iterácii lebo sa budeš snažiť čítať hodnotu mimo alokovanej pamäte pretože v cykle ideš až po pocet_prvku, to rovná sa vymaž.
Ďalej máš

j = i;
while ((j > 1) && (x <= p[j-1])) {

i začína od nuly a do j priradíš hodnotu z i takže v podmienke vo while cykle (j > 1) bude j najprv 0 a potom 1 a ani jedno neplatí takže prvé dve iterácie foru sa spraví p[j] = x; čiže p[0] = p[0] a p[1] = p[1]. Ďalej ak bude j = 2 už je možné že sa vojde do cyklu while a teda začneš tam s tým niečo robiť avšak to j-- ti zníži j hodnotu minimálne na 1 atď. atď čím sa s hodnotou na pozícii 0 vôbec nič neurobí. Preto by som odporučil nie len skúšať meniť čísla a znamienka ale napr. zobrať si papier a nakresliť čo vlastne potrebuješ urobiť a určite na to prídeš aj sám ;)

Nahoru Odpovědět
11.3.2018 20:44
/* I am not sure why this works but it fixes the problem */
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.