WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Bitte helft mir! (http://www.wcm.at/forum/showthread.php?t=52680)

pirate man 09.04.2002 21:41

Bitte helft mir!
 
hallo

ich suche jemanden, der mir bis donnerstag ein kleines programm in c programmiert - es is für die schule
es soll ein zahl-rate-spiel werden - das programm muss die zahl erraten, die man sich ausdenkt

man muss immer mit g(rößer) oder k(leiner) antworten, anfang fragt das programm ob die zahl größer als oder kleiner als 50 ist

bespiel 1:
ist deine zahl größer oder kleiner als 50?
k
ist deine zahl größer oder kleiner als 25?
k
ist deine zahl größer oder kleiner als 20?
k
ist deine zahl größer oder kleiner als 15?
g
ist deine zahl größer oder kleiner als 17?
k
deine zahl ist 16!

beispiel 2:
ist deine zahl größer oder kleiner als 50?
g
ist deine zahl größer oder kleiner als 75?
g
ist deine zahl größer oder kleiner als 80?
k
ist deine zahl größer oder kleiner als 77?
k
deine zahl ist 76!

so soll das ausschauen
ich brauch es bis donnerstag für die schule
ich hoffe, es ist jemand so nett und macht das für mich

danke

irrsinn 09.04.2002 22:33

kleine zusatzfrage: was darf man alles verwenden, reines ansi c? und auf welchem compiler soll mans ausprobieren falls nicht ansi c?

bis donnerstag abend?

flocky 09.04.2002 22:33

is des wuascht, wann er in 25er oder 5er schritten weitergeht?
und wann geht er in 3er schritten weiter??
das geht doch nicht !!

irrsinn 09.04.2002 22:35

de fakto muss das programm immer bei der hälfte des möglichen intervalls fragen obs größer oder kleiner ist. also bei 0-50 muss er mit 25 anfangen. bei 0 - 33 kann er zB bei 16 anfangen. alles andere würde die effizienz des algorithmus negativ beeinflussen

irrsinn 09.04.2002 23:00

so müsst funktionieren. hoffentlich hab ich keine denkfehler gemacht. is ja doch schon spät am abend
die datei musst du noch auf .c umbenennen.

pirate man 09.04.2002 23:02

hallo irrsinn
brauchs bis mittwoch abend weil am donnerstag brauch ichs schon inder schule
das programm soll so schnell wie möglich die zahl erraten, daher wird zuerst geteilt und dann in 5er schritten systematisch vorgegangen

pirate man 09.04.2002 23:51

die abfrage für die obergrenze brauch ich nicht
es soll einfach so sein, wie in den 2 beispielen oben

irrsinn 10.04.2002 06:39

zum thema geschwindigkeit: mein verfahren is nach geschwindigkeit optimiert. mag sein, dass du im einen oder anderen fall mit 5er schritten eine abfrage weniger brauchst. aber für den allgemeinen fall bist du so sicher am schnellsten

die abrage für unter und obergrenze hab ich nur zum testen eingebaut. nimm sie einfach raus und weis den variablen den wert zu den sie haben sollen.

irrsinn 10.04.2002 06:41

und irgendeine obergrenze wirst du brauchen. sonst wirst alt, wenn der user zB die zahl 810 meint und du dich mit 5er schritten näherst.

pirate man 10.04.2002 07:08

ups, sorry
hab vergessen zu sagen, dass es eine zahl von 1-100 sein muss
das heißt, die grenze braucht der user nicht einzutragen

pirate man 10.04.2002 07:15

ajo, hab dein programm gestern noch getestet
nachdem man die grenzen angegeben hat, schliesst sich das fenster

irrsinn 10.04.2002 07:20

folgendes ich geh jetzt auf die uni und mach eine prüfung. am abend hast eine funktionierende version

pong 10.04.2002 07:24

@irrsinn i hab ma erlaubt deine version abzuändern, ich hoff es geht ohne probs

Code:

#include <stdio.h>
#include <conio.h>

#define obergrenze 100
#define untergrenze 0

int main()
{
        unsigned short usLower = untergrenze;
        unsigned short usUpper = obergrenze;
        unsigned short usQuery = 0;
        unsigned short usChar = 0;

/*        // Zu behandelndes Intervall abfragen
        printf("\nIntervall Untergrenze eingeben: ");
        scanf("%d", &usLower);
        printf("\nIntervall Obergrenze eingeben: ");
        scanf("%d", &usUpper);

        if (usLower == usUpper)
        {
                printf("\nUnter und Obergrenze sind gleich!");
                exit(0);
        } // if
*/
        // diese konstruktion ist nicht besonders elegant. aber für diese zwecke reichts alle mal
        for ( ; ; )
        {
                // ungefähre hälfte des intervalls ermitteln
                usQuery = usLower + (usUpper - usLower) / 2;

                printf("\nIst die Zahl größer (g), kleiner (k) oder gleich (e) %d", usQuery);
                usChar=getch();

                // ist die Zahl schon gefunden?
                if ((usUpper - usLower) == 2)
                {
                        printf("\nDie gesuchte Zahl ist %d", usQuery);
                        getch();
                        exit(0);
                } // if

                switch (usChar)
                {
                case 'g': // die Zahl ist größer
                        usLower = usQuery;
                        break;
                case 'k': // die Zahl ist kleiner
                        usUpper = usQuery;
                        break;
                case 'e': // die Zahl ist gefunden
                        printf("\nDie gesuchte Zahl ist %d", usQuery);
                        getch();

                        exit(0);
                        break;
                default:
                        printf("\nUngültige Eingabe. Programm wird beendet!");
                        exit(0);
                        break;
                } // switch
        } // for
} // main


pc.net 10.04.2002 07:37

hab auch erlaubt a bisserl rumzupfuschen ... (funktioniert jetzt auch bei einem doppelklick auf die .exe ;) )

