Addieren und Vergleich
-
was denn nu los?
also weiterhin würde ich gerne noch wissen, da in der aufgabenstellung explizit eine funktion erstellt werden soll die analog zur C funktion strcmp arbeiten soll, ob es möglich ist einzelne elemente einer zeichenkette zu durchlaufen, wie ich es zB auch bei einem "char array[]" mit einer for schleife tun könnte?
-
Meinst du selber "strcmp" zu programmieren?
#include <stdio.h> #include <string.h> int equals(const char *str1, const char *str2); int main() { const char *str1 = "asdasL"; const char *str2 = "test"; if (equals(str1, str2) == 0) { printf("Gleich.\n"); } else { printf("Ungleich.\n"); } } int equals(const char *str1, const char *str2) { int i = 0; if (strlen(str1) != strlen(str2)) { return 1; } for (; i < strlen(str1); ++i) { if (str1[i] != str2[i]) { return 1; } } return 0; }
-
kallemalle schrieb:
also ...wenn man sich den quelltext anschaut wird schon sehr deutlich was ich meine. falls nicht - hier die erklärung.
Ähm... NEIN.
MFK schrieb:
kallemalle schrieb:
die kette "1234" wird addiert -> zu "10"
und "123" wird auch addiert -> zu "6"
und nun diese beiden werte verglichen. 6>10 oder 6=10 oder 6<10 .... so!!!Ja, das nennt man üblicherweise "Quersumme", nicht "Addieren". Aber sei's drum.
Das witzige daran ist, dass du ASCII-Ziffern ('0', '1', '2' ...) addierst und nicht die Zeichen (48, 49, 50 ...). Ist das gewollt, oder pure unwissenheit?
kallemalle schrieb:
ich habe in meiner funtion so getan als könnte ich die einzelnen zeichenketten die übergeben werden wie ein array aufsplitten und somit addieren ... da jeht aber nu nich ?!
Was redest Du!? Was heißt da, du hast so getan, als ob? Eine Zeichenkette ist ein Array aus
char
...kallemalle schrieb:
die antwort lautet "strcmp"
Ähm... NEIN.
strcmp
addiert genau garnix. (Und vergleicht auch nicht auf Basis einer Addition.)kallemalle schrieb:
inwiefern meinst du varaiblen initialisieren??
kallemalle schrieb:
int besser(const char* a, const char* b){ int suma,sumb; // suma und sumb sind jetzt genau irgendwas int x = sizeof(a); int y = sizeof(b); for(int i=0;i<x;i++){ suma += a[i]; // suma (irgendwas) plus egal was = keine Ahnung. } /*...*/
Merkst was?
kallemalle schrieb:
und was ich generelll nochmal fragen wollte, wieso heißt es in besser() "const char* a, const char* b" ??? das bedeutet doch, das zwei pointer vom typ const char übergeben werden richtig?
char * foo; // ein Zeiger auf char. char * const foo; // ein konstanter Zeiger auf char. Der Zeiger kann nicht verändert werden. const char * foo; // ein zeiger auf const char. Das Ziel des zeigers kann nicht verändert werden. char const * foo; // dito. const char * const foo; // ein konstanter zeiger auf const char. Weder Zeiger // noch sein Ziel können verändert werden. char const * const foo; // dito.
Dein Problem, Du's IMHO gesagt und ich verstanden habe:
#include <stdbool.h> #include <stdlib.h> #include <ctype.h> #include <string.h> bool cross_sum( unsigned long *sum, const char * const number ) { size_t length = strlen( number ); size_t i; *sum = 0; for( i = 0; i < length; *sum += number[ i++ ] - '0' ) { if( !isdigit( number[ i ] ) ) { return false; } } return true; } typedef enum { cmp_error, cmp_smaller, cmp_equal, cmp_bigger } cmp_t; cmp_t compare( const char * const first, const char * const second ) { unsigned long first_sum; unsigned long second_sum; if( !( cross_sum( &first_sum, first ) && cross_sum( &second_sum, second ) ) ) { return cmp_error; } if( first_sum == second_sum ) { return cmp_equal; } else if ( first_sum < second_sum ) { return cmp_smaller; } return cmp_bigger; } const char * const cmp_msg[ ] = { "Fehler!", "ist kleiner als", "ist gleich", "ist groeßer als" }; int main( ) { const char first[ ] = "123"; const char second[ ] = "1234"; cmp_t result = compare( first, second ); if( result == cmp_error ) { puts( cmp_msg[ result ] ); return EXIT_FAILURE; } printf( "%s %s %s.\n", first, cmp_msg[ result ], second ); return EXIT_SUCCESS; }
So. Und nun geh hin, und ließ dein Lehrbuch!
greetz, Swordfish
-
Ich glaube jetzt habe ich dein Vorhaben auch verstanden!
#include <stdio.h> #include <string.h> int equals(const char *str1, const char *str2); int qsumme(const char *str); int main() { const char *str1 = "311"; const char *str2 = "3"; char *res; int r = equals(str1, str2); switch (r) { case -1: res = "Groesser"; break; case 0: res = "Gleich"; break; case 1: res = "Kleiner"; break; } printf("Ergebnis: %s\n", res); } int equals(const char *str1, const char *str2) { const int res1 = qsumme(str1); const int res2 = qsumme(str2); if (res1 > res2) return -1; if (res1 == res2) return 0; if (res1 < res2) return 1; } int qsumme(const char *str) { int res = 0, i = 0; for (; i < strlen(str); ++i) { res += str[i] - '0'; // :) } return res; }
@Swordfish: Ich halte deinen Quelltext für Overhead, der Junge ist doch jetzt schon überfordert
-
Falls er wirklich
strcmp
mein, dann wüsst' ich gern', wo er addieren will...int my_strcmp( char const * first, char const * second ) { for( ; *first == *second; ++first, ++second ) { if( !( *first || *second ) ) { return 0; } } return *first > *second ? 1 : -1; }
greetz, Swordfish
PS: Oder er will uns veräppeln...
-
*löschmich*
-
jio ...
also ... eigentlich macht die funktion doch exakt das gleich wie meine, die ich als erstes gepostet habe. natürlich ist sie anders aufgebaut, aber wieso klappt sie denn bei mir nicht?
bei strcmp gibt er mir 100% richtige lösungen für meine aufgabe. genauso zuerlässig wie die lösung von BBB - wie erklärt ihr euch das ? ... oder besser ... wie erklärt ihr mir das?
-
kallemalle schrieb:
jio ...
also ... eigentlich macht die funktion doch exakt das gleich wie meine, die ich als erstes gepostet habe. natürlich ist sie anders aufgebaut, aber wieso klappt sie denn bei mir nicht?
bei strcmp gibt er mir 100% richtige lösungen für meine aufgabe. genauso zuerlässig wie die lösung von BBB - wie erklärt ihr euch das ? ... oder besser ... wie erklärt ihr mir das?for(..) {
res += str[i] - '0';
}Ansonsten solltest du beschreiben: WELCHHE Funktion du meinst!
-
jio .... danke .... -'0'
was macht das für einen sinn .. minus 0???
ich bitte um eine erklärung warum dies nötig ist. pls
und bei mir bleibt die frage warum strcmp genau die gleichen ergebnisse liefert...?
-
http://www.wer-weiss-was.de/theme158/article1562436.html
[...]
indem du '0' abziehst. in der ASCII Tabelle hat dez 1 einen wert von 48 und dez. 0 einen von 47, wenn du jetzt 48-47 rechnest, kommt genau 1 raus, und das wäre dein gewünschtes Ergebnis. also behindert dich die typenumwandlung nicht, und machts auch nicht komplizierter, ist nur ein sicher Weg das nichts schiefgehen kann.
[...]
-
strcmp
ist es nicht, das ihr da aufführt.@kallemalle: Könntest Du so gut sein, und die Aufgabenstellung komplett - so wie du sie erhalten hast - posten?
greetz, Swordfish
-
jo mach ich .... da sich die aufgabenstellung ein wenig auf eine vorhergehende aufgabe bezieht hier den link zu der behandelten klausur:
-
Warum sagst du es nicht gleich so?
#include <math.h> #include <float.h> #include <string.h> float average( const char *string ) { unsigned sum = 0; size_t count = 0; while( *string ) { sum += *string - '0'; ++count; ++string; } return count ? sum / ( (float) count ) : 0.0f; } int besser( const char *a, const char *b ) { float average_a = average( a ); float average_b = average( b ); if( fabsf( average_a - average_b ) < FLT_EPSILON ) { return 0; } return average_a < average_b ? -1 : 1; }
greetz, Swordfish