Forum: PC-Programmierung getch() Funktion


von Tobias H. (dexiv)


Lesenswert?

Ich hab ein Programm geschrieben das thoeretisch Rechnen kann indem man 
nur Zahlen und Zeichen eingibt ohne Bestätigen aber das funktioniert 
nicht ich dank mal es liegt an getch().Hab schon alles ausprobiert.

1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <conio.h>
4
5
int main(int argc, char *argv[])
6
{
7
    char Eingabe;
8
    int sv = 0;
9
    long b = 1;
10
    long speichern [998];
11
    char zahlen [998];
12
    long long ergebnis = 0;
13
    short i = 0;
14
    int zaehle = 0;
15
16
17
    for (;i != 999;)
18
    {
19
      zahlen[i] = 0;
20
      speichern[i] = 0; /*alle arrives auf null*/
21
      i++;
22
    }
23
    i = 0;
24
25
    for (;;) /*Eingabe*/
26
    {
27
28
       i = getch();
29
30
            if (i != 61)
31
            {
32
                zahlen[zaehle] = i;
33
                zaehle++;
34
                i=0;
35
            }
36
37
38
39
        else
40
        {
41
            break;
42
        }
43
    }
44
    i=0;
45
46
    for (;i != ++zaehle;) /*Sortierschleife*/
47
    {
48
        if ((zahlen[i] <= 9)&(zahlen[i] >= 0))
49
        {
50
            speichern[sv] = zahlen[i] * b;
51
52
            if (b == 1)
53
            {
54
                b += 9;
55
            }
56
            else
57
            {
58
                b *= 10;
59
            }
60
        i++;
61
        }
62
        else if (zahlen[i] == 43) /*Plus*/
63
        {
64
            sv++;
65
            speichern[sv] = 43;
66
            sv++;
67
            i++;
68
            b = 0;
69
        }
70
71
        else if (zahlen[i] == 45)/*Minus*/
72
        {
73
            sv++;
74
            speichern[sv] =45;
75
            sv++;
76
            i++;
77
            b = 0;
78
        }
79
80
        else if (zahlen[i] == 42) /*Mal*/
81
        {
82
            sv++;
83
            speichern[sv] =42;
84
            sv++;
85
            i++;
86
            b = 0;
87
        }
88
89
        else if (zahlen[i] == 47) /*Geteilt*/
90
        {
91
            sv++;
92
            speichern[sv] =47;
93
            sv++;
94
            i++;
95
            b = 0;
96
        }
97
98
        else /*Credits xD*/
99
        {
100
            printf ("Was habe sie gemacht !!! \nKeine Buchstaben eingeben das hier ist ein Rechner !!!\n\n\nManager: Tobias\n\nProgammierer: Tobias\n\nDesign: Gibts ja wohl noch keins oder ?!? O_o");
101
102
            return EXIT_FAILURE;
103
        }
104
105
    }
106
107
    i = 1;
108
109
    ergebnis = speichern[0];
110
111
112
    for (;i != ++sv;) /*Ausrechnen*/
113
    {
114
       if (speichern[i] == 43)
115
       {
116
           i++;
117
           ergebnis += speichern[i];
118
           i++;
119
       }
120
121
       else if (speichern[i] == 45)
122
       {
123
           i++;
124
           ergebnis -= speichern[i];
125
           i++;
126
       }
127
128
       else if (speichern[i] == 42)
129
       {
130
           i++;
131
           ergebnis *= speichern[i];
132
           i++;
133
       }
134
135
       else if (speichern[i] == 47)
136
       {
137
           i++;
138
           ergebnis /= speichern[i];
139
           i++;
140
       }
141
142
      else /*Credits xD*/
143
        {
144
            printf ("Was habe sie gemacht !!! \n Keine zwei Rechenzeichen hintereinander eingeben !!!\n\n\nManager: Tobias \n\nProgammierer: Tobias \n\nDesign: Gibts ja wohl noch keins oder ?!? O_o");
145
146
            return EXIT_FAILURE;
147
        }
148
    }
149
150
    printf (" = %d ",ergebnis);
151
    return EXIT_FAILURE;
152
}

Wer hilft kriegt Ehrenplatz in Credits ;)

PS: Mein Compiler ist Code::Blocks und ich hab Windows 7

von nichtsKönner (Gast)


Lesenswert?

