Benutzerdefinierte Suche

C Programm funktioniert nicht?!!!

  1. junger Mac

    junger Mac Thread StarterMacUser Mitglied

    Mitglied seit:
    19.11.2005
    Beiträge:
    113
    Zustimmungen:
    0
    Hallo zusammen!

    Ich soll ein C- Programm schreiben, das wie folgt beschrieben ist:
    Eine Zeichenkette die per Tastatur eingegeben wird soll mittels getchar -Aufrufen die Zeichen nacheinander einlesen und zählen:
    -wieviele Kleinbuchstaben
    -wieviele Grossbuchstaben
    -wieoft jede einzelne Dezimalziffer (0,1,.. , 9) und
    - wieviele Wörter (durch ein oder mehrere Leerzeichen bzw Tabs )
    in der Zeichenkette enthalten sind.
    Anschließend soll am Bildschirm ausgegeben werden was enthalten ist.
    Dann eine Abfage ob das ganze wiederholt werden soll!
    Mein bisheriger Quellcode sieht wie unten eingefügt aus.
    Das Programm macht alles bis auf das zählen der Zahlen!!!
    Ich werde noch ganz gaga, weis echt nicht mehr weiter!!
    Ich bekomme nur wirre Zahlen als Ausgabe!

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

    int main (int argc)
    {
    char eingabe, janein;
    int gb, kb, zahl[10], leer, wort, i;

    do
    {

    gb =0; //Variable fuer Grossbuchstabe
    kb =0; //Variable fuer Kleinbuchstabe
    //zahl =0;
    leer =0; //Variable fuer Leerzeichen
    wort =0; //Variable fuer Woerter

    rewind(stdin);
    printf("Zeichekette eingeben: ");

    do
    {
    eingabe =getchar();

    //***************************ueberpruefung GROSSBUCHSTABE*******
    if( isupper(eingabe))
    {
    gb =gb+1;
    leer=0;
    }

    // ***************************ueberpruefung kleinbuchstabe*************
    if( islower(eingabe))
    {
    kb =kb+1;
    leer=0;
    }

    //**************************ueberpruefung wort***************************
    if( isspace(eingabe) && leer !=1)
    {
    leer =1;
    wort =wort+1;
    }

    //************************ueberpruefung Ziffer***************************
    if( isdigit(eingabe))
    {
    //zahl[eingabe-47]++;
    zahl[eingabe] = zahl[eingabe]+1;
    }
    }
    while(eingabe !='\n');

    //************************ausgabe*****************************************
    printf("Grossbuchstaben: %d \n",gb);
    printf("Kleinbuchstaben: %d \n",kb);
    for(i =0; i<10; i =i+1)
    {

    printf("Die Zahl %i kommt %i mal vor.\n",i,zahl);
    }

    printf("Woerter: %d \n",wort);
    printf("Neue Zeichenkette (j/n)?");
    janein = getchar();
    }
    while(janein !='n');


    return 0;
    }
     
    junger Mac, 28.10.2006
  2. Andy-Gard

    Andy-GardMacUser Mitglied

    Mitglied seit:
    27.06.2005
    Beiträge:
    113
    Zustimmungen:
    0
    Arbeitest du mit xcode 2.0 ?
     
    Andy-Gard, 28.10.2006
  3. qfat

    qfatMacUser Mitglied

    Mitglied seit:
    30.01.2005
    Beiträge:
    238
    Zustimmungen:
    0
    c is nich java!

    will heißen die variablen werden nicht nullinitialisiert!
    du musst das array zahl nullen (alle int im array!)

    da du sonst den wert nimmst der im speicher vorher stand

    also dazu gibt es 2Varianten:
    1: mit ner for schleife alles nullen
    2: eleganter: den array mit calloc() erzeugen
     
    qfat, 28.10.2006
  4. junger Mac

    junger Mac Thread StarterMacUser Mitglied

    Mitglied seit:
    19.11.2005
    Beiträge:
    113
    Zustimmungen:
    0
    ja mit Xcode 2.0

    Im grunde geht es nur um diesen Teil:


    //************************ueberpruefung Ziffer***************************
    if( isdigit(eingabe))
    {
    zahl[eingabe] = zahl[eingabe]+1;
    }
    }
     
    junger Mac, 28.10.2006
  5. autoexec.bat

    autoexec.batMacUser Mitglied

    Mitglied seit:
    21.01.2005
    Beiträge:
    2.113
    Zustimmungen:
    20
    Ohne dir jetzt die Arbeit abnehmen zu wollen sehe ich auf anhieb 2 Sachen:

    1. Hast du dein Array nicht initialisert, daher die komischen Werte.

    2. zahl[eingabe] = zahl[eingabe]+1; Das kann so nicht funktionieren. Überleg dir mal was da gemacht wird. Da wird dein eingelesenes Zeichen einfach nur in seinen ASCII-Wert umgewandelt. So groß ist dein Array ja gar nicht.

    Im übrigen würde ich dir mal empfehlen dein Problem mit dem Compilerflag -Wall zu kompilieren. Da gibts nämlich noch einige schöne Warnungen in deinem Programm.
     
    autoexec.bat, 28.10.2006
  6. junger Mac

    junger Mac Thread StarterMacUser Mitglied

    Mitglied seit:
    19.11.2005
    Beiträge:
    113
    Zustimmungen:
    0
    @ qfat

    Ws meinst du mit
    1: mit ner for schleife alles nullen
    2: eleganter: den array mit calloc() erzeugen

    Ich habe doch oben alle int Variablen auf Null gesetzt??!!
    Wobei funzt das eigentlich: zahl[10] =0; //??
     
    junger Mac, 28.10.2006
  7. qfat

    qfatMacUser Mitglied

    Mitglied seit:
    30.01.2005
    Beiträge:
    238
    Zustimmungen:
    0
    du hast alles genullt bis auf dein array.

    also dir fehlt:
    for(i=0;i<10;i++) zahl=0;

    oder du erzeugst das array mit zahl=(int*)calloc(10,sizeof(int));
    (bei der letzten variante das #include <stdlib.h> nicht vergessen)

    wobei du beim calloc() das free() nicht vergessen solltest.

    aber da du mich so fragst solltest du wohl variante 1 nehmen ;) die ist einfacher
     
    qfat, 28.10.2006
  8. junger Mac

    junger Mac Thread StarterMacUser Mitglied

    Mitglied seit:
    19.11.2005
    Beiträge:
    113
    Zustimmungen:
    0
    @ autoexec.bat

    zu2)

    Damit hast du schon recht, das dachte ich mir auch. Ich hatte vorher noch eine Weitere Zeile über zahl[eingabe] = zahl[eingabe]+1;
    Und zwar eine einga_zahl =atoi(eingabe);
    Das sollte bewirken das die eingelesene Zahl in eine Zahl umgewandelt und als int in einga_za abgelegt wird.
     
    junger Mac, 28.10.2006
  9. autoexec.bat

    autoexec.batMacUser Mitglied

    Mitglied seit:
    21.01.2005
    Beiträge:
    2.113
    Zustimmungen:
    20
    Im Prinzip nicht schlecht. Nur falsch benutzt (deshalb auch der Tipp mit dem -Wall). Der Funktion atoi musst du einen Pointer mitgeben, also atoi(&eingabe) dann sollte es funktionieren.

    Und natürlich free(zahl) nicht vergessen wenn du das Array nicht mehr brauchst. Sonst gibts ein Speicherleck. ;)
     
    autoexec.bat, 28.10.2006
  10. El Jarczo

    El JarczoMacUser Mitglied

    Mitglied seit:
    07.07.2004
    Beiträge:
    557
    Zustimmungen:
    9
    Deine Aufgabe ist eigentlich darauf ausgelegt mit hilfe der Ascii Tabelle gelöst zu werden. Dort sind die Bereiche A bis Z, a bis z, sowie 0 bis 9, in Zusammenhängenden Zahlwerten hinterlegt. Die Prüfung ob Zahl, Klein- oder Großbuchstabe vereinfacht sich dann zu einfachen Abfragen, ala

    if ((zeichen >= 65) && (zeichen<=90)) gb++;

    Dabei kann man sich auch den automatischen Cast von char zu int zu Nutze machen. Dann wird nähmlich der Asciiwert des Zeichens ausgewertet. Dein Zahlproblem lässt sich dann auch genz einfach lösen. Schau dir mal die Tabellen an. Das Nullen des Arrays muss natürlich sein.

    Ich hoffe diese Erklärung, und ein BLick auf die Tabelle hilft dir.
     
    El Jarczo, 28.10.2006
Die Seite wird geladen...