Seite 1 von 1

[C] Add-Funktion für 'n' Zahlen

Verfasst: Di Jan 13, 2015 6:29 pm
von Laura Palmer
Hallo, beim Lernen des Zeiger-Kapitels wollte ich eine Funktion basteln, die mehr als eine Zahl addieren kann.
Mit rumgefrickel lernt man recht fix, finde ich. Hier stieß ich trotz des Wikis (ich verstand nur Bahnhof - mal wieder :D) an meine Grenzen..

Mir ist folgendes Problem untergekommen:

1. Die Do-While-Schleife soll aufhören sobald <enter> (und nur <enter>) zur Eingabe gedrückt wird.
2. Die Schleife soll bei einer falschen Eingabe (Buchstaben oder Zahlen außerhalb des Wertebereichs) die Fehlermeldung ausgeben.

Code: Alles auswählen

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

int add( int Summand_Eins, int Summand_Zwei, int *memory_address )
{
return *memory_address = Summand_Eins + Summand_Zwei;
}

int main()
{
  //system("cls"); /* Spezifisch!! cls= Windows, Linux = clear beim debuggen auskommentiert*/
  printf ("\n########################################################\n");
  printf ("dies ist eine Additions-Funktion:");
  printf ("\n########################################################\n\n");
  
  int Summe=0, Summand=0, i=0, j=0, m=0, Summanden_Liste[j];
  char Eingabe[] = {"0,0,0,0,0,0,0,0,0,0"};
  
  do
  {
    printf ("Summand %.2d: ", i+1);
    scanf ("%s", &Eingabe);
    Summand = atoi(Eingabe);   
      if (Summand == 0) /* Wie prüfe ich hier, ob eine Zahl oder ein Buchstabe vorliegt? */
      {
        printf ("bitte eine g%cltige Zahl eingeben\n", 129);
      }
      else
      {  
        add( Summand, Summe, &Summe );
        i++;
        Summanden_Liste[j] = Summand;
        j++;
      }      
  }
  while (Summand != 0); /* Hier soll geprüft werden, ob ein reines <enter> auftrat, dass zum beenden des Programms führen soll*/
    
  printf ("\nDie Gesamtsumme aus den Zahlen"); 
  for (int k = 0; k < j-1; k = k+1)
    {
      if (j>=2) {printf(" ");}
      printf( "%d", Summanden_Liste[k]);
      if (k<j-2)
        {
          printf (",");
        }
      else
        {
          if (k=j-1)
            {
              printf (" und %d", Summanden_Liste[k]);
            }
        }
    }
  printf(" ist: %d\n", Summe);
    
  return EXIT_SUCCESS; 
} 
Könnt ihr mir weiterhelfen?
Habt ihr weitere Tipps zur Verbesserung/Optimierung des Programms?

Re: [C] Add-Funktion für 'n' Zahlen

Verfasst: Mi Jan 14, 2015 2:57 pm
von Xin
Laura Palmer hat geschrieben:Mit rumgefrickel lernt man recht fix, finde ich.
Noch mehr lernt man, wenn man überlegt Vermutungen anstellt und sie dann verifiziert oder falsifiziert.
Laura Palmer hat geschrieben:Hier stieß ich trotz des Wikis (ich verstand nur Bahnhof - mal wieder :D) an meine Grenzen..

Mir ist folgendes Problem untergekommen:

1. Die Do-While-Schleife soll aufhören sobald <enter> (und nur <enter>) zur Eingabe gedrückt wird.
Ich kann mich nicht erinnern, dass ich jemals was zu scanf geschrieben hätte. Außer, dass man es nicht verwenden sollte.

Bei der Initialisierung von 'Eingabe' drängt sich mir der Verdacht auf, dass Du die Kapitel zum Thema Datentyp und Werte nochmal durchgehen solltest.
Laura Palmer hat geschrieben:2. Die Schleife soll bei einer falschen Eingabe (Buchstaben oder Zahlen außerhalb des Wertebereichs) die Fehlermeldung ausgeben.

Code: Alles auswählen

  do
  {
    printf ("Summand %.2d: ", i+1);
    scanf ("%s", &Eingabe);
    Summand = atoi(Eingabe);   
      if (Summand == 0) /* Wie prüfe ich hier, ob eine Zahl oder ein Buchstabe vorliegt? */
Gar nicht, hier liegt nur noch eine Zahl vor und die kann nunmal definitiv keine Buchstabe sein. Ich sehe meinen Verdacht bestätigt. ^^

Du musst den String 'Eingabe' prüfen, ob er eine gültige Repräsentation einer Zahl ist, weil eine Zahl ist immer eine gültige Zahl.
Laura Palmer hat geschrieben:

Code: Alles auswählen

  while (Summand != 0); /* Hier soll geprüft werden, ob ein reines <enter> auftrat, dass zum beenden des Programms führen soll*/
[/quote]
Auch hier musst Du den String 'Eingabe' prüfen, ob er dem entspricht, was Du erhältst, wenn Du nur Enter drückst.

[quote="Laura Palmer"]Habt ihr weitere Tipps zur Verbesserung/Optimierung des Programms?[/quote]
Schau Dir die Verwendung von Funktionen an.

Re: [C] Add-Funktion für 'n' Zahlen

Verfasst: Mi Jan 14, 2015 5:48 pm
von Laura Palmer
Ich verstehe nur Bahnhof. :cry:
"Eingabe" ist ja ein Charstring, wie prüfe ich den denn darauf, ob er Buchstaben oder ein <enter> enthält? Muss ich die Ascii Daten jedes einzelnen Arrayelementes auslesen und mit denen von Zahlen vergleichen? Wie tue ich das? Fängt jede Eingabe wieder bei Eingabe[0] an?

Das scanf hat sich wohl dazwischengemogelt *hust*, den Part habe ich nun mal durch folgendes ersetzt:

Code: Alles auswählen

  do
  {
    printf ("Summand %.2d: ", i+1);
    fgets (Eingabe, sizeof(Eingabe), stdin);
    sscanf(Eingabe, "%d", &Summand);   
      if ... 
besser?

Re: [C] Add-Funktion für 'n' Zahlen

Verfasst: Mi Jan 14, 2015 6:20 pm
von Xin
Laura Palmer hat geschrieben:Ich verstehe nur Bahnhof. :cry:
Deine Fragen musst Du konkreter beschreiben.
Laura Palmer hat geschrieben:"Eingabe" ist ja ein Charstring, wie prüfe ich den denn darauf, ob er Buchstaben oder ein <enter> enthält? Muss ich die Ascii Daten jedes einzelnen Arrayelementes auslesen und mit denen von Zahlen vergleichen?
Genau.
Laura Palmer hat geschrieben:Wie tue ich das?
In einer Schleife?
Für Dich ist ja nur die Frage interessant, ob die Zahl gültig aufgebaut ist - heißt, wenn Du etwas findest, was keine Ziffer ist, ist sie nicht gültig (eventuell - am Anfang)
Laura Palmer hat geschrieben:Fängt jede Eingabe wieder bei Eingabe[0] an?
Die Variable Eingabe verschiebt sich ja nicht.
Laura Palmer hat geschrieben:Das scanf hat sich wohl dazwischengemogelt *hust*, den Part habe ich nun mal durch folgendes ersetzt:

Code: Alles auswählen

  do
  {
    printf ("Summand %.2d: ", i+1);
    fgets (Eingabe, sizeof(Eingabe), stdin);
    sscanf(Eingabe, "%d", &Summand);   
      if ... 
besser?
Besser ja. Ein atoi wäre nach der Prüfung des Strings, dass es definitiv eine Zahl ist, eindeutiger.