Frage von Angrodo, 63

Eine Programmieraufgabe lösen (nicht auf hohem Niveau), kann mir einer helfen?

Hallo Leute, mir wurde vor Kurzem hier geholfen bezüglich einer Aufgabe, aber sie war , schätze ich, auf einem so hohen Niveau, dass sie nicht akzeptiert wurde von den Lehrern. Wir haben 2 Aufgaben, wobei die 2. Aufgabe eine Erweierung der ersten ist. Jetzt kommt die Frage für die erste Aufgabe: --------- Wiederholungsanweisung

Es sollen N Messwerte eingelesen und verarbeitet werden. Bei jeder Eingabe soll angegeben werden, der wievielte Messwert eingegeben wird. Nach der Eingabe soll der aktuelle Messwert, der größte Messwert, der kleinste Messwert und der Mittelwert der Messwerte berechnet und angezeigt werden.

Welche Wiederholungsanweisung eignet sich für diese Aufgabe besonders?

So musste sie gelöst werden:

include <studio.h>

include<stdlib.h>

int main (){ float eingabe; float summe =0; float mittelwert; int i=1; float min ; float wert; float max;

    printf( "Bitte geben Sie die Anzahl der  Messwert ein! \n \n");
    scanf ("%f", & eingabe);
    for(i=1;i<=eingabe;i++)
    {
        printf("Bitte geben sie den %d. Wert ein\n",i);
        scanf("%f",&wert);
        if(i==1)
    
    min=wert;
    max=wert;
    mittelwert=wert;    
        
        summe=summe+wert;
        mittelwert=summe/i;
        if(wert>=max)
            max=wert;
        else
            min=wert;
            
        
         
        printf("Der groeste Wert ist %.1f\n",max);
        printf("der kleinste Wert ist %1f\n",min);
        printf("Der Mittelwert ist %.1f\n", mittelwert);
        
    }
   

}

Jetzt kommt die erweiterte Aufgabe:

Sichere Eingabe

Erweitern Sie Ihr Programm zu Einlesen von N Messwerten um eine sichere Eingabe. D.h. bei der Eingabe der Zahl der Messwerte soll nur eine positive ganze Zahl akzeptiert werden. Fehleingaben sollen zu einem Hinweis und zu einer weiteren Eingabemöglichkeit führen.

Erstellen Sie vor dem Beginn der Programmierarbeit bitte ein Struktogramm!

Zählen Sie außerdem mit, wie viele positive und negative Werte eingegeben wurden.

Die Ermittlung des größten und kleinsten eingegebene Wertes soll bereits ab dem ersten Wert und ohne eine Sonderbehandlung für diesen Wert erfolgen. Wie belegt man die Werte für den Größten und kleinsten Wert sinnvoll vor?

Ich schätze mal, ich soll paar kleine änderungen vornehmen im ersten Programm. Kann mir jemand helfen und sich diesem Niveau anpassen?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von JuicyLuisian, 50

Die erste Sprache die ich gelernt habe war ebenfalls C und ich muss ehrlich zugeben das ich ziemliche Probleme mit Form und Syntax hatte. Ich habe auch Beispielcodes gebraucht um ein Gefühl für die Codierung zu bekommen.


int main ()
{
int eingabe; // Wenn Eingabe den Typ 'Integer' hat werden nur ganze Zahlen eingelesen, auch wenn eine Kommazahl eingegeben wird.

float summe = 0;
float mittelwert;
int i;
float min;
float wert;
float max;
int positiv = 0;
int negativ = 0;
/*******************************/
//Ich habe die Abfrage nun in einer Do-While-Schleife gesteckt.
//Für die Abfrage gab es 3 Anforderungen:
do{
printf("\n\nBitte geben Sie die Anzahl der Messwerte ein: ");
scanf("%i", &eingabe); //1. Anforderung, Nur ganze Zahlen als Eingabe. Bei der Eingabe 2.4 würde nur 2 eingelesen werden.
fflush(stdin); //2. Anforderung, Nur eine Zahl soll eingegeben werden. Wenn du eine Zahl eingibst, dann Leerzeichen und dann eine 2. Zahl eingibst passiert folgendes:
//Die 1. Zahl wird erfasst und den Wert 'eingabe' zugewiesen. Die 2. Zahl nach dem Leerzeichen bleibt im Speicher der Tastatur.
//Wenn nun der 1. Messwert abgefragt wird, wird noch vor deiner Abfrage der Tasterturspeicher ausgeleert und mit den ersten Messwert zugewiesen.
//Der Befehl fflush() leert ein Speicher, der zugewiesene Wert 'stdin' verweist auf die Standarteingabe, also die Tastertur

if(eingabe < 1){
printf("\nFEHLER! Als Eingabe werden nur positive Zahlen akzeptiert.");
}
}while(eingabe < 1);// 3. Anforderung, Nur Eingaben die größer als 0 sind werden angenommen, andernfalls wird die ganze Abfrage von neuen gestartet.
/*****************************/

for (i=1; i<=eingabe; i++) //Ich hab deine while-schleife wieder herausgenommen, da ich die Aufgabe so verstanden hab das hier auch negative Zahlen akzeptiert werden.
{
printf("Bitte geben sie den %d. Wert ein\n",i);
scanf("%f",&wert);
if(i == 1)
{
min = wert;
max = wert;
mittelwert = wert;
}
summe = summe + wert;
mittelwert = summe / i;
if (wert >= max) max = wert;
else if (wert <= min) min = wert;
if(wert < 0) negativ++;
else positiv++;
printf("Der groeste Wert ist %.1f\n",max);
printf("der kleinste Wert ist %.1f\n",min);
printf("Der Mittelwert ist %.1f\n", mittelwert);
printf("Anzahl positiver Eingaben: %d\n", positiv);
printf("Anzahl negativer Eingaben: %d\n\n", negativ);
}
}


Ich habe versucht die wichtigen Änderungen abzugrenzen. Du machst es dir sehr viel einfacher wenn du dir das Codebeispiel herauskopierst und in deine Entwicklungsumgebung einfügst.  Dann erkennst du auch was nur Komentare sind und was zum eigentlichen Programm gehört.

Ich benutze übrigens gerne Dev-C++ Version 5.1.

Ich habe einige Fehler durchprobiert und bin recht zufrieden mit den Programm. Außerdem achte auf Rechtschreibung, das ist nämlich nicht meine Stärke... :P

Ich habe in letzter Zeit Kopfschmerzen und bin mir nicht sicher ob sich vieleicht Fehler eingeschlichen haben, bzw. hab ich es nicht so intensiv überprüft. So weit so gut erstmal.

Kommentar von JuicyLuisian ,

Ich habe keine Ahnung wie du deinen Code so gut formatiert hast, bei mir funzt das vorne und hinten nicht. Kein tabulator etc. ...

Kommentar von Angrodo ,

Jawoll danke dir. Jetzt verstehe ich die Zusammenhänge auch besser durch diese Kommentare.

Eine Sache habe ich noch zu fragen.

Ein Satz der Aufgabe 5:

"

Die Ermittlung des größten und kleinsten eingegebene Wertes soll bereits ab dem ersten Wert und ohne eine Sonderbehandlung für diesen Wert erfolgen.''

Welcher Befehl ist das in deiner Programmierung?

Ich verstehe nicht so ganz diesen Satz...

Kommentar von Angrodo ,

Und was bedeutet for (i=1; i<=eingabe; i++) ?;-)

Kommentar von JuicyLuisian ,

Es gibt 2 Arten von Schleifen, die etwas solange wiederholen bis eine Bedingung erfüllt wird. Die For-Schleife verwendet man wenn man bereits vor der Schleife weiß wie oft man den Prozess wiederholen möchte. Der For-Schleife werden dann standartmäßig folgende Werte zugewiesen:

for(i = 0; i<=eingabe; i++)
{
//Prozess
}

i=0 bedeutet dein Schleife beginnt bei 0.

i<=eingabe bedeutet das die Schleife solange wiederholt wird bis die Bedingung (i ist kleiner gleich eingabe) nicht mehr erfüllt wird.

i++ bedeutet nach jeden Schleifendurchlauf wird der Wert i um +1 aufaddiert. Man kan auch i-- zum abwärtszählen oder i+2 zum +2 aufwärtszählen zu verwenden.

Die Werte für die For-Schleife sind so fest geschrieben, d.h. man muss sie in der Reihenfolge eingeben.

Die 2. Schleifenart ist die While-Schleife die du auch vorher benutzt hattest. Man verwendet sie wenn die Anzahl der Durchläufe noch unbestimmt ist. In deinem Beispiel war zwar vordefiniert das du soviele Eingaben hast wie Messergebnisse  angegeben wurden, aber wenn man nur negative Werte eingegeben hätte, hätte man die Schleife unendlich oft durchführen können. Du verstehst?

Kommentar von JuicyLuisian ,

Also der Satz ist mir schon ein wenig schleierhaft. Ich könnte mir vorstellen das er damit sagen möchte das du nicht alle Werte sammeln sollst und dann nach der eingabe aller Messwerte erst prüfst was dein Max und Min ist.

Es wäre aber auch möglich das er nicht will das du den If-Befehl verwendest. Diese If-Abfrage gibt es in C bereits in der Bibliothek 'math.h'. Wenn du zu Begin include <math.h> dann kannst du den befehl:

max = fmax(wert, max);
min = fmin(wert, min);

