PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : san.salvador lernt C - ohne Hilfe gehts nicht


san.salvador
2007-10-24, 13:24:32
Hi!

So, dritte Hausübung in C und ich steh komplett an. :(
Damit ihr mal meinen Wissensstand (bzw. den ich haben sollte :D ) seht, hier die drei Folien, die ich bisher bekommen habe.

http://www.iicm.tugraz.at/esp/folien/teil1.pdf
http://www.iicm.tugraz.at/esp/folien/teil2.pdf
http://www.iicm.tugraz.at/esp/folien/teil3.pdf


Tja, und worum gehts diesmal?

Verlangt wird folgendes:
"Erstellen Sie ein Programm, welches die Binärrepräsentation einer Ganzzahl (Integer) ausgibt. Das Programm benötigt einen Integerwert als Eingabe. Danach werden die einzelnen Bits der Zahl ausgegeben.
Die einzelnen Bytes dieser Binärrepräsentation werden mit " " (einem Leerzeichen) abgeschlossen1. Eine Fehlerbehandlung für den Fall einer falschen Eingabe muss nicht erstellt werden.
Wie bei den ersten beiden Hausübungen soll die Ausgabe mit einem abschließenden "\n" beendet werden (vgl. Beispieloutput).



Für mich passt das nicht zum bisher gelernten. Ich bin blutiger Anfänger, ich kann in den Folien nichts finden, womit ich auch nur ansatzweise auf die Lösung des Problems komme.

Mir gehts nicht darum, dass ihr mir das Programm fix fertig hinstellt, aber ich will das Ding mit eurer Hilfe hinbekommen und auch verstehen.

Denkanstöße aller Art sind herzlich willkommen! :)

Gast
2007-10-24, 13:42:57
Ist dir das Binärsystem ansich klar (wenn nicht Wiki lesen)? Wenn ja dann versuche mal was Du mit geschickten logischen Verknüpfungen über einzelne Bits einer Zahl sagen kannst.

Gast
2007-10-24, 13:43:37
Wenn Dir das klar ist, ist es nur noch eine Schleife mit Ausgaben.

Gast
2007-10-24, 14:45:43
hey die pdfs sind ja nett gemacht.
vielleicht sollt ich doch in ösilanden studieren, zumal mich das nix kostet :) (studiengebühren bäää)

naja viel zu helfen gibts da nicht wirklich :)
da muss man durch hehe, das schaffst du schon

SGT.Hawk
2007-10-24, 16:48:50
Für mich passt das nicht zum bisher gelernten. Ich bin blutiger Anfänger, ich kann in den Folien nichts finden, womit ich auch nur ansatzweise auf die Lösung des Problems komme.

Das ist eben Informatik. Es gilt nicht darum AUSWENDIG zu lernen. DU mußt eben das Problem verstehen und die Sprachlonstrukte nutzen, um einen Algoritmus zu entwickeln.Dazu gehört eben in der Informatik ein gewisses Maß an Abstraktion und analytisches Denken. Leider scheint das bei dir nicht der Fall zu sein, bzw. du hast dich noch nie mit Programmiersprachen auseinandergesetzt.

san.salvador
2007-10-24, 16:59:58
Ist dir das Binärsystem ansich klar (wenn nicht Wiki lesen)? Wenn ja dann versuche mal was Du mit geschickten logischen Verknüpfungen über einzelne Bits einer Zahl sagen kannst.
Das Binärsystem per se ist mir nicht fremd, ich glaube es zu kapieren.
Mir ist nur nicht klar, wie ich aus einer Dezimalzahl die Binärzahl herauskitzel.
Nicht falsch verstehen, am Papier kann ichs.
3 = 2^1 + 2^0 = 00000011

Aber ich schnall einfach nicht, wie ich das meinem Code beibringen soll. :(

Das ist eben Informatik. Es gilt nicht darum AUSWENDIG zu lernen. DU mußt eben das Problem verstehen und die Sprachlonstrukte nutzen, um einen Algoritmus zu entwickeln.Dazu gehört eben in der Informatik ein gewisses Maß an Abstraktion und analytisches Denken. Leider scheint das bei dir nicht der Fall zu sein, bzw. du hast dich noch nie mit Programmiersprachen auseinandergesetzt.
Das heißt ich kanns einfach nicht?

Monger
2007-10-24, 17:00:39
Dazu gehört eben in der Informatik ein gewisses Maß an Abstraktion und analytisches Denken. Leider scheint das bei dir nicht der Fall zu sein, bzw. du hast dich noch nie mit Programmiersprachen auseinandergesetzt.
Das ist ja genau das was er lernen soll. Gerade Abstraktionsvermögen fällt nicht vom Himmel. Sei also nicht so hart zu ihm.


@TS:
Ich gehe mal davon aus, dass du mal das binäre Zahlensystem irgendwo gelernt hast. Was du jetzt brauchst, ist irgendeine Form von Transformation, um von einer Darstellungsform zur anderen zu kommen...

Kleiner Tipp: "Modulo (http://de.wikipedia.org/wiki/Modulo_(Rest))" ist dein Freund.

PHuV
2007-10-24, 17:01:46
Das Binärsystem per se ist mir nicht fremd, ich glaube es zu kapieren.
Mir ist nur nicht klar, wie ich aus einer Dezimalzahl die Binärzahl herauskitzel.
Nicht falsch verstehen, am Papier kann ichs.
3 = 2^1 + 2^0 = 00000011

Aber ich schnall einfach nicht, wie ich das meinem Code beibringen soll. :(


Das heißt ich kanns einfach nicht?

das geht ganz einfach, schau Dir einfach mal die Formatierungsangaben für scanf und printf an, und von dieser Formatierungsangabe kannst Du dann ganz einfach die Binärzahl ableiten.

Mdk
2007-10-24, 17:10:10
und nur zur Sicherheit: Lernziel dieser Übung ist ""Umgang mit Bitshifting Operatoren", also Lösungen mit modulo würden als "am Lernziel vorbeigegangen" bewertet werden :-)

mfg
mdk

Edit: also, z.B. sowas wie das unter mir: abgesehen von häßlich an der Übung vorbei :-)

Gast
2007-10-24, 17:11:30
Ergebnis von unten nach oben lesen.

Die Schönheiten bzw. Ausarbeitung an Aufgabenstellung überlasse ich dir.


#include <stdio.h>

int main(int argc, char* argv[])
{
int Bit = 0;
int Input = 0;
printf("Geben Sie eine Ganzzahl ein: ");
scanf("%d", &Input);

while(Input != 0)
{
if(Input % 2 == 0)
printf("%d\n", 0);
else
printf("%d\n", 1);

Input /= 2;
}

printf("%d\n", Input);

return 0;
}

Spasstiger
2007-10-24, 17:17:05
und nur zur Sicherheit: Lernziel dieser Übung ist ""Umgang mit Bitshifting Operatoren", also Lösungen mit modulo würden als "am Lernziel vorbeigegangen" bewertet werden :-)
Mit modulo 2 frägt man die Bits ab, die beim Rechtsschieben rausgeschoben werden.
Allerdings kenne ich mich mit C und seinen Typenkonzepten auch nicht aus.

Gast
2007-10-24, 17:21:26
Nochmal der Gast von eben, wenn die Herren schon mit Bit Shifting kommen


#include <stdio.h>

int main(int argc, char* argv[])
{
int Bit = 0;
int Input = 0;
printf("Geben Sie eine Ganzzahl ein: ");
scanf("%d", &Input);

while(Input != 0)
{
printf("%d", Input < 0 ? 1 : 0);
Input <<= 1 ;
}

return 0;
}

Mdk
2007-10-24, 17:21:34
Mit modulo 2 frägt man die Bits ab, die beim Rechtsschieben rausgeschoben werden.
Allerdings kenne ich mich mit C und seinen Typenkonzepten auch nicht aus.

Was nix dran ändert, daß man die Bitshifting Operatoren verwenden soll :-) Es stimmt schon, geht mit modulo auch, aber umsonst gibts ja nicht den Punkt "Lernziel" auf der Angabe ;-)

mfg
mdk

