C++ Interview Fragen
-
Wozu überhaupt etwas machen? Ich denke, Spezialfälle wie Nicht-Palindrome sollte man in einem Interview nicht berücksichtigen.
-
DieEiOfSeTeiger schrieb:
Um die Frage halbwegs richtig beantworten zu können, hätte man mindestens nach dem Encoding fragen müssen.
Nö, die Aufgabe hätte "C-String" definieren müssen. Wenn nichts dabei steht, interpretiere ich C-String als Folge von
chars, die mit einer Null abgeschlossen wird. Und genau das dreht meine Lösung um.
Dass das Ergebnis vorwärts interpretiert noch gültiges UTF-8 sein soll, ist eine willkürliche Unterstellung. Es war schließlich nicht einmal gegeben, dass die Eingabe irgendein bestimmtes Encoding hat. In so eine realitätsferne Aufgabe sollte man IMO nichts hineininterpretieren. Wenn der Interviewer sich etwas Bestimmtes vorgestellt hatte, kann er das immernoch sagen.
-
Arcoth schrieb:
Um die Frage halbwegs richtig beantworten zu können, hätte man mindestens nach dem Encoding fragen müssen.
Wieso?
void reverse_mbstr( char* str ) { auto const len = std::strlen(str) + 1; auto wstr = std::make_unique<wchar_t[]>(len); std::mbstowcs( wstr.get(), str, len ); std::reverse( wstr.get(), wstr.get() + len - 1 ); std::wcstombs( str, wstr.get(), len ); }(ungetestet)
~Edit²: Formatierung korrigiert...
Edit³: Längenangaben korrigiert...~Und was macht dein reverse_mbstr jetzt, wenn der string von Clients mit unterschiedlichem Encoding kommt? Am besten noch gleichzeitig von mehreren Threads.
TyRoXx schrieb:
DieEiOfSeTeiger schrieb:
Um die Frage halbwegs richtig beantworten zu können, hätte man mindestens nach dem Encoding fragen müssen.
Nö, die Aufgabe hätte "C-String" definieren müssen. Wenn nichts dabei steht, interpretiere ich C-String als Folge von
chars, die mit einer Null abgeschlossen wird. Und genau das dreht meine Lösung um.
Dass das Ergebnis vorwärts interpretiert noch gültiges UTF-8 sein soll, ist eine willkürliche Unterstellung. Es war schließlich nicht einmal gegeben, dass die Eingabe irgendein bestimmtes Encoding hat. In so eine realitätsferne Aufgabe sollte man IMO nichts hineininterpretieren. Wenn der Interviewer sich etwas Bestimmtes vorgestellt hatte, kann er das immernoch sagen.Tja, vielleicht wollte der Interviewer garnicht, dass du so eine triviale Aufgabe wie einen ASCII-String umkehren programmierst, sondern er wollte wissen, ob bei unklaren Aufgaben nochmal nachfragst, anstatt Kunden etwas abzuliefern, was sie vielleicht garnicht wollen.
-
Mal ehrlich: Wenn man den durchschnittlichen Interviewer fragt welches Encoding der "C-String" denn hat, wird er sowieso ASCII sagen und innerlich mit den Schultern zucken. Weil
chargleich ASCII undwchar_tgleich "Unicode".
-
Am besten noch gleichzeitig von mehreren Threads.
Dann ersetze durch mbsrtowcs und wcsrtombs. Klärt sich dann auch das andere Problem?
-
TyRoXx schrieb:
DieEiOfSeTeiger schrieb:
Um die Frage halbwegs richtig beantworten zu können, hätte man mindestens nach dem Encoding fragen müssen.
Nö, die Aufgabe hätte "C-String" definieren müssen. Wenn nichts dabei steht, interpretiere ich C-String als Folge von
chars, die mit einer Null abgeschlossen wird. Und genau das dreht meine Lösung um.
Dass das Ergebnis vorwärts interpretiert noch gültiges UTF-8 sein soll, ist eine willkürliche Unterstellung. Es war schließlich nicht einmal gegeben, dass die Eingabe irgendein bestimmtes Encoding hat. In so eine realitätsferne Aufgabe sollte man IMO nichts hineininterpretieren. Wenn der Interviewer sich etwas Bestimmtes vorgestellt hatte, kann er das immernoch sagen.
Ist doch ein netter Schnelltest, um Vollnichtskönner zu entdecken. Bringt er da einen O(N^2), wird er sehr sehr traurig angeschaut. Das muss auch nichtmal den Ausschluss bedeuten, wenns sonst ok ist, kann man da flexibel sein, ihm nen Sedgewick leihen und das vertagen.
Ich halte das eh für eine schlimme Fehlentwicklung, daß Berufsanfänger mit 5+ Jahren Berufserfahrung gesucht werden, die mehr als 20 vorwiegend völlig irrelevante Zeitgeisttechnologien beherrschen und fließend englisch reden. Anstatt daß man sich die Blümchen pflückt und gegebenenfalls ausbildet. Pro Monat 150€ aufs Amazon-Konto für Fachbücher, warum nicht? Hab damals als Programmierer nur einmal freien Zugang zu CACM gehabt, das war bei einem Rüstungsbetrieb. Das sollten viel mehr Softwareschmieden machen. Was ist ein senior programmer? Manchmal nur einer, der mehr Erfahrung hat. Manchmal einer, der auch ein wenig in die Architektur beraten darf. Sein natürlicher Job wäre es, als einer von zehn, mit guter Ahnung über Architektur wie Details, die anderen neun durch Beratung doppelt so effektiv zu machen. Ist doch besser, als die anderen neun weiter sumpfen zu lassen, und ist auch besser, als dem senior programmer Buchführung aufzuhalsen. Der "steigt" auf, bis er kaputtgeht vor lauter Wirtschaftskacke.
Jetzt sagt Arcoth gleich, "Menno, wer im Info-Studium nicht wenigstens so viel rafft, daß er einen strrev inplace nicht in O(n) packt, der ist arbeitsmarklicher Sondermüll." Ich sage dagegen "Er hat das Studium gepackt, damit weist er nach, daß er sich sehr viele Sachen innerhalb kurzer Zeit in den Kopf hauen kann und damit gut genug operieren kann, um die Klausur zu bestehen. So Leute braucht jeder. Was er konkret da gelernt hat, ist egal, ist auch je nach Studiengang meistens 30 bis 100 Jahre veraltet. Er kanns sich reinknallen, dem kann ich am Donnerstag eine neue Zeitgeisttechnologie vor den Latz knallen und ein gutes Handbuch und am Montag schon ist er produktiv."
Viele Stellenanzeigen suchen nur nach welchen, die was technisches studiert haben. Egal was sie studier haben!!! Kommt eh nicht drauf an, was sie gelernt haben. Kommt drauf an, daß sie lernen können.
So ne Programmierfrage ist ja auch ein Aufhänger, um weiterzufragen.
wernerschwarz//mit kommentaren schrieb:
hier string reverse in C://aha, also C
#include <iostream>//aha, also C++ #include <cstring> void my_swap(char *a, char *b) {//Wäre in C++ nicht so sinnig. char tmp = *a; *a = *b; *b = tmp; } void reverse(char *str) { if(str == NULL) {//assert? //(1) return; } unsigned long j = strlen(str) - 1;//schön, strlen zu bevorzugen vor eigenen //Schleifen for(unsigned long i = 0; i < strlen(str) / 2; i++) {//size_t //Warum das /2 dort? my_swap(&str[i], &str[j]); j--;//j hier zu dekrementieren wirkt asymmetisch //wenn man j mitführem mag, warum nicht i<j? } } int main() { // your code goes here char str[] = "Hello world"; reverse(str); std::cout << str << std::endl;//endl statt '\n'? return 0;//warum? }Mal kurz schnacken drüber, alle angesprochenen Details sind an sich wurst, kann man mit ihm über sowas schnacken? Hat er Alternativen in petto?
Wenn ich (1) anspräche, wäre mir wichtig, daß er fragte, wie es im Unternehmen üblich ist. Wenn wir da auf Abwegen wandeln würden, möge er ruhig klar sagen, daß er das für kacke hält, aber notwenig ist, daß er synchron kackt und statt privater Abweichungen lieber so lange berät, bis generell andersrum gekackt wird.
-
@volkard: die schleife muss ja nur bis zu strlen/2 laufen, da swap ja immer den anfangs-character mit dem end-character tauscht.
"Hello World"
1. durchlauf: "dello WorlH"
2. durchlauf: "dlllo WoreH"
3. durchlauf: "dlrlo WoleH"
4. durchlauf: "dlroo WlleH"
5. durchlauf: "dlroW olleH"falls ich jetzt keinen fehler gemacht habe...
-
wernerschwarz schrieb:
@volkard: die schleife muss ja nur bis zu strlen/2 laufen, da swap ja immer den anfangs-character mit dem end-character tauscht.
"Hello World"
1. durchlauf: "dello WorlH"
2. durchlauf: "dlllo WoreH"
3. durchlauf: "dlrlo WoleH"
4. durchlauf: "dlroo WlleH"
5. durchlauf: "dlroW olleH"falls ich jetzt keinen fehler gemacht habe...
Ja. Das /2 ist notwendig. Altprogrammierer hätten es rausgezogen.
unsigned long anzDrchlf = (strlen(str) - 1)/2; for(unsigned long i = 0; i < anzDrchlf; i++) {Sowas können optimierende Compiler aber schon seit 25 Jahren. Macht den Code nur häßlicher.
Ein a(Anruf kommt mitem in Editieren, der dauer länger...)
for(unsigned long i=0,j=strlen()-1; i<j ;i++,j--) swap(i,j)Wobei ich da lieber eine while-Schleife hätte. Nicht zu viel Krempel in eine Zeile.
-
volkard: ja, bin deiner meinung, aber wird sich wahrscheinlich nicht besonders auf die laufzeit auswirken

die lange deklaration der schleife ist auch gewoehnungsbeduerftig

-
Was wird sich nicht besonders auf die Laufzeit auswirken? Das /2 oder das strlen() im Schleifenkopf?
Das strlen() im Schleifenkopf ist übel. Das wird der Compiler nicht wegoptimieren können...
O(N^2)
-
Jetzt sagt Arcoth gleich, "Menno, wer im Info-Studium nicht wenigstens so viel rafft, daß er einen strrev inplace nicht in O(n) packt, der ist arbeitsmarklicher Sondermüll."
Nein, wer im Info-Studium nicht wenigstens so viel rafft, dass er beweisen kann dass 3SAT NP-vollständig ist, hat einfach nicht aufgepasst. Und wenn jemand nicht aufpasst, wieso sollte ihn dann jemand schulen wollen?
Wenn jemand strlen in den Schleifenkopf schmeisst, dann hat er kein Auge für
kleinewichtigeDetailsDinge. Du hast es - hast mal erzählt, du hättest in einem kleinen Code-Schnipsel direkt den Fehler gesehen, an dem sich deine Kameraden den Kopf zerbrochen haben (im letzten Ausdruck vonforwurden zwei Integrale dividiert). Und wenn deine Buben das nicht gesehen haben, ist's problematisch, gell.Er kanns sich reinknallen, dem kann ich am Donnerstag eine neue Zeitgeisttechnologie vor den Latz knallen und ein gutes Handbuch und am Montag schon ist er produktiv.
So Erfahrungen hast du gemacht, gell? Erzähl'!
-
Arcoth schrieb:
Jetzt sagt Arcoth gleich, "Menno, wer im Info-Studium nicht wenigstens so viel rafft, daß er einen strrev inplace nicht in O(n) packt, der ist arbeitsmarklicher Sondermüll."
Nein, wer im Info-Studium nicht wenigstens so viel rafft, dass er beweisen kann dass 3SAT NP-vollständig ist, hat einfach nicht aufgepasst. Und wenn jemand nicht aufpasst, wieso sollte ihn dann jemand schulen wollen?
Als ich zur Fachschaft kam sagten mir die alten Hasen "Musst keinen eigenen Rechner haben. Musst auch nicht programmieren lernen wie ein Affe. Informatik ist was viel höherwertiges." Was verdammt ist "Informatik"? Ich studiere hier einen Scheiß und weiß nicht, was es ist.
Später begriff ich, daß die alten Hasen deswegen nicht programmieren können müssen, weil sie höhere Aufgaben machen, nämlich wie Datenbankdesign und so. Alles klar. "Informatiker" machen die Pläne und hergelaufene Polen/Chinesen/Inder proggern das aus.
Ein wenig später begriff ich, daß die alten Fachschaftshasen deswegen alte Hasen sind, weil sie ihr Studium nicht hinkriegen, es sind "alte" Hasen. Aber sie hatten voll viel Ahnung, konnten Linux-Rechner aufsetzen und so, das war nir damals noch fremd.
Hab mich ein wenig von ihnen getrennt. Hab's ihnen nicht so geglaubt. Nee, wer nicht wenigstens rudimentär proggern kann, der kann kein Gefühl dafür haben, wie so Sachen skalieren. So würde ich es heute ausdrücken. Damals hatte ich es einfach nur fett im Gefühl, daß jemand, der überhaupt gar nicht proggern kann, daß der auch keine Projektverantwortung in Sachen Software haben darf.
"dass 3SAT NP-vollständig ist"
Ähm, das war mir bisher schnuppe.
Würde es eines Deiner Projekte besser machen? Würde es das Maut-Dilemma verhindert haben, wenn die Eintscheidungsträger das wüßten?edit: Weil *Du* es wichtig findest, schaffe ich mir das gerade mal noch mal an.
Arcoth schrieb:
Wenn jemand strlen in den Schleifenkopf schmeisst, dann hat er kein Auge für
kleinewichtigeDetailsDinge. Du hast es - hast mal erzählt, du hättest in einem kleinen Code-Schnipsel direkt den Fehler gesehen, an dem sich deine Kameraden den Kopf zerbrochen haben (im letzten Ausdruck vonforwurden zwei Integrale dividiert). Und wenn deine Buben das nicht gesehen haben, ist's problematisch, gell.int a,b,n; … for(double x=a;x<=b;x+=(b-a)/n;//oder so, aber ähnlichDie beiden verzweifelten nen Tag lang und mehr und ich sah es im Augenschein. Nuja, der eine ist voll aufgestiegen und der andere nicht. Ob man diesen Popelfehler schon früh im Studium erkennt, sollte kein Maß sein normalerweise. Kinkerlitzchen, darauf fällt jeder mal rein, einmal, zweimal, zehnmal, hat mit der eingespielten Produktivität wenig zu tun.
edit: Haha! Ich bin sogar der Vollidiot vor der Herrn! Was ich schon für viele Fehler gemacht habe! Kannste Dir gar nicht vorstellen. Diverse Programmiersprachen auch noch. Gelegentlich halte ich Seminare, wo die Teilnehmer am Rechner üben. Da meldet sich jemand und sagt einen halben Satz, sattt mich erstmal herkommen zu lassen (im Forum wäre das Stammeln und den Code nicht zeigen) und ich sage ihm, wo er sich vertippt hat. Das kann ich nur, weil ich mehr als hundert mal diesen Fehler auch gemacht habe.
Arcoth schrieb:
Er kanns sich reinknallen, dem kann ich am Donnerstag eine neue Zeitgeisttechnologie vor den Latz knallen und ein gutes Handbuch und am Montag schon ist er produktiv.
So Erfahrungen hast du gemacht, gell? Erzähl'!
Absolut. Hab immer am Freitag schon anschaffen können. Mein Problem, wie ich es mir in den Kopf knalle, der Auftraggeber kriegt den "volkard kann es Dir besorgen".
-
edit: Weil *Du* es wichtig findest, schaffe ich mir das gerade mal noch mal an.
Ich finde es absolut irrelevant für das Proggern. Nur mache ich folgende (bitte zu korrigierende Annahmen):
- Wenn jemand sich für ein Fach begeistern kann, geht er auf die Uni
- Wenn er immer noch vom Fach begeistert ist, begeistert genug nicht abzubrechen, dann lernt er, was er lernen soll (und will)
- Genug gelernt, um das Abschlussexamen zu bestehen, hat jemand, der auch das Cook-Levin Theorem beweisen kann (da so etwas ja zu den Basislektionen in Komplexitätstheorie aka theoretischer Informatik gehört)
- Wenn jemand auf der Universität etwas gelernt hat, verlernt er es nicht so schnell.
- Du bist Fuffzig, daher hast du eine Rechtfertigung für den vorhergehenden Stichpunkt.Edit:
Absolut. Hab immer am Freitag schon anschaffen können. Mein Problem, wie ich es mir in den Kopf knalle, der Auftraggeber kriegt den "volkard kann es Dir besorgen".
:'D
-
Arcoth schrieb:
Du bist Fuffzig, daher hast du eine Rechtfertigung für den vorhergehenden Stichpunkt.
Und Du bist Teenie, und wir sind alle gottsfroh, daß Du uns die Welt erklärst. Halleluja!
-
Arcoth schrieb:
edit: Weil *Du* es wichtig findest, schaffe ich mir das gerade mal noch mal an.
Ich finde es absolut irrelevant für das Proggern. Nur mache ich folgende (bitte zu korrigierende Annahmen):
- Wenn jemand sich für ein Fach begeistern kann, geht er auf die UniEr studiert "Computer", weil er computerbegeistert ist, also computerspielsüchtig. BEGEISTERT! Begeisterung ist ein echter Grund, was zu studieren,
Rest Deiner Darlegung ist damit gestorben.
-
Arcoth schrieb:
- Genug gelernt, um das Abschlussexamen zu bestehen, hat jemand, der auch das Cook-Levin Theorem beweisen kann (da so etwas ja zu den Basislektionen in Komplexitätstheorie aka theoretischer Informatik gehört)
Das scheint mir ziemlich verdreht. Warum sollte es für das Abschlussexamen (was auch immer das genau sein soll) genügen, wenn man einen Beweis aus einer Grundvorlesung noch kann? Noch dazu genau den!? Es gibt so viele interessante Beweise bei denen man auch strukturell viel lernt. Aber ausgerechnet der? Das ist doch ein typischer Fall von Aussage zentral und wichtig, Beweis absolut irrelevant. In dem Beweis steckt im Prinzip nur eine einzige kleine Idee und der Rest ist technisches Handwerk. Ich sehe nicht, was es bringen soll gerade diesen Beweis zu kennen.
Versteh mich nicht falsch, ich will damit nicht das Resultat klein machen. Als das bewiesen wurde war es ein riesiger Durchbruch, weil bis dahin nicht klar war, ob es solche Probleme überhaupt gibt und wie man denn beweisen könnte, dass es eins gibt. Wenn man aber schon weiß, dass die Aussage stimmt und was die Beweisidee ist, dann bleibt (nach nunmehr 40 Jahren in denen das gereift ist) so arg viel nicht mehr übrig.
Du musst auch sehen, dass theoretische Informatik zwar Pflichtfach ist, aber einen durchaus großen Anteil (wahrscheinlich sogar die Mehrheit) der Leute echt nicht interessiert. Die wollen was anderes machen und brauchen davon maximal Bruchteile. Also sitzen sie das soweit ab, bestehen es und vergessen den Kram dann wieder. Genauso wie ich mal was über Datenbanken und Kommunikationsnetze oder Rechnerarchitektur gelernt hab... nur weil ich mich für Informatik begeistere heißt das doch nicht, dass ich allen Mist, der mir irgendwann mal erzählt wurde im Kopf behalte.
-
Compiler-Optimierung sind nichts gegen handoptimierten Code und damit meine ich nicht immer Assembler sondern z.B. die Ausnutzung der Caches durch Anpassung der Algorithmen. Hier mal ein Vortrag wie man das auch zu Teilen automatisieren kann. Wer per Hand für den jeweiligen CPU-Typ optimiert, der kann noch mal bis zum Faktor 30 an Geschwindigkeit rausholen. Das macht natürlich nur Sinn wenn der Anwendungsteil schnell sein muss/soll.
Vertraut nicht zu viel auf die Optimierung des Compilers, selbst das Hirn einschalten ist oft schneller.
-
Arcoth schrieb:
- Wenn jemand auf der Universität etwas gelernt hat, verlernt er es nicht so schnell.
*kopfkratz* Du musst auf einer anderen Uni gewesen sein als ich. Ach richtig, auf keiner. So macht es Sinn

-
SehrSchnellesRechnen schrieb:
Benötigt Falsh, DAS Beispiel fuer schlechte Programmierung.
-
was auch immer das genau sein soll
Staatsexamen, Magisterprüfung, Diplomprüfung, ...
durchaus großen Anteil (wahrscheinlich sogar die Mehrheit) der Leute echt nicht interessiert.
Wie was? Wie kann das sein, das ist doch (mMn.) sehr interessant?
Will der Großteil einfach nur Programmieren lernen?, aber warum gehen die dann auf die Uni und nicht auf eine FH oder so? Also ich finde die Theorie spannend, und deswegen werde ich auf die Uni gehen, nicht weil ich einfach ein Papier mit der Bestätigung brauche, dass ich was lernen kann. Im Prinzip wäre ja dann das Studium genau wie die Schule wieder nur so eine "vergiss gerne zu 80-90% was du hier lernst, geht ja darum dass du was lernen kannst"