Drucken Sie die Ziffern einer Zahl in umgekehrter Reihenfolge ohne Arrays oder Funktionen

8

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.

    
sa125 24.12.2009, 10:02
quelle

9 Antworten

3

(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.

    
Marco van de Voort 24.12.2009, 10:10
quelle
3

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.

%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 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.

    
Alok Singhal 24.12.2009 10:54
quelle
1

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

    
Nick Dandoulakis 24.12.2009 10:30
quelle
1

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!

    
Thomas Joulin 24.12.2009 11:01
quelle
0

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.

    
sharptooth 24.12.2009 10:14
quelle
0

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%     
Tom 24.12.2009 10:45
quelle
0
___ qstntxt ___

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.

    
___ answer1957759 ___

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

    
___ qstnhdr ___ Drucken Sie die Ziffern einer Zahl in umgekehrter Reihenfolge ohne Arrays oder Funktionen ___ answer1957688 ___

(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.

    
___ answer1957862 ___

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.

    
___ answer1957711 ___

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.

    
___ answer1957826 ___

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%     
___ answer1957882 ___

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!

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer1958082 ___

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%     
___ answer1957787 ___

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%     
___ tag123string ___ Eine Zeichenfolge ist eine endliche Abfolge von Symbolen, die üblicherweise für Text verwendet wird, manchmal jedoch auch für beliebige Daten. ___ tag123integer ___ Eine Ganzzahl ist eine ganze Zahl, die negativ, positiv oder null sein kann. (d. h. ...- 2, -1, 0, 1, 2 ...) Verwenden Sie dieses Tag für Fragen zum Verwenden, Speichern oder Bearbeiten von Ganzzahlen. ___ answer1958411 ___

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!

    
___
Zeograd 24.12.2009 10:53
quelle
0

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%     
Andrei Ciobanu 24.12.2009 11:59
quelle
0

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!

    
sa125 24.12.2009 13:57
quelle

Tags und Links