[c++]Char-Array - Eingabe nur Binär

pcslayer

Grünschnabel
Hallo User,

ich habe folgendes Problem:
Ich brauche einen Abfang, um nur Einsen und Nullen einzugeben.

Hintergrund (wen es interessiert):
Mein Lehrer hat uns eine Aufgabe zugeteilt, wo wir ein Mathematiklernprogramm entwickeln sollen. Jeder aus meiner Klasse sollte dazu eine Funktion schreiben. So danach soll jeder Schüler diese Funktionen einbinden (mein Lehrer hat eine Objekt- und Header Datei erstellt).

Problem:
Ich bin nun bei der Funktion angelangt, wo die Eingabe ein Char-Array ist und die Funktion halt aus der Eingabe (Binär) dann die Ausgabe(Dezimal) ausgeben soll. So und da die Eingabe eigentlich ja nur mit 1en und 0en funktionieren soll komm ich nicht weiter.

Dokumentation des Schülers:
Binär in Dezimal
Header Datei:
Es wurden keine zusätzlichen Header benötigt.
Rückgabe:
Die Funktion "bid" rechnet Binärzahlen in Dezimalzahlen um.
Funktionsname:
bid
Prototyp:
long bid (char a[1]);
Parameter: a <<--- ist die eingegebene Binärzahl die auf die Funktion übertragen wird.
Datentyp des Parameters a : Char a[1]

Mein Code:
Alle nicht im Code definierten Variablen sind im Hauptprogramm definiert.
Code:
cout << "---Umrechnung einer Bin"<<ae<<"rzahl in eine Dezimalzahl---\n";
int check = 0;
char Eingabe[1];
cout << "Geben Sie bitte ein Zahl f"<<ue<<"r die Umrechnung ein:\n";
                
do{
       cin >> Eingabe;
       check = 0;
       for (int i=0; i<strlen(Eingabe); i++)
       {
                        if(Eingabe[i] != '0' && Eingabe[i] != '1')
                        {
                            check = 1;
                        }
       } 
       if (check==1)
       {
                        cout << "Fehler! "<<"Geben Sie bitte ein Zahl f"<<ue<<"r die Umrechnung ein:\n";
       }
}
while(check==1);  
cout << "Ergebnis:\t";
bid (Eingabe);
Die Ausgabe geschieht in der Funktion.
Die Funktion funktioniert einwandfrei, bis auf halt, das man alle Zahlen und Zeichen eingeben kann.

Verwendete Software: wxDev-C++
Art des Programms: Konsole


Ich hoffe Ihr könnt mir weiter helfen.
 
Hi.

Wenn du die Aufgabenstellung richtig wiedergegeben hast, ist es überhaupt nicht deine Aufgabe zu prüfen ob die Eingabe nur Nullen und Einsen enthält. Du sollst doch nur die Funktion schreiben.

In der Funktion kannst du davon ausgehen, das nur gültige Werte als Argument an die Funktion übergeben werden (Programming-by-contract).

Dann ist der Funktionsname relativ ungünstig gewählt, da überhaupt nicht klar ist was die Funktion macht. Besser wäre z.B. bin2dec oder auch binaer_zu_dezimal. Wurde das von deinem Lehrer so vorgegeben?

Außerdem ist der Parametertyp falsch. Ein char[1] kann nur ein String der Länge 0 sein! Wenn du versuchst dort andere Werte zu speichern überschreibst du anderen Speicher, was zu undefiniertem Verhalten führt (z.B. Absturz). Besser wäre "const char[]" und in der main Funktion dann z.B. "char Eingabe[50];".

Habt ihr denn schon den Typ "bool" kennengelernt?

Außerdem sollte in der Funktion keine Ausgabe durchgeführt werden. Die Funktion gibt lediglich ein Ergebnis zurück.

Gruß
 
Zuletzt bearbeitet:
Hallo deepthroat,

Wenn du die Aufgabenstellung richtig wiedergegeben hast, ist es überhaupt nicht deine Aufgabe zu prüfen ob die Eingabe nur Nullen und Einsen enthält. Du sollst doch nur die Funktion schreiben.
Die Funktion wurde bereits geschrieben, von einem anderen Schüler. So und da nun jeder eine Funktion geschrieben hat, sollen wir diese Funktionen in einem Programm zusammenfassen. Das mit der Eingabe von Einsen und Nullen ist so, das wir das Programm für DAUs schreiben sollen, und diese geben schon mal einen Buchstaben oder eine Zahl, wie 50 oder so etwas, ein.

In der Funktion kannst du davon ausgehen, das nur gültige Werte als Argument an die Funktion übergeben werden (Programming-by-contract).
Schön wäre es, ist aber nicht so.

Dann ist der Funktionsname relativ ungünstig gewählt, da überhaupt nicht klar ist was die Funktion macht. Besser wäre z.B. bin2dec oder auch binaer_zu_dezimal. Wurde das von deinem Lehrer so vorgegeben?
Den kann ich leider nicht ändern.

Außerdem ist der Parametertyp falsch. Ein char[1] kann nur ein String der Länge 0 sein! Wenn du versuchst dort andere Werte zu speichern überschreibst du anderen Speicher, was zu undefiniertem Verhalten führt (z.B. Absturz). Besser wäre "const char[]" und in der main Funktion dann z.B. "char Eingabe[50];".
Auch das kann ich leider nicht ändern, da ich die Funktion nicht geschrieben habe.

Habt ihr denn schon den Typ "bool" kennengelernt?
Ja den kenne ich. :)

