DANrulz81 stellt sich vor

Hier kann jeder sich kurz vorstellen bzw. einen kurzen Steckbrief angeben.
Antworten
DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

DANrulz81 stellt sich vor

Beitrag von DANrulz81 » Fr Dez 23, 2011 9:54 pm

Hallo zusammen,

mein Name ist Dennis. Ich bin 30 Jahre alt, verheiratet und hab auch noch einen 5 jährigen Sohn. Wenn ich mal Zeit für mich finde, versuche ich grad die Programmiersprach C zu lernen. Angefangen hatte damals alles mit einem Amstrad PC mit sagenhaften 128 KB Arbeitsspeicher und einer 25 MB Festplatte.
Mit 9 Jahren habe ich angefangen, Basic zu lernen, und muss sagen, dass ich das bis heute mitgeschleppt habe, da ich das auch nie wirklich richtig gut gelernt habe. Ich konnte irgendwie immer alles mit FOR - Schleifen oder IF THEN ELSE lösen, was nie sehr elegant war. Hätte ich bloß früher mit C angefangen. Das ist eine sehr elegenate und inspirierende Sprache. Zwischen drin kamen auch mal Anflüge von Pascal und Assembler.

Ich versuch mein Bestes zu geben, da ich aber Familiär und Beruflich immer sehr eingespannt werde, kann ich nur langsame Fortschritte machen.

In diesem Sinne:

Happy Progging.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: DANrulz81 stellt sich vor

Beitrag von Xin » Sa Dez 24, 2011 11:40 am

Hohoho :-)
DANrulz81 hat geschrieben:mein Name ist Dennis. Ich bin 30 Jahre alt, verheiratet und hab auch noch einen 5 jährigen Sohn. Wenn ich mal Zeit für mich finde, versuche ich grad die Programmiersprach C zu lernen. Angefangen hatte damals alles mit einem Amstrad PC mit sagenhaften 128 KB Arbeitsspeicher und einer 25 MB Festplatte.
C ist immernoch Maß aller Dinge in der Programmierung. Ansonsten kenne ich den Amstrad auch noch, aber ich glaube, die hatten ein Kassettenlaufwerk. ^^
Ich selbst habe die recht typische C64->C128->Amiga-Karriere hinter mir.
DANrulz81 hat geschrieben:Mit 9 Jahren habe ich angefangen, Basic zu lernen, und muss sagen, dass ich das bis heute mitgeschleppt habe, da ich das auch nie wirklich richtig gut gelernt habe. Ich konnte irgendwie immer alles mit FOR - Schleifen oder IF THEN ELSE lösen, was nie sehr elegant war. Hätte ich bloß früher mit C angefangen. Das ist eine sehr elegenate und inspirierende Sprache. Zwischen drin kamen auch mal Anflüge von Pascal und Assembler.
Pascal ist inzwischen nicht nur tot, sondern verwest. Basic lebt vom zweifelhaften Ruf eine Einsteigersprache zu sein, aber müffelt schon ganz gewaltig. Hier würde ich keine Energie mehr investieren. Assembler wird nie totzukriegen sein, aber ist für die meisten Menschen nicht mehr nützlich.

Was ist Dein Ziel beim Programmieren lernen und wie bist Du auf diese Seite gestoßen?
DANrulz81 hat geschrieben:Ich versuch mein Bestes zu geben, da ich aber Familiär und Beruflich immer sehr eingespannt werde, kann ich nur langsame Fortschritte machen.
Auch wenn Jugendliche schneller lernen, dürftest Du mit 30 einer Vorahnung von Programmierung keine nennenswerten Probleme haben. Du dürftest deutlich fokussierter lernen.

Ich schreibe den C-Kurs und er ist noch nicht fertig, (auch kritisches) Feedback ist erwünscht.
Ich wünsche Dir viel Erfolg und wenn er ausbleibt, keine Scheu nachzufragen. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

Re: DANrulz81 stellt sich vor

Beitrag von DANrulz81 » So Dez 25, 2011 2:37 pm

Was ist Dein Ziel beim Programmieren lernen und wie bist Du auf diese Seite gestoßen?
Das ich mich persönlich weiter entwickle, Probleme systematisch angehe und meinen Code ständig verbessere. Mir habens beispielsweise die Rekursionen angetan. Da bin ich immernoch beeindruckt, wie man mit einfachem Code große Wirkung erziehlen kann. Da möchte ich mal hin. Des Weiteren möchte ich mit C Mikrocontroller programmieren, da ich dort näher an der Hardware bin als mit Bascom, aber doch gewohnte Programmierstrukturen anwenden kann als wie zum Beispiel beim Assembler.

Auf die Seite bin ich durch ein anderes Forum gestoßen, leider weiß ich nicht mehr, woher genau.

Ich habe beispielsweise einen Binärumrechner geschrieben:

Code: Alles auswählen

#include <math.h>
#include <stdio.h>

int main()
{
    double y;
    int x=0, i=0, rest=0, uebertrag=0, zaehler=0;

    printf("\nBitte eine Zahl eingeben: ");
        scanf("%i",&x);

        y = log(x)/log(2);                          /*Länge der binären Zahl ermitteln*/
        y=y+0.0001;
    printf("\n\nBin\x84re L\x84nge: %lf , also ist sie %1.lf Bits lang\n\n\n", y, ceil(y));
    i=ceil(y);
    int bin[i];
    for(i=ceil(y); i>0; i--){

        rest=x%2;
            bin[i]=rest;
        uebertrag=x/2;
        i--;

        rest=uebertrag%2;
            bin[i]=rest;
        x=uebertrag/2;
        };

    for(zaehler=1; zaehler<ceil(y)+1; zaehler++)
    {
    printf("%i ",bin[zaehler]);
    };
    printf("\n\n");
return 0;
}
Den hab ich dann in einem Forum gepostet, dass man mir mal sagt, wie ich mich denn geschlagen habe. Antwort war z.B.: "Das geht auch eleganter" :mrgreen:
Und heraus kam dann das:

Code: Alles auswählen

#include <stdio.h>

void binprint(unsigned x) {
  if(x > 1) {
    binprint(x / 2);
  }
  putchar(x % 2 + '0');
}

int main(void) {
  unsigned x;

  scanf("%u", &x);

  binprint(x);
  putchar('\n');

  return 0;
}
Da war ich mal wieder sehr erstaunt und geplättet, da ich darauf nie gekommen wäre.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: DANrulz81 stellt sich vor

Beitrag von Xin » Mo Dez 26, 2011 3:26 pm

DANrulz81 hat geschrieben:
Was ist Dein Ziel beim Programmieren lernen und wie bist Du auf diese Seite gestoßen?
Das ich mich persönlich weiter entwickle, Probleme systematisch angehe und meinen Code ständig verbessere. Mir habens beispielsweise die Rekursionen angetan. Da bin ich immernoch beeindruckt, wie man mit einfachem Code große Wirkung erziehlen kann. Da möchte ich mal hin.
Reine Übungssache.

Rekursion ist klasse, wenn man einen Stack bracht - man nimmt eben den Stack der Funktionen... aber das kostet. Siehe unten.
DANrulz81 hat geschrieben:Des Weiteren möchte ich mit C Mikrocontroller programmieren, da ich dort näher an der Hardware bin als mit Bascom, aber doch gewohnte Programmierstrukturen anwenden kann als wie zum Beispiel beim Assembler.
Bist Du firm in Assembler?
DANrulz81 hat geschrieben:Ich habe beispielsweise einen Binärumrechner geschrieben:
...

Den hab ich dann in einem Forum gepostet, dass man mir mal sagt, wie ich mich denn geschlagen habe. Antwort war z.B.: "Das geht auch eleganter" :mrgreen:
Der Code ist recht typisch für einen Einsteiger. Probleme werden Schritt für Schritt irgendwie gelöst und die Schritte dann hintereinandergepackt.
DANrulz81 hat geschrieben:Und heraus kam dann das:

Code: Alles auswählen

#include <stdio.h>

