Diskuze: Posloupnost_dvepole_bubble
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

					Člen				
			
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


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é.
#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.
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.
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.
#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.
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 
Zobrazeno 7 zpráv z 7.