Der Befehl fmax/fmin vergleicht 2 Werte und gibt den jeweils größten/kleinsten Wert zurück. In der Bibliothek 'math.h' steht die gleiche If-Methode drin die du einfach ohne der Bibliothek verwendet hast.

Kommentar von Angrodo ,

Sehr gut danke danke du bist die Beste. Mir fehlt nur noch das Struktogramm. Ich weiß zwar grob wie das mit dem struktogramm geht abernicht wie ich es anhand dieser Aufgabe erstellen soll. Weiß du vielleicht wie ich das struktogramm machen kann?

Kommentar von JuicyLuisian ,

Nun, zu finden ist das Prinzip auf Wiki unter den Namen 'Nassi-Shneiderman-Diagramm' https://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm

Jetzt gilt es nur noch die Kästchen aneinander zureien. Zuerst kommt deine Abfrage in einer do-while-schleife, laut wiki wäre das eine Nicht-Abweisende Schleife. Darin die If-verzweigungen sind jemweils einfache Auswahlen.

Die For-Schleife die dann kommt wäre eine Zahlengesteuerte-Schleife und die if-else-verzweigung ist dann eine Alternative Auswahl.

Antwort
von JuicyLuisian, 55

Die Thematik mit den Niveau deute ich in etwa so das du auch verstehen musst was da am Ende steht. Andernfalls kann ich mir überhaupt nicht vorstellen weshalb man sich beklagt auf zu hohen Niveau zu arbeiten... :D

Die sichere Eingabe realisiert man meist gerne mit einer do-while-Schleife. Das ist im Prinzip wie eine normale While-Schleife nur das sie zuerst etwas ausführt und dann erst überprüft ob die Schleife weiter laufen soll oder abbricht.


do
{
//deine normale Abfrage nach der Messwertenanzahl

}while(eingabe<=0);

Deine Abfrage nach den Messwerten wird jetzt solange abgefragt bis eine Zahl eingegeben wird die nicht kleiner gleich 0 ist. Du solltest auch die Variable "eingabe" als integer einbinden, nicht als float. Damit werden nur ganze Zahlen eingelesen.

Kommst du mit Struktorgrammen zurecht? Weißt du wie das aussehen soll?

Negative und positive Werte mitzählen sollte ja kein problem sein. Binde 2 neue Variablen ein. Einmal positivZähler und einmal negativ, Name ist natürlich dir überlassen und prüfe mit zusätzlichen if-Anweisungen ob sie negativ oder positiv ist und zähle dann einfach aufwerts.

Bei der Bestimmung des Maximums und Minimums werden Fehler beim Minimum auftreten. Du must noch überprüfen ob Wert auch größer als min ist. Ansonsten wird jeder Wert der kleiner ist als Max als kleinster Wert zugewiesen.

Soll eigentlich bei jeden Durchlauf der for-Schleife alle Werte ausgegeben werden? Würde für mich etwas komisch aussehen, aber nicht schlimm.


Kommentar von Angrodo ,

,,Die sichere Eingabe realisiert man meist gerne mit einer do-while-Schleife.''

Bei der ersten Aufgabe hatte ich auch eine do while Schleife und das war dann falsch. Kann man denn die Erweiterte Aufgabe auch so lösen, wie ich die 1. Aufgabe habe, nur mit paar kleinen Veränderungen?

Oder, wenn es mit einer do while schleife sein soll, kannst du mir vorziegen, wie das geht, damit ich das dann weiter studieren kann?

------------------------

,,Du solltest auch die Variable "eingabe" als integer einbinden, nicht als float''

Bezeihst du dich auf die Aufgabe 1 oder die Erweiterte Aufgabe?

Denn die 1. Aufgabe ist 100  %  korrekt, volle Punktzahl und es muss nichts dort geändert werden.

---------------------------------------

Ich weiß jetzt nicht , was du meinst, beziehst du dich jetzt auf die fertige Aufgabe, oder meinst du die Aufgabe 2 , also die Erweiterte?

Kommentar von JuicyLuisian ,

Zur Aufgabe 1, also die Aufgabe die du ja bereits abgegeben hast gibt es nur einen Fehler und das ist dein Mindestwertzuweisung. Das war die einzige Stelle in meinem Text die sich auf die Aufgabe 1 bezieht :)

Das Problem ist/war  das wenn du die Zahlenfolge (7, 1, 5) hast dann:

-wird zuerst 7 als Maximalwert zugewiesen

-als nächstes ist die 1 kleiner als Max 'else' wird den Minimalwert zugewiesen

-zuletzt ist die 5 kleiner als der Maximalwert 'else' wird den Minimalwert zugewiesen, dabei ist 5 gar nicht der kleinste Wert. Verstehst du?

