Program c++, pole, posloupnosti, seřazení sorty – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Program c++, pole, posloupnosti, seřazení sorty – C / C++ – Fórum – Programujte.comProgram c++, pole, posloupnosti, seřazení sorty – C / C++ – Fórum – Programujte.com

 

Martin
~ Anonymní uživatel
1602 příspěvků
10. 3. 2018   #1
-
0
-

Dobrý den, dostal jsem ve škole poněkud složité zadání úkolu a nevím si rady co s tím :/.

Proto bych byl rád za jakýkoliv váš postřeh jak úkol řešit, protože nevím jestli hledám problém tam kde není nebo jsem to vůbec nepochopil.

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.

Pozn: Sám to chápu tak, že se zadají dvě posloupnosti (stejně dlouhé), zadá se délka. Poté mi vznikne posloupnost, kde sečtu vždy 1. prvky z každé posloupnosti k sobě (poté 2. prvky, 3. prvky...). Teď mi dělá trochu problém to vzestupně, zda již zde to mám řadit pomocí sortů :/. Každou posloupnost si budu v průběhu ukládat a poté ji vypíši. Na závěr dojde k setřídění všech (třech ??) posloupností pomocí sortů.

Předem díky za jakoukoliv pomoc či nápad.

Nahlásit jako SPAM
IP: 107.167.108.–
KIIV
~ Moderátor
+43
God of flame
10. 3. 2018   #2
-
0
-
  • Zadas velikost
  • Nactes dve sady cisel, kazda o zadane velikosti
  • Vytvoris treti sadu cisel tim, ze scitas prvky na stejnych pozicich z tech dvou nactenych
  • Seradis jen tu posledni
  • Vypises vsechny tri

V kazdem programu muzes mit to same, jen budou tri varianty. Jedna na konci pouzije tvoji funkci BubbleSort, jedna InsertSort a posledni varianta pouzije SelectSort. Na vypis mas mit opet funkci.

A "vzestupne" znamena serazeni od nejmensiho po nejvetsi.

Nahlásit jako SPAM
IP: 185.163.41.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin
~ Anonymní uživatel
1602 příspěvků
10. 3. 2018   #3
-
0
-

#2 KIIV

Připojen obrázek.

Takže takovýto postup je zatím v pořádku že? Vyhazuje mi to každý prvek, prozatím neseřazené. Teď by mělo následovat seřazení vzestupně té třetí posloupnosti a poté vypíši všechny tři posloupnosti.

Jinak již nic? Já to nejdříve pochopil totiž tak, že na závěr dám posloupnosti (všechny) do sebe a opět je seřadím. Ale když si to tak pročítám, tak zřejmě jsem to pochopil špatně a tvá verze bude zřejmě správná.


Nahlásit jako SPAM
IP: 107.167.108.–
KIIV
~ Moderátor
+43
God of flame
10. 3. 2018   #4
-
0
-

#3 Martin
Ne tak uplne. Vypis ma byt specificky pomoci funkce.

Taktez VLA (variable length arrays) nejsou technicky vzato v C++ standardu. Je to jen rozsireni nekterych kompilatoru, ale na jinem to fungovat nemusi. (to je ta cast kolem  int x[promenna] a tak dale)

Nahlásit jako SPAM
IP: 37.188.176.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin
~ Anonymní uživatel
1602 příspěvků
10. 3. 2018   #5
-
0
-

   

#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;
}

Mohl by mi někdo poradit, kde dělám chybu? Už si s tím hraji opravdu dlouho a pořád ji nevidím. Mám to možná lehce zmatečně označené, ale snad je to k poznání.

Nahlásit jako SPAM
IP: 107.167.109.–
KIIV
~ Moderátor
+43
God of flame
10. 3. 2018   #6
-
0
-

#5 Martin
Pole se indexuji od 0 do N-1. Jakmile zapisujes na N, tak uz zapisujes ZA pole.

Dale neni dobry zvyk pouzivat jednu promennou pro ruzne ucely. Vznikaji pak presne takovehle situace. Pekne si nadefinuj for (int i = 0; i < pocet_prvku; ++i) ...  Nestane se pak, ze uplne mimo loopy prdnes p[i] = p1[i] + p2[i]; a projde to!  Zaprve je po predchozim for a podmince i <= pocet_prvku vlastne rovno pocet_prvku+1, takze uz zapisujes hodne mimo pole. A zadruje to neni v loopu, takze tezko to zkopiruje vic, jak jednu hodnotu (a jeste uplne blbou).

A nauc se poradne odsazovat, zatim ti to asi tak nepripada, ale spravne odsazeny kod je asi tak milionkrat lepe citelnejsi nez tohle.

Nahlásit jako SPAM
IP: 89.176.10.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin
~ Anonymní uživatel
1602 příspěvků
11. 3. 2018   #7
-
0
-

   

#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],p3[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 p[pocet_prvku],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 jsem to dal takto. Tu rovnici p[i] = p1[i] + p2[i] nevím jak nebo kam jinam zapsat tak, aby to počítalo s novou hodnotou v sortu.

Každopádně zřejmě bude teď chyba někde v této oblasti, případně přímo v sortu.

Nahlásit jako SPAM
IP: 107.167.109.–
KIIV
~ Moderátor
+43
God of flame
11. 3. 2018   #8
-
0
-

#7 Martin
tos tomu moc nepomohl - spravne odsazeni, "dramaticke pauzy" pro zprehledneni a tak. Kravina u scitani uz ted nemuze v zadnym pripade projit, protoze ted uz neexistuje promenna i mimo for loop. Tim te to snad donuti zamyslet se nad tim, jestli tam treba taky nemas scitat hodnoty v dalsim foru a ne se tam snazit nacpat kopirovani hodnoty daleko za polem (respektive za vsema trema). Doporuceni "nepouzivat promennou pro ruzne ucely", mit promenne jen kdyz je potrebujes, nevytvaret promenne, kdyz do nich nemas co priradit jsou docela dobry doporuceni. Minimalne prvni z nich te ted kope do zadku.

#include <iostream>
#include <string>
#include <ctime>

using namespace std;

// volani typicke pro C, v C++ to jde udelat lepe:
void VypisPole (int pocet_prvku, int p[]) {
  cout << "\n*************************";
  for (int 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;

  // ve standardu C++ neexistuje:
  int p1[pocet_prvku], p2[pocet_prvku];

  for (int i = 0; i < pocet_prvku; i++) { // nepouzivat promennou i pro ruzne "ucely" ()
    cout << "Zadej " << i + 1 << ". cislo posloupnosti:";
    cin >> p1[i];
  }

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

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

  // pred tim si mel p3, ktere si ani nepouzil....
  int p[pocet_prvku];
  



  // kdyz jsou int i jen tam, kde maj, tak tohle v zivote nemuze projit (== totalni blbost):
  p[i] = p1[i] + p2[i];




  // na serazeni maji byt pouzity funkce:
  for (int i = pocet_prvku-1; i > 1; --i) { // kdyz zacnes s i = pocet_prvku, j+1 bude MIMO POLE!!!!!!
    for (int j = 0; j < i; ++j) { // INDEXUJE SE OD 0 !!!!!!!!!
      if (p[j] > p[j + 1]) {
        int pom = p[j + 1]; // definuj promennou, az kdyz ji potrebujes
        p[j + 1] = p[j];
        p[j] = pom;
      }
    }
  }

  VypisPole (pocet_prvku, p);

  return 0;
}
Nahlásit jako SPAM
IP: 89.176.10.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 72 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý