Array aufsteigend oder absteigend oder gemischte Reihenfolge?



  • der-ulf schrieb:

    es gibt im c gar keine objekte mensch

    gibt's wohl. exemplare von primitiven typen und structs sind z.b. objekte.
    🙂



  • ne das heißt dann anders 💡



  • ~fricky schrieb:

    der-ulf schrieb:

    es gibt im c gar keine objekte mensch

    gibt's wohl. exemplare von primitiven typen und structs sind z.b. objekte.
    🙂

    Alle Instanzen von irgendwelchen Typen sind Objekte.



  • ascda schrieb:

    ne das heißt dann anders

    und wie?
    🙂



  • hm das müsste ich jetzt im c standard 80.48 revision 294.d2r2008 oder so nchgucken, aber da frag mal lieber einen der üblichen schlaumeier 🕶



  • Hallo,

    3.15 Object

    [#1] A region of data storage in the execution environment,
    the contents of which can represent values. Except for
    bit-fields, objects are composed of contiguous sequences of
    one or more bytes, the number, order, and encoding of which
    are either explicitly specified or implementation-defined.
    When referenced, an object may be interpreted as having a
    particular type; see 6.2.2.1.

    Den Schlaumeier-Titel gebe ich allerdings gerne an andere weiter... 😉

    MfG,

    Probe-Nutzer



  • Ja folgendes hab jetzt a bisserl herum programmiert:
    Sieht so aus:

    #include <stdio.h>
    #include <conio.h>
    
    void main()
    {
    	int Feld[5],i;
    	int Absteigend=0,Aufsteigend=0;
    
    	for(i=0;i<5;i++)
    	{
    
    		printf("Wert:");
    		scanf("%d",&Feld[i]);
    	}
    
    	for(i=0;i<5;i++)
    	{
    		if(Feld[i]<=Feld[i+1])
    		{
    			Aufsteigend++;
    
    		}
    		 if(Feld[i]>=Feld[i+1])
    		{
    			Absteigend++;
    
    		}
    	printf("Auf:%d\n",Aufsteigend);	
    	printf("Ab:%d\n",Absteigend);
    	}
    
    	if(Aufsteigend==5)
    	{
    printf("Aufsteigend sortiert");
    	}
    	else if(Absteigend==4)
    	{
    		printf("Absteigend sortiert");
    	}
    	else
    	{
    		printf("Gemischte Reihenfolge");
    	}
    
    	fflush(stdin);
    		getchar();
    }
    

    Aber da gibts ein kleines Probelm:
    Wenn ich 1,2,3,4,5 eingib gibt er mir aus aufsteigend od. 1,1,2,3,4...etc.
    Das passt so weit aber wenn ich 5,5,4,3,2 eingib oder so was dergleichen zählt er mir 1 xAufsteigende und 4 Absteigend wieso?Ich versteh generell die Vedingung ==4, ==5 nicht.da passt was nicht!

    Sorry hät gleich den Code reinstellen sollen! 😞
    lg Stefanos



  • for(i=0;i<5;i++) 
        { 
            if(Feld[i]<=Feld[i+1]) 
            { 
                Aufsteigend++; 
    
            } 
             if(Feld[i]>=Feld[i+1]) 
            { 
                Absteigend++; 
    
            }
    

    Der Teil ist bedenklich, da du hier einen Vergleich Feld[4] mit Feld[5] durchführst, und das obwohl du nur ein Array mit 5 Feldern deklariert hast (0 bis 4).



  • Stefanos schrieb:

    Ja folgendes hab jetzt a bisserl herum programmiert:
    Sieht so aus:

    #include <stdio.h>
    #include <conio.h>
    
    void main()
    {
    	int Feld[5],i;
    	int Absteigend=0,Aufsteigend=0;
    
    	for(i=0;i<5;i++)
    	{
    
    		printf("Wert:");
    		scanf("%d",&Feld[i]);
    	}
    
    	for(i=0;i<5;i++)
    	{
    		if(Feld[i]<=Feld[i+1])
    		{
    			Aufsteigend++;
    		
    		}
    		 if(Feld[i]>=Feld[i+1])
    		{
    			Absteigend++;
    			
    		}
    	printf("Auf:%d\n",Aufsteigend);	
    	printf("Ab:%d\n",Absteigend);
    	}
    
    	if(Aufsteigend==5)
    	{
    printf("Aufsteigend sortiert");
    	}
    	else if(Absteigend==4)
    	{
    		printf("Absteigend sortiert");
    	}
    	else
    	{
    		printf("Gemischte Reihenfolge");
    	}
    
    	
    	
    
    	
    		
    	
    
    	
    
    	
    	fflush(stdin);
    		getchar();
    }
    

    Aber da gibts ein kleines Probelm:
    Wenn ich 1,2,3,4,5 eingib gibt er mir aus aufsteigend od. 1,1,2,3,4...etc.
    Das passt so weit aber wenn ich 5,5,4,3,2 eingib oder so was dergleichen zählt er mir 1 xAufsteigende und 4 Absteigend wieso?Ich versteh generell die Vedingung ==4, ==5 nicht.da passt was nicht!

    Sorry hät gleich den Code reinstellen sollen! 😞
    lg Stefanos

    Wieso verstehst du eigentlich dein selbst programmiertes nicht ???



  • Wer sortiert Dein Array eigentlich? Ich meine, wo kommt das sortierte Array her?



  • Derzeit gibt er es noch per Hand ein, ist generell aber doch Jacke wie Hose, oder ?

    for(i=0;i<5;i++)
        {
    
            printf("Wert:");
            scanf("%d",&Feld[i]);
        }
    


  • Nein, ist es nicht. Wenn er später eh vorher sortiert, müsste er es nicht mehr prüfen. Anfänger kommen trotzdem manchmal auf komische Ideen...



  • @Tachyon Vielleicht soll anhand dieser Zeilen ja gerade entschieden werden, ob ein Sortieralgorithmus eingesetzt werden soll. Außerdem schadet ein wenig Programmierpraxis - auch wenn sie unnötig ist - dem Lernenden nicht.

    @Stefanos

    fflush(stdin);
    

    Das ist kein ANSI C, siehe (http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html)



  • Korhil schrieb:

    @Tachyon Vielleicht soll anhand dieser Zeilen ja gerade entschieden werden, ob ein Sortieralgorithmus eingesetzt werden soll. Außerdem schadet ein wenig Programmierpraxis - auch wenn sie unnötig ist - dem Lernenden nicht.

    Auch wieder war-

    Korhil schrieb:

    @Stefanos

    fflush(stdin);
    

    Das ist kein ANSI C, siehe (http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html)

    Klar ist das ANSI C. Nur das Verhalten ist undefiniert.



  • Tachyon schrieb:

    Korhil schrieb:

    @Tachyon Vielleicht soll anhand dieser Zeilen ja gerade entschieden werden, ob ein Sortieralgorithmus eingesetzt werden soll. Außerdem schadet ein wenig Programmierpraxis - auch wenn sie unnötig ist - dem Lernenden nicht.

    Auch wieder war-

    Korhil schrieb:

    @Stefanos

    fflush(stdin);
    

    Das ist kein ANSI C, siehe (http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html)

    Klar ist das ANSI C. Nur das Verhalten ist undefiniert.

    Okay, aber ist etwas undefiniertes akzeptabler ?



  • Hallo,

    was hälst du von folgender Lösung? Die Funktion hat eine Signatur analog zu qsort aus der Standardbibliothek; sie kann auf Arrays beliebigen Typs abgeschossen werden und auch die Vergleichsfunktion wird übergeben.

    Grüße
    Martin

    #include <stdlib.h>
    #include <stdio.h>
    
    #define UNORDERED 0
    #define ASCENDING 1
    #define DESCENDING 2
    
    int asc_descending(void *base, size_t nmemb, size_t size,
    		   int (*compar) (const void *, const void *))
    {
    	register unsigned char *i, *r;
    	int res = ASCENDING | DESCENDING;
    
    	i = r = base;
    	r += --nmemb * size;
    
    	while (i < r) {
    		int c = (*compar) (i, i + size);
    		if (c < 0)
    			res &= ~DESCENDING;
    		else if (c > 0)
    			res &= ~ASCENDING;
    		i += size;
    	}
    
    	return res;
    }
    
    static int cmp(const void *p1, const void *p2)
    {
    	return *(const int *)p1 - *(const int *)p2;
    }
    
    int main()
    {
    	int v[] = { 0, 1, 1, 2, 3, 5, 8 };
    	/* int v[] = { 8, 5, 3, 2, 1, 1, 0 }; */
    	/* int v[] = { 8, 5, 0, 1, 3, 2, 1 }; */
    	size_t n = sizeof(v) / sizeof(int);
    
    	switch (asc_descending(v, n, sizeof(int), &cmp)) {
    	case ASCENDING:
    		printf("aufsteigend\n");
    		break;
    	case DESCENDING:
    		printf("absteigend\n");
    		break;
    	case UNORDERED:
    		printf("unsortiert\n");
    		break;
    	default:
    		printf("Autsch!\n");
    	}
    
    	return EXIT_SUCCESS;
    }
    

Anmelden zum Antworten