Der Rest bezog sich auf die Aufgabe 2. Ich habe vorgeschlagen die Variable 'eingabe' als Integer einzubinden weil gefordert ist das nur ganze Zahlen eingegeben werden dürfen. In Aufgabe 1 ist es auch mit float vollkommen richtig und funktioniert fehlerfrei, aber dein Meister möchte es wohl gerne so. :)

Das die do-while-Schleife falsch war versteh ich nicht. Vieleicht liegt das daran das es bei Aufgabe 1 nicht zwingend nötig war. Do-while-Schleife ist auf jeden Fall die elegante Lösung und der Inbegriff eines sauberen Codes. Eine weitere Möglichkeit wäre ein goto-Befehl. Du könntest eine if-Bedingung einbauen um deine Bedingungen zu überprüfen und dann mit goto zurück zu einen bestimmten Punkt springen. Goto-Befehle sind ein Streitthema in der Programmiertechnik. Man kommt normalerweise IMMER ohne goto aus und dieser Befehl ist sehr Fehleranfällig, unübersichtlich und wird von Programmierern meist gemieden.

Wenn noch irgendwas unklar ist, dann frag ruhig. Ich drücke mich auch oft undeutlich aus.

Kommentar von Angrodo ,
#include <stdio.h>
#include <stdlib.h>

int main () {
	float eingabe;
	float summe = 0;
	float mittelwert;
	int i = 1;
	float min;
	float wert;
	float max;
	int positiv = 0;
	int negativ = 0;

	printf("Bitte geben Sie die Anzahl der Messwert ein!\n\n");
	scanf ("%f", &eingabe);
	while (i <= eingabe) {
		printf("Bitte geben sie den %d. Wert ein\n",i);
		scanf("%f",&wert);
		if (wert > 0) {
			if(i == 1) {
				min = wert;
				max = wert;
				mittelwert = wert;
			}
			summe = summe + wert;
			mittelwert = summe / i;
			if (wert >= max)
				max = wert;
			else if (wert <= min)
				min = wert;
			positiv++;

			printf("Der groeste Wert ist %.1f\n",max);
			printf("der kleinste Wert ist %.1f\n",min);
			printf("Der Mittelwert ist %.1f\n", mittelwert);
			printf("Anzahl positiver Eingaben: %d\n", positiv);
			printf("Anzahl negativer Eingaben: %d\n", negativ);
			i++;
		}
		else {
			printf("Der Wert muss positiv sein\n");
			negativ++;
			printf("Anzahl positiver Eingaben: %d\n", positiv);
			printf("Anzahl negativer Eingaben: %d\n", negativ);
		}
	}
}
Soweit wäre das zu 5, bin aber noch lange nicht fertig, kannst du mir Helfen? Nicht durch schreiben ,sondern ,
dass du mir durch das Vorzeigen hilfst.
Antwort
von Angrodo, 63

Es heißt oben am Anfang # include  stdio.h und #include stdlib.h

wenn ich < > drum rum mache dann verschwindet der Ausdruck, komisch

     

Kommentar von Angrodo ,

,,Die sichere Eingabe realisiert man meist gerne mit einer do-while-Schleife.''

Bei der ersten Aufgabe hatte ich auch eine do while Schleife und das war dann falsch. Kann man denn die Erweiterte Aufgabe auch so lösen, wie ich die 1. Aufgabe habe, nur mit paar kleinen Veränderungen?

Oder, wenn es mit einer do while schleife sein soll, kannst du mir vorziegen, wie das geht, damit ich das dann weiter studieren kann?

------------------------

,,Du solltest auch die Variable "eingabe" als integer einbinden, nicht als float''

Bezeihst du dich auf die Aufgabe 1 oder die Erweiterte Aufgabe?

Denn die 1. Aufgabe ist 100  %  korrekt, volle Punktzahl und es muss nichts dort geändert werden.

---------------------------------------

Ich weiß jetzt nicht , was du meinst, beziehst du dich jetzt auf die fertige Aufgabe, oder meinst du die Aufgabe 2 , also die Erweiterte?

Kommentar von Angrodo ,

Ah so, und ein Struktogramm zu der Erweiterten Aufgabe weiß ich nicht, wie ich es machen soll.

Kommentar von JuicyLuisian ,

Ich glaube nicht das ich fähig bin dir Struktogramme zu erklären, zumindest nicht mit bloßen Text. Also hab ich dir ein Tutorial auf YouTube herausgesucht: https://www.youtube.com/watch?v=ASsIipo_uDk

Ich bin der Meinung man hätte es auch kürzer erklären können, aber es ist schön ausführlich erklärt. Es kann gut sein das du schon ab der hälfte des Viedeos  das Vorgehen verstehst.

Keine passende Antwort gefunden?

Fragen Sie die Community