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;
}
}
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
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;
>> }
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.
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).
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
intmain(void)
2
{
3
intc=0;
4
5
while(c!='a'){
6
print_menu();
7
c=my_getch();
8
}
9
return0;
10
}
wobei print_menu() dein Menu ausgibt und my_getchar die Eingabe
auswertung macht.
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.
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.
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;
}
charmy_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.
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?
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;
}
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.)
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.