Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Python] Kalender: add/leave space bij 1 of 2 cijferige dag

Pagina: 1
Acties:

  • jdh009
  • Registratie: Juni 2002
  • Laatst online: 18:53

jdh009

FP ProMod
Topicstarter
Sinds een paar weken ben ik begonnen met de programmeertaal Python. Hierbij gebruik ik het boek Python for Rookies waarin een vaardigheidsoefening staat om een kalender te maken. De input van de functie bij het eerste deel is een nummer van een maan en de dag in de week dat hij start(waarbij 1 maandag is en 7 zondag).

Qua output doet het programma alles wat ik wil, echter kom ik er niet uit hoe ik de lege ruimtes het gemakkelijkste weg kan werken (regel 63 tot 69) als een getal uit 2 cijfers bestaat maar het bij een andere maand/start dag wel mogelijk is om op dezelfde plaats een 1 cijferige getal kan komen.

Voorbeeld:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> cal(2, 2)
February 2009
Mo Tu We Th Fr Sa Su 
    1  2  3  4  5  6
 7  8  9  10  11  12  13
 14 15 16 17 18 19 20
21 22 23 24 25 26 27

>>> cal(2, 7)
February 2009
Mo Tu We Th Fr Sa Su 
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28


Ik zat zelf te denken om het in een functie met een for loop te gieten waarbij ik een counter laat meelopen en per dag dan bekijkt of het getal < 9 is waarna ik deze dan wel of niet met een spatie toevoeg aan een variable die ik vervolgens return en print. Ik krijg het op dit moment echter nog niet werkend en vroeg me dus af of ik in de juiste richting aan het denken ben?

Heel erg bedankt

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
month_name = ['January' , 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
month_days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
##month_days = ['0', '31', '28', '31', '30', '31', '30', '31', '31', '30', '31', '30', '31']
day_name_long = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
day_name_short = ['Mo ', 'Tu ' , 'We ', 'Th ', 'Fr ', 'Sa ', 'Su ']

##def cal(year, monthnumber):


def cal(monthnumber, starting_day):

## temp_input_data
##starting_day = 1
    year = 2009
##monthnumber = 10

    ## starting day reset
    if starting_day >= 8:
        skip = starting_day / 7
        starting_day = starting_day - (skip * 7)

    #other data
    space = '   '
    space2 = '' 

    ## Leap Year:
    leap = 0
    if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
        leap = +1

    a = int(month_days[monthnumber] + leap)
    b = range(1, a + 1)

    print month_name[monthnumber-1], year

    print day_name_short[0] + day_name_short[1] + day_name_short[2] + day_name_short[3] + day_name_short[4] + day_name_short[5] + day_name_short[6]

    ## First row
    empty_space = space * (starting_day-1)
    days_remaining = 7 -  (starting_day)
    if days_remaining == 0:
        print empty_space, b[0]
        c = 1
    elif days_remaining == 1:
        print empty_space, b[0], space2, b[1]
        c = 2
    elif days_remaining == 2:
        print empty_space, b[0], space2, b[1], space2, b[2]
        c = 3
    elif days_remaining == 3:
        print empty_space, b[0], space2, b[1], space2, b[2], space2, b[3]
        c = 4
    elif days_remaining == 4:
        print empty_space, b[0], space2, b[1], space2, b[2], space2, b[3], space2, b[4]
        c = 5
    elif days_remaining == 5:
        print empty_space, b[0], space2, b[1], space2, b[2], space2, b[3], space2, b[4], space2, b[5]
        c = 6
    elif days_remaining == 6:
        print empty_space, b[0], space2, b[1], space2, b[2], space2, b[3], space2, b[4], space2, b[5], space2, b[6]
        c = 7

    ## Second, third and fourth row
    print space2, b[c], space2, b[c+1], space2, b[c+2], space2, b[c+3], space2, b[c+4], space2, b[c+5], space2, b[c+6]
    c += 7
    print space2, b[c], b[c+1], b[c+2], b[c+3], b[c+4], b[c+5], b[c+6]
    c +=7
    print b[c], b[c+1], b[c+2], b[c+3], b[c+4], b[c+5], b[c+6]
    c +=7

    ## last row
    d = a - c
    if d == 1:
        print b[c+1]
    elif d == 2:
        print b[c], b[c+1]
    elif d == 3:
        print b[c], b[c+1], b[c+2]
    elif d == 4:
        print b[c], b[c+1], b[c+2], b[c+3]
    elif d == 5:
        print b[c], b[c+1], b[c+2], b[c+3], b[c+4]
    elif d == 6:
        print b[c], b[c+1], b[c+2], b[c+3], b[c+4], b[c+5]
    elif d == 7:
        print b[c], b[c+1], b[c+2], b[c+3], b[c+4], b[c+5], b[c+6]
    else:
        print b[c], b[c+1], b[c+2], b[c+3], b[c+4], b[c+5], b[c+6]
        c +=7
        d = a - c
        if d == 1:
            print b[c+1]
        elif d == 2:
            print b[c], b[c+1]

[ Voor 3% gewijzigd door jdh009 op 08-10-2013 12:45 ]

"Each event is preceded by Prophecy. But without the hero, there is no Event." - Zurin Arctus, the Underking | "Ad Nocendum Potentes sumus." - Me, 30 November 1999


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
ik pak (niet in Python) meestal de meest rechtse twee karakters van concatenatie van een spatie met het getal..
(0 ipv spatie, dat leest makkelijker:)

01 -> meest rechtse twee karakters = 01
021 -> meest rechtse twee karakters = 21

  • Naranya
  • Registratie: Oktober 2010
  • Laatst online: 15:28
Jezus wat een lap tekst.
Ik neem aan dat je zoiets bedoelt:
Python:
1
2
3
4
print "1".rjust(2)
 1
print "11".rjust(2)
11

  • P_Tingen
  • Registratie: Maart 2005
  • Laatst online: 19:12

P_Tingen

omdat het KAN

Mijn python is niet zo best maar als ik je programma bekijk dan lijkt het me dat je een ingewikkelde route volgt. Nogmaals: ik weet weinig van python en het kan dus dat de pseudofuncties die ik noem niet bestaan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Ruimte tot aan de eerste dag
do i = 1 to StartDag:
  print "   " // 3 spaties

  // positie bijhouden
  Positie++ 
end.

// Alle dagen afdrukken
do i = 1 to AantalDagenInMaand:
  if i < 10 then print "  "   // 2 spaties
  else print " " // 1 spatie
  
  print i.

  if i modulo 7 = 0 then print CRLF // regelskip
end

... en gaat over tot de orde van de dag


  • jdh009
  • Registratie: Juni 2002
  • Laatst online: 18:53

jdh009

FP ProMod
Topicstarter
Heel erg bedankt! het is gelukt. Via .rjust kan ik het zonder veel aanpassen werkend krijgen.

"Each event is preceded by Prophecy. But without the hero, there is no Event." - Zurin Arctus, the Underking | "Ad Nocendum Potentes sumus." - Me, 30 November 1999


  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 16:07
Ik zou eens gaan uitzoeken hoe for loops etc werken. Op het moment dat je jezelf min of meer gaat herhalen op de regel erna dan is het vaak een signaal dat dit beter kan.

  • bastichelaar
  • Registratie: Januari 2000
  • Nu online
Heb het als oefening ook even gedaan, misschien heb je er wat aan :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
month = [
        (None, None),
        ('January', 31),
        ('February', 28),
        ('March', 31),
        ('April', 30),
        ('May', 31),
        ('June', 30),
        ('July', 31),
        ('August', 31),
        ('September', 30),
        ('October', 31),
        ('November', 30),
        ('December', 31),
    ]
day = [
        (None, None),
        ('Monday', 'Mo'),
        ('Tuesday', 'Tu'),
        ('Wednesday', 'We'),
        ('Thursday', 'Th'),
        ('Friday', 'Fr'),
        ('Saturday', 'Sa'),
        ('Sunday', 'Su'),
        ]

def cal(monthnumber, startingday):

    if startingday > 7:
        startingday = startingday % 7

    year = 2009
    if (year % 4 == 0) and ((year % 100 != 0) or (year % 400 == 0)):
        print "Schrikkeljaar!"
        month[1] = ('February', 29)

    print month[monthnumber][0], year

    for d in day[1:]:
        print d[1],
    print

    i = 0
    j = 0
    while j < month[monthnumber][1]:
        if i < (startingday - 1):
            print "  ",
        else:
            print str(j+1).rjust(2),
            if ((i+1) % 7 == 0):
                print
            j += 1
        i += 1

cal(6, 2)

[ Voor 179% gewijzigd door bastichelaar op 08-10-2013 15:29 ]


  • DXaroth
  • Registratie: Maart 2011
  • Laatst online: 24-08 19:58
de normale sprintf notatie kan ook wonderen verrichten; print "%2d" % nummer zal precies hetzelfde doen als str(nummer).rjust(2) ,maar zal in veel gevallen sneller zijn.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het grappige is trouwens dat deze functie ook gewoon in python zit:
>>> import calendar
>>> print(calendar.month(2009,2))
   February 2009
Mo Tu We Th Fr Sa Su
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

In de source van calendar.py wat bij python zit kun je zien wat de implementatie is.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • bastichelaar
  • Registratie: Januari 2000
  • Nu online
Sterker nog, als je linux gebruikt is cal zelfs een programma op de console :) Maar het is wel een leuke oefening.
Pagina: 1