was passiert denn?
was funktioniert/funktioniert nicht?

von 900ss (900ss)


Lesenswert?

Tobias H. schrieb:
> aber das funktioniert
> nicht

Dann geh auf Optionen und stell von "funktioniert nicht"
auf "funktioniert" ;-)

Im Ernst, das ist keine Fehlerbeschreibung. Was funktioniert denn nicht?

Was ich so beim überfliegen gefunden habe:
Prüfe nochmal nach, wie lang dein Array wird mit
> char zahlen [998];

Und ob du hier die richtige mit deiner Indexvariablen immer das Array 
"triffst" oder evtl. mal ausserhalb landest (was evtl. zu einem Absturz 
führen kann, nicht muss.).
> short i = 0;
>     for (;i != 999;)

Hier benutzt du ein '&' was ein "bitwise and" ist. Du möchtest aber ein 
"logic and" haben.
>if ((zahlen[i] <= 9)&(zahlen[i] >= 0))

Um eine Prüfung auf ein großes A zu machen kannst du statt 61 auch 'A' 
benutzen (mit dem ' davor und dahinter). Das macht das Programm 
lesbarer. Ein Fehler ist es mit 61 aber nicht.
>if (i != 61)

Genauso hier kannst du '+' benutzen.
>else if (zahlen[i] == 43) /*Plus*/

von Karl H. (kbuchegg)


Lesenswert?

Was auch immer du da geschrieben hast:

SChmeiss es weg und fang nochmal an.
Aber diesmal:
Arbeite in Schritten. Teile dir die komplette Aufgabe in Teilaufgaben 
auf. Implementiere diese Teilaufgabe und dann teste diese ordentlich. 
Erst dann, wenn eine Teilaufgabe funktioniert, gehst du die nächste 
Teilaufgabe an.
Am besten ist es, wenn du für jede Teilaufgabe eine eigene Funktion 
machst, die nur diese eine Teilaufgabe löst. Wenn eine Teilaufgabe 
kompliziert ist, kann man auch diese wieder ein einfachere Einzelteile 
zerlegen.

Unmengen von Code zu schreiben, der schon von Anfang an nicht 
funktioniert bringt nichts. Du stehst dann da mit ... Unmengen nicht 
funktionierendem Code und hast keine Ahnung, wo du mit der Fehlersuche 
anfangen sollst.


Und ja. Ich meine das wirklich ernst. Schmeiss das weg und fang nochmal 
an. Was du da hast ist, freundlich ausgedrückt, ein grosser Haufen Müll. 
Im Moment sieht das aus, als ob du dich da kräftig übernommen hast.

von Klaus W. (mfgkw)


Lesenswert?

Mal wieder ein Thread ohne sinnvolle Antworten!

@Tobias:
Ja, das liegt an getch().
Das ist ein altbekanntes Problem. Am besten an Microsoft melden.

von Tobias H. (dexiv)


Lesenswert?

Ok aber wenns an getch liegt kann mir dann jemand sagen obs eine 
"Ausweichmöglichkeit" gibt ??


PS:Danke für die schnellen Antworten

von Hc Z. (mizch)


Lesenswert?

Warum meinst Du, dass es an getch() liegen soll?  Glaubst Du, dass 
Microsoft und/oder Dein Compilerhersteller einen so schlechten Job 
gemacht haben, das es seine Spezifikationen nicht einhält?  Und dass das 
außer Dir noch niemandem aufgefallen ist?

von Karl H. (kbuchegg)


Lesenswert?

Tobias H. schrieb:
> Ok aber wenns an getch liegt kann mir dann jemand sagen obs eine
> "Ausweichmöglichkeit" gibt ??

Es liegt nicht am getch()
Klaus wollte dich auf den Arm nehmen.

Das dein Programm generell nicht funktionert, liegt daran, dass es so 
geschrieben ist, dass es noch nicht einmal ansatzweise funktionieren 
kann.
Du bist weit, weit weg von einer auch nur ansatzweisen rudimentären 
Lösung deiner Aufgabenstellung.

Dein Programm ist das C-Äquivalent zu HaPe Kerkeling, wenn er Russisch 
'spricht'. Es sieht zwar so aus wie, ist aber in Wirklichkeit kompletter 
Kauderwelsch.


Klingt vielleicht hart, ist aber die ungeschminkte Wahrheit.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.