1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

programmieren lernen zu schwer

Discussion in 'Programmieren' started by D.Brown, May 30, 2009.

Thread Status:
Not open for further replies.
  1. D.Brown

    D.Brown Kbyte

    Ich hab wieder ma ne Frage also wie könnte eine Funktion aussehen wenn
    ich eine variable eintippen will also ich mach jetzt lieber ein beispiel es ist falsch aber anders kann ich es nicht erklären

    #include <string>
    #include <iostream>

    using namespace std;
    int main()

    {
    string a;
    cin >> a; // hiermit will ich bewirken das ich ein wert eingeben kann in buchstaben nicht als zahl z.b bla,hallo etc. !!

    cout << " Das haben sie eingegeben: " << a << endl; /*dann sollte das erscheinen was ich eingetippt habe egal was z.b blabla oder hallo*/

    if(a == hallo) /* hier liegt mein problem kann ich überhaupt mit den funktionen string und if sowas erstellen ?? ich hab mir hier gedacht also wenn ich hallo da oben mit der cin funktion eingegeben habe dann soll HALLO HALLO erscheinen !! und sosnt soll es ciao sagen und das programm beenden */

    {

    cout << " HALLO HALLO " << endl;
    system("Pause");
    return 0;

    }

    cout << " CIAO " << endl;
    system("Pause");
    return 0;

    }

    ich hoffe ihr versteht was ich meine
    und ich danke schonma für ne kleine Hilfe!
     
    Last edited: Jun 11, 2009
  2. daboom

    daboom Megabyte

    Wenn Du eine String Konstante irgendwo benutzen willst, muss die in Anf&#252;hrungsstriche. Genau wie die Konstanten, die Du an Dein cout gibst.

    Das hei&#223;t, Du musst einfach nur

    PHP:
    if (== "hallo")
    schreiben, und schon geht's ;)

    Btw:

    PHP:
    system("pause");
    return (
    0);
    kann / sollte aus der Bedingung raus und einfach dahinter / darunter. Es wird ja sowieso in jedem Fall ausgef&#252;hrt. Funktionieren tut's aber auch so ;)

    Edit: Ich sehe gerade, da ist ja kein "else", der letzte Kommentar bezog sich darauf, dass es dort aber einen gibt.
     
  3. D.Brown

    D.Brown Kbyte

    so jetzt klappt es ich danke dir :bussi:
    ich hab mir ein kleines programm zu umrechen von celsius in fahrenheit und umgekehrt geschrieben. und bin stolz auf mich.:):cool:


    und zu deine Aussage ich hab 2mal if verwendet und es ist garnicht nötig else zu schreiben
    oder wie hast du das gemeint?
    Ich :bitte: um Erklärung
    Ich meine es so bsp:

    int main()

    {
    int a;
    cout << "geben sie eine zahl ein" << endl;
    cin >> a;
    if ( a == 4) // wenn ich die 4 eingeben dann tut er das
    { cout << " die zahl ist 4 " << endl;
    system("Pause");
    return 0; }

    // wenn ich eine andere zahl eingebe dann tut er das und da ist kein else erforderlich
    cout << "beenden" << endl;
    system("Pause");
    return 0;
    }
     
  4. daboom

    daboom Megabyte

    Ich meine es so:

    PHP:
    int main() {
    int a;

    cout << "geben sie eine zahl ein" << endl;

    cin >> a;

    if ( 
    == 4) {
      
    cout << "  die zahl ist 4 " << endl;
    } else {
         
    cout << "beenden" << endl;
    }

     
    system("Pause");
      return 
    0;
     }
     
  5. D.Brown

    D.Brown Kbyte

    wenn ich zum anfang des Programms zurück will ist es dann sinnvoll eine marke zu machen ?
    oder ist es in c++ eher nicht sinnvoll ?
    funktionieren tut es ja :D

    beispiel


    int main()
    {
    int zahl;

    anfang:



    cout << " hallo " << endl;
    cout << " 1 oder 2" << endl;
    cin >> zahl;
    if(zahl == 1)

    { cout << " HALLO HALLO" << endl;
    system("Pause");
    return 0;
    }

    goto anfang;

    return 0;

    }
     
  6. magiceye04

    magiceye04 Wandelndes Forum

    Das sieht nach Endlosschleife aus :o

    Eigentlich sind Sprunganweisungen in C nicht wirklich sinnvoll.
    Code, der mehrfach verwendet werden soll, geh&#246;rt in eine function (So eine Art Unterprogramm).
     
  7. daboom

    daboom Megabyte

    Genau. Ich wei&#223; auch nicht, wer &#252;berhaupt auf die Idee gekommen ist, Sprungmarken in eine h&#246;here Programmiersprache reinzulassen ;)

    In diesem Fall w&#228;re folgendes sinnvoller:

    PHP:
    // Forward Deklaration
    void anfang();

    int main() {
      
    anfang();

      return (
    0);
    }

    void anfang() {
      
    int zahl;

      
    cout << " hallo " << endl;
      
    cout << " 1 oder 2" << endl;
      
    cin >> zahl;

      if(
    zahl == 1) {
        
    cout << " HALLO HALLO" << endl;
        
    system("Pause");
      }

      
    anfang();
    }
    Macht genau dasselbe.
    Wie magiceye aber schon sagte, wird das nat&#252;rlich ne Endlosschleife aber dessen bist Du Dir ja bestimmt bewusst ;)
     
  8. AS_X

    AS_X Halbes Megabyte

    Die Rekursion ist aber unnötiger Speicheraufwand (Aktivierungsblöcke auf dem Laufzeitkeller).
    Wie wäre es mit einer while-Schleife? In eine solche könnte man sogar eine Abbruchbedingung aufnehmen... oder break einsetzen, was aber wieder etwas mehr goto-like ist.

    PHP:
    while (zahl == 1) {
      ...
    }
    führt die Befehle in den geschweiften Klammern (hier durch drei Punkte angedeutet) solange die Bedingung (hier: zahl == 1) erfüllt ist aus. Die Auswertung erfolgt gleich beim ersten Mal! Soll die Bedingung erst am Ende der Schleife geprüft werden, so kommt eine sogenannte do-while-Schleife zum Einsatz.

    CF: http://www.win-tux.de/c_010_000.htm
     
  9. Fettbemme

    Fettbemme Halbes Megabyte

    Da gebe ich Dir recht. Es gibt zu 99.999999999999% keinen Grund Sprungmarken in einer Hochsprache zu verwenden, egal ob C, C++, Pascal oder was auch immer. Das einzige wo es eventuell ein Sinn macht ist bei etwas komplexem Exception Handling.

    Das macht in keinem das Selbe. Du hast eine Rekusion geschrieben. Bei jedem Aufruf wird wenn ich das so richtig sehe ein "int" angelegt, und auf jedenfall ein Stack aufgebaut, der nicht mehr abgebaut wird solange ich die falsche Zahl eingebe. Ich tippe auf einen Stack overflow nach einer gewissen Zeit bei Eingabe einer "falschen" Zahl.

    Rekursinonen sind eine Welt für sich, und man sollte sehr genau wissen was man da anrichtet. Wer schon einmal einen rekursiven Parser geschrieben hat weiss wovon ich rede....

    In dem von D.Brown gegebenen Beispiel wäre sicher eine while oder do...while Schleife Sinnvoll. Das wurde aber auch schon angemerkt.
     
  10. daboom

    daboom Megabyte

    Mit "dasselbe" meinte ich natürlich das gleiche Verhalten.

    Klar gibt es hier eine Rekursion, die erstmal nen schönen Stack aufbaut usw. Eh das aber zu nem Overflow kommt, müssten schon ein paar hunderttausend Eingaben erfolgen, schätze ich. Ich hatte halt einfach nur schnell (Code Copy&Paste) zeigen wollen, was mit der Auslagerung in eine Funktion gemeint war... :rolleyes:

    Rekursionen sind, da habt ihr beide recht, natürlich immer zu vermeiden, wenn wir von einer normalen x86 Architektur o.ä. und den "normalen" Sprachen (wie C, C++, Java usw.) sprechen. Auch wenn manche Compiler einfache Rekursionen wieder in Iterationen umoptimieren, sollte man sich darauf eigentlich nie verlassen und immer versuchen, einen iterativen Ansatz zu schreiben.

    Btw: Der Stack wird in meinem Beispiel nie abgebaut, auch nicht, wenn ich die richtige Zahl eingebe. ;)
     
  11. D.Brown

    D.Brown Kbyte

    erstmal Danke für eure Antworten,
    besonders daboom für deinen guten Beispiel.
    Ja kla ich war mir bewusst, das es eine Endlooseschleife wird hätte ich lieber einfach break benutzen sollen.
    Das war ja nur ein beispiel hab es nur als beispiel schnell getippt nicht das ich jetzt keine lust hatte das auszuprobieren ich hätte es gar nicht compilieren können (Ich war am Schulpc in einer Freistunde :)).

    Also meine nächste Frage :

    int ist im Wertebereich von -2147483648 bis +2147483647
    long ist im Wertebereich von -2147483648 bis +2147483647
    Short ist im Wertebereich von -32767 bis 32767


    Ich verstehe es nicht wann ich welche variable benutzen soll :confused:
    z.b habe ich gelesen das variablen vom typ short üblicherweise einen Wertebereich von 2 Byte haben und Variablen vom Typ long einen von 4 Byte.
    So nun woher weiss ich welche Zahl wieviel Byte braucht bzw. benutzen wird ?
    Was ist ein Wertebereich?? sind das zahlen von -32767 bis 32767 oder wie soll ich das verstehen in windows Rechner kann man ja auch im Rechner also (zum Rechnen) auch zahlen im Hex oder binär umwandeln hat das ergendwas damit zu tun ?
    Und wieso verwende ich nicht immer die variable long anstatt int oder short da long ja ein grösseren Wertebereich hat ?

    Und muss man das ganze wirklich verstehen können das scheint mir sehr kompliziert zu wirken (naja alles scheint einen kompliziert wenn man null Ahnung davon hat!!!!)?

    Ich danke wieder für Antworten!
     
  12. daboom

    daboom Megabyte

    Der Wertebereich eines Typs ist der Bereich der Zahlen, den man in ihm speichern kann, mal ganz salopp formuliert. Eigentlich ist es die Anzahl der verschiedenen Zustände, die er speichern kann.

    Ganz einfach angefangen: 1 Bit hat einen Zahlenbereich von 0-1, weil man genau 2 verschiedene Zustände speichern kann. Die letztere Aussage ist hierbei eigentlich wichtiger.
    Kommt nun ein Bit hinzu (also 2 Bit), verdoppelt sich diese Anzahl schon, da man jeden der alten Zustände (also 0 und 1) mit einem der neuen Zustände (ebenfalls wieder 0 oder 1) kombinieren kann. Das setzt sich immer so fort (also die Verdopplung der Anzahl der möglichen Zustände), so dass man die Anzahl der Zustände, die ein Typ speichern kann, ganz einfach mit

    2 ^ AnzahlDerBits (Zwei hoch AnzahlDerBits)

    ausrechnen kann.

    Bei 8 sind das 256, also z.B. die zahlen von 0 bis 255. (unsigned - also ohne Vorzeichen) Oder aber auch die zahlen von -128 bis 127 (signed - also mit Vorzeichen)

    Bei 32 bit sinds dann ca. 4,3 Mrd. Zustände.

    In C++ ist es leider plattformabhängig, welcher Datentyp welchen Wertebereich hat. Die einzige Aussage, die hier getroffen wird ist, dass

    short <= int <= long

    also theroretisch auch alle gleich groß sein könnten. int soll wohl immer die natürliche Wortbreite des Systems widerspiegeln (32Bit Windows -> 4 Byte)

    Welchen Typ Du nun verwendest, hängt eigentlich nur davon ab, welche Zahlen Du in der entsprechenden Variable speichern möchtest.

    Beispiel: Für die Tage eines Monats reicht ein char, da es ja z.b. keinen 167. Januar gibt (geht halt nur höchstens bis 31). Wenn Du Deinen Kontostand speichern möchtest, sieht das (hoffentlich ;)) schon anders aus, so dass ein char nicht mehr reicht (der würde dann überlaufen, also wieder von vorn anfangen, zu zählen)

    Der Windows Taschenrechner macht da, glaub ich, nochmal was ganz anderes.
     
  13. magiceye04

    magiceye04 Wandelndes Forum

    Der Grund, warum man nicht f&#252;r alle n&#246;tigen Variablen immer gleich den gr&#246;&#223;ten Wertebereich vorsieht, also z.B. alles in long oder gar longlong /int64_t (=64bit) abspeichert, ist einfach die Tatsache, da&#223; man keinen Speicher unn&#246;tig verschwenden will. Bei einer Handvoll Variablen mag das noch egal sein, wenn Du ein Feld aus 100Mio Daten verarbeiten willst und die alle jeweils 8Byte verschlingen, sind daf&#252;r mal eben 800MB belegt. Also nimmt man immer nur soviel, wie man braucht.
     
  14. D.Brown

    D.Brown Kbyte

    Danke für eure Erklärungen!!!:bussi:
    magiceye04 ich habs verstanden wie du es meinst also warum einen LKW unnötig beladen wenn das auch alles im Auto passt.:)

    Nun zu deiner Aussage daboom hab ich ein paar Fragen:

    Also char hat den Wertebereich von -127 bis 127
    also ich hab mir das mit den binärezahlen angeguckt und der binärewert von der dezimalzahl 127 ist 1111111 und von 128 ist 10000000 so hier hat die binärzahl bei 128 einer stelle mehr.
    Heisst das jetzt das es 1Bit mehr hat?
    und deswegen nicht mehr mit char verwendet werden kann oder hat die binärzahl garnichts damit zu tun ?

    wenn ich richtig verstanden habe also wenn ich die zahl 21474836 benutze, müsste ich dann "int" verwenden weil char bzw. short zu wenig aufnehmen kann? und was würde passieren wenn ich für die zahl doch char benutzen würde ? du hast ja gesagt die würde nochmal von vorne gezählt werden. Das habe ich aber nicht verstanden.

    und Woher weiss ich welchen Wertebereich ein Buchstabe bzw. Wort hat? bzw wieviel bit dafür verwendet werden?



    Ich hoffe ich hab das nicht alles falsch verstanden bin sehr müde und ich muss morgen sehr früh zu schule :D
     
  15. Fettbemme

    Fettbemme Halbes Megabyte

    Nein, von -128 bis +127 :)

    Das ist Richtig, nur kannst Du die Zahl +128 nicht mehr mit einem char abbilden, da würdest Du einen Datentyp benötigen, der vorzeichenbehaftet ist mit 2 Bytes (z.B short int)

    Das was Du gesagt hast ist schon korrekt, nur gibt es ganzzahlige Variablentypen die einen Zahlenbereich nur von 0 ab im positiven Bereich abdecken, und andere Typen haben auch einen Wertebereich mit negativen Zahlen.

    Du könntest dien Wert 128 z.B. noch mit dem Datentyp "unsigned char" (Wertebereich 0-255) abbilden.

    Richtig für Deine genannte Zahl wäre z.B. int eine passende Wahl.

    Wenn Du einem char einen Wert aus einer int Variable zuweisen möchtest, wirst Du mit einwenig Glück ein Compiler Warning bekommen. Aber darauf würde ich mich nicht verlassen. VC++2008 hat mich eben im Stich gelassen bei diesem "Codeschnipsel"

    Code:
      int intvar;
      char charvar;
      
      intvar=257;
      charvar=intvar;
    
    Was passiert da, dem Int wird der Wert 257 zugewiesen. Dieser Wert kann in einem Char nicht abgebildet werden. Zur Verständlichkeit gehe ich jetzt auf die Binärebene. 257 entspricht 100000001 (Hex 0x101). Noch etwas anders hingeschrieben 00000001 00000001. Es werden also 2 Bytes benötigt. Wenn Du jetzt diesen Wert dem char zuweisen möchtest, dann geht das höherwertige Byte verloren. In der Variablen charvar steht dann der Wert 1, also 00000001.

    Etwas ähnliches würde hier passieren
    Code:
      unsigned char charvar1;
      unsigned char charvar2;
      unsigned char charvar3;
      
      charvar1=250;
      charvar2=10;
    
      charvar3=charvar1+charvar2; // Wert 260 erwartet aber Wert 4 steht in Variable
      charvar3=charvar1*2; // Wert 500 erwartet aber Wert 160 steht in Variable
      charvar3=charvar2-charvar1; // Wert -240 erwartet aber Wert 16 steht in Variable
    
    
    
    Die Zuweisungen der Werte liegen beide innerhalb des Wertebereiches eines unsigned char der bei 0-255 liegt. Addiere ich diese beiden Werte dann ist das Ergebnis aber nicht mehr im Wertebereich eines unsigned char. Das Ergebnis 260 das 00000001 00000100 binär entspricht wäre in der Variablen charvar3 nur 4 sprich 00000100.
    Das gleiche Problem würde auftreten auch bei Multiplikationen oder Subtraktionen wenn der Wertebereich nicht betrachtet wird. Das ist ein nicht ganz einfaches Thema, da auch die Wechsselwirkungen von z.B. Rechenoperationen mit in die Wahl des Variablentyps mit eingehen.

    Ein "ASCII Buchstabe" hat 1 Byte. Wenn Du mal nach eine ASCII Tabelle im Web suchst stellst Du fest, wie diese codiert sind. Es ist aber nicht generell, dass ein "Buchstabe" nur 1 Byte hat. (Es gibt z.B. die Möglichkeit Buchstaden auch nach UNICODE zu codieren, da hast Du dann pro Buchstabe 2 Bytes. Das aber nur als Hinweis der Vollständigkeit! Sollte für Dich am Anfang unwichtig sein).
    Ein Wort, ich denke damit meinst Du z.B. den Satz "Ich gehe heute früh zur Schule" ist im prinzip ein Feld von char Zeichen. Auch da ist es möglich, dass Dein Satz zu lang ist für das von Dir gewählt Feld. Bei solchen Dingen fängt es an, z.B. die STL zu verwenden oder andere C++ Klassenbibliotheken die einem das String Handling doch sehr vereinfachen. Das Rad neu erfinden macht auch keinen Sinn.

    Nee das hat soweit schon gepasst, Du bist auf dem richtigen Weg :)
     
Thread Status:
Not open for further replies.

Share This Page