Python leap year calculator (between two years selected by the user) - python

I can't find the correct loops to use to make this code work!
I tried to use a while loop and I could get Python to show all the leap years between the two years selected by the user but not in the formatting that I was asked to use.
start = int(input("Enter start year: "))
end = int(input("Enter end year: "))
if start < end:
print ("Here is a list of leap years between " + str(start) + " and " + str(end) + ":")
while start < end:
if start % 4 == 0 and start % 100 != 0:
print(start)
if start % 100 == 0 and start % 400 == 0:
print(start)
start += 1
if start >= end:
print("Check your year input again.")
Problem description: A year is a leap year if it is divisible by four, except that any year divisible by 100 is
a leap year only if it is also divisible by 400. Write a program which works out the
leap years between two years given by the user. The program should list 10 leap
years per line, with commas between each year listed and a full stop at the end, as
in the following example input/output:
Enter start year: 1000
Enter end year: 1200
Here is a list of leap years between 1000 and 1200:
1004, 1008, 1012, 1016, 1020, 1024, 1028, 1032, 1036, 1040,
1044, 1048, 1052, 1056, 1060, 1064, 1068, 1072, 1076, 1080,
1084, 1088, 1092, 1096, 1104, 1108, 1112, 1116, 1120, 1124,
1128, 1132, 1136, 1140, 1144, 1148, 1152, 1156, 1160, 1164,
1168, 1172, 1176, 1180, 1184, 1188, 1192, 1196, 1200.
Hints: the answer uses a for loop to work through all the years from the start year to the
end year, an extra variable as a leap year counter, and various if and if-else statements
inside the loop to check if the year is a leap year, if a comma is needed, and if a new line
is needed.

The condition should be different -
if (start % 4 == 0 and start % 100 != 0) or (start % 4 == 0 and start % 400 == 0):
Also in order to include the end year in the range the loop condition should be -
while start <= end:

obtaining leap years:
start = int(input("Enter start year: "))
end = int(input("Enter end year: "))
list(range(start + (4 - start % 4), end + 1, 4))

I'm afraid I disagree with the hint that you use a counter to determine whether to print a comma or a full stop followed by a newline. It makes for a very complicated loop. The problem arises with the last line, which might have fewer than 10 year numbers in it. I reckon you still want a full stop not a comma at the end of that line.
Instead of printing your line inside a loop, build a table of years and format it afterwards. I've changed your solution as little as possible. One change that you did not ask for involved fixing the input validation.
start = int(input("Enter start year: "))
end = int(input("Enter end year: "))
while start >= end:
print("Check your year input again.")
start = int(input("Enter start year: "))
end = int(input("Enter end year: "))
print ("Here is a list of leap years between {0} and {1}:".format(start,end))
leap_years = []
while start <= end:
if start % 4 == 0 and start % 100 != 0:
leap_years.append(str(start))
if start % 100 == 0 and start % 400 == 0:
leap_years.append(str(start))
start += 1
for line in range(0, len(leap_years), 10):
print ("{0}.".format(", ".join(leap_years[line:line+10])))

Here is an elegant solution I thought might help you out:
start = int(input("Enter start year: "))
end = int(input("Enter end year: "))
if start <= end:
leap_years = [str(x + start) for x in range(end-start) if x % 4 == 0 and x % 100 != 0]
leap_years[-1] += "."
print(f"Here is a list of leap years between {start} and {end}:\n{(', '.join(leap_years))}")
else:
print("Check your input years again!")
An explanation for this? Essentially it makes a range between your start and end year and loops over it to see if it's divisible by 4 and NOT divisible by 400, if so; it adds it to an array that we can join using , and then add a period at the end and display this to the user using f-strings.

