29 svar
415 visningar
destiny99 behöver inte mer hjälp
destiny99 8066
Postad: 9 aug 2023 16:09 Redigerad: 9 aug 2023 16:11

Average of the sum

Hej!

Jag undrar hur man ska göra med den här n som ej är definierad sen innan? Sen är det punkter emellan fjärde elemetet och 98 elementet som jag är osäker över om det ska vara så. Är det upp till mig att hitta på ett antal värden som gör att vi får ett medelvärde på 50.5? Jag följde punkterna man ska göra och kodade det som min kod visar nu.

Laguna Online 30704
Postad: 9 aug 2023 16:15

Uppgiften är slarvigt formulerad. De menar nog att du först ska mata in ett tal och kalla det för n.

Sedan ska du summera alla heltal från 1 upp till n.

destiny99 8066
Postad: 9 aug 2023 16:20
Laguna skrev:

Uppgiften är slarvigt formulerad. De menar nog att du först ska mata in ett tal och kalla det för n.

Sedan ska du summera alla heltal från 1 upp till n.

så variabeln ska alltså döpas till n?

Laguna Online 30704
Postad: 9 aug 2023 16:22 Redigerad: 9 aug 2023 16:22

I koden får du kalla den vad du vill, tycker jag, men det är det dom menar med n i uppgiften.

destiny99 8066
Postad: 9 aug 2023 16:23 Redigerad: 9 aug 2023 16:24
Laguna skrev:

I koden får du kalla den vad du vill, tycker jag, men det är det dom menar med n i uppgiften.

Jag får tyvärr error nu när jag kör koden i #3

Laguna Online 30704
Postad: 9 aug 2023 16:28

Det där ... ingår inte i språket Python, det är bara en del av språket i uppgiftsformuleringen.

destiny99 8066
Postad: 9 aug 2023 16:29
Laguna skrev:

Det där ... ingår inte i språket Python, det är bara en del av språket i uppgiftsformuleringen.

Vad ingår ej i python?

Laguna Online 30704
Postad: 9 aug 2023 16:30

punkt punkt punkt

destiny99 8066
Postad: 9 aug 2023 16:32 Redigerad: 9 aug 2023 16:34
Laguna skrev:

punkt punkt punkt

Men ska det stå sifrror där emellan ? Kan man nöja sig med 1,2,3,4,98,99,n? Om ja så får jag dessvärre ej samma average värde uppgiften har

Laguna Online 30704
Postad: 9 aug 2023 16:47

Som jag skrev så är det talen från 1 upp till n du ska summera.

Iroz11 17
Postad: 9 aug 2023 16:57
destiny99 skrev:

Hej!

Jag undrar hur man ska göra med den här n som ej är definierad sen innan? Sen är det punkter emellan fjärde elemetet och 98 elementet som jag är osäker över om det ska vara så. Är det upp till mig att hitta på ett antal värden som gör att vi får ett medelvärde på 50.5? Jag följde punkterna man ska göra och kodade det som min kod visar nu.

Prova med denna kod Destiny:

def main():
limit = int(input("Enter the limit: "))

numbers = []
total_sum = 0

while total_sum < limit:
num = int(input("Enter a number: "))
numbers.append(num)
total_sum += num

average = total_sum / len(numbers)

print("Numbers entered:", numbers)
print("Sum of numbers:", total_sum)
print("Average of numbers:", average)

if __name__ == "__main__":
main() 

 

//

Visa spoiler

frågade ChatGpt^^

destiny99 8066
Postad: 9 aug 2023 16:58
Laguna skrev:

Som jag skrev så är det talen från 1 upp till n du ska summera.

Jaa men då får jag fel för vi har punkter emellan?

destiny99 8066
Postad: 9 aug 2023 16:59
Iroz11 skrev:
destiny99 skrev:

Hej!

Jag undrar hur man ska göra med den här n som ej är definierad sen innan? Sen är det punkter emellan fjärde elemetet och 98 elementet som jag är osäker över om det ska vara så. Är det upp till mig att hitta på ett antal värden som gör att vi får ett medelvärde på 50.5? Jag följde punkterna man ska göra och kodade det som min kod visar nu.

Prova med denna kod Destiny:

def main():
limit = int(input("Enter the limit: "))

numbers = []
total_sum = 0

while total_sum < limit:
num = int(input("Enter a number: "))
numbers.append(num)
total_sum += num

average = total_sum / len(numbers)

print("Numbers entered:", numbers)
print("Sum of numbers:", total_sum)
print("Average of numbers:", average)

