Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Binaariluvut ja merkkijonojen muodostaminen niistä

JRokka [30.04.2020 17:46:44]

#

Mitä parannettavaa tässä on?

mjono = "pesukone"
mjn = ""
luvut = []
for x in range(len(mjono)):
    luvut.append(0)
#Muodostetaan binaarilukuja ja sen avulla merkkijonoja.
#1 tarkoittaa, että merkki tulostetaan.
while (True):

    #Muutetaan ensin viimeistä numeroa ja sen jälkeen mahdollisesti edellä olevia
    if (luvut[len(luvut)-1] == 0):
        luvut[len(luvut)-1] = 1
        #Muodostetaan luvuista merkkijono.
        mjn = ""
        for i in range(len(luvut)):
            if (luvut[i] == 1):
                mjn += mjono[i]
        print(luvut)
        print(mjn)
        x = len(luvut)-1
        #Muutetaan edellä olevia lukuja.
        while (True):
            if (luvut[x] == 0):
                break
            if (x > 0):
                x -= 1
        luvut[x] = 1
        for y in range(x+1,len(luvut)):
            luvut[y] = 0
    else:
        #Ei muuteta edellä olevia lukuja.
        luvut[len(luvut)-1] = 0
    mjn = ""
    for i in range(len(luvut)):
        if (luvut[i] == 1):
            mjn += mjono[i]
    print(luvut)
    print(mjn)
    if (not(0 in luvut)):
        #Poistutaan silmukasta.
        break

Jaska [30.04.2020 18:04:47]

#

En tiedä onko tarkoituksena vaan tulostaa kaikki osasanat vai onko järjestyksellä väliä. Vaihtoehtoinen lähestymistapa on osoitteessa https://www.geeksforgeeks.org/generate-all-the-binary-strings-of-n-bits/ .

luvut = []
for x in range(len(mjono)):
    luvut.append(0)

Tämän voi laittaa muotoon

luvut = [0]*len(mjono)

Varmasti makuasia, mutta Pythonissa ei ole pakko käyttää range(len)-rakennetta.

Metabolix [30.04.2020 18:23:19]

#

Koodistasi on vaikea käsittää, mitä siinä edes tehdään. Tämä on ehdottomasti erittäin huono asia ja koskee myös useimpia aikaisempia koodejasi. Koodista pitäisi pystyä ymmärtämään, mitä siinä tapahtuu ja mikä on koodin tavoite. Jos koodi on liian monimutkainen suoraan ymmärrettäväksi, kommenttien pitäisi selittää koodin toimintaa ja erityisesti koodin tarkoitusta. "Merkkijonojen muodostaminen binääriluvuista" on niin epäselvä kuvaus, että siitä ei voi arvata, mitä koodi oikeastaan tekee.

Koodisi myös jää ilmeisesti jumiin ikuiseen silmukkaan – korjaa ainakin tämä harjoituksena.

Käytät taulukkoa etkä binäärilukuja, ja tämän takia koodisi on sekava ja hidas. Oikeasti luvuilla koodista tulee lyhyt ja paljon nopeampi.

teksti = "pesukone"
# Käydään läpi binääriluvut 1 – N.
for luku in range(1, 2 ** len(teksti)):
    # Otetaan binääriluvun bittien mukaisesti merkkejä merkkijonosta.
    osa = "".join(teksti[-i - 1] for i in reversed(range(len(teksti))) if luku >> i & 1 == 1)
    print(osa)

Tai jos taulukkomuotoinen bittien tulostus on todella tarpeen:

teksti = "pesukone"
for luku in range(1, 2 ** len(teksti)):
    bitit = [luku >> i & 1 for i in reversed(range(len(teksti)))]
    osa = "".join(teksti[i] for i in range(len(teksti)) if bitit[i] == 1)
    print(bitit)
    print(osa)

Yleinen sinun koodiesi vika on myös se, että niistä ei ole mitään hyötyä. Kokeile joskus tehdä jokin kokonainen ohjelma, jota voi käyttää johonkin järkevään tarkoitukseen.

JRokka [01.05.2020 23:50:30]

#

luvut = [0,0,0,0,0,0]


a = 0
#Tulostetaan binaarilukuja.
while (True):
    #Lasketaan binaarilukuja kahden potenssien avulla.
    a += 1
    print(luvut)
    if (a % 32 == 0):
        luvut[0] = 1
        for x in range(1,len(luvut)):
            luvut[x] = 0
    elif (a % 16 == 0):
        luvut[1] = 1
        for x in range(2,len(luvut)):
            luvut[x] = 0
    elif (a % 8 == 0):
        luvut[2] = 1
        for x in range(3,len(luvut)):
            luvut[x] = 0
    elif (a % 4 == 0):
        luvut[3] = 1
        for x in range(4,len(luvut)):
            luvut[x] = 0
    elif (a % 2 == 0):
        luvut[4] = 1
        for x in range(5,len(luvut)):
            luvut[x] = 0
    elif (a % 1 == 0):
        luvut[5] = 1
    if (luvut[0] == 1):
        break

JRokka [16.05.2020 13:55:41]

#

#include <iostream>
using namespace std;

int main(){
 //Seuraavan neljän luvun avulla yritetään laskea suuremmat binaarit.
 int bin_2 = 0;
 int bin_4 = 0;
 int bin_8 = 0;
 int bin_16 = 0;
 int luvut[5] = {0,0,0,0,0};
 while (luvut[0] < 1){
  luvut[4]=1;
  bin_2++;
  bin_4++;
  bin_8++;
  bin_16++;
  //Katsotaan, muutetaanko suurempia lukuja.
  if (bin_16 == 16){
   luvut[0]=1;
   luvut[1]=0;
   luvut[2]=0;
   luvut[3]=0;
   luvut[4]=0;
   bin_16=0;
   bin_8=0;
   bin_4 = 0;
   bin_2 = 0;
  }
  else if (bin_8 == 8){
   luvut[1]=1;
   luvut[2]=0;
   luvut[3]=0;
   luvut[4]=0;
   bin_8=0;
   bin_4=0;
   bin_2=0;
  }
  else if (bin_4 == 4){
   luvut[2]=1;
   luvut[3]=0;
   luvut[4]=0;
   bin_4=0;
   bin_2=0;
  }

 else if (bin_2 == 2){
   luvut[3]=1;
   luvut[4]=0;
   bin_2=0;
  }


  for (int x = 0; x < 5; x++){
   cout << luvut[x] << " ";
  }
  cout << endl;
 }



 return 0;
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta