Ein paar Fragen zur C Programmierung

- OCinside.de PC Forum
https://www.ocinside.de

-- Software
https://www.forum-inside.de/forums.cgi?forum=17

--- Ein paar Fragen zur C Programmierung
https://www.forum-inside.de/topic.cgi?forum=17&topic=8997

Ein Ausdruck des Beitrags mit 18 Antworten ergibt bei 3 Antworten pro Seite ca. 6 DIN A4 Seiten. Das entspricht bei 80 g/m² ca. 29.94 Gramm Papier.


-- Veröffentlicht durch rage82 am 20:18 am 19. April 2010

ableiten einfach? im gegensatz zur restlichen kurvendiskussion?

ich hasse die ganzen regeln und alles, das überseh ich regelmäßig. mathe 1 und besonders mathe 2 waren die schlechtesten klausuren in meinem studium, selbst transformationen (die im grunde fast nur aus integrationen bestehen) hab ich besser hinbekommen, warum auch immer. wobei das auch eine recht einfache klausur war und als punktelieferant sogar ne ortskurve vorkam :lol: :lol:



-- Veröffentlicht durch Hitman am 20:06 am 19. April 2010

Nein, weisst du was schlimm ist? Wenn du die Lösungen hinschreibst aber nicht erklären kannst wie du drauf gekommen bist.

Dann hast du kaum Punkte und wirst sogar des Schummelns bezichtigt...

Ich hasse Rechenwege.


-- Veröffentlicht durch gabiza7 am 19:50 am 19. April 2010

Mein größtes Problem in Mathe ist ja nichtmal, dass ich den Stoff nicht versteh, sondern, dass ich mich ständig verrechne, auch bei ganz einfachen Sachen und dann gibt's natürlich nie viel Punkte in Prüfungen (wenn man sich einmal verrechnet ist's einfach ein Folgefehler, aber wenn man sich nochmal und nochmal verrechnet hat der Lehrer die Schnauze irgendwann auch voll).

Naja, Ableiten ist ja bloß nach Schema F vorgehen, da find ich eher noch die Kurvendiskussion an sich schwer, wobei ich irgendwie sagen muss, dass das Thema im Gegensatz zu anderen Sachen sehr dankbar ist, da es einfach nachvollziehbar ist, bloß man darf sich eben nicht verrechnen, was wie gesagt mein Problem ist.
Ich hab wahrscheinlich Legasthenie nur in Mathe. XD


-- Veröffentlicht durch Marodeur am 6:18 am 19. April 2010

Mathe ist nen harter Brocken, aber durchaus machbar wenn man brav zu den Übungen geht, die Übungen bearbeitet usw..
Aber Kurvendiskussionen sind ziemlich einfach grundsätzlich.
Schwierigste da sind ja die Ableitungen für Extremabestimmung und da gibts das schöne Sprichwort
"Ableiten ist Handwerk, Integrieren ist Kunstwerk"
:lol:

In die Vorlesungen mal reinsetzen (wenn man Zeit hat) ist ne gute Idee.
Fällt keinem auf (im Normalfall).
Ich saß z.B. schon in ner Astrophysikvorlesung weil mir grad mal langweilig war.
Wurde auch mitgezählt für Übungsgruppen und so. :lolaway:


-- Veröffentlicht durch KakYo am 16:58 am 16. April 2010

Man kann auch einfach mal so im normalen Betrieb in die Uni gehen und sich ein paar Vorlesungen anschauen, das merkt eh keiner. Vorlesungsverzeichnis sollte es online geben auf den Uni-Seiten. Zu solchen Einführungsveranstaltungen werden einem doch eh nur die schönen Sachen erzählt:lol:

Kenne Informatik nicht aber hab mir sagen lassen das die etwas mehr in Mathe gemacht haben (z.B. hat bei uns komplett die Numerik gefehlt) als wir Ingenieure und das war zum Teil schon harter Tobak. Aber war machbar! Man muss sich halt reinhängen.


-- Veröffentlicht durch gabiza7 am 15:43 am 16. April 2010

Das hört sich ja gut an, das mit Mathe, ich hab in der Schule immer ne 3 oder ne 4 in Mathe-Arbeiten.
Zwar machen wir jetzt, würde ich jetzt mal behaupten nicht ganz so einfache Sachen (z.B. Kurvendiskussion mit ln(x) wo Variablen mitdrin sind, also z.B. neben x nach a), aber trotzdem. Kurvendisskussion findet ihr wahrscheinlich total einfach, oder?
Ich muss ja eigentlich sagen, dass es auch einfach ist, aber halt auch sehr verwirrend, wenn man dann gebrochrationale Funktionen oder eben das Exponentialzeugs diskutieren muss.
Da muss ich wohl mal gucken, ob das Informatik-Studium bei mir wegen Mathe hinhaut.

Aber danke für den Buchtipp, hab einige Seiten im Netz mal schnell überflogen und das Ganze liest sich wirklich verständlich und vor allem weiß ich jetzt, dass Java nicht unbedingt was mit Webprogrammierung zu tun haben muss (ich verwechsle Java-Script immer mit Java:lol:).
Bis jetzt gab's für mich bloß immer Delphi, denke aber sowie langsam, dass das ein Mist ist, genauso wie VB.


-- Veröffentlicht durch VoooDooo am 13:03 am 16. April 2010

Mathe war heftig, das kann ich bestätigen. An der Schule war Mathe eins meiner Lieblingsfächer, immer 1 oder 2 geschrieben. Im Studium hab ich es grad so mit ner 4 geschafft. Man muss allerdings dazusagen das ich im Studium etwas faul war ;).

(Geändert von VoooDooo um 13:05 am April 16, 2010)


-- Veröffentlicht durch Marodeur am 1:02 am 16. April 2010

Ich kann nur von meinem Studiengang sprechen (angewandte Informatik an der Ruhruni Bochum), aber da ist das mit dem Verstehen kein großes Problem (zumindest im Bereich der Informatik).
Die Matheteile sind da wesentlich heftiger.
Wir haben auch einiges an Hardwaresachen dabei wie Grundlagen der Elektronik, Grundlagen der Digitaltechnik, Computerarchitektur usw..
Ich würde empfehlen mir mal das Buch "Java ist auch eine Insel" zu kaufen und das mal die ersten 800 Seiten oder so durchzuarbeiten. Das klingt viel, das Buch liest sich aber sehr einfach, verständlich und ist auch nicht so knochentrocken.
Ich vermute dass du bei 1h Aufwand pro Tag in rund 2-3Wochen soweit sein solltest.
Das Buch brauchst du im Studium wahrscheinlich sowieso oder es ist zumindest eine nützliche Hilfe.
Wenn du da keine großen Verständnisprobleme hast sollte das mit dem Verständnis im Studium auch funktionieren.
Musst aber bedenken wie theoretisch das Studium angelegt ist.
Auch ohne andere Studiengänge zu kennen wage ich einfach mal die Prognose, dass in so ziemlich jedem ein paar Mathevorlesungen mit drin sind und die werden dann (vermutlich) auch das größere Problem werden.


-- Veröffentlicht durch gabiza7 am 18:02 am 15. April 2010

Danke, VoooDooo für deine aufschlussreiche Antwort.:)

Dann bin ich mal beruhigt, wenn man im Studium programmieren lernt, aber wie ist es mit dem Verstehen und Mitkommen?
Also in der Schule komm ich im Informatikunterricht sehr gut mit, was würdest du sagen, ist auf der FH wahrscheinlich schon schwerer zu verstehen, oder? Oder hattest du in der Schule kein Informatik und hast daher auch keinen Vergleich?

Am Idealisten für mich wäre es ja, wenn ich mein Interesse für PCs und Programmieren sowie Schreiben verbinden könnte, also praktisch mal später vll zu Com! oder so gehen, weil mir das schon Spaß macht z.B. Hardware zu testen und dann darüber zu schreiben (hab bisher noch nicht soviel getestet, bin aber dabei und demnächst wird auch meine Webpage online gehen) sowie hin und wieder auch was zu programmieren. Hab aber keine Ahnung, ob man dazu Info studiert haben muss oder eher was mit Journalistik oder ob es dafür einen kombinierten Studiengang gibt.

(Geändert von gabiza7 um 18:03 am April 15, 2010)


-- Veröffentlicht durch VoooDooo am 21:17 am 14. April 2010

@gabiza7: das ganze Programmieren lernst du im Studium, du brauchst theoretisch gar kein Vorwissen. Ich hatte auch so gut wie keine Ahnung vom Programmieren vorher. Ging mit C los, dann C++ und später Java, zwischendurch bisschen Assembler. Gibt genug Übungsstunden und man kann ja nebenher selber bisschen programmieren und vertiefen. War Informatikstudium an ner Fachhochschule.

Mit Hardware an sich hat das Studium eigentlich gar nichts zu tun. Klar lernst du die ganzen Zusammenhänge (CPU, Speicher...) und wie alles miteinander arbeitet, aber das ist ziemlich Theoretisch.


-- Veröffentlicht durch poschy am 20:58 am 14. April 2010

hab ja noch bis juli zeit, das werd ich auf jedenfall machen.. danke :thumb:


-- Veröffentlicht durch BDKMPSS am 20:45 am 14. April 2010