if __name__ == "__main__":
main() 

 

//

Visa spoiler

frågade ChatGpt^^

Oj det var svår kod :/ jag försöker göra som jag gör nu för att komma fram liksom.

destiny99 8066
Postad: 9 aug 2023 18:56 Redigerad: 9 aug 2023 18:57

Jag gjorde istället så och det löste sig. Tack ändå!

Tegelhus 227
Postad: 9 aug 2023 19:47

Poängen med uppgiften är väl att man ska träna på loopar. Det går ju att lösa det i det här fallet genom att skriva om det som du gjorde, men när man håller på med programmering är just loopar ett väldigt kraftfullt verktyg som du kommer behöva förr eller senare.

En loop är i grund och botten en upprepning av någonting. I det här fallet kan upprepningen vara att du lägger till en siffra i taget till din summa, tills vi har gått igenom alla siffror (vårt slutvillkor).

I Python finns egentligen två loopar, "while" och "for". Båda kan användas för att lösa uppgiften, men skiljer sig lite i hur man använder dem.

Iroz förslag gör ju något annat än det du vill göra, men konstruktionen är ungefär vad du vill ha. Mitt tips är att du läser på lite om loopar, och ser om du kan lösa uppgiften med det också. Loopar är trots allt ett väldigt centralt koncept inom programmering.

destiny99 8066
Postad: 9 aug 2023 20:16 Redigerad: 9 aug 2023 20:18
Tegelhus skrev:

Poängen med uppgiften är väl att man ska träna på loopar. Det går ju att lösa det i det här fallet genom att skriva om det som du gjorde, men när man håller på med programmering är just loopar ett väldigt kraftfullt verktyg som du kommer behöva förr eller senare.

En loop är i grund och botten en upprepning av någonting. I det här fallet kan upprepningen vara att du lägger till en siffra i taget till din summa, tills vi har gått igenom alla siffror (vårt slutvillkor).

I Python finns egentligen två loopar, "while" och "for". Båda kan användas för att lösa uppgiften, men skiljer sig lite i hur man använder dem.

Iroz förslag gör ju något annat än det du vill göra, men konstruktionen är ungefär vad du vill ha. Mitt tips är att du läser på lite om loopar, och ser om du kan lösa uppgiften med det också. Loopar är trots allt ett väldigt centralt koncept inom programmering.

Absolut jag ska göra det och lösa om uppgiften igen med for eller while loop när jag kan om loop mer. Synd att jag ej såg att det handlade om loopar i den uppgiften men antar det är för att vi vill använda range o sånt.

Laguna Online 30704
Postad: 9 aug 2023 21:11

Ditt medelvärde stämmer bara om n är 100.

destiny99 8066
Postad: 9 aug 2023 21:23
Laguna skrev:

Ditt medelvärde stämmer bara om n är 100.

Ah nu ändrade jag så att det står n i nämnaren så det kan gälla för vilken n som helst.

destiny99 8066
Postad: 13 aug 2023 11:55

Nu gjorde jag en metod med if och for sats. Dock får jag detta felmeddelande

david1010 8
Postad: 13 aug 2023 12:32

