Forum: PC-Programmierung String auf Ziffern Prüfen


von Yian (Gast)


Angehängte Dateien:

Lesenswert?

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;
}

von Karl H. (kbuchegg)


Lesenswert?

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.

1
int enthaelt_ziffern( const char* str )
2
{
3
  ....
4
}
5
6
int main(void)
7
{
8
  char s[80] = "abcd12345";
9
10
  if( enthaelt_ziffern( s ) )
11
    printf ("Ziffer vorhanden = 1\n");
12
  else
13
    printf ("keine Ziffer vorhanden = 0\n");
14
}

so. Und du schreibst jetzt die Funktion!

von DirkB (Gast)


Lesenswert?

Und probier deine Bedingung
1
if(s[i] > '0' || s[i] < '9')
 mal ruhig für alle Ziffern (sind ja nur 10) und sagen wir mal '!' und 
'A' aus.
(Am besten auf dem Papier)

von Yian (Gast)


Lesenswert?

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');
}

von Thorsten H. (lordvader91)


Lesenswert?

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...

von Yian (Gast)


Lesenswert?

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);
if(str[i] > '0' || str[i] < '9')
{
  printf ("Ziffer vorhanden: 1\n");
}
    else
    {
      printf ("keine Ziffer vorhanden:0\n");
    }

return 1;

return 0;

}

int main(void)
{
  char s[80] = "abcd12345";

  if( enthaelt_ziffern( str ) )
    printf ("Ziffer vorhanden: 1\n");
  else
    printf ("keine Ziffer vorhanden: 0\n");
    system('PAUSE');
}

von Floh (Gast)


Lesenswert?

> 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?

von Karl H. (kbuchegg)


Lesenswert?

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!

von Yalu X. (yalu) (Moderator)


Lesenswert?

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):
1
if(str[i] > '0' || str[i] < '9')

von Karl H. (kbuchegg)


Lesenswert?

>> 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
int enthaelt_ziffern( const char* str )
2
{
3
  ...
4
5
  for( ....
6
  {
7
    if( ..... )
8
      return 1;
9
  }
10
11
  return 0;
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.

von Robert L. (lrlr)


Lesenswert?

>isDigit gibt es auch in C, nur heißt sie
>dort isdigit

und da wundert sich noch jemand, warum man für BR eine 2 bekommt ;-)

von Mike (Gast)


Lesenswert?

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)

von Rainer F. (alles_muss_weg)


Lesenswert?

Ausserdem stimmt die Bedingung
1
if(str[i] > '0' || str[i] < '9')
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).

von Karl H. (kbuchegg)


Lesenswert?

Rainer F. schrieb:
> Ausserdem stimmt die Bedingung
>
1
if(str[i] > '0' || str[i] < '9')
> 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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.