Außerdem sollte in der Funktion keine Ausgabe durchgeführt werden. Die Funktion gibt lediglich ein Ergebnis zurück.
Ja das sollte sie, aber manche Schüler hören dem Lehrer einfach nicht zu. :(

Naja; trotzdem schon mal Danke für deine Antwort.
 
Hi

In der Funktion kannst du davon ausgehen, das nur gültige Werte als Argument an die Funktion übergeben werden (Programming-by-contract).
...
Schön wäre es, ist aber nicht so.
Die Eingabe sollte dort geprüft werden, wo sie eingegeben wird...
dann kann sich die Funktion auf die Richtigkeit verlassen.

Auch das kann ich leider nicht ändern, da ich die Funktion nicht geschrieben habe.
...
Ja das sollte sie, aber manche Schüler hören dem Lehrer einfach nicht zu
Warum versuchst du, die Fehler eines Anderen zu umgehen?
Dadurch entsteht nur vermurkster Code.
Sag dem anderen Schüler, was zu ändern wäre.

Und wenn ich mir deine Angabe anschaue, denk ich auch, dass du eigentlich die Funktion des anderen Schülers machen sollst.

Gruß
 
Hallo sheel,

Die Eingabe sollte dort geprüft werden, wo sie eingegeben wird...
dann kann sich die Funktion auf die Richtigkeit verlassen.
Ja die Eingabe findet nun mal außerhalb der Fkt. statt, die ich ja schreiben soll.

Warum versuchst du, die Fehler eines Anderen zu umgehen?
Dadurch entsteht nur vermurkster Code.
Sag dem anderen Schüler, was zu ändern wäre.
1. Problem: Der Schüler ist nicht mehr in meiner Klasse -> er braucht es nicht zu ändern -.-.
2. Ja wir also jeder aus meiner Klasse soll das nun mal so machen.

Und wenn ich mir deine Angabe anschaue, denk ich auch, dass du eigentlich die Funktion des anderen Schülers machen sollst.
So hier mal ein kleines Schaubild:

Schüler1 -> schreibt Fkt. freier Fall ->...
Schüler2 -> schreibt Fkt. Subtraktion -> ...
Schüler3 -> schreibt Fkt. bid -> ...
Ich -> schreibt Fkt. Lineare_Regression-> ...
SchülerN ->schreibt Fkt. xy-> ...

... Lehrer erstellt Obj- und Header-Datei aller Fkt. -> stellt Dateien zum Downloaden auf FTP-Server -> Schüler 1-N (inkl. mir) müssen nun ein Programm schreiben, wo eine Person eingeben kann was er berechnen möchte, wo dann nach der Auswahl die entsprechende Fkt. ausgeführt wird
kurz: ein kleines Programm, womit man verschiedene Sachen berechnen kann

so und dazu müssen wir auch die Eingaben abfangen, damit halt keine Buchstaben oder etwas was da nichts verloren hat in die Fkt. kommt; es sind insgesamt 20 Fkt. bei allen habe ich es hin bekommen, das nur die entsprechenden Eingaben statt finden, doch bei dieser Fkt. bid komm ich nicht weiter.
 
Original Aufgabe:
Funktionen TEIL I (Matheprogramm)

In jedem Programm gibt es Routinen, die häufiger benutzt werden müssen. Wenn man diese Routinen jedesmal an der Stelle, an der sie benötigt wrid neu implementieren müsste, würde der Quelltext sehr lang und unübersichtlich.
Eine Lösung ist, diese Routinen auszulagern, und sie bei bedarf aufzurufen. Eine solche ausgelagerte Routine ist die Funktion.

Erarbeiten sie sich die Informationen auf dem Arbeitsblatt Funktionen.
Programmieren Sie Ihr Programm "Christbaum" aus der letzten Einheit so um, dass das Zeichenen der Linie in eine Funktion ausgelagert ist.
Bearbeiten Sie die Aufgabe zu Lernprogramm (Teil 1).

Arbeitsblatt Funktionen PDF-Dokument
Aufgabe zu Lernprogramm (Teil 1)
Bewertung der Funktionen Feedback



Funktionen TEIL II (Matheprogramm)

Nachdem Sie jeder eine eigen Funktion geschrieben und dokumentiert haben, ist es nun an der Zeit, alle Funktionen zu benutzen.

Entwickeln Sie das Programm aus der Aufgabe zum Lernprogramm.

Die gesammelten Dokumentationen finden Sie im
Wiki: Programmieren in C++ -> Funktionen -> Dukumentation der Funktionen.
Die Implementierungen finden Sie im Verzeichnis Implementationen. Hier sind Objekt-Dateien, in denen der Quelltext kompiliert ist abgelegt.

Achtung:
Benutzer von DEV C++ benötigen die Datei funktionen.o

Implementationen Datei

Wichtiger Hinweis:
Die Objekt-Dateien (.obj, bzw .o) enthalten eine Funktion version(). Wenn Sie diese Funktion aufrufen erhalten Sie die aktuelle Versionsnummer der Datei.


Aufgabe zum Lernprogramm (Teil 2)
Aufgabe zum Lernprogramm (Teil 3)

Mein bisheriger Code (Auszug):
Code:
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <sstream> 
#include <string> 
#include <cmath>
#include <math.h>
#include <iomanip>
#include <ctype.h>
#include <windows.h>
#include <stdio.h>
#include "funktionen.h"
#define Anzahl 1
using namespace std;
double abfangd(string Textd);
int abfangi(string Texti);
float abfangf(string Textf);
unsigned long abfangul(string Textul);

int main(int argc, char *argv[])
{                                                                                   //start main
    char c = 184, ue = 129, oe = 148, ae = 132, ss = 225, Ue = 154 ;                //Sonderzeichen char
    string ues(1,ue), oes(1,oe), aes(1,ae), sss(1,ss), Ues(1,Ue);                   //Sonderzeichen string
    cout << c <<" by xxx\tVersion: xxx";
    string sAuswahl, text, erneut;
    int Fkt;
    version();
    cout << endl;
    do
    {                                                                               //start do erneut
        cout << "W"<<ae<<"hlen Sie bitte aus was Sie berechnen m"<<oe<<"chten:\n";
        cout << "1 = Aufprallgeschwindigkeit nach einem freien Fall\n";
        //cout << "2 = Bahngeschwindigkeit eines Sateliten auf einer gesostation"<<ae<<"ren Kreisbahn;\n"; 
        cout << "3 = Brennweite, Bildweite, Gegenstandsgr"<<oe<<""<<ss<<"e und Bildgr"<<oe<<""<<ss<<"e einer optische Linse\n"; 
        cout << "4 = Die Fakult"<<ae<<"t einer ganzen Zahl\n";
        cout << "5 = Die Lineareregression einer Messreihe mit zehn Wertepaaren\n";
        cout << "6 = Eine beliebig lange Reihe ganzer Zahlen sortiert\n";
        cout << "7 = Kapital,MwSt, Bruttopreis, Zinsen;[BUG]\n";
        cout << "8 = Ladezustand eines aufladenden Kondensators\n";
        cout << "9 = Momentanwert der "<<Ue<<"berlagerung zweier sinförmiger-Spannungen;\n";
        cout << "10 = Nullstellen eines Polynoms f"<<ue<<"nfter Ordnung;[BUG]\n";
        //cout << "11 = Schwingungsdauer eines ged"<<ae<<"mpften Pendels;\n";
        cout << "12 = Umrechnung einer Bin"<<ae<<"rzahl in eine Dezimalzahl\n";
        cout << "13 = Umrechnung einer Dezimalzahl in eine Bin"<<ae<<"rzahl;\n";
        cout << "14 = Volumen und Oberfl"<<ae<<"che einer Pyramide\n";
        cout << "15 = Volumen und Oberfl"<<ae<<"che eines Quaders\n";
        cout << "16 = Volumen und Oberfl"<<ae<<"chen einer Kugel\n";
        cout << "17 = Volumen und Oberfl"<<ae<<"chen eines Ellipsoids\n";
        cout << "18 = Volumen und Oberfl"<<ae<<"chen eines Kegels\n";
        cout << "19 = Volumen und Oberfl"<<ae<<"cheneines Prismas\n";
        cout << "20 = Wurfweite, Wurfh"<<oe<<"he und Wurfwinkel eines schiefen Wurfs\n";
        
        cout << "\nAuswahl:\t";
        cin >> sAuswahl;
        while (sAuswahl != "1" && sAuswahl /* != "2"&& sAuswahl */ != "3"&& sAuswahl != "4"&& sAuswahl != "5"&& sAuswahl != "6"&& sAuswahl != "7"&& sAuswahl != "8"&& sAuswahl != "9"&& sAuswahl != "10"&& sAuswahl /* != "11"&& sAuswahl */ != "12"&& sAuswahl != "13"&& sAuswahl != "14"&& sAuswahl != "15"&& sAuswahl != "16"&& sAuswahl != "17"&& sAuswahl != "18"&& sAuswahl != "19"&& sAuswahl != "20") 
        {                                                                           //while auswahl berechnung start
            cout << "Fehler! Bitte wiederholen Sie die Eingabe:\n";
            cin >> sAuswahl;
        }                                                                           //while auswahl berechnung ende
        stringstream convertsAuswahltoint;
        convertsAuswahltoint << sAuswahl;
        convertsAuswahltoint >> Fkt;
        cout << endl;
        
        switch (Fkt){                                                               //start switch berechnung
            case 1: 
            {                                                                       //start case 1                                                                       
                cout << "---Aufprallgeschwindigkeit nach einem freien Fall---\n\n";
                string einheit = "m/s"; 
                text = "Geben Sie bitte die H"+oes+"he [in m] ein:\n";
                float Eingabe = abfangf(text);
                float Ausgabe = aufprall (Eingabe);
                cout << "Ergebnis:\t";
                cout << Ausgabe << einheit;
            }                                                                       //ende case 1  
            break;
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------                
            case 2: 
            {                                                                       //start case 2  
                cout << "---Bahngeschwindigkeit eines Sateliten auf einer gesostation"<<ae<<"ren Kreisbahn---\n\n"; 
                cout <<"\n zur Zeit noch in Arbeit\n";
    /*             double Ausgabe, radius, entfernung, time;
                cout << "Geben Sie bitte den Radius des Planeten ein:\n";
                cin >> radius;
                cout << "Geben Sie bitte die Entfernung des Satelliten zum Planten an:\n";
                cin >> entfernung;
                cout << "Geben Sie bitte die Zeit an:\n";
                cin >> time;
                Ausgabe = geostanonaersat (radius, entfernung, time);
                cout << "Ergebnis:\t";
                cout << Ausgabe;  */
            }                                                                       //ende case 2
            break;
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------            
            case 3: 
            {                                                                       //start case 3
                cout << "---Brennweite, Bildweite, Gegenstandsgr"<<oe<<""<<ss<<"e und Bildgr"<<oe<<""<<ss<<"e einer optische Linse---\n\n";
                double Ausgabe, brennweite, bildweite, gegenstandsweite, gegenstandsgroesse, bildgroesse;
                int Auswahl;
                string einheit; 
                text = "W"+aes+"hlen Sie bitte aus, ob Sie die Brennweite[1], die Bildweite[2], Gegenstandsweite[3] oder die Bildgr"+oes+sss+"e[4] berechnen m"+oes+"chten\n";
                Auswahl = abfangi(text);
                while (Auswahl != 1 && Auswahl != 2 && Auswahl != 3 && Auswahl != 4)
                {                                                                   //start Abfang der Auswahl
                    text = "W"+aes+"hlen Sie bitte aus, ob Sie die Brennweite[1], die Bildweite[2], Gegenstandsweite[3] oder die Bildgr"+oes+sss+"e[4] berechnen m"+oes+"chten\n";
                    Auswahl = abfangi(text);
                }                                                                   //ende Abfang der Auswahl
                switch (Auswahl){                                                   //start switch Brenn-, Bildweite, Gegenstands- und Bildgröße
                    case 1:
                    {                                                               //start case 1 Brenn-, Bildweite, Gegenstands- und Bildgröße
                        einheit = "cm";  
                        text = "Geben Sie bitte die Bildweite [in cm] ein:\n";
                        bildweite = abfangd(text);
                        text = "Genben Sie bitte die Gegenstandsweite [in cm] ein:\n";
                        gegenstandsweite = abfangd(text);
                        cout << "Brennweite:\t";
                    }                                                               //ende case 1 Brenn-, Bildweite, Gegenstands- und Bildgröße
                    break;
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------                
            case 11: 
            {                                                                       //start case 11
                cout << "---Schwingungsdauer eines ged"<<ae<<"mpften Pendels---\n\n";
                cout <<"\n zur Zeit noch in Arbeit\n";
            }                                                                       //ende case 11
            break;
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------                
            case 12: 
            {                                                                       //start case 12
                cout << "---Umrechnung einer Bin"<<ae<<"rzahl in eine Dezimalzahl---\n";
                int check = 0;
                char tEingabe[Anzahl];
                cout << "Geben Sie bitte ein Zahl f"<<ue<<"r die Umrechnung ein:\n";
                do{
                    cin >> tEingabe;
                      check = 0;
//                    for (int i=0; i<strlen(tEingabe); i++)
                    for (int i=0; i<Anzahl; i++)
                    {
                        if(tEingabe[i] != '0'  tEingabe[i] != '1')
                        {
                            check = 1;
                        }
                    } 
                    if (check==1)
                    {
                        cout << "Fehler! "<<"Geben Sie bitte ein Zahl f"<<ue<<"r die Umrechnung ein:\n";
                    }
                }
                while(check==1);  
                cout << "Ergebnis:\t";
                bid (tEingabe);
            }                                                                       //ende case 12
            break;
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------                
            
            default: cout << "Fehler-Code: 1683954x6734******!!\n\n";
            break;
        }                                                                           //ende switch berechnung
        cout << endl;
        cout << "\nM"<<oe<<"chten Sie erneut etwas berechnen? [ja = j oder nein = n]\n";
        cin >> erneut;
        while (erneut != "j" && erneut != "n")
        {
            cout <<"Fehler! " <<"M"<<oe<<"chten Sie erneut etwas berechnen? [ja = j oder nein = n]\n";
            cin >> erneut;
        }
        cout <<endl;
    }                                                                               //ende do erneut
    while (erneut == "j");
    Fkt = 0;
    cout << "\n\n\t\t\tTsch" << ue << "ss";
    Sleep(1000);
}                                                                                   //ende main

double abfangd(string Textd){
    char eingabe[2000000];
    int check;
    cout << Textd;
    do{
        check = 0;
        cin >> eingabe;
        for (int i=0; i<strlen(eingabe); i++)
        {
            if(eingabe[i] != '0' && eingabe[i] != '1' && eingabe[i] != '2' && eingabe[i] != '3' && eingabe[i] != '4' && eingabe[i] != '5' && eingabe[i] != '6' && eingabe[i] != '7' && eingabe[i] != '8' && eingabe[i] != '9' && eingabe[i] != ',' && eingabe[i] != '.'){
                check = 1;
            }
            if (eingabe[i] == ',')
            {
                eingabe[i] = '.';
            }
        }
        if (check==1)
        {
            cout << "Fehler! "<<Textd;
        }
    }
    while(check==1);
    double eingabed = atof(eingabe);
    return eingabed; 
}
int abfangi(string Texti){
    char eingabe[2000000];
    int check;
    cout << Texti;
    do{
        check = 0;
        cin >> eingabe;
        for (int i=0; i<strlen(eingabe); i++){
            if(eingabe[i] != '0' && eingabe[i] != '1' && eingabe[i] != '2' && eingabe[i] != '3' && eingabe[i] != '4' && eingabe[i] != '5' && eingabe[i] != '6' && eingabe[i] != '7' && eingabe[i] != '8' && eingabe[i] != '9')
            {
                check = 1;
            }
        }
        if (check==1)
        {
            cout << "Fehler! "<<Texti;
        }
    }
    while(check==1);
    int eingabei = atoi(eingabe);
    return eingabei; 
}
float abfangf(string Textf){
    char eingabe[2000000];
    int check;
    cout << Textf;
    do{
        check = 0;
        cin >> eingabe;
        for (int i=0; i<strlen(eingabe); i++){
            if(eingabe[i] != '0' && eingabe[i] != '1' && eingabe[i] != '2' && eingabe[i] != '3' && eingabe[i] != '4' && eingabe[i] != '5' && eingabe[i] != '6' && eingabe[i] != '7' && eingabe[i] != '8' && eingabe[i] != '9' && eingabe[i] != ',' && eingabe[i] != '.'){
                check = 1;
            }
            if (eingabe[i] == ',')
            {
                eingabe[i] = '.';
            }
        }
        if (check==1)
        {
            cout << "Fehler! "<<Textf;
        }
    }
    while(check==1);
    float eingabef = atof(eingabe);
    return eingabef; 
}
unsigned long abfangul(string Textul){
    char eingabe[2000000];
    int check;
    cout << Textul;
    do{
        check = 0;
        cin >> eingabe;
        for (int i=0; i<strlen(eingabe); i++){
            if(eingabe[i] != '0' && eingabe[i] != '1' && eingabe[i] != '2' && eingabe[i] != '3' && eingabe[i] != '4' && eingabe[i] != '5' && eingabe[i] != '6' && eingabe[i] != '7' && eingabe[i] != '8' && eingabe[i] != '9' && eingabe[i] != ',' && eingabe[i] != '.'){
                check = 1;
            }
            if (eingabe[i] == ',')
            {
                eingabe[i] = '.';
            }
        }
        if (check==1)
        {
            cout << "Fehler! "<<Textul;
        }
    }
    while(check==1);
    unsigned long eingabeul = (unsigned long) eingabe;
    return eingabeul; 
}
 
Zuletzt bearbeitet:
Hi.

Also hier wäre ganz klar dein Lehrer gefordert mal etwas regelnd einzugreifen. Wie sheel schon sagte entsteht da irgendwelcher Murks und das bringt eigentlich keinem etwas.

Ansonsten kann ich kein Problem in deinem Code entdecken, außer das du wie bereits angesprochen außerhalb der Arraygrenzen von tEingabe zugreifst und dies führt nunmal zu undefiniertem Verhalten - d.h. ab diesem Zeitpunkt kannst du nicht mehr sagen was das Programm tun wird!

Das Problem ist hier ganz klar der Parametertyp der bid Funktion. Der ist einfach falsch und muß geändert werden. Sprich mit deinem Lehrer.

Auf jeden Fall darfst du nicht den gleichen Fehler wiederholen:
C++:
char tEingabe[50];
Deine Schleife vorher war korrekt, jetzt läuft deine Schleife nur 1 Mal durch (solange i < 1). Benutze strlen.

Außerdem könntest du die Schleife frühzeitig verlassen wenn du ein anderes Zeichen als '0' oder '1' gefunden hast.

Gruß
 
Zurück