As the hint says, use a counter.
This counter should count the number of leap years you have printed. Every tenth leap year, you end the output with a newline, otherwise with comma and space.
To get the numbers right, just add a variable leap_year_counter and check if ==10 and reset or %10, then you can also output how many you found at the end.
To actually print with the correct ending, use the end keyword argument of the print function (print(value, end=<end you want>).
The for loop part of the hint probably expects you to use for year in range(start, stop) instead of the while loop.

start = int(input("Enter start year: "))
end = int(input("Enter end year: "))
if start > end:
print("Check your year input again.")
else:
print ("Here is a list of leap years between " + str(start) + " and " + str(end) + ":")
while(start <= end):
if start % 100 == 0 and start % 400 == 0:
print(start)
start += 1
if start % 4 == 0 and start % 100 != 0:
print(start)
start += 1
else:
start += 1
You need to add else part. Because program can't do anything when there is not a leap year.

Try it:
while start < end:
if start % 4 == 0:
if start % 100 == 0:
if start % 400 == 0:
print("{} is a leap year".format(start))
else:
print("{} is not a leap year".format(start))
else:
print("{} is a leap year".format(start))
else:
print("{} is not a leap year".format(start))
start += 1
Out:
Enter start year: 2000
Enter end year: 2020
2000 is a leap year
2001 is not a leap year
2002 is not a leap year
2003 is not a leap year
2004 is a leap year
2005 is not a leap year
2006 is not a leap year
2007 is not a leap year
2008 is a leap year
2009 is not a leap year
2010 is not a leap year
2011 is not a leap year
2012 is a leap year
2013 is not a leap year
2014 is not a leap year
2015 is not a leap year
2016 is a leap year
2017 is not a leap year
2018 is not a leap year
2019 is not a leap year
[NOTE]:
You could also use for start in range(start, end) instead of the while start < end and start += 1

for yr in range(399, 510):
if (yr%4==0):
if(yr%100==0):
if (yr%400==0):
print(f" leap year {yr}")
else:
print(f" leap year {yr}")
i think this is most easy way to print out all the leaps yrs in given range

y = int(input("Enter year: "))
count=0
if y < 1600 :
print("check your year input again")
for i in range(1600,y):
if i % 400 == 0 and i % 100 != 0:
print(i, "is a Leap Year")
elif i % 4 == 0 :
count += 1
print(i, "is a Leap Year.")
print("Total leap year: {}".format(count))

Related

Transform the ERL in python

Transform the ERL for one or more selection statements to decide whether a year is a Leap year.
The rules are:
A year is generally a Leap Year if it is divisible by 4, except that if the year is divisible by 100, it is not a Leap year, unless it is also divisible by 400.
Thus 1900 was not a Leap Year, but 2000 was a Leap year.
year = int(input ("What year would you like to assess? "))
leapYear = False #Setting a flag which will be assessed at the end
#the if statements are checking to see if the conditions #are true to assess it as a leap year
if year mod 4 == 0 then
leapYear = True
endif
if year mod 100 == 0 then
leapYear = False
end if
if year mod 400 == 0 then
leapYear = True
end if
if leapYear == True then
print("This is a leap year")
else
print("This is not a leap year")
end if

Python script for Gregorian Epact [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 5 months ago.
Improve this question
I want to write a script that will return the Gregorian epact.
The program asks the user to provids a year.
It checks if the input is correct (i.e. number).
It determines the number of digits of the given number (4 here).
If the user fails five to provides a correct input the scripts terminates.
Here is my script.
I think it is rather complicated. How could I simplify it?
# Program for the calculation of the Gregorian epact
import math as m # Python's basic mathematical library
print("This program calculates the Gregorian epact value of a given year.")
print("See https://fr.wikipedia.org/wiki/%C3%89pacte for further details.")
is_year_correct = False
n = 0
while (not is_year_correct) and n<=4:
year = input("Enter the year (e.g. 2020): ") # User provides a year
try:
year = int(year)
digits = int(m.log10(year))+1 # number of digits in year
except ValueError:
print("Please, try again by entering a year!")
if digits == 4:
is_year_correct = True
else:
print("Please enter a four digit number.")
n = n+1
if n<=4:
c = year // 100
epact = (8+(c//4) - c + ((8*c + 13)//25) + 11 * (year % 19)) % 30
print("The epact value is", epact, "days.")
else:
print('No more attempts!')
Wow learning about epact led me on a rabbit hole
I have minimized the code a bit however I lost some functionality...
I have a way to make sure the functionality is ensured and I will share the piece of code in a sec:
Code with comments:
# Program for the calculation of the Gregorian epact
print("This program calculates the Gregorian epact value of a given year.")
print("See https://fr.wikipedia.org/wiki/%C3%89pacte for further details.")
# Infinite loop
while True:
# Tries to convert the user's input into a number
try:
year = int(input("Enter the year (e.g. 2020): ")) # User provides a year
# All code under this will NOT be executed if user doesn't enter a number
# as the code above will raise an exception causing us to go to the
# exception area
# If year is less than 1000 we warn else we leave infinite loop
if year < 1000: print("Please enter a four digit number.")
else: break
# If user enters a letter
except ValueError:
print("Please, try again by entering a year!")
# Epact calculations
c = year // 100
epact = (8+(c//4) - c + ((8*c + 13)//25) + 11 * (year % 19)) % 30
print(f"The epact value is {epact} days.")
Code without Comments:
# Program for the calculation of the Gregorian epact
print("This program calculates the Gregorian epact value of a given year.")
print("See https://fr.wikipedia.org/wiki/%C3%89pacte for further details.")
while True:
try:
year = int(input("Enter the year (e.g. 2020): ")) # User provides a year
if year < 1000: print("Please enter a four digit number.")
else: break
except ValueError:
print("Please, try again by entering a year!")
c = year // 100
epact = (8+(c//4) - c + ((8*c + 13)//25) + 11 * (year % 19)) % 30
print(f"The epact value is {epact} days.")
All functionality
# Program for the calculation of the Gregorian epact
print("This program calculates the Gregorian epact value of a given year.")
print("See https://fr.wikipedia.org/wiki/%C3%89pacte for further details.")
for _ in range(5):
try:
year = int(input("Enter the year (e.g. 2020): ")) # User provides a year
if year < 1000: print("Please enter a four digit number.")
else: break
except ValueError:
print("Please, try again by entering a year!")
try:
c = year // 100
epact = (8+(c//4) - c + ((8*c + 13)//25) + 11 * (year % 19)) % 30
print(f"The epact value is {epact} days.")
except: print("No more tries!")

Print the arithmetic average, the youngest and oldest age

This Python program should read a birth year until the number zero is entered.
The program should then print out the average age and how old the youngest and oldest is.
I need help with two things.
Print "Unreasonable age, please try again" when input year is -N, like "-45"
Print the result i.e. the arithmetic average, the youngest and oldest only when I exit the loop.
That means when I enter 0.
Current output:
Please type in birth year, to stop, enter 0: 1948
Average age is 72.0 years old.
The younges is 72 years old, and the oldest is 72 years old.
Please type in birth year, to stop, enter 0: 1845
Unreasonable age, please try again
Average age is 72.0 years old.
The younges is 72 years old, and the oldest is 72 years old.
Please type in birth year, to stop, enter 0: 1995
Average age is 48.5 years old.
The younges is 25 years old, and the oldest is 72 years old.
Please type in birth year, to stop, enter 0: 2005
Average age is 37.333333333333336 years old.
The younges is 15 years old, and the oldest is 72 years old.
Please type in birth year, to stop, enter 0: 0
Average age is 37.333333333333336 years old.
The youngest is 15 years old, and the oldest is 72 years old.
Expected output that I want:
Please type in birth year, to stop, enter 0.
Year: 1998
Year: 1932
Year: 1887
Fail: Unreasonable age, please try again.
Year: 1987
Year: -77
Fail: Unreasonable age, please try again.
Year: 1963
Year: 0
Average age is 49 years old. The youngest is 21 years old, and the oldest is 87 years old.
Example code:
# set number_years to zero ### Initial value (has not started counting yet)
number_year = 0
# set number_years to zero ### Initial value (has not started counting yet)
sum_year = 0
# set sum_year to zero ### No maximum age yet
max_year = 0
# set max_year to zero ### Well increased minimum value (age) to start with
min_year = 110
# set input_year to minus 1 ### Only as start value for the sake of the loop start!
input_year = -1
# White input_year is not 0:
while input_year != 0:
# print info and store input value to input_year, stop if 0 is entered
input_year = int(input("Please type in birth year, to stop, enter 0: "))
# let age be (2020 - input_year)
age = (2020 - input_year)
# To avoid beauty flaws with the printout "Unreasonable year ..."
# when the final zero is entered, we must check that age is not 2020
# which it is deceptive enough because 2020-0=2020
# if age is less than zero or age is greater than 110 and age is not 2020:
if age < 0 or age > 110 and age != 2020:
# Print "Unreasonable age, please try again"
print("Unreasonable age, please try again")
# else
else:
# if input_year is greater than zero:
if input_year > 0:
# increase number_year with 1
number_year += 1
# let sum_year become sum_year + age
sum_year = sum_year + age
# if age is less than min_year:
if age < min_year:
# set min_year to age ### New minimum age found
min_year = age
# if age is bigger than max_year:
if age > max_year:
# set max_year to age ### New maximum age found
max_year = age
## If the entered number was 0, exit the loop
#if input_year == 0:
# break
# Now just print the arithmetic average, the youngest and oldest
# Print "Average age is ", sum_year / number_year, "year."
print("Average age is ", sum_year / number_year, "years old.")
# Print "The younges is ", min_year, " and the oldest is ", max_year
print("The youngest is", min_year, "years old,", " and the oldest is ", max_year, "years old.")
# Done! :-)
The code works by simply unindenting the two last print statements and uncommenting the if …: break:
# Initial value (has not started counting yet)
number_year = 0
# Initial value (has not started counting yet)
sum_year = 0
# No maximum age yet
max_year = 0
# Well increased minimum value (age) to start with
min_year = 110
# Only as start value for the sake of the loop start!
input_year = -1
while input_year != 0:
# print info and store input value to input_year, stop if 0 is entered
input_year = int(input("Please type in birth year, to stop, enter 0: "))
age = 2020 - input_year
# To avoid beauty flaws with the printout "Unreasonable year ..."
# when the final zero is entered, we must check that age is not 2020
# which it is deceptive enough because 2020-0=2020
if age < 0 or age > 110 and age != 2020:
print("Unreasonable age, please try again")
# else
else:
if input_year > 0:
number_year += 1
sum_year += age
if age < min_year:
### New minimum age found
min_year = age
if age > max_year:
### New maximum age found
max_year = age
if input_year == 0:
break
# print the arithmetic average, the youngest and oldest
print("Average age is ", sum_year / number_year, "years old.")
print("The youngest is", min_year, "years old,", " and the oldest is ", max_year, "years old.")
I also removed unnecessary comments. But, your code can be simplified very much by simply using a list:
ages = []
while True: # infinite loop - we will exit by break-ing when age is 0
age = 2020 - int(input("Please enter birth year (0 to exit)"))
if age == 2020: # user entered a 0 - exit loop
break
if age < 0 or age > 110:
print("Unreasonable age, please try again")
continue # directly go to next loop
ages.append(age) # will only get appended if the condition above was false because of the continue
if ages: # ages list is not empty
print("Average age is", sum(ages) / len(ages), "years old")
print("The youngest is", min(ages), "old, and the oldest is", max(ages), "old")
else:
print("No ages entered - cannot print mean, min and max age - exiting")
You could store all the ages in a list and then do the math you need with that.
# initialize your list
ages = []
# run your code here, adding the age value with each valid input
# this can be done right before finishing the loop, after the last if statement
...
while input_year != 0:
...
ages.append(age)
# at the end, do the required calculations
average_age = np.mean(ages)
min_age = np.min(ages)
max_age = np.max(ages)

How do I fix a Floating Point Calculation issue?

So, last week, I got some work sent to me for Python 3, and one of the questions goes as follows: "Write (a) program which inputs the year. Your program should output whether it is a leap year or not. To work out if it is a leap year, test whether it is exactly divisible by 4."
This is what I've got so far:
yearStr = input("Please input a year: ")
year = float(yearStr)
calculation = year / 4
print(calculation)
if calculation == .0:
print("This is a leap year.")
else:
print("This is not a leap year.")
When I run the program, the IF statement doesn't work as intended. Could you help me, please?
Division does not yield zero if the number is evenly divisible, so this method cannot work.
Rather, use the modulo (%) operator to get the remainder of the division:
year = int(yearStr)
calculation = year % 4
if calculation == 0: # leap year
...
And note that strictly speaking, leap year determination is a bit more complex than just being divisible by four. But it'll do for the next 79 years.
Your problem is the performance of the code. To check if the year is leap, you have to put different conditions. You can now use this code:
year = int(input("Please input a year: "))
if ((year%400 == 0) or ((year%4 == 0) and (year%100 != 0))):
print("This is a leap year.")
else:
print("This is not a leap year.")
You are comparing calculation with 0, which is true only if the year was 0. You can check if integer value is equal to number itself.
calculation = year / 4
print(calculation)
if int(calculation) == calculation:
print("This is a leap year.")
else:
print("This is not a leap year.")
Still, this is not a good way to solve this problem, there is a remainder operation - %. For example 5 % 2 = 1. You can use it this way:
yearStr = input("Please input a year: ")
year = float(yearStr)
print(calculation)
if calculation % 4 == 0:
print("This is a leap year.")
else:
print("This is not a leap year.")

For loop - Leap year input

could anyone please help me with a current problem Im having... Its a leap year exercise.
● Write a program to input a year and a number of years.
● Then determine and display which of those years were or will be leap
years.
Example:
What year do you want to start with? - 1994
How many years do you want to check? - 8
1994 isn’t a leap year
1995 isn’t a leap year
1996 is a leap year
1997 isn’t a leap year
1998 isn’t a leap year
1999 isn’t a leap year
2000 is a leap year
2001 isn’t a leap year
I cant seem to get my years to display there own value of being a leap year or not....this is the code i have so far:
year = int(input("Please enter the year you would like to start checking leap years from."))
total_years = int(input("Please enter over how many years you would like to check."))
leap_year= 0
if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
leap_year = ("this is a leap year")
else:
leap_year = ("this is not a leap year")
for a in range (0,total_years):
print(year + a, leap_year)
Any help will be greatly appreciated.
Thank you.
You need to put the logic for checking the years into the loop. For example like so:
start_year = int(input("Please select a starting year: "))
num_of_years = int(input("Please select how many years you'd like to check: "))
end_year = start_year + num_of_years
# The formula I used below to determine when a year is a leap year was copied from emrah-diril in this thread
for year in range(start_year-1, end_year):
year += 1
if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
print ("{}: Is a leap year".format(year))
else:
print (year)
The if-else block that checks for leap year should be inside the for loop. It's currently outside the for loop so it checks the first year you enter and the for loop simply prints the result for the first year total_years number of times.
So, to fix your code, try something like this:
year = int(input("Please enter the year you would like to start checking leap years from."))
total_years = int(input("Please enter over how many years you would like to check."))
def is_leap_year(year):
if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
return True
else:
return False
for a in range (0, total_years):
if is_leap_year(year+a):
print("this is a leap year")
else:
print("this is not a leap year")
python
start_year = int(input("Please enter the year you would like to start checking leap years from: "))
total_years = int(input("Please enter over how many years you would like to check: "))
for year in range(start_year, start_year + total_years):
if year % 4 == 0:
print(f"{year} is a leap year")
else:
print (f"{year} is not a leap year")

Categories

Resources