Grob gesagt kann man eine Schleife folgendermaßen aufteilen:

Vorher:
for (int i = 0; i < 1000000; i++) {
  a();
}

nachher:
startThread(run(), 0, 499999);
startThread(run(), 500000, 1000000);

run(c, b) {
  for (int i = c; i < b; i++) {
     a();
  }
}

Die Threads werden dann von dem OS automatisch verteilt. Du solltest nur nicht mehr stark rechnende Threads erstellen als du Kerne hast, weil es sonst wieder langsamer wird.

Mit der Suchmaschine deiner Wahl findest du bestimmt schnell was passendes für die Plattform auf der das laufen soll.
Man muss im Prinzip ein header file einbinden und eine Funktion aufrufen, die dann "magic" macht. Etwas Verwaltung ist das aber schon.
Wenn du aber nicht unbedingt 2h in das verstehen rein stecken willst, dann musst das nicht machen :thumb:

(Geändert von BDKMPSS um 20:49 am April 14, 2010)


-- Veröffentlicht durch poschy am 20:25 am 14. April 2010

ich studiere wirtschaftsingenieurwesen elektrotechnik :thumb:

am besten gehst du einfach mal in deine wunsch uni/fh.. dort kann man sich sowas mal probeweise anschauen, wird rumgeführt usw :)

wie mache ich sowas denn?
einfach mehrere funktionen? wie weise ich den einzelnen kernen funktionen zu?:noidea:


-- Veröffentlicht durch gabiza7 am 19:40 am 14. April 2010

Auch, wenn das jetzt OT ist.
Was studierst'n du? Ist das schon Informatik oder Mathe oder so, wo du programmieren musst?

Wenn Informatik, kann man das können? Programmiere ja auch, aber nur ein bisschen, aber ich zweifle irgendwie noch an mir, ob das reicht für ein Informatikstudium.
Momentan hab ich sehr wenig Zeit, dass ich mich richtig mit Programmierung beschäftige (Abschlussjahr), daher kann ich nur das Nötigste und das auch nur in Delphi, so Variablen deklarieren natürlich, Datentypen umwandeln und Arrays, naja und durch mein Fachreferat ein bisschen Tabellen und so aber das alles nur in Delphi.
Ist C schwerer? Wie sieht's mit Assembeln aus, kann man das lernen? (In der TR-Szene gibt's ja Assembler, die die "tomb4.exe" mit ollidbg auseinandernehmen und verändern, ich durfte da auch mal reingucken, aber wenn ich ehrlich bin, verstehe ich davon nichts)

Bin dann auch eher praktisch veranlagt, also mir macht PCs bauen und übertakten und so, viel Spaß, aber im Studium kommt das ja wahrscheinlich nicht dran, PC-Hardware-Kenntnisse werden wahrscheinlich vorrausgesetzt und Übertakten ist ja jetzt mal so böse gesagt "nur was für Spinner" (also ist nicht meine Meinung, aber vermutlich die Meinung der ganzen Programmierer und so)

(Geändert von gabiza7 um 19:41 am April 14, 2010)


-- Veröffentlicht durch BDKMPSS am 19:32 am 14. April 2010

Dann schreibst du eine handvoll Zeilen in einer sehr abstrakten Sprache (Setl, Lisp/Prolog) , mietest dir für ein paar Minuten eine PowerPC Node in einem Rechenzentrum und hast den Prof verblüfft oder verärgert :lol:

Lager es in so viele Threads aus wie du Kerne im Recher hast und dann geht es gleich um einiges schneller. Bei einer Primzerlegung ist das auch relativ einfach aufzuteilen.

(Geändert von BDKMPSS um 19:38 am April 14, 2010)


-- Veröffentlicht durch poschy am 19:26 am 14. April 2010

danke schonmal für die antwort :thumb:

also wir reden hier von c-basics.. assembler kann ich zwar ein paar dinge, ist jedoch vom prof nicht gewünscht ;)

diese ganze optimierungssache ist für mich sowieso käse.. das programm soll unter 2 sekunden laufen, was aber doch auch abhäning vom pc selber ist..

ich hab schon größtenteils überall schleifen verkürzt.. (wenns möglich war). Weiss nicht wie ich sonst noch was optimieren könnte.. deswegen kam ich überhaupt erst auf diese ideen :thumb:


-- Veröffentlicht durch BDKMPSS am 19:01 am 14. April 2010

Ich denke du nimmst mir das nicht übel wenn ich sage, dass dies der völlig falsche "Optimierungs" Ansatz ist.

Als erste, wichtigste und oft auch als einzige sinnvolle Optimierung ist der Algorithmus als solcher zu überdenken. Wenn du einen schlechten Algorithmus noch so hochoptimiert implementierst ist so gut wie immer langsamer als ein schlecht implementierter guter Algorithmus.

Generell kann man aber trotzdem auch zu deinen Vergleichen Aussagen treffen. Für genauere Erklärungen ist das hier aber wohl nicht der richtige Ort und würde auch etwas zu lang werden.
_____

In C hängt nehmen sich globale und lokale Variablen grundsätzlich erst ein mal nichts. In abstrakteren Programmiersprachen sind globale Variablen langsamer, da erst versucht wird sie lokal aufzulösen (zu finden) und dann global. Die globale Auflösung ist oft auch langsamer.
In C gilt das aber nicht, da der Compiler beides meistens gleich umsetzt und die Variable in dem Sinne nicht aufgelöst werden muss.
Was im konkreten Fall schneller ist, hängt von der Nutzung ab.
Wenn du eine Funktion sehr oft aufrufst und diese jedes mal eine neue Variable initialisiert, ist das langsamer als die alte Variable einfach zu überschreiben. Dazu hat man in C 2 Möglichkeiten. Eine globale Variable oder eine lokale "static" variable.
Nicht wirklich sinnvolles Pseudo-Code Beispiel:
for(int i = 0; i< 1000000; i++) {
   a();
}

a() {
 int b;
 b = 99;
}

ist langsamer als:
a() {
 static int b;
 b = 99;
}
was sich wiederum (meistens) genau so verhält wie:
static int b;
a() {
 b = 99;
}

Wenn du Parameter übergibt ist dies langsamer als nichts zu übergeben. Aber viele globale Variablen zu verwenden ist (eigentlich immer) schlechter programmier Stil und bringt wenig bis nichts.
_____

Eine iterative Lösung gegen eine rekursive Lösung ist meist schwer abzuschätzen. Die Rekursion verbraucht eigentlich immer mehr Speicher, kann aber auch trotzdem schneller als so manche iterative Lösung sein.
Hängt stark vom Problem ab.
Wenn du etwas endrekursiv umsetzten kannst hast du mit modernen Compilern fast das gleiche Ergebnis wie mit einer iterativen Lösung (was Speicher und Geschwindigkeit angeht).
Eine *perfekte* Iteration sollte exakt das gleiche Ergebnis wie eine *perfekte* Endrekursion liefern.
_____

Prototypen gehören zu allen "public" (also in C allen nicht "static") Funktionen und natürlich immer ins header file, welches vor der Main Methode zu inkludieren ist.
"private" (also "static" Funktionen in C) vor der Main und den ersten Aufruf der Funktion schreiben, dann keinen Prototyp schreiben.
Ob du die Funktions-Implementierung vor oder nach der Main Funktion oder in eine andere Datei schreibst macht überhaupt nichts aus, da der Compiler und Linker das eh zusammen wirft. Das Ergebnis ist in jedem Fall gleich (und gleich schnell).
_____

Eine verkettete Liste ist in jeder Sprache stets langsamer als ein Array, außer in Sprachen gibt, bei der das Array nur eine verkettete Liste ist.
Es kann aber schneller sein die Liste zu erweitern als ständig ein neues Array anzulegen und umzukopieren. Deshalb hat man die Liste erfunden.
_____

Ich würde es immer vorziehen Alles in einem ordentlichen Stil umzusetzen, selbst wenn es ein wenig langsamer ist. Oft optimiert der Compiler es so weit, das das gleiche bei raus kommt, aber das Programm ist einfach wartbarer und *schöner*. Selbst wenn nicht ist die "Verbesserung" für das angesprochene nie mehr als im einstelligen Prozent Bereich.
Wenn du es wirklich schnell und ohne overhead haben willst schreibe es in Assembler. Wenn du das ein paar mal gemacht hast ist das auch nicht so extrem schwer und außerdem mach sich das immer gut auf einer Bewerbung.
Das wichtigste ist und bleibt aber der Algorithmus, der mal schnell eine Optimierung von mehreren tausend Prozent bringen kann.

Viel Spaß weiterhin ;)

(Geändert von BDKMPSS um 19:28 am April 14, 2010)


-- Veröffentlicht durch poschy am 18:29 am 14. April 2010

Hey, denke das ist das richtige Unter-Forum :thumb:
Hab ein Programm zur Primzahlzerlegung geschrieben. Das würd ich gern so optimal wie möglich machen :thumb:

Welche Dinge sind schneller?

Globale / Lokale Variablen ?

schleifen oder rekursion ?

funktionsprototypen + funktionen unter der main? oder ohne prototypen?

verkettete liste oder array?


OCinside.de PC Forum
© 2001 - 2024 www.ocinside.de