Gör en funktion som tar in en siffra n, gör två variabler som vi sätter till 0 i början. En som håller koll på antal element och en som har koll på den totala summan från 1 till n +1. Gör en forloop där du itererar från 1 - n+1 ( som du gjort i din range funktion. Addera totala summan på ena variabeln ( den som håller koll på totala summan) och addera 1 på den andra ( som håller koll på antal element). dividera sedan totala summan med antal element. 

kan se ut såhär:

Visa spoiler

def average(n):
total_sum = 0
total_elements = 0
if n< 99:
       print( ' has to be bigger than 100')
for i in range(1,n+1):
          total_sum +=i
          total_elements +=1
average = total_sum/ total_elements
return average


print(average(100))

Som jag tolkar uppgiften vill man iterera upp till åtminstonde 100

destiny99 8066
Postad: 13 aug 2023 12:35 Redigerad: 13 aug 2023 12:40
david1010 skrev:

Gör en funktion som tar in en siffra n, gör två variabler som vi sätter till 0 i början. En som håller koll på antal element och en som har koll på den totala summan från 1 till n +1. Gör en forloop där du itererar från 1 - n+1 ( som du gjort i din range funktion. Addera totala summan på ena variabeln ( den som håller koll på totala summan) och addera 1 på den andra ( som håller koll på antal element). dividera sedan totala summan med antal element. 

kan se ut såhär:

Visa spoiler

def average(n):
total_sum = 0
total_elements = 0
if n< 99:
       print( ' has to be bigger than 100')
for i in range(1,n+1):
          total_sum +=i
          total_elements +=1
average = total_sum/ total_elements
return average


print(average(100))

Som jag tolkar uppgiften vill man iterera upp till åtminstonde 100

Jag har ej lärt mig om def funktion och sånt än.  Bara for loop ,while ,if och sånt. Dock gjorde jag såhär istället

david1010 8
Postad: 13 aug 2023 12:40

okej, då kan du göra en input på n istället. 

såhär kan du göra då:

n = int(input("input a integer: "))
total_sum = 0
total_elements = 0
if n< 99:
        print( ' has to be bigger than 100')
for i in range(1,n+1):
         total_sum +=i
         total_elements +=1
average = total_sum/ total_elements
print(average)

destiny99 8066
Postad: 13 aug 2023 12:42 Redigerad: 13 aug 2023 12:44
david1010 skrev:

okej, då kan du göra en input på n istället. 

såhär kan du göra då:

n = int(input("input a integer: "))
total_sum = 0
total_elements = 0
if n< 99:
        print( ' has to be bigger than 100')
for i in range(1,n+1):
         total_sum +=i
         total_elements +=1
average = total_sum/ total_elements
print(average)

Okej men funkar mitt sätt också ovan? I din kod får jag känslan av att den skriver ut bara average värdet men ej summan som jag förstått att den skall göra och sen är väl i ej definierad?

david1010 8
Postad: 13 aug 2023 13:11
destiny99 skrev:
david1010 skrev:

okej, då kan du göra en input på n istället. 

såhär kan du göra då:

n = int(input("input a integer: "))
total_sum = 0
total_elements = 0
if n< 99:
        print( ' has to be bigger than 100')
for i in range(1,n+1):
         total_sum +=i
         total_elements +=1
average = total_sum/ total_elements
print(average)

Okej men funkar mitt sätt också ovan? I din kod får jag känslan av att den skriver ut bara average värdet men ej summan som jag förstått att den skall göra och sen är väl i ej definierad?

Det jag gör och som jag tolkar uppgiften är att man vill beräkna medelvärdet av en talföljd upp till n. Att göra det så adderar jag alla tal från 1 - n och dividerar totalsumman med antal tal, vilket ger medelvärdet av talföljden. i definieras i loopen. använder man en variabel i en loop behöver man inte definiera den. i detta exempel kommer i vara 1 under första iterationen, 2 under andra och fortsätta till n. Notera att total_elements adderas med 1 och inte i. Kan vara svårt att se skillnad på dem ibland. 

Din kod fungerar. Dock krånglar du till det kan jag tycka, men det är väl en smaksak.  några småsaker du kan tänka på:

du behöver inte multiplicera a_n med 1 när du definierar variabeln, det gör ingen skillnad.

i din forloop använder du n som variabel. Dock,(antar jag)  definierar du n som ditt maxvärde i talserien. När du sedan använder n i din range(1,n+1) kommer n att ändras till 1,2,3..., n. Det fungerar i denna uppgift men överlag kan det vara bra att hålla isär de olika variablerna så varje variabel har sin egna uppgift.  Det gör det mer lättläst och du undviker onödiga fel. 

destiny99 8066
Postad: 13 aug 2023 14:46 Redigerad: 13 aug 2023 14:49
david1010 skrev:
destiny99 skrev:
david1010 skrev:

okej, då kan du göra en input på n istället. 

såhär kan du göra då:

n = int(input("input a integer: "))
total_sum = 0
total_elements = 0
if n< 99:
        print( ' has to be bigger than 100')
for i in range(1,n+1):
         total_sum +=i
         total_elements +=1
average = total_sum/ total_elements
print(average)

Okej men funkar mitt sätt också ovan? I din kod får jag känslan av att den skriver ut bara average värdet men ej summan som jag förstått att den skall göra och sen är väl i ej definierad?

Det jag gör och som jag tolkar uppgiften är att man vill beräkna medelvärdet av en talföljd upp till n. Att göra det så adderar jag alla tal från 1 - n och dividerar totalsumman med antal tal, vilket ger medelvärdet av talföljden. i definieras i loopen. använder man en variabel i en loop behöver man inte definiera den. i detta exempel kommer i vara 1 under första iterationen, 2 under andra och fortsätta till n. Notera att total_elements adderas med 1 och inte i. Kan vara svårt att se skillnad på dem ibland. 

Din kod fungerar. Dock krånglar du till det kan jag tycka, men det är väl en smaksak.  några småsaker du kan tänka på:

du behöver inte multiplicera a_n med 1 när du definierar variabeln, det gör ingen skillnad.

i din forloop använder du n som variabel. Dock,(antar jag)  definierar du n som ditt maxvärde i talserien. När du sedan använder n i din range(1,n+1) kommer n att ändras till 1,2,3..., n. Det fungerar i denna uppgift men överlag kan det vara bra att hålla isär de olika variablerna så varje variabel har sin egna uppgift.  Det gör det mer lättläst och du undviker onödiga fel. 

Okej så om jag tar bort den där ettan vid a_n så har jag ju hållt isär variablerna. Förstår ej riktigt var du menar att jag krånglar till. Om vi använder din kod så blir det mer programmering än matematisk vilket vad min kod är. 

Fermatrix 7841 – Fd. Medlem
Postad: 13 aug 2023 15:02

Du krånglar till implementationen en aning,  men att du vill anvnda den slutna formeln för en aritmetisk summa är helt rätt tänk. Att prata om tidskomplexitet är långt lite överkurs men det skadar inte att introducera det redan nu. 

väldigt förenklat så kan du se tidskomplexitet som hur bra en algoritm beräkningstid ökas när dess input ökar. Vi brukar beteckna detta som O(något). Du lär dig (om du inte gjort det i envarren (Ex Taylor)) att O faktiskt är Ordo här, dvs, det har och göra med gränsvärden. Att beräkna summan iterativt (en for loop) är O(n), så tidskomplexiteten växer linjärt med n (tänk dig kurvan y=xy=x) medan lösningen med den slutna formeln är O(1) - den är konstant oavsett värdet av n. Det är alltså mycket snabbare (för stora n, för små n spelar det ingen roll) att beräkna summan med den slutna formeln som vi kan ta fram med lite matematik.

Här har du några olika sätt att beräkna uppgiften. en funktion def namn(argument) har jag för mig du har pillat med innan? Helt enkelt är det ett block av kod som körs när vi kallar på dess namn. Den rekursiva lösningen är nog ganska jobbig att begripa i början, så skit i den. Det var mest för att illustrera var matematiken kommer in.

 

# f(n) = 1 + 2 + 3 + ... + n <=> f(n) = n + f(n-1) - beräkna rekursivt (O(n))
def rec_sum(n):
    if n <= 0:
        return 0
    return n + rec_sum(n - 1)


# beräknas iterativt (med for loop) mha sum och range - O(n)
def itr_sum(n):
    return sum(range(1, n + 1))


# använder slutna formeln för en aritmetisk summa som du ville göra (O(1))
def sum_natural_numbers(n):
    return n * (n + 1) // 2


def avg(n):
    return sum_natural_numbers(n) / n if n != 0 else 0


# Körs om det körs med -O flaggan (görs per default)
if __debug__:
    n = 100
    assert (rec_sum(n) / n == itr_sum(n) / n == sum_natural_numbers(n) / n)

if __name__ == '__main__':
    n = 100
    print(sum_natural_numbers(n))
    print(avg(n))

Kan du med koden ovan fixa till din lösning så att den

  • Tar emot en input n
  • Beräknar summan iterativt (exempelvis med en for loop)
  • Inte använder sig av en funktion mer än main (inga def)
  • beräknar medelvärdet

Bonus för att träna din förståelse:

  • Kan du lösa den nu istället med en while loop?
  • Kan du lösa problemet genom att bryta isär saker till enkla funktioner? 
  • Kan du utöka programmet så att den kan hantera en lista med dessa tal?

Tillägg: 13 aug 2023 15:05

Jag råkade glömma bort den iterativa lösningen. den som kallas itr_sum är det mest "Pythonic" sättet att beräkna summan, men jag tror ni hänger med på vad jag menade. :)

destiny99 8066
Postad: 13 aug 2023 15:18
Dracaena skrev:

Du krånglar till implementationen en aning,  men att du vill anvnda den slutna formeln för en aritmetisk summa är helt rätt tänk. Att prata om tidskomplexitet är långt lite överkurs men det skadar inte att introducera det redan nu. 

väldigt förenklat så kan du se tidskomplexitet som hur bra en algoritm beräkningstid ökas när dess input ökar. Vi brukar beteckna detta som O(något). Du lär dig (om du inte gjort det i envarren (Ex Taylor)) att O faktiskt är Ordo här, dvs, det har och göra med gränsvärden. Att beräkna summan iterativt (en for loop) är O(n), så tidskomplexiteten växer linjärt med n (tänk dig kurvan y=xy=x) medan lösningen med den slutna formeln är O(1) - den är konstant oavsett värdet av n. Det är alltså mycket snabbare (för stora n, för små n spelar det ingen roll) att beräkna summan med den slutna formeln som vi kan ta fram med lite matematik.

Här har du några olika sätt att beräkna uppgiften. en funktion def namn(argument) har jag för mig du har pillat med innan? Helt enkelt är det ett block av kod som körs när vi kallar på dess namn. Den rekursiva lösningen är nog ganska jobbig att begripa i början, så skit i den. Det var mest för att illustrera var matematiken kommer in.

 

# f(n) = 1 + 2 + 3 + ... + n <=> f(n) = n + f(n-1) - beräkna rekursivt (O(n))
def rec_sum(n):
    if n <= 0:
        return 0
    return n + rec_sum(n - 1)


# beräknas iterativt (med for loop) mha sum och range - O(n)
def itr_sum(n):
    return sum(range(1, n + 1))


# använder slutna formeln för en aritmetisk summa som du ville göra (O(1))
def sum_natural_numbers(n):
    return n * (n + 1) // 2


def avg(n):
    return sum_natural_numbers(n) / n if n != 0 else 0


# Körs om det körs med -O flaggan (görs per default)
if __debug__:
    n = 100
    assert (rec_sum(n) / n == itr_sum(n) / n == sum_natural_numbers(n) / n)

if __name__ == '__main__':
    n = 100
    print(sum_natural_numbers(n))
    print(avg(n))

Kan du med koden ovan fixa till din lösning så att den

  • Tar emot en input n
  • Beräknar summan iterativt (exempelvis med en for loop)
  • Inte använder sig av en funktion mer än main (inga def)
  • beräknar medelvärdet

Bonus för att träna din förståelse:

  • Kan du lösa den nu istället med en while loop?
  • Kan du lösa problemet genom att bryta isär saker till enkla funktioner? 
  • Kan du utöka programmet så att den kan hantera en lista med dessa tal?

Tillägg: 13 aug 2023 15:05

Jag råkade glömma bort den iterativa lösningen. den som kallas itr_sum är det mest "Pythonic" sättet att beräkna summan, men jag tror ni hänger med på vad jag menade. :)