Mdk
2007-10-24, 17:26:31
Nochmal der Gast von eben, wenn die Herren schon mit Bit Shifting kommen

[...]



Nicht ungefinkelt, nein. Das kommt jetzt also entweder als Vergleichsvorlage ins Plagiatsprüfsystem oder wird hier übersehen... ;-)

Bitmasken wären sonst grundsätzlich nett gewesen. Und jetzt wärs besser, aufzuhören, hier konkrete Lösungen zu posten. Wenn er was wissen will, soll er fragen.

mfg
mdk

Spasstiger
2007-10-24, 17:29:08
Was nix dran ändert, daß man die Bitshifting Operatoren verwenden soll :-) Es stimmt schon, geht mit modulo auch, aber umsonst gibts ja nicht den Punkt "Lernziel" auf der Angabe ;-)
Ok, ich sehe gerade im Skript von san.salvador, dass Integer auch geschoben werden können und in dem Fall binär interpretiert werden. Dann kann man das Problem natürlich auch anders angehen.
Die modulo-Lösung wäre allerdings die in anderen Sprachen gebräuchliche Variante. In Java z.b. unterstützt Integer keine Schiebeoperationen. ;)

Gast
2007-10-24, 17:31:06
Nicht ungefinkelt, nein.

Interessantes Wort, was heisst das? :D

Mdk
2007-10-24, 17:33:30
[...]
Die modulo-Lösung wäre allerdings die in anderen Sprachen gebräuchliche Variante. In Java z.b. unterstützt Integer keine Schiebeoperationen. ;)

Wie meinen?!


public static void main(String[] args) {
int foo = 42;
System.out.println(foo);
foo <<= 1;
System.out.println(foo);
}



Output:

42
84


mfg
mdk

Und Tante Edit sagt:

Integer foo zeigt dasselbe Verhalten :-)

Mdk
2007-10-24, 17:36:18
Interessantes Wort, was heisst das? :D

Oha, da verwende ich seit Jahren ein Wort und dann sagt der Duden, das gibts garnicht :-)

Gefinkelt ist lustigerweise laut Duden auch österreichisch, das war mir neu.


ge|fin|kelt <Adj.> [zu mundartl. Fink = schlauer Mensch] (österr.): schlau, durchtrieben: ein -er Gauner.


Und ungefinkelt ist demzufolge das Gegenteil ;-) Wobei ich das nicht so negativ konnotiert sehen würde wie im Duden Beispiel. Ich könnt auch "tricky" schreiben...

mfg
mdk

Gast
2007-10-24, 17:39:29
Oha, da verwende ich seit Jahren ein Wort und dann sagt der Duden, das gibts garnicht :-)

Gefinkelt ist lustigerweise laut Duden auch österreichisch, das war mir neu.



Und ungefinkelt ist demzufolge das Gegenteil ;-) Wobei ich das nicht so negativ konnotiert sehen würde wie im Duden Beispiel. Ich könnt auch "tricky" schreiben...

mfg
mdk

Mein obiges beispiel ist aber mit 0 vorne auf 32 stellen aufgefüllt oder 64 je nach dem :D

Aber die kann man ja mit ein wneig denken und paar Sekunden tip arbeit auch wegbekommen

Mdk
2007-10-24, 17:51:34
Mein obiges beispiel ist aber mit 0 vorne auf 32 stellen aufgefüllt oder 64 je nach dem :D
[...]


Exakt. Und daher auch "nicht ungefinkelt" :-)

mfg
mdk

san.salvador
2007-10-24, 18:09:08
Nochmal der Gast von eben, wenn die Herren schon mit Bit Shifting kommen


#include <stdio.h>

int main(int argc, char* argv[])
{
int Bit = 0;
int Input = 0;
printf("Geben Sie eine Ganzzahl ein: ");
scanf("%d", &Input);

while(Input != 0)
{
printf("%d", Input < 0 ? 1 : 0);
Input <<= 1 ;
}

return 0;
}

Ich hab mich jetzt damit etwas beschäftigt, ein paar Fragen sind aufgetaucht (ich will nicht nur die Übung abgeben können, sondern auch verstehen, was da gespielt wird. :D ).

