erster Rechner / Programmierfragen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
nkler
Beiträge: 2
Registriert: Fr Aug 08, 2008 10:53 am

erster Rechner / Programmierfragen

Beitrag von nkler » Fr Aug 08, 2008 11:17 am

Hallo erstmal,
ich habe mich nach einigem Hin und Her dazu bewegt doch mal in die C Programmierung einzusteigen, um mich schonmal etwas fürs das Studium mit Programmiersprachen auseinander zu setzen.
Vorher habe ich schon einiges mit PHP zu tuen gehabt, desshalb ist mir der Einstieg doch leichter gefallen aus ich gedacht hätte.

So hab ich dann mal einfach los getippelt und habe einen kleinen Rechner geschrieben, welcher doch schon recht anständig läuft.

Code: Alles auswählen

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

int main()
{
    float
        zahl1,
        zahl2;                  //Die beiden Zahlen die zum Start der berechnung stehen.

    float zwischenergebnis = 0; //Das Zwischenergebnis

    int
        rechenprogramm,         //1=Addieren 2=Subtrahieren 3=Multiplizieren 4=Dividieren
        programmstatus = 1;     //Soll das Programm fortgeführt werden? 1=Neustart 2=Berechnungsart gewählt 4=Beenden

    printf("Basisrechner V1\n");

    while(programmstatus != 4) // Schleife für die Programmausführung
    {
        while(programmstatus == 1) // Berechnungsart auswählen
        {
            printf("Bitte Berechnungsart angeben.\n\n");
            printf("\t1 = Addieren\n\t2 = Subtrahieren\n\t3 = Multiplizieren\n\t4 = Dividieren\n\n");

            scanf("%1d", &rechenprogramm);
            fflush(stdin);

            if(rechenprogramm<1 || rechenprogramm>4)
            {
                printf("Berechnungsart muss zwischen 1 und 4 liegen.\n\n");
            }
            else
            {
                programmstatus = 2;
            }
        }

        while(programmstatus == 2)  //Schleife für Zahlen eingabe und durchführen der Berechung.
        {
            if(zwischenergebnis == 0)   // Wenn kein Zwischenergebnis angegeben ist zwei Zahlen anfordern
            {
                printf("\nGeben sie zwei Zahlen zur Berechnung an.\n\n");
                scanf("%f %f", &zahl1, &zahl2);
                fflush(stdin);
            }
            else    // Wenn Zwischenergebnis vorhanden ist nur eine Zahl zur Weiterberechnung anfordern
            {
                printf("\nGeben sie eine weiter Zahlen zur Berechnung mit %f an.\n\n", zwischenergebnis);
                scanf("%f", &zahl2);
                fflush(stdin);

                zahl1 = zwischenergebnis;
            }

            switch(rechenprogramm) // Rechung durchführen
            {
                case 1:
                    zwischenergebnis = zahl1 + zahl2;
                    break;
                case 2:
                    zwischenergebnis = zahl1 - zahl2;
                    break;
                case 3:
                    zwischenergebnis = zahl1 * zahl2;
                    break;
                case 4:
                    zwischenergebnis = zahl1 / zahl2;
                    break;
            }

            printf("\nDas Ergebnis der Berechnung lautet %f.\n\n", zwischenergebnis);

            printf("Weitere Berechnungen?\n\n");
            printf("\t1 = Mit dem Ergebnis weiterrechnen (Andere Berechnungsart)\n\t2 = Mit dem Ergebnis weiterrechnen (Selbe Berechungsart)\n\t3 = Neue Berechung\n\t4 = Programm beenden\n\n");

            scanf("%d", &programmstatus);
            fflush(stdin);

            if(programmstatus == 3) // Zwischenspeicher auf 0 setzten und Berechungsart auswählen lassen.
            {
                zwischenergebnis = 0;
                programmstatus = 1;
            }
        }
    }
}

/* Geschrieben von <edit> */
Jedoch hätte ich einige Frage bezüglich der Programmierung.

Ganz vorne weg wie man Sätze in einer Variable speichern kann. Weil von PHP her hab ich mir angewöhnt einfach

Code: Alles auswählen

$lang['erklaerung']='Hier ist ein Text';
schreiben zu können was mir bei C nicht so wirklich gelingt. Das wäre ganz praktisch um einzelne Worte wir addition oder ähnliches einzufügen.

Ich habe schon dieses thema hier gefunden http://proggen.org/viewtopic.php?f=21&t=105 wo auf fflush(stdin); hingewieses wird das man es besser austauschen kann. FAQ Frage 2 Jedoch steige ich durch diese Funktion noch nicht ganz durch

Code: Alles auswählen

void clear_stdin()
{
    int ch; /* Wichtig! Muss int, und nicht char sein. */   
    while(c = getchar()) != '\n' && c != EOF)
        /* Nichts tun */;
}
und außerdem scheint mir hinter dem getchar() ein ) zu viel zu sein. Aber ich verstehe sie nicht desswegen weiß ich auch nicht wo der Fehler ist.

Dazu würde mich interessieren was ihr zum Thema übersichtlichkein des Quellcodes sagt und ob ihr einen tipp habt wir ich die Nachkommastellen des Ergebnissen kürzen kann.

gruß
<edit>

Edit By Xin: Namen auf Wunsch des Autors entfernt.

aqe89
Beiträge: 70
Registriert: Sa Jul 05, 2008 9:36 am
Wohnort: Schweiz

Re: erster Rechner / Programmierfragen

Beitrag von aqe89 » Fr Aug 08, 2008 11:38 am

Ganz vorne weg wie man Sätze in einer Variable speichern kann. Weil von PHP her hab ich mir angewöhnt einfach
Also das macht man in einem char Array oder auch String genannt.

Ersatz für fflush:
do {scanf("%c",&c);} while ( getchar() != '\n' );

oder nimm gleich eine andere Funktion zum einlesen.
noch einen denkanstoss. wo kannst du es optimieren?
char zeichen;
In eine char Variable kannst du ein Zeichen einlesen.
* / + -


while((c = getchar()) != '\n' && c != EOF)

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: erster Rechner / Programmierfragen

Beitrag von fat-lobyte » Fr Aug 08, 2008 1:26 pm

nkler hat geschrieben:Jedoch hätte ich einige Frage bezüglich der Programmierung.

Ganz vorne weg wie man Sätze in einer Variable speichern kann. Weil von PHP her hab ich mir angewöhnt einfach

Code: Alles auswählen

$lang['erklaerung']='Hier ist ein Text';
schreiben zu können was mir bei C nicht so wirklich gelingt. Das wäre ganz praktisch um einzelne Worte wir addition oder ähnliches einzufügen.
Das nennt man "Character Arrays" oder auch Strings genannt. In C ist die einfache "Addition" von 2 strings nicht möglich. Man muss erst mal platz für einen neuen STring schaffen, den ersten reinkopieren und dann den zweiten reinkopieren. Addition oder auch einfügen gibt es nur in C++.
nkler hat geschrieben:Ich habe schon dieses thema hier gefunden http://proggen.org/viewtopic.php?f=21&t=105 wo auf fflush(stdin); hingewieses wird das man es besser austauschen kann. FAQ Frage 2 Jedoch steige ich durch diese Funktion noch nicht ganz durch

Code: Alles auswählen

void clear_stdin()
{
    int ch; /* Wichtig! Muss int, und nicht char sein. */   
    while(c = getchar()) != '\n' && c != EOF)
        /* Nichts tun */;
}
und außerdem scheint mir hinter dem getchar() ein ) zu viel zu sein. Aber ich verstehe sie nicht desswegen weiß ich auch nicht wo der Fehler ist.
Fehler? Was fürn Fehler? Bis jetzt war noch von keinem Fehler die rede.
Ist schon klar, dass du die Funktion nicht verstehst, sie ist ja auch nicht so einfach. Deswegen steht auch in der FAQ, dass man scanf eigentlich vermeiden sollte.
Diese funktion holt so lange Zeichen von der Standardeingabe, bis ein newline gefunden wurde oder "End-Of-File" erreich wurde. Dann ist der eingabepuffer leer.
nkler hat geschrieben:Dazu würde mich interessieren was ihr zum Thema übersichtlichkein des Quellcodes sagt
Ist ganz gut, nur in C schreibt man die variable die man deklarieren will in die gleiche Zeile wie den Typen. (Natürlich nur wennns nicht solche Giga- Deklarationen sind, wie in C++).
nkler hat geschrieben:und ob ihr einen tipp habt wir ich die Nachkommastellen des Ergebnissen kürzen kann.
Sieh dir mal die Funktion printf() genauer in einer Referenz an.
Haters gonna hate, potatoes gonna potate.

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

Re: erster Rechner / Programmierfragen

Beitrag von nufan » Fr Aug 08, 2008 1:36 pm

Ich hab so ein Programm wie ich angefangen hab auch versucht. Es funktionierte auch ganz gut. DIe Rechenoperatoren las ich als char ein. Jedoch funktionierte das "/"-Zeichen nicht, weder am Ziffernblock, noch die andere Taste.

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

Re: erster Rechner / Programmierfragen

Beitrag von Xin » Fr Aug 08, 2008 7:35 pm

nkler hat geschrieben:ich habe mich nach einigem Hin und Her dazu bewegt doch mal in die C Programmierung einzusteigen, um mich schonmal etwas fürs das Studium mit Programmiersprachen auseinander zu setzen.
Vorher habe ich schon einiges mit PHP zu tuen gehabt, desshalb ist mir der Einstieg doch leichter gefallen aus ich gedacht hätte.
Moin, nkler!

Zum einen mal Willkommen in Forum. Wie hast Du uns gefunden? Was Du studierst und wer Du bist, kannst Du ja mal in 'Uservorstellung' offenbaren.
nkler hat geschrieben:Jedoch hätte ich einige Frage bezüglich der Programmierung.

Ganz vorne weg wie man Sätze in einer Variable speichern kann. Weil von PHP her hab ich mir angewöhnt einfach

Code: Alles auswählen

$lang['erklaerung']='Hier ist ein Text';
schreiben zu können was mir bei C nicht so wirklich gelingt. Das wäre ganz praktisch um einzelne Worte wir addition oder ähnliches einzufügen.
Das ist auch in C möglich, allerdings ist $lang['bla] in PHP schon ein abstraktes Konstrukt, das ist nichts, was ein Computer so erledigen kann. Hier muss aus 'bla' ein Hashwert gebildet werden und anschließend durch Hash-Tabellen der entsprechende Wert gesucht werden, bis man an dem Punkt angekommen ist, der für 'bla' steht. Das ganze ist ziemlich schnell, aber wie man sieht auch nicht ganz trivial. Hashtables sind gelegentlich sehr nützlich, aber häufig auch nicht erforderlich und dies ist so ein Fall.

Code: Alles auswählen

#define description 0
#define bla 1

char const * language[2];

int main( void )
{
  language[ descripton ] = "Beschreibung";
  language[ bla ] = "Gelaber";

  printf( "%s: %s\n", language[ description ], language[ bla ] );
}
nkler hat geschrieben:Ich habe schon dieses thema hier gefunden http://proggen.org/viewtopic.php?f=21&t=105 wo auf fflush(stdin); hingewieses wird das man es besser austauschen kann. FAQ Frage 2 Jedoch steige ich durch diese Funktion noch nicht ganz durch

Code: Alles auswählen

void clear_stdin()
{
    int ch; /* Wichtig! Muss int, und nicht char sein. */   
    while(c = getchar()) != '\n' && c != EOF)
        /* Nichts tun */;
}
und außerdem scheint mir hinter dem getchar() ein ) zu viel zu sein. Aber ich verstehe sie nicht desswegen weiß ich auch nicht wo der Fehler ist.
Ich würde sagen, dass Du damit richtig liegst, dass hier ein Fehler ist, die Anzahl der Klammern stimmt nämlich nicht. Allerdings ist nicht eine zuviel, sondern eine zuwenig: c wird der Wert zugewiesen, der von getchar() geliefert wird und anschließend wird das Ergebnis der Zuweisung (der Wert von getchar() ) mit '\n’ vergliechen. Würde man die Klammern weglassen, würde das Ergebnis von getchar() mit '\n' verglichen und das Ergebnis des Vergleichs an c zugewiesen.

Danke für die Rückmeldung, ich habe die Zeile korrigiert. :-)
nkler hat geschrieben:Dazu würde mich interessieren was ihr zum Thema übersichtlichkein des Quellcodes sagt und ob ihr einen tipp habt wir ich die Nachkommastellen des Ergebnissen kürzen kann.
Mir gefällt die Definition der Variablen nicht, das ist eine Frage der Formatierung, also kein Designproblem.
Was das Design angeht, entferne die Variable 'programmstatus'. Hierfür brauchst Du die Befehle 'break' und 'continue'. Anschließend kannst Du das Programm ggfs. etwas leserlicher machen, indem Du Teile in Funktionen auslagerst.

Ansonsten sieht es doch ganz gut aus - nur weiter so! :-)
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.

nkler
Beiträge: 2
Registriert: Fr Aug 08, 2008 10:53 am

Re: erster Rechner / Programmierfragen

Beitrag von nkler » Mo Aug 11, 2008 1:26 pm

So ich muss mich hier nochmal zurück melden, ich hatte die letzten tage doch sehr voll gepackt und konnte mich daher nicht melden,
vielen dank schonmal für die Antworten, ich werd mich da gleich mal durch fuchsen.

Antworten