Zahl oder nicht Zahl!!!



  • Und da nehmen wir doch bitte isdigit() oder wenn es unbedingt ein händischer Vergleich sein soll -> '0' und '9' statt 48 und 57. Dann ist es wenigstens noch lesbarer und portabel.

    Aber ingesamt wäre mir das zuviel Stress. Ich würde fertige Funktionen wie strtod() und strtol() verwenden. Das Rad neu zu erfinden ist so schrecklich unproduktiv.

    edit: isdigit() mit isalpha() verdreht.



  • @TactX: Der Grund dieses Beispiels dient einmal die Grundkenntnisse von
    C zu üben. Und darum möchte ich keine anderen Funktionen z.B: strrod(),...
    verwenden. Aber trotzdem Danke!

    Mein Code:

    #include<stdio.h>
    
    void main(void)
    {
    char string[30];
    char *p_cPointer;
    char a;
    int index=0;
    int indexp=0;
    int indexn=0;
    char *p_cP2;
    
    printf("Eingabe:");
    scanf("%s",string);/*String einlesen*/
    
    	for(p_cPointer=string;*p_cPointer!='\0';p_cPointer++) /*Inhalte des String bis zum Ende auslesen*/
    	{
    
    	a=*p_cPointer;
    
    		if(a>='0' &&a<='9') /*Prüfen ob es eine Zahl ist*/
    		{
    		index = index+1; /*Counter für die Anzahl der Zahlen*/
    		p_cP2=p_cPointer-1;
    			if(*p_cP2=='-') /*Prüfen ob das Zeichen vorher ein Minus ist, wenn ja->negativ, wenn nein->positv*/
    			{
    			indexn=indexn+1; /*Counter für die Anzahl der Negativen Zahlen*/
    			}
    			else
    			{
    			indexp=indexp+1; /*Counter für die Anzahl der Positven Zahlen*/
    			}
    		}
    
    	}
    
    printf("Es befinden sich %d Zahlen im String\n",index);
    printf("Anzahl der positiven: %d\n",indexp);
    printf("Anzahl der negative: %d\n",indexn);
    }
    

    Danke!!!!!



  • @all

    Hätte da noch eine "kleine 😃 " Frage:

    Ich habe mehrere Variablen oder ein Array in diesem die Variblen
    gespeichert sind.

    Wie vergleiche ich die untereinander um sie dann
    z.B von der kleinsten zu Größten Zahl zu ordnen
    und sie dann wieder in die Variablen oder in das Array zu speichern?

    Sollte ja irgendwie mit einer Schleife gehen oder?



  • Dazu kannst du z.B. qsort() nehmen, Bubblesort und SelectionSort sind auch nicht so schwer, wenn du etwas selbst programmieren möchtest.



  • Normalerweise nimmt man dafür qsort(). Aber da du ja nicht so auf fertige Funktionen stehst, musst du das wohl selbst implementieren.

    Der Bubblesort dürfte einer der einfachsten, aber auch langsamsten sein:
    http://de.wikipedia.org/wiki/Bubblesort

    edit: zu langsam.



  • Ok, jetzt ist es kein Problem mehr!!
    Werde es mal mit Bubblesort probieren.

    @all: Vielen Dank!!!

    mfg
    Mini



  • So, ich schon wieder 😃 !

    Und zwar hätte ich noch eine Frage zu q-sort.

    Def:

    #include <stdlib.h>
      void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );
    

    Es gebt um ein Array, welches mit Int-Werten gefüllt ist.

    1.Parameter: Adresse des Arrays
    2.Parameter: Die Anzahl der Int-Variablen in meinem Array
    3.Parameter: Byte Anzahl eines Elementes meines Arrays-> Die Byte-Anzahl von Int
    4.Parameter: ?????????????????????????????

    Was ist der 4.Parameter?

    Danke!!!!



  • int compare(void *a, void *b)
    {
        return irgendwas; // -1, 0 oder 1, je nach dem, wie sich a zu b verhaelt
    }
    
    qsort(buf, buflen, sizeof(buf[0]), compare);
    


  • Ok, es funktioniert!

    Aber was macht dies Funktion "compare! überhaupt
    bzw. warum braucht man die überhaupt?
    Ok, sie gibt entwender 1,0 oder -1 zurück!

    Bei meinem Bsp. werden die Arrays vom kleinsten Wert zum
    größten geordnet.
    Kann man mit dieser Funktion auch vom Größten zum Kleinsten ordnen?
    Wenn ja wie?

    #include<stdio.h>
    #include<stdlib.h>
    
    // Bubble-Sort: Sortieren eines Arrays
    int compare( const void* a, const void* b );
    
    void main(void)
    {
    int array1[5]={1,-2,0,3,5};
    int array2[5]={1,-2,0,3,5};
    int i,j,Zwischenwert;
    int size_array=5;
    
    /* Sortieren selbst programmiert
    for(i=0;i<size_array;i++)
    {
    	for(j=i+1;j<size_array;j++)
    	{
    		if(array2[i]<array2[j])
    		{
    		Zwischenwert=array2[j];
    		array2[j]=array2[i];
    		array2[i]=Zwischenwert;
    		}
    	}
    }
    */
    
    /* mit qsort  void qsort= qsort( array, array_size, sizeof(int), compare_ints );*/
    
    qsort(array2, size_array, sizeof(int), compare);
    
    printf("\nVorher Nachher");
    printf("\n %d     %d\n",array1[0],array2[0]);
    printf("\n %d     %d\n",array1[1],array2[1]);
    printf("\n %d     %d\n",array1[2],array2[2]);
    printf("\n %d     %d\n",array1[3],array2[3]);
    printf("\n %d     %d\n",array1[4],array2[4]);
    
    }
    
    int compare( const void* a, const void* b )
    { 
    
    int* arg1 = (int*) a;
    int* arg2 = (int*) b;
    if( *arg1 < *arg2 ) return -1;
    else if( *arg1 == *arg2 ) return 0;
    else return 1;
    
    }
    


  • Mini1982 schrieb:

    Aber was macht dies Funktion "compare! überhaupt
    bzw. warum braucht man die überhaupt?

    Um qsort() mitzuteilen, welches der zu vergleichenden Werte größer/kleiner/gleich ist.

    Mini1982 schrieb:

    Ok, sie gibt entwender 1,0 oder -1 zurück!

    Genauer: Sie gibt entweder 0, eine Zahl größer 0 oder eine Zahl kleiner 0 zurück.

    Mini1982 schrieb:

    Bei meinem Bsp. werden die Arrays vom kleinsten Wert zum
    größten geordnet.
    Kann man mit dieser Funktion auch vom Größten zum Kleinsten ordnen?
    Wenn ja wie?

    Indem man die Vergleichsfunktion entsprechend abändert.

    btw, deine Vergleichsfunktion kann man auch einfacher mit einer Subtraktion lösen.



  • Passt, ich hab es überissen 😃 !

    Hat zwar lang gedauert aber es funktioniert 😃 !

    @all: Thanks

    mfg
    Mini


Anmelden zum Antworten