Code:

#include <stdio.h>
#include <conio.h>

int main()
{
  unsigned short usLower = 0;
  unsigned short usUpper = 0;
  unsigned short usQuery = 0;
  unsigned short usChar = 0;

  // Zu behandelndes Intervall abfragen
  printf("\nIntervall Untergrenze eingeben: ");
  scanf("%d", &usLower);
  printf("\nIntervall Obergrenze eingeben: ");
  scanf("%d", &usUpper);

  if (usLower == usUpper)
  {
    printf("\nUnter und Obergrenze sind gleich!");
    getch();
    return(0);
  } // if

  // diese konstruktion ist nicht besonders elegant. aber fuer diese zwecke reichts alle mal

  while (1)
  {
    // ungefaehre haelfte des intervalls ermitteln
    usQuery = usLower + (usUpper - usLower) / 2;

    printf("\nIst die Zahl groesser (g), kleiner (k) oder gleich (e) %d", usQuery);
    usChar = getch();

    // ist die Zahl schon gefunden?
    if ((usUpper - usLower) == 2)
    {
      printf("\nDie gesuchte Zahl ist %d", usQuery);
      break;
    } // if

    switch (usChar)
    {
      case 'g':    // die Zahl ist groesser
                    usLower = usQuery;
                    break;
      case 'k':    // die Zahl ist kleiner
                    usUpper = usQuery;
                    break;
      case 'e':    // die Zahl ist gefunden
                    printf("\nDie gesuchte Zahl ist %d", usQuery);
                    break;
      default:
                    printf("\nUngueltige Eingabe. Programm wird beendet!");
                    break;
    } // switch
  } // while
  getch();
  return(0);
} // main

gruß
pc.net

pirate man 10.04.2002 08:42

@ pong

deine version bzw. die von dir geänderte is fast so wies sein soll :)
die option g(leich) darf nicht zur verfügung stehen

das programm muss so fragen, dass zum schluss nur eine möglichkeit überbleibt

beipspiel (die zahl ist 34):

größer oder kleiner als 50?
k
größer oder kleiner als 25?
g
größer oder kleiner als 35?
k
größer oder kleiner als 30?
g
größer oder kleiner als 33?
g
die gesuchte zahl ist 34

ich hoff, du kriegst es so hin :)

irrsinn 10.04.2002 13:47

was soll dann passieren, wenn du dir sagen wir 50 "ausdenkst" und das programm fragt dich ob die gesuchte zahl größer oder kleiner als 50 ist? dann hast nämlich ein problem in der programmlogik.

pirate man 10.04.2002 14:21

gute frage
dann darf man sich halt nicht 50 ausdenken ;)

pong 10.04.2002 17:04

Code:

#include <stdio.h>
#include <conio.h>

#define obergrenze 100
#define untergrenze 0

int main()
{
        unsigned short usLower = untergrenze;
        unsigned short usUpper = obergrenze;
        unsigned short usQuery = 0;
        unsigned short usChar = 0;

/*        // Zu behandelndes Intervall abfragen
        printf("\nIntervall Untergrenze eingeben: ");
        scanf("%d", &usLower);
        printf("\nIntervall Obergrenze eingeben: ");
        scanf("%d", &usUpper);

        if (usLower == usUpper)
        {
                printf("\nUnter und Obergrenze sind gleich!");
                exit(0);
        } // if
*/
        // diese konstruktion ist nicht besonders elegant. aber für diese zwecke reichts alle mal
        for ( ; ; )
        {
                // ungefähre hälfte des intervalls ermitteln
                usQuery = usLower + (usUpper - usLower) / 2;

                printf("\nIst die Zahl größer (g) oder kleiner (k) %d", usQuery);
                usChar=getch();

                // ist die Zahl schon gefunden?
                if (((usUpper - usLower) == 2) || ((usUpper - usLower) == 0))
                {
                        printf("\nDie gesuchte Zahl ist %d", usQuery);
                        getch();
                        exit(0);
                } // if

                switch (usChar)
                {
                case 'g': // die Zahl ist größer
                        usLower = usQuery;
                        break;
                case 'k': // die Zahl ist kleiner
                        usUpper = usQuery;
                        break;
/*                case 'e': // die Zahl ist gefunden
                        printf("\nDie gesuchte Zahl ist %d", usQuery);
                        getch();

                        exit(0);
                        break;
->mog a ned
*/
                default:
                        printf("\nUngültige Eingabe. Programm wird beendet!");
                        exit(0);
                        break;
                } // switch
        } // for
} // main


irrsinn 10.04.2002 17:08

und wenn dich das programm irgendwann im weiteren verlauf fragt ob die gesuchte zahl größer oder kleiner ist und dabei die gesuchte zahl ausgibt? solche situationen können unabhängig von der gesuchten zahl und unabhängig vom intervall auftreten.


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag