Als Hausaufgabenproblem arbeite ich daran, einen dezimalen int von stdin zu lesen, ihn in eine andere Basis zu konvertieren (ebenfalls von stdin bereitgestellt) und auf den Bildschirm zu drucken.
Folgendes habe ich bis jetzt:
%Vor%Das funktioniert großartig, nur dass der Algorithmus, der diese verwendet, die umgewandelten Zahlen von der niedrigstwertigen zur höchstwertigen Stelle berechnet und sie somit in umgekehrter Reihenfolge druckt. Wenn Sie also zum Beispiel 1020 in hexadezimales Format ( 0x3FC ) umwandeln, wird CF3 gedruckt.
Gibt es einen Trick, den ich verwenden könnte, um diese Zahlen umzukehren, um in der richtigen Reihenfolge zu drucken. Ich kann nur wenn-else, while, einfache math-Operatoren und printf () / getchar () / scanf () - keine Funktionen, Arrays oder Zeiger. Danke.
(Originalteil des Posts hier entfernt, da es nicht die Lösung ist)
THen Die einzige Lösung, die ich sehen kann besteht darin, die Schleife, die Sie jetzt haben, die Anzahl der Male, die Sie Ziffern haben, durchzuführen.
Zuerst berechnen Sie alle Ziffern, bis Sie zum letzten kommen, und drucken Sie dann.
Dann nehmen Sie den ursprünglichen Wert + Basis und beginnen wieder zu teilen, bis Sie zur zweiten "höchsten Wert" Ziffer kommen. Drucken Sie es aus.
Es ist eine doppelte Schleife und Sie berechnen alles zweimal, aber Sie verwenden keinen zusätzlichen Speicher.
Es ist ein guter Versuch und eine gut formulierte Frage. Wenn wir nur mehr Leute hätten, die Fragen so klar stellen würden!
Die Einschränkungen scheinen künstlich zu sein. Ich denke, Sie haben in Ihrer Klasse noch nichts über Funktionen, Arrays, Zeiger usw. gelernt, aber ich denke, dass dieses Problem nicht elegant ohne Funktionen und / oder Arrays gelöst werden soll.
Wie auch immer, Sie können so etwas tun:
%Vor%Sie berechnen im Grunde, wie viele Ziffern Sie in der ersten Schleife benötigen, und drucken die Ziffern später in der richtigen Reihenfolge.
Einige spezifische Probleme mit Ihrem Code. Ich verstehe, dass es der Beginn einer C-Klasse ist, aber dennoch ist es besser, solche Probleme zu kennen, als sie nie zu realisieren:
%Vor% Sie sollten danach fflush(stdout)
hinzufügen, um sicherzustellen, dass die Ausgabe angezeigt wird, bevor scanf()
aufgerufen wird. Standardmäßig ist stdout
auf vielen Systemen in der Zeile gepuffert, sodass die Eingabeaufforderung möglicherweise nicht angezeigt wird, bevor das Programm auf die Eingabe wartet.
Wie oben.
%Vor% Sie gehen von einem ASCII-Zeichensatz aus. Das muss nicht wahr sein. Aber ohne Arrays oder Zeiger gibt es keine einfache Möglichkeit, die mit 10...
korrespondierenden Alphabete zu drucken. Außerdem kann Ihr Code seltsame Zeichen für base > 36
ausgeben.
Sie sollten sich auch bewusst sein, dass es sehr schwierig ist, scanf()
sicher zu verwenden. Hoffentlich lernst du später bessere Wege, um etwas zu lernen.
In einer Schleife können Sie die Anzahl der Ziffern und die big_base berechnen.
In einer zweiten Schleife können Sie die Ziffern beginnend mit dem höchstwertigen wie folgt ausgeben:
n = 1020, 3 Hexadezimalziffern, big_base = 16 * 16
1st step
1020 / (16 * 16) = 3
2nd step
n = 1020- 3 * (16 * 16) = 252
252 / (16) = 15, F
3rd step
n = 252 - 15 * 16 = 12, C
Hey! Ich erkenne eine berühmte Hausaufgabe, die ich auch im ersten Jahr meiner Schule hatte (@Epitech Schüler: kopiere nicht den folgenden Code, versuche deine eigene Lösung zu finden, es ist zu deinem Besten ^^)
Die Lösung für Ihr Problem besteht darin, das Problem rekursiv zu lösen:
%Vor%Gibt Ihre Hausaufgabe an, dass es nur mit positiven Zahlen arbeiten soll? Wenn nicht, ist es einfach, die Behandlung der negativen Zahlen einzuschließen:
%Vor%@arno: Das stimmt, weil der Beispielcode eine ASCII-Tabelle verwendet. Wenn wir etwas wirklich flexibles wollen, brauchen wir die Basis in Parameter. Zum Beispiel:
%Vor%Dies implementiert das Beispiel:
%Vor%Ich hoffe, es löst Ihr Problem!
edit: Ich habe nicht richtig gelesen ^^ Sie dürfen keine Funktionen verwenden, daher kommt Rekursion nicht in Frage ... Hier ist ein interaktiver Weg, den Sie in eine main () einfügen können. Sie können diesen Code verbessern, indem Sie die Handhabung der negativen Zahlen und flexible Basen hinzufügen, wie ich Ihnen gezeigt habe:)
%Vor%Hoffe, es löst jetzt alles!
Sie könnten das Stück Code neu schreiben, indem Sie jede Zahl so berechnen, dass sie sich wie eine Zustandsmaschine verhält. Es beginnt im Anfangszustand und berechnet die Anzahl der Ziffern, ändert dann den Zustand auf "N-te Ziffer drucken", um die höchstwertige Ziffer zu drucken, ändert dann den Status, um zu den weniger signifikanten Stellen usw. zu gelangen, bis es das Finale ergibt Zustand. Wenn Sie dies in einer Schleife ausführen, geben Sie alle Ziffern in der richtigen Reihenfolge aus.
Sie könnten zwei Schleifen verwenden. Der erste erzeugt weiter Kräfte der Basis, bis er eine Potenz findet, die größer ist als die eingegebene Zahl. Die zweite beginnt hier (oder eher eine Potenz davor) und arbeitet zurück zur Basis ^ 0 (d. H. 1), um die höchstwertigen ersten Ziffern zu berechnen.
Nicht getesteter Pseudocode:
%Vor%Als Hausaufgabenproblem arbeite ich daran, einen dezimalen int von stdin zu lesen, ihn in eine andere Basis zu konvertieren (ebenfalls von stdin bereitgestellt) und auf den Bildschirm zu drucken.
Folgendes habe ich bis jetzt:
%Vor%Das funktioniert großartig, nur dass der Algorithmus, der diese verwendet, die umgewandelten Zahlen von der niedrigstwertigen zur höchstwertigen Stelle berechnet und sie somit in umgekehrter Reihenfolge druckt. Wenn Sie also zum Beispiel 1020 in hexadezimales Format ( 0x3FC ) umwandeln, wird CF3 gedruckt.
Gibt es einen Trick, den ich verwenden könnte, um diese Zahlen umzukehren, um in der richtigen Reihenfolge zu drucken. Ich kann nur wenn-else, while, einfache math-Operatoren und printf () / getchar () / scanf () - keine Funktionen, Arrays oder Zeiger. Danke.
In einer Schleife können Sie die Anzahl der Ziffern und die big_base berechnen.
In einer zweiten Schleife können Sie die Ziffern beginnend mit dem höchstwertigen wie folgt ausgeben:
n = 1020, 3 Hexadezimalziffern, big_base = 16 * 16
%code%
1020 / (16 * 16) = 3
%code%
n = 1020- 3 * (16 * 16) = 252
252 / (16) = 15, F
%code%
n = 252 - 15 * 16 = 12, C
(Originalteil des Posts hier entfernt, da es nicht die Lösung ist)
THen Die einzige Lösung, die ich sehen kann besteht darin, die Schleife, die Sie jetzt haben, die Anzahl der Male, die Sie Ziffern haben, durchzuführen.
Zuerst berechnen Sie alle Ziffern, bis Sie zum letzten kommen, und drucken Sie dann.
Dann nehmen Sie den ursprünglichen Wert + Basis und beginnen wieder zu teilen, bis Sie zur zweiten "höchsten Wert" Ziffer kommen. Drucken Sie es aus.
Es ist eine doppelte Schleife und Sie berechnen alles zweimal, aber Sie verwenden keinen zusätzlichen Speicher.
Es ist ein guter Versuch und eine gut formulierte Frage. Wenn wir nur mehr Leute hätten, die Fragen so klar stellen würden!
Die Einschränkungen scheinen künstlich zu sein. Ich denke, Sie haben in Ihrer Klasse noch nichts über Funktionen, Arrays, Zeiger usw. gelernt, aber ich denke, dass dieses Problem nicht elegant ohne Funktionen und / oder Arrays gelöst werden soll.
Wie auch immer, Sie können so etwas tun:
%Vor%Sie berechnen im Grunde, wie viele Ziffern Sie in der ersten Schleife benötigen, und drucken die Ziffern später in der richtigen Reihenfolge.
Einige spezifische Probleme mit Ihrem Code. Ich verstehe, dass es der Beginn einer C-Klasse ist, aber dennoch ist es besser, solche Probleme zu kennen, als sie nie zu realisieren:
%Vor%Sie sollten danach %code% hinzufügen, um sicherzustellen, dass die Ausgabe angezeigt wird, bevor %code% aufgerufen wird. Standardmäßig ist %code% auf vielen Systemen in der Zeile gepuffert, sodass die Eingabeaufforderung möglicherweise nicht angezeigt wird, bevor das Programm auf die Eingabe wartet.
%Vor%Wie oben.
%Vor%Sie gehen von einem ASCII-Zeichensatz aus. Das muss nicht wahr sein. Aber ohne Arrays oder Zeiger gibt es keine einfache Möglichkeit, die mit %code% korrespondierenden Alphabete zu drucken. Außerdem kann Ihr Code seltsame Zeichen für %code% ausgeben.
Sie sollten sich auch bewusst sein, dass es sehr schwierig ist, %code% sicher zu verwenden. Hoffentlich lernst du später bessere Wege, um etwas zu lernen.
Sie könnten das Stück Code neu schreiben, indem Sie jede Zahl so berechnen, dass sie sich wie eine Zustandsmaschine verhält. Es beginnt im Anfangszustand und berechnet die Anzahl der Ziffern, ändert dann den Zustand auf "N-te Ziffer drucken", um die höchstwertige Ziffer zu drucken, ändert dann den Status, um zu den weniger signifikanten Stellen usw. zu gelangen, bis es das Finale ergibt Zustand. Wenn Sie dies in einer Schleife ausführen, geben Sie alle Ziffern in der richtigen Reihenfolge aus.
Sie könnten zwei Schleifen verwenden. Der erste erzeugt weiter Kräfte der Basis, bis er eine Potenz findet, die größer ist als die eingegebene Zahl. Die zweite beginnt hier (oder eher eine Potenz davor) und arbeitet zurück zur Basis ^ 0 (d. H. 1), um die höchstwertigen ersten Ziffern zu berechnen.
Nicht getesteter Pseudocode:
%Vor%Hey! Ich erkenne eine berühmte Hausaufgabe, die ich auch im ersten Jahr meiner Schule hatte (@Epitech Schüler: kopiere nicht den folgenden Code, versuche deine eigene Lösung zu finden, es ist zu deinem Besten ^^)
Die Lösung für Ihr Problem besteht darin, das Problem rekursiv zu lösen:
%Vor%Gibt Ihre Hausaufgabe an, dass es nur mit positiven Zahlen arbeiten soll? Wenn nicht, ist es einfach, die Behandlung der negativen Zahlen einzuschließen:
%Vor%@arno: Das stimmt, weil der Beispielcode eine ASCII-Tabelle verwendet. Wenn wir etwas wirklich flexibles wollen, brauchen wir die Basis in Parameter. Zum Beispiel:
%Vor%Dies implementiert das Beispiel:
%Vor%Ich hoffe, es löst Ihr Problem!
edit: Ich habe nicht richtig gelesen ^^ Sie dürfen keine Funktionen verwenden, daher kommt Rekursion nicht in Frage ... Hier ist ein interaktiver Weg, den Sie in eine main () einfügen können. Sie können diesen Code verbessern, indem Sie die Handhabung der negativen Zahlen und flexible Basen hinzufügen, wie ich Ihnen gezeigt habe:)
%Vor%Hoffe, es löst jetzt alles!
Interessante Aufgabe, die Sie als Hausaufgabe haben. Ich bin ein Anfänger Programmierer, und ich habe versucht, diese Aufgabe zu lösen.
Der folgende Code funktioniert (ich habe nicht viel getestet, funktioniert anscheinend). Ich bin mir sicher, dass es nicht die optimale und beste Lösung ist, aber das einzige, was ich mir vorstellen konnte. Es sollte mit jeder Basis funktionieren. Leider werden 10- & gt; A, 11- & gt; B usw. nicht konvertiert:
%Vor%Sie können bei diesem Ansatz versuchen. Es ist mehr ein Beweis des Konzepts, Sie müssen immer noch einen speziellen Fall behandeln, aber, hey, das sind Ihre Hausaufgaben:)
%Vor%Ausgehend von dem, was vorgeschlagen wurde, bestand die Lösung darin, weiterhin die letzte Nummer zu drucken und die Schleife für jede Ziffer zu wiederholen. Ich behielt den Druckzustand im Auge, indem ich den vorherigen Quotienten und das Drucken speicherte, wenn ich jedesmal ankam (dann die Nummer zurücksetzte und von vorne anfing) und sie dann auf die vorherige zurücksetzen. Klingt kompliziert, aber die Änderung des Codes war einfach. Meine Stop-Bedingung für die Schleife war, wenn ich zwei aufeinanderfolgende Drucke hatte, da die meiste Zeit nur Quotient / Rest berechnet und nichts gedruckt wird, und wenn zwei Stellen nacheinander gedruckt werden, sind es die letzten zwei. Wie auch immer, hier ist der Code:
%Vor%Danke an alle, die sich gemeldet haben!
Interessante Aufgabe, die Sie als Hausaufgabe haben. Ich bin ein Anfänger Programmierer, und ich habe versucht, diese Aufgabe zu lösen.
Der folgende Code funktioniert (ich habe nicht viel getestet, funktioniert anscheinend). Ich bin mir sicher, dass es nicht die optimale und beste Lösung ist, aber das einzige, was ich mir vorstellen konnte. Es sollte mit jeder Basis funktionieren. Leider werden 10- & gt; A, 11- & gt; B usw. nicht konvertiert:
%Vor%Ausgehend von dem, was vorgeschlagen wurde, bestand die Lösung darin, weiterhin die letzte Nummer zu drucken und die Schleife für jede Ziffer zu wiederholen. Ich behielt den Druckzustand im Auge, indem ich den vorherigen Quotienten und das Drucken speicherte, wenn ich jedesmal ankam (dann die Nummer zurücksetzte und von vorne anfing) und sie dann auf die vorherige zurücksetzen. Klingt kompliziert, aber die Änderung des Codes war einfach. Meine Stop-Bedingung für die Schleife war, wenn ich zwei aufeinanderfolgende Drucke hatte, da die meiste Zeit nur Quotient / Rest berechnet und nichts gedruckt wird, und wenn zwei Stellen nacheinander gedruckt werden, sind es die letzten zwei. Wie auch immer, hier ist der Code:
%Vor%Danke an alle, die sich gemeldet haben!