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.