Programiranje

Potrebna pomoc oko zadatka za informatiku

Igzy20 pet 3.11.2017 21:52

Vjerojatno ništa, kao i svi koji se registriraju na forum očekujući da će drugi za njih sve riješiti bez imalo truda. Umjesto da bar nešto sami pokušaju, pa makar to i apsolutno krivo bilo.

martin5487 ned 5.11.2017 11:31

Pozdrav. Imao sam zadatak da napisem program u pythonu koji uspisuje da li je godina prestupna i ja sam ovako napisao:
n=int(input('Unesi godinu'))
if n%100==0:
print('Godina nije prestupna')
elif n%400==0:
print('Godina je prestupna')
elif n%4==0:
print('Godina je prestupna')
else:
print('Godina nije prestupna')

ali prof mi kaze da netreba tako no ovaj program radi.
Ako bi mi netko mogao mozda pokazat kako to resiti na neki drugi nacin?

Bobobo-bo Bo-bobo ned 5.11.2017 16:39

Pokreni svoj program i unesi godinu 2000. Tvoj program javi da nije prestupna, što nije točno.

 

Problem je što program prvo provjerava da li je godina djeljiva sa 100. Godina 2000 zadovoljava ovaj uvjet pa program ispisuje poruku i izlazi iz if naredbe -  provjera da li je 2000 djeljivo s 400 se neće izvršiti.

 

Najjednostavnije je zamijeniti prvi i drugi uvjet.

 

 

ihush ned 5.11.2017 17:15
martin5487 kaže...
Pozdrav. Imao sam zadatak da napisem program u pythonu koji uspisuje da li je godina prestupna i ja sam ovako napisao:
n=int(input('Unesi godinu'))
if n%100==0:
print('Godina nije prestupna')
elif n%400==0:
print('Godina je prestupna')
elif n%4==0:
print('Godina je prestupna')
else:
print('Godina nije prestupna')

ali prof mi kaze da netreba tako no ovaj program radi.
Ako bi mi netko mogao mozda pokazat kako to resiti na neki drugi nacin?

 

martin5487 kaže...
Evo razloga zasto sam proveravao sa 100 i 400.

 pažljivo čitaj.. moraš smisliti odgovor, rečenicu koja će na kraju dati točan rezultat, neovisno koja je godina.. s izuzetcima.

da je samo svaka 4 tad bi bilo lako, if n 4=0.. zbog korekcije, svaka 100ta, mada je djeljiva, nije prijestupna, opet zbog korekcije svaka 400ta je.. to su izuzetci.

izuzetke testiraš samo kad su potrebni, ne za svaku drugu npr neparnu godinu koja nije izuzetak.. pa ne može biti ni izuzetak-izuzetka.

..tad bi zadatak bio precizno-struktutno-logički napravljen. Kao diagram toka, skup-podskup-rekurzija..

 

prvi if koji zaovolji uvjet, se uzme za true, else je kad ni jedan if nije zadovoljen (pravilo)

 

da je samo if djeljivo s 4..true (prijestupna) i else-false (nije prijestupna), tad bi dobio točno osim za 100tu.. false

kad dodaš za 100tu-izuzetak, moraš i 400tu kao izuzetak-izuzetka..true

to je zadatak, tako ga čitaš.

sve ostalo je else=false.

 

probaj, .. unutar if 4, unutar if 100 if 400.. i sve godine koje uneseš, moraju biti točne, 1234, 999, 1000, 2111, 2100, 2000.. 1999, 2001..

za test, uvijek koristi brojeve za koje znaš točan odgovor-rezultat.

-u tvom rješenju, godina npr 400, 1600, 2000.. bi dala netočan odgovor, jer bi dijeljenje sa 100 zadovoljilo uvjet, ne bi se uopće izvršilo djeljenje s 400..

ako zamjeniš ta dva redosljeda if 400 pa if 100, odgovor je točan. tj kad prvo djeliš sa 400 i to da true (točno) tad je djeljenje sa 100 nepotrebno, ako nije djeljivo s 400, prolazi do djeljenja sa 100 npr 200 i 300, 500, 600..

to su dva načina, pravi redosljed ili unutar ifa, dodatni test, uvod u rekurzije.. i logiku grananja uvijeta koji se (ne)izvršavaju.

zgodno je pratiti u debuggeru izvršavanje.. tad vidiš petlju i kako se izvršava, kad izlazi .. i tako otkriješ zašto je redosljed postavljanja testiranja važan, izuzetci.

martin5487 sri 8.11.2017 19:27

