CwCity Board >>> Programmier Sprachen >>> Kylix, C/C++ etc. >>> isdigit() arbeitet unlogisch
isdigit() arbeitet unlogisch

Seiten: 1
LifeSpirit
Verfasst am: 06.11.2014 um: 18:40 Uhr
 
Cw Posting Dude
Poster Teufel
Beiträge: 72
SPAM:
0% Spam
Hallo ;)

Gegeben sei ein Kommandozeilenprogramm, das per Aufrufparameter eine Ganzzahl bekommt. Berechnet werden soll gemäss Gauss'scher Summenformel die Summe aller natürlichen Zahlen bis zu dieser Zahl. ( N = N * ( N + 1 ) / 2 ).


Quellcode

Bildschirmausgabe beim Testen :
(Sollte wider Erwarten der Screenshot nicht angezeigt werden, einfach auf den Link klicken )



Da kann doch was nicht ganz rund laufen oder?



Before I registered "LifeSpirit" as my nickname, I was known as "BrokenSoul1979".
I deleted the account of BrokenSoul1979 since I can't just change my name.

----

Verwechsle NIEMALS freie Software mit Freeware. Freie Software kann und darf Geld
kosten, Freeware ist in den meisten Fällen unfrei.

----

I don't have anything to do with "Open Source" - what I am using is called "Free Software".

----

Googlest
du noch oder suchst du schon
 



stoerchu
Verfasst am: 06.11.2014 um: 19:59 Uhr
 
Cw Guru
King
Beiträge: 802
SPAM:
0% Spam
( N = N * ( N + 1 ) / 2 )

Die Formel ist fehlerhaft. N kann nicht = N sein in diesem Fall rein vom Syntax her.

probier mal: = (n^2 + n) / 2 oder auch (n * n + n) / 2


de.wikipedia.org/wiki/Gaußsch...

Für diese Rechnung braucht man meines Erachtens kein Kommandozeilenprogramm. :-)





mit vielen Grüssen stoerchu




Letzte Änderung am: 06.11.2014 um: 20:01 Uhr durch: stoerchu
 

markush
Verfasst am: 06.11.2014 um: 22:07 Uhr
 
Dr. CwCity.de
Community God
Beiträge: 3832
SPAM:
0% Spam

isdigit prüft ein Zeichen auf eine Zahl, aber da es schon davor in ein int gewandelt wurde funktioniert es nicht mehr richtig, bzw, überprüft den ascii Code und gibt von 48 (0) bis 57 (9) ein Ergebniss zurück.


int zahl;
if (isdigit(argv[1][0])) // Handelt es sich wirklich um eine Zahl? Dann Ergebnis ausgeben
{
zahl = atoi( argv[1] );
printf( "Ergebnis: %d\n", zahl * (zahl + 1) / 2);
}


Der Link zu meinem Github Profil

Weitere Links:
--> ratgeber---forum.de (Danke für die Unterstützung) <--
 

LifeSpirit
Verfasst am: 06.11.2014 um: 23:08 Uhr
 
Cw Posting Dude
Poster Teufel
Beiträge: 72
SPAM:
0% Spam
  
Zitat von stoerchu

Für diese Rechnung braucht man meines Erachtens kein Kommandozeilenprogramm. :-)


Brauchen nicht - man BRAUCHT streng genommen auch sowas nicht:

#include <stdio.h>

int main()
{
  printf("Hello World\n");
  return 0;
}


Womit ich sagen will - zum Üben ist alles gut ;)

Before I registered "LifeSpirit" as my nickname, I was known as "BrokenSoul1979".
I deleted the account of BrokenSoul1979 since I can't just change my name.

----

Verwechsle NIEMALS freie Software mit Freeware. Freie Software kann und darf Geld
kosten, Freeware ist in den meisten Fällen unfrei.

----

I don't have anything to do with "Open Source" - what I am using is called "Free Software".

----

Googlest
du noch oder suchst du schon
 

bodo4all
Verfasst am: 21.11.2014 um: 21:45 Uhr
 
Cw Aufsteiger
Aufsteiger
Beiträge: 45
SPAM:
0% Spam
isdigit funktioniert schon richtig. Es prüft, ob der angegebene Parameter ein Zeichenkode für eine Ziffer im Bereich 0 bis 9 ist.

Da du allerdings vorher bereits atoi benutzt hast, steht in zahl schon der Wert der als Zeichenkette eingegebenen Zahl. Daher ist die Analyse von markush richtig, dass nur bein Eingaben von 48 bis 57 die Berechnung durchgeführt wird. Denn diese Werte entsprechen den ASCII-Kodes der Ziffern 0 bis 9 - dabei ist unterstellt, dass dein System mit ASCII kodiert.

Die Abfrage mit isdigit ist also überflüssig. Wenn du wissen möchtest, ob überhaupt eine Zahl korrekt angegeben wurde, musst du eine andere Konvertierung benutzen, denn atoi kann keinen Fehler melden. Hier kannst du z. B. sscanf oder strtol einsetzen; bitte lies dann dazu die Beschreibungen.

 

 
Seiten: 1

Folgende User sind hier gerade aktiv:
-

ANZEIGE