Kleines Zahlenraten programmieren

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
JulesPryla
Beiträge: 1
Registriert: Fr Nov 14, 2014 12:21 am

Kleines Zahlenraten programmieren

Beitrag von JulesPryla » Fr Nov 14, 2014 12:26 am

Hallo lieber Leser,

Ich habe ein Problem mit einer Aufgabe, die die C-Programmierung betrifft.

Es geht um ein C-Programm, das zufällig zwei ganze Zahlen a und b zwischen 1 und 1000 bestimmt, so dass a <= b gilt. Der Benutzer soll so lange aufgefordert werden, eine Zahl zu raten, bis er die Zahl gefunden hat, die genau in der Mitte von a und b liegt. Nach jedem Rateversuch erhält der Benutzer einen Hinweis: Ist die Zahl kleiner als a oder größer als b: „Viel zu klein!“ bzw. „Viel zu groß!“ Ist die Zahl im richtigen Bereich, aber näher einer Grenze als an der Mitte: „Zu klein!“ bzw. „Zu groß!“ Anderenfalls: „Ein bisschen zu klein!“ bzw. „Ein bisschen zu groß!“
Wenn der Benutzer richtig geraten hat, erhält er die Mitteilung „Richtig!“ und die Grenzen werden zur Kontrolle ausgegeben.

Ich komme nicht richtig zurecht und stehe auf dem Schlauch.
Ich wollte eigentlich Zahlenräume schaffen, die unterscheiden zwischen "viel zu groß" und "ein bisschen zu groß" - die ich aber nicht umsetzten kann.

Ich muss dazu sagen, dass ich noch ein blutiger Anfänger bin.

Code: Alles auswählen

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


//Funktion für die zufällige Nummer
//int randomNumber() {
//int r = rand() % 1001 + 1;


int main() {

	srand(time(NULL));

	int a, b;
	do{
		a = rand() % 1000 + 1;
		b = rand() % 1000 + 1;
	} while (a <= b);
	int mitte = (a + b) / 2;
	int gerateneZahl;

	//Diese drei Zeilen habe ich nur genutzt, um zu überprüfen, ob die Zahlen stimmen
	printf("%i\n", a);
	printf("%i\n", b);
	printf("%i\n", mitte);

	printf("\nBitte geben Sie eine Zahl ein: ");
		scanf_s("%i", &gerateneZahl);


	while (a <= b) {

		if (gerateneZahl > mitte) {
			printf("ein bisschen zu groß\n");
		}
		if (gerateneZahl > (mitte)) {
			printf("viel zu gross\n");
		}
		else if (gerateneZahl < mitte) {
			printf("ein bisschen zu klein\n");
		}
		else if (gerateneZahl < (mitte)) {
			printf("viel zu klein\n");
		}
		if (gerateneZahl == mitte) {
			printf("Richtig! Die Grenzen waren %d und %d\n", a, b);
		}
	}

	return 0;

}
Kann jemand etwas damit anfangen und mir vielleicht weiterhelfen?

Ich bin für jeden Kommentar dankbar und brauche hier echt Hilfe.

Vielen Dank!

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Kleines Zahlenraten programmieren

Beitrag von nufan » Fr Nov 14, 2014 12:52 am

Tag :)
JulesPryla hat geschrieben:

Code: Alles auswählen

	do{
		a = rand() % 1000 + 1;
		b = rand() % 1000 + 1;
	} while (a <= b);
Davon würde ich dir abraten. Rein theoretisch kann das auch eine Endlosschleife sein. Du kannst ja einfach mal zwei Zahlen erzeugen. Falls b nicht die größere ist, vertauscht du die beiden.

EDIT:
Jetzt seh ichs erst. Die Schleife passt gar nicht zu der von dir beschriebenen Bedingung a <= b.
JulesPryla hat geschrieben:

Code: Alles auswählen

	while (a <= b) {
Was genau versuchst du mit dieser Bedingung zu erreichen?
JulesPryla hat geschrieben:

Code: Alles auswählen

		if (gerateneZahl > mitte) {
			printf("ein bisschen zu groß\n");
		}
		if (gerateneZahl > (mitte)) {
			printf("viel zu gross\n");
		}
		else if (gerateneZahl < mitte) {
			printf("ein bisschen zu klein\n");
		}
		else if (gerateneZahl < (mitte)) {
			printf("viel zu klein\n");
		}
		if (gerateneZahl == mitte) {
			printf("Richtig! Die Grenzen waren %d und %d\n", a, b);
		}
So wie ich deine Frage verstanden hab ist hier die Umsetzung der Bereiche dein Hauptproblem. Fang bei den einfachen Fällen an und arbeite dich vor.

Der allereinfachste Fall ist, wenn der Benutzer richtig geraten hat. Die Bedingung überschneidet sich auf keinen Fall mit einer anderen Bereichsüberprüfung. Danach kannst du die alles außerhalb des Intervalls [a,b] ausschließen, also alles was < a bzw. > b ist. Diese 3 Fälle schließen sich gegenseitig aus, du kannst sie also mit einfachen if- bzw. else-if-Anweisungen darstellen.

Hast du keinen von den vorigen 3 Fällen, solltest du zuerst feststellen in welchem Bereich des Intervalls sich die geratene Zahl befindet: [a, mitte) oder (mitte, b]
Du weißt nun, ob die Zahl innerhalb des Intervalls zu groß oder zu klein ist. Um festzustellen, ob die Zahl jetzt "ein bisschen" zu groß/zu klein ist, solltest du die Differenz zu den beiden Bereichspunkten bilden. Je nachdem welche Differenz kleiner ist, ist die Zahl "zu klein" oder nur "ein bisschen zu klein/groß". Hier musst du dann Bedinungen ineinander verschachteln.


Ein Beispiel:
a = 1
b = 10
Mitte = 5
Geratene Zahl: 9

Ist die geratene Zahl genau die Mitte (5 == 9)? => Nein
Ist die Zahl kleiner als a? => Nein => die Zahl ist größer gleich a
Ist die Zahl größer als b? => Nein => die Zahl ist kleiner gleich b
=> Damit wissen wir, dass die Zahl auf jeden Fall im Intervall [a, b] liegt
Ist die Zahl kleiner als die Mitte? => Nein
=> Die Zahl ist größer als die Mitte, also im Intervall (mitte, b]
Differenzen berechnen:
geratene Zahl - mitte = 9 - 5 = 4
b - geratene Zahl = 10 - 9 = 1
1 < 4 => geratene Zahl ist näher an der Intervallgrenze als an der Mitte, sie ist also zu groß, aber nicht "ein bisschen" zu groß.


Konnte ich dir damit das Ganze etwas klarer machen?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Kleines Zahlenraten programmieren

Beitrag von Xin » Fr Nov 14, 2014 12:53 am

JulesPryla hat geschrieben:Ich komme nicht richtig zurecht und stehe auf dem Schlauch.
Ich wollte eigentlich Zahlenräume schaffen, die unterscheiden zwischen "viel zu groß" und "ein bisschen zu groß" - die ich aber nicht umsetzten kann.
Du hast die Zahl 'mitte', was ja schonmal ganz gut ist. :-)
Wenn die Zahl mitte-5 überschreitet, aber kleiner als mitte ist, dann ist die geratene Zahl kleiner, aber nah dran.

Code: Alles auswählen

if( gerateneZahl > (mitte-5) && gerateneZahl < mitte )
  printf( "Die gesuchte Zahl ist größer, aber Du bist ganz nah dran\n" );
else if( gerateneZahl == mitte )
  printf( "Richtig\n" );
else if( gerateneZahle < (mitte+5) && gerateneZahl > mitte )
  printf("blabla");
Experimentier damit mal was rum. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten