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.
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.
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?
I koden får du kalla den vad du vill, tycker jag, men det är det dom menar med n i uppgiften.
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
Det där ... ingår inte i språket Python, det är bara en del av språket i uppgiftsformuleringen.
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?
punkt punkt punkt
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
Som jag skrev så är det talen från 1 upp till n du ska summera.
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^^
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?
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.
Jag gjorde istället så och det löste sig. Tack ändå!
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.
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.
Ditt medelvärde stämmer bara om n är 100.
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.
Nu gjorde jag en metod med if och for sats. Dock får jag detta felmeddelande
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
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
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)
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?
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.
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.
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 ) 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. :)
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 ) 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.
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.
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
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?