Hi to all-

da ich mich gerade im ersten Semester meines
Wirtschaftsinformatik-Studiums befinde bin ich zur zeit recht flei�ig am
programmieren.
Ich habe eigentlich nur ein gro�es Problem - mein prof ist ein 100%
Windows-Anh�nger.
Nun, jetzt hat er uns den Quelltext eines Programms gegeben (zur
Berechnung von br�chen), dass wir vervollst�ndigensollten.
Nun, unter Windows l�sst sich sein Quelltext ohne Probleme compillieren
und das Programm ausf�hren.
Die Compillierung verl�uft unter Linux mit gcc auch ohne Probs.
Allerdings funktioniert das Program nicht einwandfrei (eigentlich gar
nicht).  Egal was ich im Programm eingebe bekomme ich immer die gleiche
fehlermeldung (die im Programm eingebaut ist, falls man versucht durch 0
zu teilen).
Vielleicht hat ja jemand von euch mal Zeit + Lust, sich den Quelltext
anzuschauen.

Thanks greg


/*Unvollstaendige Bruchrechnung mit Prozeduren und Funktionen und mit Parameter*/

#include <stdio.h>
#include <math.h>


#define SUCCESS         0
#define ERRDIV          1
#define ERROPERATOR     2
#define FALSE 0
#define TRUE  1

void erklaere_programm(void)
{
  printf("Programm zur Berechnung von Bruechen\n Geben Sie RETURN ein !");
}  /*erklaere_programm*/



short melde_fehler(short fehlernummer)
{
  switch (fehlernummer) {

  case ERRDIV:
    printf("Fehler Nr. 1 : Division durch Null !\n");
    break;

  case ERROPERATOR:
    printf("Fehler Nr. 2 : Unzulaessiger Operator !\n");
    break;

  default:
    printf("Fehler Nr. 100 : Unbekannte Fehlernummer !\n");
    break;
  }

  return SUCCESS;
}



short lese_aufgabe_ein(short *zaehler1, short *nenner1, short *zaehler2,
  short *nenner2, char *operatorZeichen)
{
  short eingabe_erfolgreich;

  do {
    printf("Zaehler1 : ");
    scanf("%i", zaehler1);
    printf("Nenner1 : ");
    scanf("%i", nenner1);

    getchar(); /* Eingabepuffer leeren */

    printf("Operator : ");
    do
    {
     scanf("%c", operatorZeichen);
    }while ((*operatorZeichen != '+') &&
                        (*operatorZeichen != '-') &&
                        (*operatorZeichen != '*') &&
                        (*operatorZeichen != ':'));

    printf("Zaehler2 : ");
    scanf("%i", zaehler2);
    printf("Nenner2 : ");
    scanf("%i", nenner2);

    if (*nenner1 == 0 || *nenner2 == 0) {
      melde_fehler(ERRDIV);
      eingabe_erfolgreich = FALSE;
    } else
      eingabe_erfolgreich = TRUE;
  } while (!eingabe_erfolgreich);

  return SUCCESS;
}  /*lese_aufgabe_ein*/


short ermittle_ggt(short z, short n, short *ggt)
{
  short x, y;

  x = abs(z);
  y = abs(n);

  if (x == 0 && y == 0) {
    *ggt = 1;
    melde_fehler(ERRDIV);
    return SUCCESS;
  }
  while (x != 0 && y != 0) {
    if (x > y) {
      x %= y;
    } else {
      y %= x;
    }
  }

  if (x == 0)
    *ggt = y;
  else
    *ggt = x;
  return SUCCESS;
}  /*ermittle_ggt*/



short kuerze_bruch(short *zaehler, short *nenner)
{
  short ggt;

  ermittle_ggt(*zaehler, *nenner, &ggt);
  *zaehler /= ggt;
  *nenner /= ggt;

  if (*nenner < 0) {
    *zaehler = -*zaehler;
    *nenner = -*nenner;
  }
  return SUCCESS;
}  /*kuerze_bruch*/



short addiere_brueche(short z1, short n1, short z2, short n2,
                            short *erg_z, short *erg_n)
{
  *erg_z = z1 * n2 + z2 * n1;
  *erg_n = n1 * n2;

  return SUCCESS;
}  /*addiere_brueche*/


short subtrahiere_brueche(short z1, short n1, short z2, short n2,
  short *erg_z, short *erg_n)
{
  *erg_z = z1 * n2 - z2 * n1;
  *erg_n = n1 * n2;
        return 0;
}  /*subtrahiere_brueche*/


short multipliziere_brueche(short z1, short n1, short z2, short n2,
                            short *erg_z, short *erg_n)
{
  *erg_z = z1 * z2;
  *erg_n = n1 * n2;

  return SUCCESS;
}  /*multipliziere_brueche*/


short dividiere_brueche(short z1, short n1, short z2, short n2,
                            short *erg_z, short *erg_n)
{
  *erg_z = z1 * n1;
  *erg_n = z2 * n2;

  return SUCCESS;
}  /*addiere_brueche*/


short loese_aufgabe(short zaehler1, short nenner1, short zaehler2,
  short nenner2, char operatorZeichen, short *ergebnis_zaehler,
  short *ergebnis_nenner)
{
  short fehlernr;

  kuerze_bruch(&zaehler1, &nenner1);
  kuerze_bruch(&zaehler2, &nenner2);

  switch (operatorZeichen) {

  case '+':
    fehlernr = addiere_brueche(zaehler1, nenner1, zaehler2,
        nenner2, ergebnis_zaehler, ergebnis_nenner);
    break;

  case '-':
    fehlernr = subtrahiere_brueche(zaehler1, nenner1,
        zaehler2, nenner2, ergebnis_zaehler, ergebnis_nenner);
    break;

  case '*':
    fehlernr = multipliziere_brueche(zaehler1, nenner1,
        zaehler2, nenner2, ergebnis_zaehler, ergebnis_nenner);
    break;

  case ':':
    fehlernr = dividiere_brueche(zaehler1, nenner1,
        zaehler2, nenner2, ergebnis_zaehler, ergebnis_nenner);
    break;


  default:
    fehlernr = ERROPERATOR;
    break;
  }

  if (fehlernr == SUCCESS)
    kuerze_bruch(ergebnis_zaehler, ergebnis_nenner);

  return fehlernr;
}  /*loese_aufgabe*/

short gebe_ergebnis_aus(short ergebnis_zaehler, short ergebnis_nenner)
{
  printf("\nErgebnis :\n\n");
  printf("Zaehler = %d\n", ergebnis_zaehler);
  printf("Nenner = %d\n", ergebnis_nenner);

  return SUCCESS;
}  /*gebe_ergebnis_aus*/



void bearbeite_bruchaufgabe(void)
{
  short fehlernummer = 0;

  short ergebnis_zaehler, ergebnis_nenner,
        zaehler1, nenner1, zaehler2, nenner2;
  char operatorZeichen;

  lese_aufgabe_ein(&zaehler1, &nenner1, &zaehler2, &nenner2,
                   &operatorZeichen);
  fehlernummer = loese_aufgabe(zaehler1, nenner1, zaehler2, nenner2,
      operatorZeichen, &ergebnis_zaehler, &ergebnis_nenner);

  if (fehlernummer != SUCCESS)
    melde_fehler(fehlernummer);
  else
    gebe_ergebnis_aus(ergebnis_zaehler, ergebnis_nenner);
}  /*bearbeite_bruchaufgabe*/




short programm_beenden(void)
{
  char antwort;

  getchar(); /* Eingabepuffer leeren */

  do {
    printf("\nMoechten Sie eine Aufgabe berechnen lassen ? (j/n) ");
    scanf("%c", &antwort);
  } while (antwort != 'j' && antwort != 'n');

  return (antwort == 'n');
}  /*programm_beenden*/



int main(void)
{  /*Hauptprogramm*/
  erklaere_programm();

        do
    bearbeite_bruchaufgabe();
        while (!programm_beenden());
  return SUCCESS;
}  /*Hauptprogramm*/





Antwort per Email an