Programmieren
 
 
 
 
 
C-Grundkurs

 
 
 
 
.. Beispiel: Hole eine Fließkommazahl
 
 

 
 
 
 


Aufgabe:
Schreiben Sie eine Funktion getFPnum(), welche die Eingabe eines Strings von der Tastatur aus ermöglicht. Der String soll nullterminiert werden, auf eine bestimmte Anzahl von Zeichen begrenzbar sein und nur Zeichen enthalten, die in einer Fliesskommazahl vorkommen. Hierbei ist auf deren mögliche Positionierung zu achten. Ein eingegebenes Komma soll in einen Punkt gewandelt werden.

Die Eingabe zur Funktion soll durch die Escape- oder Return-Taste abgebrochen werden können. Wird die Escape-Taste zum Abbruch benutzt, gibt die Funktion getFPnum() den Wert 0 zurück und der eingegebene String besitzt die Länge 0 (leerer String). Bei Return wird der bis dahin eingegebene String mit Null terminiert und die Funktion gibt 1 zurück.
Mit der Taste [<--] sollen Fehleingaben in den String korrigiert werden können.

Geben Sie ein Testprogramm für die Funktion an, das einen Eingabebuffer für 30 Eingabezeichen bereitstellt. Das Testprogramm soll die Eingabe anzeigen, es soll den eingegebenen String zur Kontrolle ausgeben und seine Wandlung in eine Fliesskommazahl von Typ double dokumentieren.


 

 

 




// getfpstrg.cpp
// -------------  Version 20.05.2002
//                Model: small
//                Fliesskommaemulation ein (bei SC12)
//                Schwarzer, BBS WiLu


// Holt einen nullterminierten String, der eine Fliess-
// komma zahl enthält.

// Deklaration von Bibliotheksfunktionen
#include <stdio.h>     // für printf(), putc()
#include <conio.h>     // für getch()
#include <math.h>      // für atoi()

// Deklaration eigener Funktionen
void setStdio(char);   // nur bei SC12
int  getFPnum( char* Buffer, int StringLang);

// Definition von Kurzbezeichnungen
#define CR    0x0D     // Carriage Return (Enter Taste)
#define ESC   0x1B     // Escape (Esc-Taste)
#define BS    0x08     // Backspace (<-- Taste)
#define SPACE 0x20     // Leerzeichen (Space Bar)

// main()
// Testprogramm zum Test der Eingabefunktion getFPum()
void main(void)
{
 const char len=30;
 char   buf[len+1]="";
 double x;

 setStdio(2);
 printf("\r\n Eingabe: ");
 getFPnum(buf, 15);
 printf("\r\n Der String in buf lautet %s",buf);
 x =atof(buf);
 printf("\r\n Die Zahl in x lautet: x=%f",x);
 setStdio(3);
}


// getFPnum()
// Holt einen String von der Tastatur, der nur Zeichen für
// eine Fliesskommazahl enthalten kann. Das bedeutet, er
// kann genau ein Komma oder einen Punkt besitzen und
// auf der ersten Position die Zeichen + oder -. Die
// Stringlänge beträgt 'len', der eingegebene String wird
// in den Buffer 'buf' zurückgegeben, den das aufrufende
// Programm bereitstellt. Das Zeichen ',' wird in das
// Zeichen '.' verändert.
// Mit der Taste [<--] kann die Eingabe editiert werden
// Rückgabe 0, Funktion wurde mit <cr> beendet, im Buffer
// der nullterminierte Fliesskommastring,
// Rückgabe 1, Funktion wurde mit <esc> beendet, im Buffer
// ein leerer String
int getFPnum (char *buf, int len)
{
 int n=0, c;
 int pktflg = 0;

 while (1){
   c= getch();                        // Zeichen holen
   switch (c){
    case CR : buf[n]= 0; return(1);   // wenn <cr>
    case ESC: buf[0]= 0; return(0);   // wenn <esc>
    case BS : if (n>0){               // wenn <bs>
                putc(c, stdout);
                putc(' ', stdout);
                putc(c, stdout);
                n--;
                if(buf[n]=='.'||buf[n]==';')
                pktflg=0;
                continue;
               }
  }
  if(n >len-1) continue;              // wenn Länge zu groß
   switch (c){
    case ',':                         // Komma oder Punkt
    case '.': if (pktflg) continue;   // und nur eines
                  buf[n]='.';
                  pktflg=1;  break;
    case '+':                         // wenn Vorz. und
    case '-': if (n != 0) continue;   // erste Position
                  buf[n]= (char)c;
                  break;
    default : if(c<'0' || c>'9')      // Zeichen 0-9 
               continue;
               buf[n]= (char)c;
    }

    n++;
    putc(c,stdout);                   // Bildschirmausgabe
 } // while
} // Funktion




// setStdio()
// Besonderheit des SC12, die Funktion kann bei normalen
// PCs weggelassen werden. Diese Funktion richtet den Ein-
// gabestrom auf das Benutzerprogramm kanal=2 oder auf das
// Betriebssystem kanal=3
// Wird später im Kapitel über den SC12 erklärt.
#include <dos.h>
static union  REGS  inregs;
static union  REGS  outregs;

void setStdio (char kanal)
{
  inregs.h.ah = 0x11;
  inregs.h.al = kanal;
  int86(0xA0, &inregs, &outregs);
}




 

 

 


Zur Funktion: hole eine Fliesskommazahl von Stdin
Soll die obige Funktion auf einem SC12 IPC@CHIP WebServer laufen, so muß ihr ein zusätzliches Unterprogramm mitgegeben werden. Dieses richtet die Standardeingabe des SC12 auf das Benutzerprogramm. Der Grund für dieses Unterprogramm wird später bei der Besprechung des SC12 erläutert. Hier wurde es angefügt und am Anfang, sowie am Ende von main() aufgerufen.

Deklarationen
int getFPnum (char*, int);

Übergabeparameter 1:
Der Zeiger char* zeigt auf einen Zeichenbuffer (CharArray), der den nullterminierten Eingabestring in der gewünschten Länge aufnehmen können muß.

Übergabeparameter 2:
Die Länge des Stringbuffers muß getstrg() auch mitgeteilt werden, was im zweiten Übergabeparameter in Form einer Integervariablen geschieht. Der Buffer muss wegen der den String abschliessenden 0 ein Zeichen mehr aufnehmen können als Eingabezeichen gewünscht werden.

Rückgabeparameter:
Wird die Eingabe durch die Taste [ENTER] abgebrochen, dann gibt die Funktion 1 zurück. Der Stringbuffer der aufrufenden Funktion ist mit dem bis dahin eingegebenen String gefüllt. Dieser ist nullterminiert.
Wird die Eingabe durch die Taste [ESC] abgebrochen, dann gibt die Funktion 0 zurück. Der Stringbuffer der aufrufenden Funktion ist leer. Das bedeutet, es befindet sich nur die den String abschließende 0 in ihm.


 


 

www..de