Hallo ich habe von meinem Prof. folgenden Aufgabe bekommen.
Es ist eine Funktion enthaelt_ziffern() zu erstellen, die eine von der
aufrufenden Funktion
erhaltene Zeichenkette auf Ziffern überprüft und bei Vorhandensein eine
Eins zurückgibt un
ansonsten eine Null.
Diese Funktion soll mit einem kurzen Programm enthaelt_ziffern.c
getestet werden, das
folgenden Dialog ausgibt (Benutzereingaben in Fettdruck ->lalala):
Zeichenkette eingeben (max. 70 Zeichen, Ende mit RETURN): lalala
Zeichenkette enthaelt keine Ziffern.
und kommen nicht wirklich weiter kann mir einer einen Tipp geben zum
weiteren Vorgehen.
Das habe ich bisher als Quelltext auf die Reihe bekommen aber es
funktioniert noch nicht.
#include <stdio.h>
#include <string.h>
int enthaelt_ziffern(const char *s);
int main(void)
{
int i;
const char *s;
for(i=1; i<strlen(s); i++) /* Überprüfe Ziffern bzw Zahl */
{
if(s[i] > '0' || s[i] < '9')
{
printf ("Ziffer vorhanden = 1\n");
}
else
{
printf ("keine Ziffer vorhanden = 0\n");
}
}
return 1;
}
return 0;
}
Yian schrieb:
Nimm die Aufgabe wörtlich:
> Es ist eine Funktion enthaelt_ziffern() zu erstellen
wo ist deine Funktion?
Schreib die Funktion und du wirst sehen, dass du tatsächlich so
weiterkommst.
> for(i=1; i<strlen(s); i++)
du musst aber nicht in jedem Schleifendurchlauf strlen erneut aufrufen.
Dein String verändert sich ja in der Schleife nicht. D.h. es reicht
einmalig die Länge festzustellen.
So habe das Programm um eine Funktion erweitert bekomme aber jetzt immer
eine Ziffer gemeldet auch wenn sie im String nicht vorhanden ist was
mache ich falsch?
int enthaelt_ziffern( const char* str )
{
printf ("Bitte Zeichenkette eingeben (max. 70 Zeichen, Ende mit
RETURN):\n");
scanf("%s",&str);
}
int main(void)
{
char s[80] = "abcd12345";
if( enthaelt_ziffern( s ) )
printf ("Ziffer vorhanden = 1\n");
else
printf ("keine Ziffer vorhanden = 0\n");
system('PAUSE');
}
Deine Funktion macht jetzt nichts anderes mehr, als die Benutzereingabe
einzulesen.
Du musst in die Funktion auch die Überprüfung, ob der String eine Ziffer
enthält oder nicht, rein packen und als Rückgabewert für die Funktion,
je nach Fall, 1 oder 0...
> komme immer noch nicht weiter kann einer vllt die Funktion berichtigen?
Dann lernst du ja nichts.
Geh einfach noch mal durch die Aufgabenstellung:
- Die Funktion bekommt eine Zeichnkette übergeben -> Parameter
- Diese Zeichenkette durchgehen und nachschauen, ob eine Zahl dabei ist
- Falls ja, die Funktion mit einem Rückgabewert 1 verlassen
- Falls nein, die Funktion mit 0 verlassen
So, genauer kann man das Vorgehen nicht beschreiben, ohne dir die Lösung
hinzuklatschen. Was studierst du eigentlich? Und im wievielten Semester?
Yian schrieb:> komme immer noch nicht weiter kann einer vllt die Funktion berichtigen?>> int enthaelt_ziffern( const char* str )> {> int i;>> printf ("Bitte Zeichenkette eingeben (max. 70 Zeichen, Ende mit> RETURN):\n");> scanf("%s",&str);
Wo in deiner Aufgabenstellung steht denn, dass die Funktion den String
einlesen soll?
Deine Aufgabestellung:
1
Es ist eine Funktion enthaelt_ziffern() zu erstellen, die eine von
2
der aufrufenden Funktion erhaltene Zeichenkette auf Ziffern überprüft
3
und bei Vorhandensein eine Eins zurückgibt und ansonsten eine Null.
#DAS# soll deine Funktion machen. Nicht mehr und nicht weniger!
Von Einlesen steht da in Bezug auf die Funktion nichts!
Steht in der Aufgabenstellung, dass die Funktion in C geschrieben werden
muss?
In Haskell wäre der Rumpf der Funktion sogar noch deutlich kürzer als
ihr Name:
1
enthaelt_ziffern = any isDigit
Ok, ok, ich habe auch noch ein ganz klein wenig was Konstruktives
beizutragen: Die Funktion isDigit gibt es auch in C, nur heißt sie
dort isdigit und ist in ctype.h deklariert. Bevor du diese Funktion
benutzt, solltest du dir aber überlegen, was in dieser Zeile alles
verkehrt ist (wie schon von DirkB angedeutet, sind da gleich mehrere
Fehler drin):
>> komme immer noch nicht weiter kann einer vllt die Funktion berichtigen?
Einen Hinweis geb ich noch.
(Auch wenn ich noch nicht überzeugt davon bin, dass das was bringt. Das
bisher gezeigte ist mehr als konfus. Da hat wer seine bisherigen
Hausaufgaben nicht gemacht, und steht jetzt auf verlorenem Posten)
> - Diese Zeichenkette durchgehen und nachschauen, ob eine Zahl dabei ist> - Falls ja, die Funktion mit einem Rückgabewert 1 verlassen> - Falls nein, die Funktion mit 0 verlassen
Das stellt sich so dar, dass wenn man beim 'Durchgehen' der einzelnen
Zeichen auf eine Ziffer stösst, sofort den return mit 1 einleiten kann.
Denn gefragt ist ja nur, ob irgendein Zeichen eine Ziffer ist. Die erste
Ziffer, die man antrifft reicht dafür schon. Und dann steht auch schon
fest, dass ein return 1 durchzuführen ist.
Kommt man dagegen aus der Schleife raus, ohne jemals auf eine Ziffer
gestossen zu sein, dann ist klar, dass im String keine Ziffer enthalten
sein kann. Denn sonst hätte man sie ja gefunden und einen return 1 dafür
gemacht. D.h. die Tatsache, dass im String keine Ziffer enthalten ist,
ergibt sich als Nebenprodukt und muss gar nicht explizit getestet
werden. Wird die Schleife komplett durchlaufen, dann WISSEN wir, dass
keine Ziffer enthalten sein KANN.
1
intenthaelt_ziffern(constchar*str)
2
{
3
...
4
5
for(....
6
{
7
if(.....)
8
return1;
9
}
10
11
return0;
12
}
> So, genauer kann man das Vorgehen nicht beschreiben, ohne dir die Lösung> hinzuklatschen.
exakt. Noch detailierter und der Zweck der Hausübung ist verfehlt.
Last Yian bloss ungestört weiterschwimmen und lasst uns hoffen dass er
bald untergeht, bzw. durchrasselt und wieder zurück geht um auf dem Bau
zu arbeiten!
Wir brauchen keine unfähige Ing's, die sich nur mit der Hilfe anderer
durchs Leben mogeln können!
Er kann ja immer noch Karierre als Politiker machen, so wie z.B. der
Steinbrück! (Dessen einzige Fähigkeit ist, eine grosse Klappe zu haben)
> nicht ganz. Was passiert mit 0 und 9? Richtig, die grenzt du aus. Die> Bedingung ist nur bei Ziffern von 1 bis 8 wahr (einschliesslich).
Noch nicht mal das.
Wir Menschen sind unglaublich schlampig wenn es um logische
Verknüpfungen geht. Das wir im realen Leben damit durchkommen, liegt
daran, dass deine Zuhörer implizit mitdenken und deine Fehler
automatisch so korrigieren, dass sie nicht das hören was du gesagt hast,
sondern das was du gemeint hast.
Nur: Bei einem Computer ist das anders. Der macht das, was dort steht.
Teste einfach mal mit einem Zeichen 'A'
Ist 'A' größer als '0'? Ja, ist es.
Tatsächlich gilt für jedes einzelne Zeichen, egal welches, dass es
entweder größer als '0' ODER kleiner als '9' ist.