pozdrav. hitno mi treba pomoc oko dva zadatka.

a) napisati program koji ispisuje da li je broj deljiv sa 9, ali bez upotrebe ˝else˝.(znam da treba to ici ovako : a=int(input('unesi broj'))

                                                                                 if a%9==0:

                                                                                     print('broj je deljiv')

                                                                                 else:

                                                                                     print('broj nije deljiv'); ali kako to bez grananja?)

b)napisati program koji ispisuje kojije broj veći ,a koji manji ali bez upotrebe min i max(znam da je sa upotrebom min i max ovako:Ž
a=int(input('unesi prvi broj'))

b=int(input('unesi drugi broj'))

print('najveći je',max(a,b))

print('najmanji je',min(a,b))

Bobobo-bo Bo-bobo sub 11.11.2017 09:49

Zadatak a) se može riješiti pomoću dictionaryja:

DJELJIV = {True: 'broj je djeljiv', False: 'broj nije djeljiv'}
a = int(input('unesi broj'))
print(DJELJIV[a % 9 == 0])

 

Zadatak b) se može napraviti ovako:

a=int(input('unesi prvi broj'))
b=int(input('unesi drugi broj'))

if a > b:
    print('najveći je', a, 'najmanji je', b)
elif b > a:
    print('najveći je', b, 'najmanji je', a)

martin5487 sri 6.12.2017 19:44

pitanje: kako riječima objasniti sta petlja radi. znam da prvo uzima broj od 1 do n+1 ali ne razumem zasto dalje pise z_djelitelja=0:

n=int(input('unesi broj'))

for i in range(1,n+1):

   zbroj_djelitelja=0

   for j in range(1,i):

     if i%j==0:

       zbroj_djelitelja+=j

   if zbroj_djelitelja==i:

       print(i,end=' ')

ako netko moze da mi napise kako procitati taj program u cijelosti?

Floki čet 7.12.2017 16:39

Dakle, prvo treba opisati što algoritam uopće radi, a zatim tehniku na koji način to radi.

 

Algoritam za uneseni integer n traži savršene brojeve u intervalu [1, n]. Savršeni broj n je onaj prirodni broj čija suma djeljitelja koji su manji od n je jednaka n.

 

Vanjskom petljom prolazimo kroz zadani interval [1, n].

Varijabla z_djeljitelja nam služi da u nju zbrojimo sve djeljitelje svakog pojedinog broja i iz vanjske petlje. Zato varijablu resetiramo na 0 za svaki pojedini broj.

Unutarnjom petljom tražimo djeljitelje svakog broja i iz vanjske petlje u intervalu [1, i) i zbrajamo ih u varijablu z_djeljitelja.

Ako nam je zbroj djeljitelja broja i jednak broju i, ispišemo broj.

majstorp pon 11.12.2017 22:53

Pozz svima potrebna mi je pomoc oko iscitavanja ovog koda.

 

import math

parni=int(input('unesi paran broj'))

for nep in range(3,parni//2+1,2):

    p=True

    for nep2 in(nep,parni-nep):

    if p:

    for k in range(2,round(math.sqrt(nep2))+1):

    if nep2%k==0:

     p=False

   if p:

     print('{} +{}' .format(nep,parni-nep))

 

 

 

uglavnom znam da program ispsuje parni broj pomocu zbira prostih brojeva,Potrebno mi je da mi iscita netko svaki korak posebno.Hvala od srca svakom tko mi pomogne. ;)

Bobobo-bo Bo-bobo sri 27.12.2017 21:25
majstorp kaže...

Pozz svima potrebna mi je pomoc oko iscitavanja ovog koda.

 

import math

parni=int(input('unesi paran broj'))

for nep in range(3,parni//2+1,2):

    p=True

    for nep2 in(nep,parni-nep):

    if p:

    for k in range(2,round(math.sqrt(nep2))+1):

    if nep2%k==0:

     p=False

   if p:

     print('{} +{}' .format(nep,parni-nep))

 

 

 

uglavnom znam da program ispsuje parni broj pomocu zbira prostih brojeva,Potrebno mi je da mi iscita netko svaki korak posebno.Hvala od srca svakom tko mi pomogne. ;)

 

Navedeni program ne radi ništa jer ima gomilu grešaka - pogrešna, neuparena i nekonzistentna indentacija, zatvorena zagrada viška, korištenje varijable prije inicijalizacije i naopaki poziv funkcije sqrt.math (treba math.sqrt)

 

Ono što preostane nakon minimalnih ispravaka

import math

parni=int(input('Unesi paran broj'))