1. Was ist "int argc, char* argv[]"? Noch nie gesehen diese Konstruktion, funktionieren tuts ohne auch. :|

2. Wofür "int Bit = 0;", wenn "Bit" nie verwendet wird?

3. Bugreport: dein Prog frisst alle 0 auf der rechten Seite bis zur ersten 1 auf - gewollt?

PHuV
2007-10-24, 18:34:01
Ich hab mich jetzt damit etwas beschäftigt, ein paar Fragen sind aufgetaucht (ich will nicht nur die Übung abgeben können, sondern auch verstehen, was da gespielt wird. :D ).

1. Was ist "int argc, char* argv[]"? Noch nie gesehen diese Konstruktion, funktionieren tuts ohne auch. :|

Sehr wichtige Konstruktion, wenn man Argumente an das Programm übergeben möchte, argc ist die Anzahl der Argumente und char* argv[] ein Zeiger auf ein Array von Zeichenketten, welche die Argumente selbst darstellen.

Mdk
2007-10-24, 18:41:20
Ich hab mich jetzt damit etwas beschäftigt, ein paar Fragen sind aufgetaucht (ich will nicht nur die Übung abgeben können, sondern auch verstehen, was da gespielt wird. :D ).

1. Was ist "int argc, char* argv[]"? Noch nie gesehen diese Konstruktion, funktionieren tuts ohne auch. :|


Siehe auch Antwort darüber, das wird erst behandelt...(wenn überhaupt...:-()


2. Wofür "int Bit = 0;", wenn "Bit" nie verwendet wird?


Vergessen von der ersten Variante, sollte das -Wall nicht sogar melden? Nein, wohl nicht, wegen Initialisierung, aber sicher bin ich jetzt nicht...


3. Bugreport: dein Prog frisst alle 0 auf der rechten Seite bis zur ersten 1 auf - gewollt?

Das versteh ich jetzt nicht, was meinst Du?

mfg
mdk

san.salvador
2007-10-24, 19:28:21
Vergessen von der ersten Variante, sollte das -Wall nicht sogar melden? Nein, wohl nicht, wegen Initialisierung, aber sicher bin ich jetzt nicht...

Nein, -Wall bleibt mucksmäuschenstill. Ich hab auch erwartet, dass sich gcc darüber aufregt, wenn eine Variable nicht benutzt wird. :|


Das versteh ich jetzt nicht, was meinst Du?

mfg
mdk
Nun, "8" gibt nicht 0(...)01000 aus, sondern 0(...)01
Es fehlen also die drei 0 am Schluß - muss ich das gut finden? X-D

Mdk
2007-10-24, 19:35:22
Nein, -Wall bleibt mucksmäuschenstill. Ich hab auch erwartet, dass sich gcc darüber aufregt, wenn eine Variable nicht benutzt wird. :|


Interessant, hier unter Cygwin:


$ gcc -Wall shift.c -o shift
shift.c: In function `main':
shift.c:5: warning: unused variable `Bit'




Nun, "8" gibt nicht 0(...)01000 aus, sondern 0(...)01
Es fehlen also die drei 0 am Schluß - muss ich das gut finden? X-D

Aja, natürlich, ich bin aber auch blind :-) Was klar ist, weil sobald die letzte 1 draußen ist, ist Input nun mal 0 ;-) So gehts also mal nicht...

mfg
mdk

Spasstiger
2007-10-24, 20:15:53
Integer foo zeigt dasselbe Verhalten :-)
Wusste ich noch gar nicht. :redface:

Mdk
2007-10-24, 20:23:24
Wusste ich noch gar nicht. :redface:

Wenns tröstet: ich auch nicht :-)

mfg
mdk

Gast
2007-10-24, 23:14:47
Hi,

hier mal eine mögliche Lösung mittels Bitschiebeoperationen und Maskierung einzelner Bitstellen.


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int x = 0;

int i= 0;

scanf("%d", &x);

for(i = 0;i < 8*sizeof(int);i++)
{
printf("%d", (x >>( 8*sizeof(int)-i-1) ) & 0x01 );
}


system("PAUSE");
return(0);
}