Forum: PC-Programmierung einfaches Menü erstellen


von Bernd (Gast)


Lesenswert?

Servus,
im Rahmen einer Aufgabe die ich von unserem Lehrer bekomme muss ich 
vorweg ein kleines Menü erstellen.

Aufgabe sieht so aus:

Erstellen Sie ein Programm, welches aus 3 Modulen besteht. Dieses
soll ein Menü auf dem Bildschirm ausgeben, als auch
eine Statuszeile. Immer wenn der Benutzer b, r oder s gedrückt hat
, soll unterhalb des Menüs (print_Menu.c) z.B. „Taste b
wurde gedrückt“ ausgegeben werden. Wird ein a
eingegeben, so bricht das Programm ab, ansonsten können immer
wieder endlos Tasten gedrückt werden. Die Tasten B, R, S und A
sollen auch akzeptiert werden.
Tipp: Verwenden Sie die Funktion _getch.

a: abbruch
b: beginn
r: reset
s: stop

Status:
Taste b wurde gedrückt


dass mit den drei funktionen habe ich bislang nicht wirklich 
hinbekommen. ich habe somit alles erst mal in der main stehen. die 
ausgabe des status scheint auch zu funktionieren. nur wird das programm 
immer direkt beendet und ich kann wenn ich zb a gedrückt habe den status 
durch drücken einer anderen taste nicht mehr ändern.

eventuell kann mir jemand von euch mal weiterhelfen.

code:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include "utilities.h"

int main (void)
{
  int c;
  printf 
("Menue\tBeginn\tReset\tStop\tAbbruch\n\t-b-\t-r-\t-s-\t-a-\n");
  _gotoxy (0,22);
  printf("Status:\n");

  c = _getch();

  if(c == 'a')
  {
    _gotoxy (0,23);
    printf ("a wurde gedrueckt");
  }


  if(c == 'b')
  {
    _gotoxy (0,23);
    printf ("b wurde gedrueckt");
  }

  if(c == 's')
  {
    _gotoxy (0,23);
    printf ("s wurde gedrueckt");
  }

  if(c == 'r')
  {
    _gotoxy (0,23);
    printf ("r wurde gedrueckt");
  }




  if (c == '0')
  {
    return 0;
  }

}

: Gesperrt durch User
von Sam .. (sam1994)


Lesenswert?

Warum eigentlich nicht:
1
char c = _getch();
2
std::cout << c << " wurde gedrückt";

von Imon (Gast)


Lesenswert?

Bernd schrieb:
> Servus,
> im Rahmen einer Aufgabe die ich von unserem Lehrer bekomme muss ich
> vorweg ein kleines Menü erstellen.
>
> Aufgabe sieht so aus:
>
> Erstellen Sie ein Programm, welches aus 3 Modulen besteht.

Okay das heist soviel wie du sollst dein Programm in 3 logische Blocke
teilen, etwas Overkill bei den was ich hier lese aber gut wenn es so
sein soll, oder hast du uns nur ein ausschnitt geeben. von der Aufgaben 
stellung.

> Dieses
> soll ein Menü auf dem Bildschirm ausgeben, als auch
> eine Statuszeile.

Hier der Hinweiss das soll das erste Modul sein, print_Menu.c wird 
weiter unten vorgeschlagen. Ergo sollst du eine Funktion print_Menu 
entwickeln
und diese in eine eigene Datei packen, dazu sollst du sicherlich ein 
passenden Header schreiben.

> Immer wenn der Benutzer b, r oder s gedrückt hat
> , soll unterhalb des Menüs (print_Menu.c) z.B. „Taste b
> wurde gedrückt“ ausgegeben werden.
 das Menu soll also die Tasten b r s und a Akzeptieren bei allen anderen
ist zu klären was passieren soll, im Zweifel Nachfragen Fehler meldung 
und oder einfach Ignorieren. Du machst im augenblick das zweite.

> Wird ein a
> eingegeben, so bricht das Programm ab, ansonsten können immer
> wieder endlos Tasten gedrückt werden. Die Tasten B, R, S und A
> sollen auch akzeptiert werden.

okay heirfür gibt es sinnvolle Funktionen in dem header ctype.h
In der Praxis heißt das bei den meisten Codierungen einfach das
5 Bit definiert auf High oder Low zu setzen. Aber das ist ein Hack
so geht es Ordentlich
1
#include <ctype.h>
2
3
4
if ( isalpha(c) ) {
5
    c = tolower( c) ; /* jetzt ist c ein kleinbuchstabe
6
                         Achtung Verhalten von tolower ist 
7
                         undefiniert wenn C kein unsigned char 
8
                         wert oder EOF ist, deshalb die If Abfrage 
9
                         obwohl das eigentlich nicht passieren
10
                         sollte */
11
                     
12
}
nun hast du alle eingaben mit Großbuchstaben in klein buchstaben 
gewandelt.


> Tipp: Verwenden Sie die Funktion _getch.
>
Auwa die funktion _getch, ist eine Funktion die man nur mit Vorsicht 
genießen sollte. Der unterstrich vor denn Funktionsnamen suggeriert das 
es
sich um eine Interne Funktion des aktuellen Compiler handelt, Die nicht 
dazu gedacht ist das sie von Programmieren ohne weites genutzt wird.
Normaler weise würde ich dir raten, zu klären warum sie _getchar heißt, 
allerdings weiss ich auch das man als Schüler sein Dozenten ein stück 
weit
ausgeliefert ist nutz die Funktion also, sei dir aber bewusst das du 
normaler weise sehr Vorsichtig sein solltest wenn bei c was mit 
unterstrich oder doppelt unterstrich anfängt.


> a: abbruch
> b: beginn
> r: reset
> s: stop
>
> Status:
> Taste b wurde gedrückt

das Einlesen der Tasten und die Ausgabe darauf könnte deine zweite 
Funktion sein. nur so als Gedanke.

>
>
> dass mit den drei funktionen habe ich bislang nicht wirklich
> hinbekommen.

Okay warum nicht, fehlendes wissen wie die Funktion lauten sollen oder 
das erkennen was, die drei Funktion sind ? Wenn es fehlendes Wissen zu 
denn aussehen der Funktionen ist, frage nach, da kann dir dein Dozent, 
google und wir sicher helfen.

> ich habe somit alles erst mal in der main stehen.

 main ist auch nur eine Funktion, mit der Besonderheit das diese 
Funktion
 vom Preloader des C Programm als erstes gerufen wird. Was dann deine 
dritte Funktion ist.

> die
> ausgabe des status scheint auch zu funktionieren. nur wird das programm
> immer direkt beendet und ich kann wenn ich zb a gedrückt habe den status
> durch drücken einer anderen taste nicht mehr ändern.

ist klar das dein Programm immer direkt bendet wird da fehlt eine 
Schleife
die das Menu und die Tasten abfrage solange wiederholt bis a gedrückt 
wird. Dein Tasten Problem das du denn status nicht mehr ändern kannst 
kommt entweder auch daher, oder aber die alternative kann auch sein das 
die funktion _getchar zwar das Zeichen aus denn Tasterturpuffer ließt 
aber nicht löscht. Bau erstmal die Schleife ein dann gehen wir denn 
Status Tasten nach :-)

>
> eventuell kann mir jemand von euch mal weiterhelfen.
>
> code:
>
> #include <stdlib.h>
> #include <stdio.h>
> #include <conio.h>
> #include "utilities.h"
>
> int main (void)
> {
>   int c;
>   printf
> ("Menue\tBeginn\tReset\tStop\tAbbruch\n\t-b-\t-r-\t-s-\t-a-\n");

   ist ja wirklich kaum zu lesen, die Ausgabe wie wäre es mit sowas
1
   printf( "Menue\t" "Beginn\t" "Reset\t" "Stop\t" "Abbruch\n"
2
           "\t-b-" "\t-r-" "\t-s-" "\t-a-\n" );

   beachte bitte das ich keine Komma zwischen denn String Sequenzen
   gemacht habe, und das ist genau so gültiges C wie oben nur halt 
leichter
   zu lesen.

>   _gotoxy (0,22);
>   printf("Status:\n");
>
>   c = _getch();
>
>   if(c == 'a')
>   {
>     _gotoxy (0,23);
>     printf ("a wurde gedrueckt");
>   }
>
>
>   if(c == 'b')
>   {
>     _gotoxy (0,23);
>     printf ("b wurde gedrueckt");
>   }
>
>   if(c == 's')
>   {
>     _gotoxy (0,23);
>     printf ("s wurde gedrueckt");
>   }
>
>   if(c == 'r')
>   {
>     _gotoxy (0,23);
>     printf ("r wurde gedrueckt");
>   }
>
>
>
>
>   if (c == '0')
>   {
>     return 0;
>   }

   Hier sollte dich dein Compiler Warnen du hast gesagt main ist vom 
type int gibst aber nur ein wert zurück wenn C == '0' ist.

   return 0;
>
> }

von Imon (Gast)


Lesenswert?

Samuel K. schrieb:
> Warum eigentlich nicht:
>
>
1
> 
2
> char c = _getch();
3
> std::cout << c << " wurde gedrückt";
4
>

weil das Porgramm was er geschrieben hat nicht nach C++ sondern nach C 
aussieht und es dort kein cout gibt.

von Bernd (Gast)


Lesenswert?

jop wir lernen nur C im moment.

dass mit den funktionen habe ich mir schon in dem sinne klar gemacht wie 
ich die aufbauen könnte. bei mir ist aber meistens dann das problem wie 
ich die 3 module also sprich main + 2 funktionen miteinander 
verschachtele.

mittlerweile bin ich mit einer while schleife bereits soweit dass ich 
das programm nur mit der a taste beenden kann.

den rest werde ich jetzt mal alles noch irgendwie mit der main aufbauen 
und erst dann versuchen das ganze in funktionen zu packen.

so habe ich es bislang immer gemacht und bin eigentlich gut gefahren.

problem mit meinem ansatz von oben ist dass sobald ich irgendeinen 
buchstaben gedrückt habe dass die funktion nicht mehr auf einen anderen 
buchstaben reagiert. sprich ich denke dass da noch irgendwo ne schleife 
fällig wäre.

von Sam .. (sam1994)


Lesenswert?

Imon schrieb:
> weil das Porgramm was er geschrieben hat nicht nach C++ sondern nach C
> aussieht und es dort kein cout gibt.

Das kommt davon wenn man µC's mit C programmiert und PC-Software mit 
C++...

Printf("%c wurde gedrückt", c); müsste doch trotzdem gehen.

Bernd schrieb:
> problem mit meinem ansatz von oben ist dass sobald ich irgendeinen
> buchstaben gedrückt habe dass die funktion nicht mehr auf einen anderen
> buchstaben reagiert. sprich ich denke dass da noch irgendwo ne schleife
> fällig wäre.

Klar, danach endet das Programm ja (wenn du nichts in deiner goto 
funktion machst).

So eine Schleife haben fast alle Programme (außer vielleicht 
Batchtools).

von Imon (Gast)


Lesenswert?

Bernd schrieb:
> jop wir lernen nur C im moment.
>
> dass mit den funktionen habe ich mir schon in dem sinne klar gemacht wie
> ich die aufbauen könnte. bei mir ist aber meistens dann das problem wie
> ich die 3 module also sprich main + 2 funktionen miteinander
> verschachtele.
>

Wie wäre es wenn du die 3 Funktionen ungefähr so verbindest.
1
int main(void)
2
{
3
  int c  = 0;
4
 
5
  while( c != 'a') {
6
    print_menu();
7
    c = my_getch();
8
  } 
9
  return 0;
10
}

wobei print_menu() dein Menu ausgibt und my_getchar die Eingabe 
auswertung macht.

von Imon (Gast)


Lesenswert?

Samuel K. schrieb:
> Imon schrieb:
>> weil das Porgramm was er geschrieben hat nicht nach C++ sondern nach C
>> aussieht und es dort kein cout gibt.
>
> Das kommt davon wenn man µC's mit C programmiert und PC-Software mit
> C++...
>
> Printf("%c wurde gedrückt", c); müsste doch trotzdem gehen.

Schreib das printf noch klein und wir sind uns einig das es so geht.

>
> Bernd schrieb:
>> problem mit meinem ansatz von oben ist dass sobald ich irgendeinen
>> buchstaben gedrückt habe dass die funktion nicht mehr auf einen anderen
>> buchstaben reagiert. sprich ich denke dass da noch irgendwo ne schleife
>> fällig wäre.
>
> Klar, danach endet das Programm ja (wenn du nichts in deiner goto
> funktion machst).

Diese gotoxy sind teil der conio.h auf Ms Compilern, das sind keine 
goto's im klassischen sinne sondern eine Steuerfunktion die den Cursor 
in der Konsole ( 80 x 24 Zeichen ) setzten.

von Bernd (Gast)


Lesenswert?

Samuel K. schrieb:
> Printf("%c wurde gedrückt", c); müsste doch trotzdem gehen.

danke logisch hab ich total vergessen dass es so auch geht.

von Sam .. (sam1994)


Lesenswert?

Imon schrieb:
> Schreib das printf noch klein und wir sind uns einig das es so geht.

Mist! Satzanfang im Code großgeschrieben.
Das kommt davon wenn man erst den Rechtschreibmeckertanten recht machen 
will.

Imon schrieb:
> Diese gotoxy sind teil der conio.h auf Ms Compilern, das sind keine
> goto's im klassischen sinne sondern eine Steuerfunktion die den Cursor
> in der Konsole ( 80 x 24 Zeichen ) setzten.

Das kannte ich noch nicht. Ich dachte die sind in der #include 
"utilities.h"
definiert.

von Bernd (Gast)


Lesenswert?

so denke dass ichs habe das was es machen soll tut es. was meint ihr?

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include "utilities.h"
int Menue();
int Auswahl();
int main(void)
{

  int c = 0;
  Menue();
  while (c != 'a')
  {
    c = Auswahl();
  }

  return 0;
}




int Menue()    //Funktion zur Anzeige des Menüs
{
  _gotoxy (0,0);
  printf 
("Menue\tBeginn\tReset\tStop\tAbbruch\n\t-b-\t-r-\t-s-\t-a-\n");

  _gotoxy (0,22);
  printf("Status");

  return;

}

int Auswahl(int c)  //Funktion zur Auswahl des Modus
{
  c = getch();
  if ( c == 's' | 'b' | 'r')
  {
    _gotoxy (0,23);
    printf("%c wurde gedrueckt", c);
  }
  return c;
}

von void (Gast)


Lesenswert?

Deine Funktion Menue liefert angeblich noch nen int Wert zurück, tut sie 
aber in Wirklichkeit nicht. Geht so zwar aber du solltest
1
void Menue()
2
{
3
...
4
}
schreiben. Das einzelne return; Statement kannst du dir dann auch 
sparen.

von Bernd (Gast)


Lesenswert?

danke. jetzt hab ich gleich noch ne frage. und zwar wie speichere ich 
einen erechneten wert in einem array?

von void (Gast)


Lesenswert?

1
char my_array[8]; //So legst du ein Array von 8 char-Werten an. Geht natürlich auch mit int oder sonstwas.
2
3
my_array[0] = 'c'; //So schreibst du ein 'c' ins erste Feld
4
5
my_array[7] = 'k'; //So schreibst du ein 'k' in letzte Feld

Zu beachten ist, dass der Index bei 0 losgeht und du immer darauf achten 
musst nicht über die Grenzen hinauszuschreiben! im Beispiel von mir wäre 
my_array[7] das letzte Feld. Wenn du in my_array[8] schreibst, schreibst 
du einfach in den Speicher hinter my_array[7], was sehr schlecht ist und 
unvorhersehbare Folgen haben könnte.

und: C-Buch kaufen und nachlesen.

von Bernd (Gast)


Lesenswert?

danke dass was du mir schreibst war mir klar. nur wenn nun ein wert von 
33,5423 oder so in einer rechnung rauskommt wie schreibe ich es damit 
direkt in den array ohne jedes zeichen zuzuweisen?

von Bernd (Gast)


Lesenswert?

ok habs hinbekommen hab den vektor vergessen. jetzt klappts mit printf.

von Bernd (Gast)


Lesenswert?

naja nächste aufgabe. ich soll mit strikturen arbeiten und arrays 
ausgeben.
so nun habe ich dass hier geschrieben nach meinem skript wohl bemerkt.

nur bekomme ich immer den fehler c4123 es fehlt ein ; vor Typ. immer da 
wo struct employee asemployee; bzw struct employee asadress;

woran kann das liegen? denke mal das programm stimmt sowieso nicht oder 
zumindest hab ichs direkt so abgeschrieben ausem skript und nur die 
namen geändert und trotzdem sind fehler drinn.

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

int f1(int c);
struct employee
{
  char acName[10];
  char acFirstname[10];
  int uiAge;
}employee = {"Matthias" , "Knab" , 22};

struct adress
{
  char acTown[20];
  long uiZipcode;
  char acStreet[20];
}adress = {"Oberschopfheim" , 77948 , "Meiersmattstrasse"};

int main ()
{
  int c = 0;

  while (c != 'a')
  {
    c = f1(c);
    struct employee asemployee;
    printf ("Name: %s\n", employee.acName);
    printf ("Nachname: %s\n", employee.acFirstname);
    printf ("Alter: %d\n", employee.uiAge);

    struct adress asadress;
    printf("Dorf: %c\n", adress.acTown);
    printf("Strasse: %c\n", adress.acStreet);
    printf("PLZ: %c\n", adress.uiZipcode);
  }
return 0;
}



int f1 (int c)
{
  c = getch();
  return c;
}

von Klaus W. (mfgkw)


Lesenswert?

Das liegt daran, daß in C in jedem Block erst alle Deklarationen
und Definitonen stehen müssen, dann die ausführbaren Anweisungen.

(Ansonsten wäre es nett, wenn du mal halbwegs lesbare Sätze
schreiben würdest und eine vernünftige Formatierung benutzen
könntest. Wer so schlampig programmiert wie du Texte schreibst,
kommt eh nicht weit und wird bis zur Rente seine Hausaufgaben
von anderen lösen lassen.
Abgesehen davon, daß es lästig ist, den ganzen Quelltext nach
Fehlern durchsuchen zu müssen, weil du zu faul bist eine
vernünftige Beschreibung zu liefern.)

von Klaus W. (mfgkw)


Lesenswert?

PS. Es gibt auch Bücher über C, in denen die Grundlagen stehen.
Macht mehr Arbeit, als hier alles vorkauen zu lassen. Hilft aber...

von Bernd (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Wer so schlampig programmiert wie du Texte schreibst,
> kommt eh nicht weit

muss ich auch nicht habs nur ein semester studiere ja kein AI.

Klaus Wachtler schrieb:
> Ansonsten wäre es nett, wenn du mal halbwegs lesbare Sätze
> schreiben würdest und eine vernünftige Formatierung benutzen


mein dozent hat sich nie beschwert.

Klaus Wachtler schrieb:
> Abgesehen davon, daß es lästig ist, den ganzen Quelltext nach
> Fehlern durchsuchen zu müssen, weil du zu faul bist eine
> vernünftige Beschreibung zu liefern.

joa wenn du nix zur hilfe beitragen kannst spam bitte irgendwo anders 
rumm.

Klaus Wachtler schrieb:
> PS. Es gibt auch Bücher über C, in denen die Grundlagen stehen.
> Macht mehr Arbeit, als hier alles vorkauen zu lassen. Hilft aber...

ich hab sogar 2 beschränke mich aber auf "c von a bis z" nur wenn man 
von morgends 8 uhr bis abends 17 uhr vorlesung bzw labor hat ist es 
schwierig bei allem am ball zu bleiben und da informatik kein 
schwerpunktsfach ist läuft dies so nebenbei.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.