Sida 1 av 3

Python-fråga *ny fråga*

Postat: 16 november 2014, 15:14:13
av Icecap
Håller på att hjälpa med en uppgift i programmering. Språket är Python och jag har definitivt inte samma tankegång som designer av det skit.

Skal skriva hhv. '1' - '8' och 'A' hhv. 'H' enl. ett koordinatsystem, alltså ett shack-bräda med koordinater.

Att placera texten grafisk är inget problem alls (numera) men jag kan inte klura ut hur jag kan skriva texten till en buffer som kan placeras.

Buffern är väl en 'list' men hur i all sina dar ska jag fixa detta?
I C ville det bli:

Kod: Markera allt

char Buffer[10], i;
for(i = 0; i < Size_X; i++)
  {
  sprintf(Buffer, "%c", 'A' + i);
  ... // Put buffer on canvas as text
  }

Re: Python-fråga

Postat: 16 november 2014, 15:24:46
av Micke_s
Skit skulle jag inte säga att det är, väldigt trevligt att hålla på med när man har lärt sig...

Förstår dock inte riktigt hur resultatet ska se ut dock.
är det detta som efterfrågas?:

Kod: Markera allt

 A B C D E F G H
1
2 
3 
4
5
6
7
8

Re: Python-fråga

Postat: 16 november 2014, 15:24:58
av sodjan
Hur ska det se ut?

Kod: Markera allt

 A B C D E F G H
1
2
3
4
5
6
7
8
eller på något annat sätt?

EDIT:
HA! :-)
Det räcker kanske att svara på en av våra frågor... :-)

Re: Python-fråga

Postat: 16 november 2014, 15:26:56
av Icecap
Det är korrekt - men antal värden ska inte vara fasta, de ska kunde ändras om man ändrar konstanterna Size_X och Size_Y.

Hade det varit så att det alltid var en 8x8 bräda hade det varit avklarat sedan länge men nu är det inte så.

Re: Python-fråga

Postat: 16 november 2014, 15:37:01
av Micke_s
funkar upp till Z.
Kanske inte är snyggaste koden precis

Kod: Markera allt

' ' + ' '.join(map(chr, range(ord('A'), ord('H')+1)))  + '\n' + '\n'.join(map(str, range(1,8+1)))
Edit: vad händer om Size_X är större än A-Z, ska man köra AA-ZZ eller?

Re: Python-fråga

Postat: 16 november 2014, 15:45:34
av sodjan
C exemplet ger väl en sträng med "ABCDEFGH" ?

Kod: Markera allt

b = []
a = range(1,9)
for i in a:
  b.append(chr(64+i))
print b
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
Sen kan ni ju göra något med "b".

Eller om ni vill ha en vanlig sträng:

Kod: Markera allt

b = ''
a = range(1,9)
for i in a:
  b = b + chr(64+i)
print b
ABCDEFGH
Nian kan ju bytas mot "max+1" eller liknande

Re: Python-fråga

Postat: 16 november 2014, 15:51:42
av sodjan

Kod: Markera allt

size_x = 10
size_y = 8
b = ''
for i in range(1, size_x + 1):
  b = b + ' ' + chr(64+i)
print b
for i in range(1, size_y + 1):
  print i
 A B C D E F G H I J
1
2
3
4
5
6
7
8

Re: Python-fråga

Postat: 16 november 2014, 16:01:14
av Icecap
Micke_s: tack - men ingen cigarr.

Sodjan: C-exempeln ger en sträng på 1 tecken med EOL efter (0x00).

Vi har redan lösa placeringen av varje siffer/bokstav, det som verkar väldigt ologisk för mig är hur man skapar ett tecken baserat på ett numerisk värde.

Om man i C ger en char ett värde på 'A' + 3 blir det ju 'D' m man läser ut den char som tecken - och detta är den funktion jag vill uppnå.

Så jag vill inte uppnå en sträng som ser ut som:

Kod: Markera allt

"8              "
"7              "
"6              "
"5              "
"4              "
"3              "
"2              "
"1              "
"  A B C D E F G H"
men istället ett antal "strängar" på 1 tecken där tecknet beror på 'i' i ekvationen 'A' + i (eller '0' + i).

Storlekar som kräver AA osv är inte aktuella.

Siffrorna borde ju gå att skriva in i en list med rätt formattering, alltså att 10 blir "10" osv. Jag har hittat formatringsförklaringen - men alla exempel går till StandartOut och det kan ju kvitta när det är en fullgrafisk yta texten ska placeras på.

Jag ser att jag var otydlig i min beskrivning till att börja med. Jag vill alltså kunde göra motsvarigheten till sprintf(Buffer, "Format", Värde);

Re: Python-fråga

Postat: 16 november 2014, 16:14:23
av sodjan
> Sodjan: C-exempeln ger en sträng på 1 tecken med EOL efter (0x00).

Vad ska du ha 0x00 till? Är det inte Python ni använder?

> Om man i C ger en char ett värde på 'A' + 3 blir det ju 'D' ...

Kod: Markera allt

print chr(ord('A') + 3)
D
Att fylla ut stränger med blank är "som vanligt"...

Re: Python-fråga

Postat: 16 november 2014, 16:17:26
av Icecap
Sodjan: Till detta behöver jag inte EOL men resultatet blir så i C.

Och en 'print' i Python går till StdOut vilket är totalt värdelöst i detta. Jag behöver skapa en text(sträng) istället.

chr() finns inte i Python.
ord() finns inte i Python.

Python är verkligen ett python språk!

Re: Python-fråga

Postat: 16 november 2014, 16:18:46
av sodjan
Man kan inte "fuska" i Python som man kan i C
via t.ex implicta casts o.s.v.

Kod: Markera allt

print chr('A' + 3)
TypeError: cannot concatenate 'str' and 'int' objects
> Och en 'print' i Python går till StdOut vilket är totalt värdelöst i detta. Jag behöver skapa en text(sträng) istället.

Ja men gör det då !!

Kod: Markera allt

s = chr(ord('A') + 3)
print s
D
Allt som du kan göra "print" på kan du även spara i en variabel, så klart.

Re: Python-fråga

Postat: 16 november 2014, 16:20:12
av sodjan
> chr() finns inte i Python.
> ord() finns inte i Python.

Vad tror du att jag kör då?

Re: Python-fråga

Postat: 16 november 2014, 16:22:34
av sodjan

Re: Python-fråga

Postat: 16 november 2014, 16:29:10
av Icecap
sodjan: tack!!!! och ja, ord() och chr() finns visst i Python :oops:

Re: Python-fråga

Postat: 16 november 2014, 17:03:09
av sodjan
He he... :-)

Jag har använd Python till en del små "fix-jobb" och även som "motor"
till web baserade rapporter hos en kund under flera år nu.

Många klagar t.ex på den tvingande indenteringen, men samtidigt är just
bristen på indentering som många klagar på när det gäller andra spårk... :-)

I mitt fall är huvudorsaken till att jag använder det att så mycket är
inbyggt i den "dist" som jag använder. Ett hundratal populära tillägg
som inte ingår i Python som standard. Databas gränssnitt, PDF verktyg
o.s.v.