for nep in range(3, parni // 2 + 1, 2):
    p=True
    for nep2 in range(nep, parni-nep):
        if p:
            for k in range(2,round(math.sqrt(nep2)) + 1):
                if nep%2==0:
                    p=False
    if p:
        print('{} + {}'.format(nep,parni-nep))

 

je program koji ispisuje sve kombinacije unesenog pozitivnog parnog broja kao zbroja dva pozitivna brojeva od kojih je prvi neparan broj veći ili jednak 3 i manji ili jednak od drugog broja.

 

6 -> 3 + 3

8 -> 3 + 5

10 -> 3 + 7, 5 + 5

12 -> 3 + 9, 5 + 7

14 -> 3 + 11, 5 + 9, 7 + 7

...

 

1. Glavna petlja kroz varijablu nep provlači sve neparne brojeve veće ili jednake od 3 i manje od polovice unesenog parnog broja.

2. Na početku petlje varijabla p se postavlja na True.
3. Slijede dvije ugniježđene petlje koje efektivno ne rade ništa. Uvjet nep % 2 == 0 nikad nije ispunjen (jer je varijabla nep uvijek neparna) pa vrijednost varijable p ostaje nepromijenjena.

4. Na dnu se ispisuje (jer je p uvijek True) trenutna vrijednost varijable nep i razlika između parni i nep.

martin5487 čet 8.2.2018 09:21

Pozdrav, potrebna mi je pomoć oko iščitavanja svakog koraka zadatka:

 

n=int(input('unesi broj'))

ima=False

for i in range (1, n // 2, 2):

    t=i

    pom=n

    while pom > 0:

       pom-=t

       t+=2

    if pom ==0

       ima =True

       for j in range (i, t , 2):

           print(j,end= '  ')

if not ima:

    print('Nema')

 

Znam da program ispisuje sve konbinacije neparnih broje koje u zbiru daje uneseni broj n, ali ne znam kako iščitati zadatak. Unaprijed hvala. :D

 

martin5487 ned 14.10.2018 16:24

pozdrav! Naisao sam na zadatak koji ne razumem u potpunosti.Ako bi netko bio ljubazan i objasnio ga bio bih jako zahvalan.

def upis(n):
  x=[0]*n
  for i in range (n):
   x[i]=int(input())
  return x
n=int(input('broj elenata:'))
print('prva lista')
a=upis(n)
print('druga lista:')
b=upis(n)
s=0
for i in range(n):
s+=a[i]*b[i]
print(s)

Bobobo-bo Bo-bobo sri 12.12.2018 20:15

Priprema ispisa za fout može se premjestiti u funkciju (i malo pojednostaviti jer je '{0}.format(p) isto što i p)

 

def ispis(p, n):
    if n > 1:
      return '{0}{1}'.format(p, n)
    else:
        return p

fin = open('ulaz.txt', 'r')
fout = open('izlaz.txt', 'w')
retci = fin.readlines()
for r in retci:
    p = ''
    n = 0
    for t in r.strip():
        if t == p or p == '':
            n += 1
        else:
            fout.write(ispis(p, n))
            n = 1
        p = t
    fout.write(ispis(p, n) + '\n')
fout.close()

 

Tvoja petlja radi isto što i funkcija groupby iz modula itertools pa se može izbaciti ponovljeni kod za ispis nakon petlje:

 

from itertools import groupby

fin = open('ulaz.txt', 'r')
fout = open('izlaz.txt', 'w')
retci = fin.readlines()
for r in retci:
    for p, grupa in groupby(r.strip()):
        n = len(list(grupa))
        if n > 1:
            fout.write('{0}{1}'.format(p, n))
        else:
            fout.write(p)
    fout.write('\n')
fout.close()

 

Može i ovako

martin5487 ned 17.2.2019 12:43
Pozdrav,pronašao sam sljedeći zadatak i čini mi se jako zanimljiv, ali nisam siguran kako radi pa ako bi netko mogao samo da mi ga ukratko pojasni.Unaprijed hvalaa:)
from time import*
from random import*
def najbliži_1(a):
   broj_1,broj_2=a[0],a[1]
   for i in range (len(a)-1):
     for j in range(i+1,len(a)):
       if abs(a[i]-a[j])< abs(broj_1-broj_2)and a[i]!=a[j]:
         broj_1,broj_2=a[i],a[j]
   return broj_1,broj_2
def najbliži_2(a):
   a.sort()
   broj_1,broj_2=a[0], a[1]
   for i in range(len(a)-1):
     if abs(a[i]-a[i+1]) < abs (broj_1-broj_2) and a[i]!=a[i+1]:
       broj_1,broj_2=a[i],a[i+1]
   return broj_1, broj_2
def main():
   a=[randint(1,100000) for i in range(5000)]
   t1=clock()
   print(najbliži_1(a))
   t2=clock()
   print(najbliži_2(a))
   t3=clock()
   print('funkcija 1:{0:5f}'.format(t2-t1))
   print('funkcija 2:{0:5f}'.format(t3-t2))
main()

 

martin5487 ned 17.2.2019 12:45
Pozdrav,pronašao sam sljedeći zadatak u pythonu i čini mi se jako zanimljiv, ali nisam siguran kako radi pa ako bi netko mogao samo da mi ga ukratko pojasni.Unaprijed hvalaa:)
from time import*
from random import*
def najbliži_1(a):
   broj_1,broj_2=a[0],a[1]
   for i in range (len(a)-1):
     for j in range(i+1,len(a)):
       if abs(a[i]-a[j])< abs(broj_1-broj_2)and a[i]!=a[j]:
         broj_1,broj_2=a[i],a[j]
   return broj_1,broj_2
def najbliži_2(a):
   a.sort()
   broj_1,broj_2=a[0], a[1]
   for i in range(len(a)-1):
     if abs(a[i]-a[i+1]) < abs (broj_1-broj_2) and a[i]!=a[i+1]:
       broj_1,broj_2=a[i],a[i+1]
   return broj_1, broj_2
def main():
   a=[randint(1,100000) for i in range(5000)]
   t1=clock()
   print(najbliži_1(a))
   t2=clock()
   print(najbliži_2(a))
   t3=clock()
   print('funkcija 1:{0:5f}'.format(t2-t1))
   print('funkcija 2:{0:5f}'.format(t3-t2))
main()

 

Bobobo-bo Bo-bobo ned 17.2.2019 15:58

Program ispisuje rezultate i brzinu izvršavanja dviju funkcija tako da im pošalje istu listu od 5.000 random cijelih brojeva iz intervala [1, 100.000].

 

Obje funkcije za zadanu listu vraćaju jedan par različitih elementa čija je razlika najmanja - npr. za listu [1, 3, 10, 3] rezultat je (1, 3). Funkcije ne koriste isti algoritam - prva uspoređuje elemente "svaki-sa-svakim", dok druga prvo sortira listu pa provjera samo sljedbenik svakog elementa.

 

 

Ovo je primjer rezultata:

(47755, 47754)
(154, 155)
funkcija 1:3.388098
funkcija 2:0.002507

martin5487 sri 20.2.2019 10:20

hvala Vam puno. opet imam jos  jedno pitanje.

 

kod ovog zadata razumijem sve osim razloga zasto je ispisano traženje srednje vrednosti toliko komplikovano.zar ne bi mogla jednostavno pocetak+kraj//2

 

from random import*
def binarno_traženje(e, a):
   početak, kraj = 0, len(a) - 1
   while početak <= kraj:
     sredina = početak + (kraj - početak) // 2
     print(sredina,a[sredina])
     if a[sredina] == e:
       return sredina
     elif a[sredina] > e:
       kraj = sredina - 1
     else:
       početak = sredina + 1
   return -1

a=[]
n=int(input('Unesi broj elemnata liste'))
for i in range(n):
   a.append(randint(1,9*n))
a.sort
print (a)
e=int(input('unesi traženi broj'))
index = binarno_traženje(e,a)

if index==-1:

   print('nema trazenog broja',e,'u listi')

else:

   print('index broja',e,'je',index')

Bobobo-bo Bo-bobo sri 20.2.2019 20:54

Program ne traži srednju vrijednost, nego poziciju traženog broja e u listi od n random brojeva metodom binarnog pretraživanja.

 

Za početak program ima sintaktičku grešku - zadnji jednostruki navodnik u zadnjoj liniji je višak. Drugi problem je što linija a.sort ne radi ništa. Za binarno pretraživanje lista mora biti sortirana, a za izvršavanje metode/funkcije treba navesti zagrade a.sort().

CyberK sri 20.2.2019 22:35
Bobobo-bo Bo-bobo kaže...

Program ne traži srednju vrijednost, nego poziciju traženog broja e u listi od n random brojeva metodom binarnog pretraživanja.

Ja mislim da on pita zasto "sredina = početak + (kraj - početak) // 2"
umjesto "sredina = (početak + kraj) // 2"

Matematicki je isto i ja bi isto stavio ovo drugo, ali nije bas da je prevelika razlika.