Tyvärr vet jag ej hur man använder main elr lärde mig det. 

Fermatrix 7841 – Fd. Medlem
Postad: 13 aug 2023 15:26

Nu i början kan du antingen struna i if __name__ == '__main__': eller bara lägga ditt den och tänka att här är din entry point, dvs, ditt program när du kör kommer alltid köra main blocket. Vad if __name__ == '__main__': faktiskt gör är inte viktigt för närvarande, men du kommer se det överallt. Kort sagt så har det att göra med vad som händer om du i en annan modul skulle importera denna modulen. Men det räcker för tillfället att veta att dina program kommer börja här. Om du har programmerat i C, Java eller något annat språk så är detta i princip samma sak som main funktionen. 

destiny99 8066
Postad: 13 aug 2023 16:24 Redigerad: 13 aug 2023 17:42
Dracaena skrev:

Nu i början kan du antingen struna i if __name__ == '__main__': eller bara lägga ditt den och tänka att här är din entry point, dvs, ditt program när du kör kommer alltid köra main blocket. Vad if __name__ == '__main__': faktiskt gör är inte viktigt för närvarande, men du kommer se det överallt. Kort sagt så har det att göra med vad som händer om du i en annan modul skulle importera denna modulen. Men det räcker för tillfället att veta att dina program kommer börja här. Om du har programmerat i C, Java eller något annat språk så är detta i princip samma sak som main funktionen. 

Nej jag har aldrig programmerat i C eller något. Sitter första gången med python nu.

Såhär ser den ut nu

Fermatrix 7841 – Fd. Medlem
Postad: 13 aug 2023 18:21 Redigerad: 13 aug 2023 18:24

Snyggt, det fungerar. för rimliga n så får du rätt svar. 

Fundera på denna frågan en stund, motivera gärna ditt svar också:

Behöver du verkligen for loopen? 


Läs ledtrådarna efter du funderat i minst 5 min:

Ledtråd: 1

Lägg en print i din for loop och skriv ut average_number och total_sum

Ledtråd 2

Hade du beräknat den slutna formeln för 1,2,3,4,5... upp till n eller hade du valt ett specifikt värde?

Svara
Close