void binprint(unsigned x) {
  if(x > 1) {
    binprint(x / 2);
  }
  putchar(x % 2 + '0');
}
Da war ich mal wieder sehr erstaunt und geplättet, da ich darauf nie gekommen wäre.
Dieser Algorithmus ist eine Art "Standard" als Beispiel für "Eleganz". Du darfst also davon ausgehen, dass derjenige, der ihn gepostet hat ihn auch nur mal irgendwo gelesen hat und ihn nicht selbst entwickelt hat.
Sieht hübsch aus, hat aber einen großen Nachteil: er ist rekursiv und Rekursion ist teuer. Rekursiv ist er, weil er zuerst rechnet (die Rekursion), und dann erst die Ergebnisse (putchar) liefert.

Nehmen wir das ganze ohne Rekursion:

Code: Alles auswählen

void binprint( unsigned int x )
{
    for( ;x; x>>=1 )
         putchar( (x&1) + '0' );
}
Nun haben wir ein Problem: die Ausgabe wird nicht beim Auftauchen aus dem Stack erledigt, sondern mit der Rechnung. Damit ist das Ergebnis leider nicht in der richtigen Reihenfolge. Für 133 erhält man statt "10000101" nun "10100001". Statt den Stack der Funktionen zu nutzen, könnte man auch einen eigenen Stack etablieren. Mehr als 32 Bit sind ja nicht drin.
Dann sieht das ganze so aus:

Code: Alles auswählen

void binprint( unsigned int x )
{
  char stack[33];
  unsigned int stackPtr = 32;

  stack[ stackPtr ] = '\0'; // Nullbyte

  for( ;x; x>>=1 )
    stack[ --stackPtr ] = (x&1) + '0';

  puts( &stack[stackPtr] );
}
Das sieht vielleicht nicht mehr so elegant aus, ist aber deutlich schneller, weil es eben nicht rekursiv ist.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

Re: DANrulz81 stellt sich vor

Beitrag von DANrulz81 » Mo Dez 26, 2011 11:07 pm

Bist Du firm in Assembler?
Naja, es geht so. Es kommt auch drauf an, was für einen. mit dem für X86 habich noch nie was gemacht. Nur für den 8051 und für AVR.

Und wegen den Rekursionen: Dein Code muss ich mir mal genauer anschauen, so ganz bin ich noch nicht dahinter gekommen. Mir erscheint C teilweise immer noch sehr kryptisch, als alter Basic Programmierer muss ich mich da erst nach und nach durcharbeiten.

Was mir noch aufgefallen ist: Leider lässt sich dein Code nicht compilieren, ich bekomme immer diese Fehlermeldung:

Code: Alles auswählen

c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\libmingw32.a(main.o):main.c|| undefined reference to `WinMain@16'|
Liegt das an C++?

Was ich an diesem Code auch nicht verstehe: Wo ist denn da die Schleife? Klingt jetzt vielleicht etwas komisch, aber:

Code: Alles auswählen

void binprint(unsigned x) {
  if(x > 1) {
    binprint(x / 2);
  }
  putchar(x % 2 + '0');
}

int main(void) {
  unsigned x;

  scanf("%u", &x);

  binprint(x);
  putchar('\n');

  return 0;
}
die einzige Schleife, die ich dort finde, ist das "if". Oder bleibt das Programm so lange darin, wie x>1 ist?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: DANrulz81 stellt sich vor

Beitrag von cloidnerux » Mo Dez 26, 2011 11:23 pm

Hi und ein herzliches Willkommen im Forum auch von mir.
Liegt das an C++?
Nein, es liegt daran, das keine main-Funktion vorhanden ist, der bei jedem C/C++ Programm den Einstiegspunkt definiert.
Naja, es geht so. Es kommt auch drauf an, was für einen. mit dem für X86 habich noch nie was gemacht. Nur für den 8051 und für AVR.
AVR ist mir Sympathisch^^

MfG cloidnerux.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: DANrulz81 stellt sich vor

Beitrag von Xin » Di Dez 27, 2011 11:19 am

DANrulz81 hat geschrieben:
Bist Du firm in Assembler?
Naja, es geht so. Es kommt auch drauf an, was für einen. mit dem für X86 habich noch nie was gemacht. Nur für den 8051 und für AVR.
AVR ist ja auch nicht schlecht.
Nicht unbedingt, was ich jetzt brauche, aber ich glaube cloidnerux sabbert schon ;-D
DANrulz81 hat geschrieben:Und wegen den Rekursionen: Dein Code muss ich mir mal genauer anschauen, so ganz bin ich noch nicht dahinter gekommen. Mir erscheint C teilweise immer noch sehr kryptisch, als alter Basic Programmierer muss ich mich da erst nach und nach durcharbeiten.
Ich habe auch mit Basic angefangen und kann da heute nur noch von abraten, weil man lernt in Blöcken zu arbeiten, während moderne Programmiersprachen geschachtelt werden können. Ausdrücke und Konstrukture können ineinander geschachtelt werden. Hat man sich einmal Strategien zurecht gelegt, in Blöcken zu denken, dann macht man sich teils das Leben schwer, weil man die einfachen Lösungen als zu kryptisch ansieht. Das muss man üben - wie gesagt: Ich habe auch jahrelang Basic programmiert, bevor ich über ASM nach C kam.
DANrulz81 hat geschrieben: Was mir noch aufgefallen ist: Leider lässt sich dein Code nicht compilieren, ich bekomme immer diese Fehlermeldung:

Code: Alles auswählen

c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\libmingw32.a(main.o):main.c|| undefined reference to `WinMain@16'|
Liegt das an C++?
Nein, das ist normales C. Du kannst die rekursive Fassung mit meiner austauschen, musst aber die main-Funktion behalten.
DANrulz81 hat geschrieben: Was ich an diesem Code auch nicht verstehe: Wo ist denn da die Schleife? Klingt jetzt vielleicht etwas komisch, aber:

Code: Alles auswählen

void binprint(unsigned x) {
  if(x > 1) {
    binprint(x / 2);
  }
  putchar(x % 2 + '0');
}
die einzige Schleife, die ich dort finde, ist das "if". Oder bleibt das Programm so lange darin, wie x>1 ist?
If ist eine Bedingung, keine Schleife.

Die Schleife entsteht dadruch, dass sich binprint() selbst aufruft und zwar mit der Hälfte des vorherigen x ( x/2 entspricht x >> 1 in meinem Code). Der Trick dabei ist, dass durch die Rekursion erst die am tiefsten verschachtete Funktion als erstes zu putchar() kommt. Das letzte errechnete wird also als erstes ausgegeben. Damit löst sich das Problem der Reihenfolge in Luft auf, weil sich so die richtige Ausgabereihenfolge ergibt.

Rekursion verstehst Du am besten, wenn Du das Beispiel von Hand auf Papier durchrechnest. Nimm eine einfache Zahl, wie 5 ( binär 101 ) und rechne das halt mal durch.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

Re: DANrulz81 stellt sich vor

Beitrag von DANrulz81 » Di Dez 27, 2011 12:01 pm

Ich habe auch mit Basic angefangen und kann da heute nur noch von abraten, weil man lernt in Blöcken zu arbeiten, während moderne Programmiersprachen geschachtelt werden können. Ausdrücke und Konstrukture können ineinander geschachtelt werden. Hat man sich einmal Strategien zurecht gelegt, in Blöcken zu denken, dann macht man sich teils das Leben schwer, weil man die einfachen Lösungen als zu kryptisch ansieht. Das muss man üben - wie gesagt: Ich habe auch jahrelang Basic programmiert, bevor ich über ASM nach C kam.
Das stimmt. Da liegt warscheinlich auch mein Problem. Momentan bin ich auch mit dem AVR auf Basic unterwegs (BASCOM), da das für mich etwas einfacher ist ;) weil ich eben diese Blockarbeitsweise drin habe. Deshalb ist es mir auch immer schwer gefallen, mit Assembler zu arbeiten, weil ich dort auch keine direkten IF THEN ELSE Anweisungen verwenden kann, sondern nur schauen, ob ein Bit gesetzt ist und es dann weiter geht im Programm. Hinzu kommt noch, dass ich durch das damalige Lehrbuch gelernt habe, viel mit GOTO zu arbeiten, was meinen Code nie sehr schön aussehen ließ. Und das habe ich irgendwie nie ganz los bekommen, was ich jetzt bereuhe.

Aber nichts desto trotz versuche ich jetzt, meine Basic Vergangenheit hinter mir zu lassen, auch wenn es schwer ist, nochmal von vorne anzufangen.

Antworten