C Programm funktioniert nicht?!!!

junger Mac

Aktives Mitglied
Thread Starter
Dabei seit
19.11.2005
Beiträge
137
Reaktionspunkte
6
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;
}
 
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
 
ja mit Xcode 2.0

Im grunde geht es nur um diesen Teil:


//************************ueberpruefung Ziffer***************************
if( isdigit(eingabe))
{
zahl[eingabe] = zahl[eingabe]+1;
}
}
 
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.
 
@ 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; //??
 
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
 
@ 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 schrieb:
@ 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.
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.

qfat schrieb:
oder du erzeugst das array mit zahl=(int*)calloc(10,sizeof(int));
(bei der letzten variante das #include <stdlib.h> nicht vergessen)
Und natürlich free(zahl) nicht vergessen wenn du das Array nicht mehr brauchst. Sonst gibts ein Speicherleck. ;)
 
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.
 
Hey Leute ein SUPERMEGAHYPERDANKESCHÖN an euch, es läuft!!!!!
In der ja Nein Abfage gibt es leichte Probleme, habe ich eben bemerkt!
Wenn ich mehr als ein Zeichen eingebe deutet er das als "ja", welche einfache bessere Lösungen gibt es denn noch dafür? Aber do {} while{} Schleifen sind dafür in Ordnung in C oder!
Mit goto weis ich geht das noch irgendwie, den Befehl meide ich jedoch =>>> Der ist böse
Warum soll ich mit Compilerflag -Wall compelieren?
Ich weis wie ich den Code als rtf im TextEdit schreibe, im Terminal mit gcc compeliere und es dann aufrufe, oder ein Project mit Xcode 2.0 erstelle und dort compeliere und ausführe. Gibt es einen guten Link der mir eine Gebrauchsanweisung für Xcode auf Deutsch verrät?
Interessant wäre der debug Modus in dem man sieht wie die einzelnen Speicherzellen ihren Wert ändern etc.
Danke nochmal!!:)

Hier nochmal der Code:


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

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

do
{

gb =0;
kb =0;
leer =0;
wort =0;
einga_zahl =0;

for(i =0; i<10; i++)
{
zahl =0;
}

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))
{
einga_zahl =atoi(&eingabe);
zahl[einga_zahl] = zahl[einga_zahl]+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;
}
 
Ich nochmal!

Danke El Jarczo, ich kenne die ASCII und Ansi Tabellen, ich könnte statt den von dir verwendeten Dezimalcode der hinter jedem ASCII Zeichen steckt auch seinen Hex Code verwenden. Wir sollten das Problem an der FH jedoch mit isalpha() lösen!

Der Prof hat einer Studentin auch einen Lösungsansatz gegeben, das unten genannte Programm bleibt gleich, bis auf:

einga_zahl =atoi(&eingabe);
zahl[einga_zahl] = zahl[einga_zahl]+1;

//wird ersetzt durch:

zahl[zeichen-'0']++; //so läuft es an den UNIX Rechnern der FH

Ich weis jedoch nicht was die Zeile macht, bzw bedeutet!
Kann mir das noch wer erläutern?
 
also das ist ganz einfach:
zahl[zeichen-'0'] macht:
also zahl ist dein array so nun wird von dem ascii wert des zeichens der ascii wert der 0 subtrahiert, dadurch kommst du in den zahlen bereich (also wieder auf 0-9).

da ascii 0 (48) - ascii 0 (48) = 0 ist und ascii 9 (57) - ascii 0 (48) = 9 ist :D

so und das ++ erhöht dann den inhalt des arrays um 1.

ich hoffe das hilft dir
 
junger Mac schrieb:
Warum soll ich mit Compilerflag -Wall compelieren?
-Wall schaltet zusätzliche Compilerwarnungen an. Dann kriegst du eine Warnung für alle Codestellen angezeigt, die (nach Meinung des Compilers ;)) nicht ganz sauber programmiert sind. So hättest du z.B. auch eine Warnung bei der atoi-Funktion gekriegt.

einga_zahl =atoi(&eingabe);
zahl[einga_zahl] = zahl[einga_zahl]+1;

//wird ersetzt durch:

zahl[zeichen-'0']++; //so läuft es an den UNIX Rechnern der FH

Ich weis jedoch nicht was die Zeile macht, bzw bedeutet!
Kann mir das noch wer erläutern?
Dann ist aber noch einigen an Arbeit angesagt. :hehehe:

++ ist der Imkrement-Operator, der 1 zu seinem Operanden hinzu addiert (also ist bewirkt vereinfacht gesagt i++ das gleiche wie i = i + 1). Genauso gibt es den Dekrement-Operator --. Davon gibt es jeweils wieder zwei Versionen, nämlich die Präfix-Variante (z.B. ++i) und die Postfix-Variante(z.B. i++). Auf die Unterscheide der Beiden geh ich jetzt mal nicht ein. ;)

Wenn du dir mal die ASCII-Tabelle anschaust wirst du feststellen, dass mit `zeichen-'0'` einfach die Differenz der beiden ASCII-Werte und somit der Integer-Wert deines Zeichens berechnet wird. Das geht deshalb, weil die Zahlenwerte in aufsteigender Reihenfolge in der ASCII-Tabelle auftauchen.

Viel Spaß noch mit C. :hehehe:
 
Über in Inkrement und Dekrement weis ich Bescheid, das jedoch der Compiler das zeichen-'0' in den ASCII umwandelt und dann die äquivalenten Dezimalzahlen voneinander subtrahiert, darüber bin ich gestolpert!
 
Zurück
Oben Unten