2016-05-01 2 views
-2

Das Programm soll eine Ziffer jeweils einzeln empfangen und diese Ziffer als Index für das Array verwenden, um zu prüfen, ob es wahr ist. Wenn dies der Fall ist, brechen Sie die Schleife ab, und wenn nicht, setzen Sie sie auf "True" und scannen Sie die anderen Ziffern weiter, bis sie die letzte Ziffer erreichen. Es soll nur sagen, ob zu diesem Zeitpunkt eine Ziffer wiederholt wurde oder nicht.Lesen Sie die Ziffern für eine Nummer einzeln und prüfen Sie, ob es sich um Duplikate handelt.

Ich habe diesen Code bisher, aber ich kann es nicht funktionieren. Kann mir jemand helfen? Ich habe bei der Fehlersuche selbst festgestellt, dass ich den Wert der Variablen nach der Ausführung getestet habe, dass manchmal die Ziffern nicht einmal gelesen wurden, nur die erste eingegebene Ziffer wird gelesen.

Hier ist der Code:

#include <stdio.h> 
#define true 1 
#define false 0 
typedef int bool; 

int main(void) 
{ 
    // Variables to contain the seen digits 
    bool seendig[10] = { false }; 
    long entered; 
    int container; 

    printf("This Program Is Designed To Determine If Any Digits Has Been Repeated!\n Please Enter a Number: "); 

    scanf("%1d", &entered); 

    while (entered > 0) 
    { 
    container = entered; 

    if (seendig[container]) 
     break; 

    seendig[container] = true; 

    entered /= 10; 

    } 

    if (entered > 0) 
    printf("\nThe Digit Was Repeated\n\n"); 

    else 
    printf("The Digit Was Not Repeated\n\n"); 

    system("pause"); 

    return 0; 
} 
+1

'scanf_s ("% 1d", & eingegeben)' soll die ganze Zahl oder eine Ziffer lesen? –

+1

'lange eingegeben;' -> 'int eingegeben;' und das hat viele Probleme. – BLUEPIXY

+1

Beginnen Sie nicht mit 'typedef' eigenen 'bool'. Verwenden Sie den booleschen C-Standardtyp und '#include '. Sidenote (nicht verwandt): 'bool seendig [10] = {false};' funktioniert einfach, hat aber nicht die Semantik, alle Felder auf 'falsch' zu setzen. – Olaf

Antwort

1

Der Teil

container = entered; 

              if (seendig[container]) 

verursacht out-of-Range-Zugriff, wenn 10 oder mehr ganze Zahl eingegeben wird.

Ich denke,

container = entered; 

container = entered % 10; 

sein sollte, die am wenigsten signifikante Ziffer in Dezimalzahl zu bekommen.

+0

@ user3121023 Ich habe es als '% ld' – MikeCAT

+0

für den Vorschlag missverstanden, aber es ist nur eine zu erhalten Ziffer, also wie wäre es wichtig, was im Container ist? Wenn sie mehr als eine Ziffer eingeben würden, würde sie sie einzeln benutzen, wenn sie sieht, dass das das Programm ist. –

+0

Liebe Theorie der Unendlichkeit, Sie ehren Ihren Namen als "seendig [container]" wird die Unendlichkeit adressieren und wird außerhalb der Grenzen liegen, wenn eine Zahl größer als 10 eingegeben wird, weil Ihr Code NICHT jeweils eine Ziffer verarbeitet (und unter der Annahme% ld und nicht% 1d, letzteres macht das Programm obsolet, weil in einer einstelligen Zahl keine Ziffer steht) jemals wiederholt werden). –

0

sollten Sie diese Codezeile hinzufügen Ihrer while-Schleife nur

scanf_s("%d", &entered); 
+0

Die Verwendung von '% ld' ist die richtige Art,' long' über 'scanf()' zu lesen. Sind Sie sicher, dass '% d' für' scanf_s() 'korrekt ist? – MikeCAT

+0

okay, zuerst einmal, ich bin neu zu programmieren und im Ziel, c zuerst zu beherrschen, von was iv gelernt, altho% ld behandelt lange intergers,% 1d wird verwendet, um 1 Ziffer zu nehmen, was ist, was ich tun will.Wenn ich es in% ld ändere, wird das nicht einfach akzeptiert und in die Variable geklatscht? was ist nicht was ich will. Das Buch verwendet einen sehr ähnlichen Code, den ich nicht funktionieren kann, ich benutze scanf_s, weil normale scanf wird nicht in visual b –

+0

bauen ja der richtige Weg hier ist% 1d zu verwenden. Nur falsch geschrieben. – Alikbar

1

Ist Ihr Code zu beenden versuchen, die Benutzereingaben 1 Nummer zu lassen? oder viele Zahlen? Wenn es das letztere ist, dann sollte Ihre scanf("%1d",&entered); innerhalb einer Schleife sein und auch würde ich empfehlen, dass Sie eine Post-Test-Schleife oder do-while loop verwenden, da Sie den Benutzer zuerst eine Nummer eingeben müssen, bevor Sie es überprüfen.

Sie sollten auch betrachten, da es einen gültigen Indexwert in einem Array ist

do { 
    printf("This Program Is Designed To Determine If Any Digits Has Been Repeated!\nPlease Enter a Number: "); 
    scanf("%d", &temp); 


    entered = temp; 
    if(temp >= 0){ 
     while(temp > 0){ 
      entered = temp % 10; 
      temp/=10; 
     } 
    }else{  
     break; 
    } 

    if(entered >= 0 && seendig[entered] != true){ 
     seendig[entered] = true; 
    }else{ 
     flag = 1; 
    } 
    printf("\n"); 
    }while(flag == 0); 

    if (entered >= 0){ 
    if(flag == 1){ 
     printf("\nThe Digit Was Repeated\n\n"); 
    }else{ 
     printf("The Digit Was Not Repeated\n\n"); 
    } 
    }else{ 
     printf("The Digit You have Inputted is a Negative Value\n\n"); 
    } 
Verwandte Themen