C Abfrage zur Wiederholung des Programms

ToastMario

Newbie
Registriert
Feb. 2018
Beiträge
5
Servus Leute,

ich habe ein Programm geschrieben und soweit funktioniert auch alles außer am Ende die Abfrage zur Wiederholung des Programms.

Gebe ich am Ende 'j' ein, springt der Cursor im Terminal lediglich eine Zeile nach unten ohne dass das Programm endet.
Zudem ist mir aufgefallen dass das Programm sich nur wiederholt, wenn ich eine gerade Anzahl an 'j' eingebe und bei einer ungeraden Anzahl, der Cursor nur nach unten springt und eine weitere Eingabe verlangt.
Ich möchte jedoch, dass lediglich nur ein 'j' vom Benutzer eingegeben werden muss.

Anbei der Code.

Ich hoffe ihr könnt mir helfen.
Vielen Dank im Voraus.

Code:
// Potenzierer
// Aufg3-1

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    int basis, nbasis, potenz, npotenz;
    char weiter;
    
    do
    {
        printf("\nPotenzierer\n\nBasis eingeben: ");
        scanf("%d", &basis);
        
        printf("\nPotenz >= 0 eingeben: ");
        scanf("%d", &potenz);
        
        if (potenz < 0)
        {
            do
            {
                printf("\nFalsche Eingabe!\nPotenz >= 0 eingeben: ");
                scanf("%d", &potenz);
            }
            
            while (potenz < 0);
        }
        
        if (potenz == 0)
        {
            printf("\n%d ^ %d = 1\n\n", basis, potenz);
        }
        
        else
        {
            nbasis = basis;
            npotenz = potenz;
            
            do
            {
                nbasis = nbasis * basis;
                npotenz = npotenz - 1;
            }
            
            while (npotenz != 1);
            
            printf("\n%d ^ %d = %d\n\n", basis, potenz, nbasis);
        }
        
        printf("\nMöchten Sie eine weitere Zahl potenzieren? (j/n) \n\n");
      
        do
        {
            scanf("%c", &weiter);
        }
        while ( getchar() != '\n' );
        
    }
    
    while (weiter == 'j' || weiter == 'J');
    
    return 0;
}
 
ich muss die schleife benutzen um den eingabepuffer zu leeren, ansonsten überspringt das Programm meine eingabe
 
Sind zu viele Schleifen, sollte nur eine geben. Denke so, dass wenn eine falsche Zahl eingegeben wird, die erste Schleife neu startet. Das scanf pausiert den Code an der Stelle bis zum Ende der Eingabe. Hierfür solltest du den Code in Funktionen auslagern um es besser steuern zu können.
 
Zuletzt bearbeitet von einem Moderator:
laut Aufgabenstellung soll ich nur mit Nichtabweisenden bzw. Fußgesteuerten Schleifen arbeiten
Ergänzung ()

Soweit funktioniert ja alles, das einzige was mich stört ist, das sich das Programm nur wiederholt bei einer gerade Anzahl an eingegebenen 'j'. Ich möchte das der Benutzer nur ein 'j' eingeben muss zur Wiederholung.
 
Code:
// Potenzierer
// Aufg3-1
 
#include <stdio.h>
#include <stdlib.h>
 
int main (void)
{
    int basis, nbasis, potenz, npotenz;
    char weiter;

    do
    {
        printf("\nPotenzierer\n\nBasis eingeben: ");
        scanf("%d", &basis);

        printf("\nPotenz >= 0 eingeben: ");
        scanf("%d", &potenz);
 
        if (potenz < 0)
        {
            do
            {
                printf("\nFalsche Eingabe!\nPotenz >= 0 eingeben: ");
                scanf("%d", &potenz);
            }

            while (potenz < 0);
        }

        if (potenz == 0)
        {
            printf("\n%d ^ %d = 1\n\n", basis, potenz);
        }

        else
        {
            nbasis = basis;
            npotenz = potenz;

            do
            {
                nbasis = nbasis * basis;
                npotenz = npotenz - 1;
            }
            while (npotenz != 1);

            printf("\n%d ^ %d = %d\n\n", basis, potenz, nbasis);
        }

        printf("\nMöchten Sie eine weitere Zahl potenzieren? (j/n) \n\n");

        do
        {
            scanf("%c", &weiter);

            if(weiter=='n' || weiter=='N')
            {
                return 0;
            }
            if(weiter=='j' || weiter == 'J')
            {
                break;
            }
        }
        while (1);
    }
    while (1);

    return 0;
}

Hat wohl einer seltsame Interaktion mit getchar(), scanf() und dem Buffer - das sollte man genauer analysieren um es zu verstehen. Hat auch noch ein paar Dinge die man optimieren kann, aber ich vermute es ist ja eine Schul-/Uniaufagbe :)
 
super danke für die tolle Hilfestellung ! :)
ich verstehe die (1) bei while nicht so ganz.. ..tue das was in der schleife steht solange (1) ? woher nimmt das Programm diese info ob 1 oder ungleich 1 ?
 
Hallo!

Gerne - ja grundsätzlich läuft die Schleife für immer (normalerweise schreibt man while(true)) außer man bricht sie von innen ab mittels return oder break. Da es zwei Schleifen ineinander sind, kann man sie entweder mit extra Variablen kontrollieren, oder aber die innere Schleife abbrechen(break) oder aber beide/alle (return).

/edit:
Ein wenig exakter formuliert:
break: Verlassen genau jener Schleife, in der sich das break befindet (Das ist auch die einzige Variante, in der ein GoTo zulässig ist :D )
return: Verlassen der Funktion
 
Zuletzt bearbeitet:
Zurück
Oben