Frage zu Strings...



  • Ich hab jetzt noch folgende Aufgabe:

    Die kleinste Zahl einer Liste von n Zahlen findet man durch folgenden Algorithmus:

    Bahupte, die erste Zahl sei die kleinste Zahl. Für die restlichen Zahlen (2,3,...,n) führe aus Falls die Zahlkleiner ist als die derzeit kleinste Zahl dann ist diese Zahl die neue kleinste Zahl.

    Schreiben Sie ein Programm zu diesem Algorithmus. Stellen Sie zusätzlich fest, welche Position (Vektorindex) die kleinste Zahl hat.

    Mein Code:

    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
    
    #define NMAX 100
    
    int main()
    {
    	int i, c, kleinste_zahl, hilfs_var, j;
    	char liste[NMAX];
    
    	i = 0;
    	c = getchar();
    	while(c != '\n')
    	{
    		liste[i] = c;
    		i = i + 1;
    		c = getchar();
    	}
    
    	kleinste_zahl = liste[0];
    
    	for(j=0; j<i; j=j+1)
    	{
    		if(kleinste_zahl > liste[j])
    		{
    			hilfs_var = liste[j];
    			liste[j] = kleinste_zahl;
    			kleinste_zahl = hilfs_var;
    		}
    	}
    
    	printf("Position = %i, kleinste Zahl = %i", j, (kleinste_zahl-48));
    
    return 0;
    }
    

    Das Problem an meinem Code ist wahrschinlich wieder, dass ich keine mehrstelligen Zahlen eingeben kann. ABER: Ist das laut Aufgabe überhaupt gefordert? Aber man soll doch Programme immer so allgemein wie möglich halten; das stimmt doch, oder?



  • wieso ein char array?
    dadurch werden die chars für den vergleich nach int gecasted und die ASCII repräsentation wird verglichen.
    sicher nicht was du wolltest 🙂



  • Hm, das ist immer eigentlich noch das gleiche Problem wie gestern Abend. Ich weiß nicht, wie ich in C eine Benutzereingabe programmiere, die dem Benutzer erlaubt ein int array mit int-Zahlen zu belegen; getrennt z.B. durch Leerzeichen. Folgende Eingabe soll es verdeutlichen:

    Der Benutzer gibt genau das in die Konsole ein:

    12 32 45 56 78 89 123 456 789 -> [ENTER]

    Im Array soll dann folgendes stehen:

    -----------------------------------------------------------------------------
    | 12|032| 32|032| 45|032| 56|032| 78|032| 89|032|123|032|456|032|789|032|010|
    -----------------------------------------------------------------------------
    

    Irgendwie verstehe ich das aber trotzdem nicht. Denn wie soll man denn nun z.B. die ASCII-Zahl "32" für das Leerzeichen von der Zahl 32 die an der zweiten Stelle im Array steht unterscheiden können?



  • bandchef schrieb:

    Hm, das ist immer eigentlich noch das gleiche Problem wie gestern Abend. Ich weiß nicht, wie ich in C eine Benutzereingabe programmiere, die dem Benutzer erlaubt ein int array mit int-Zahlen zu belegen; getrennt z.B. durch Leerzeichen. Folgende Eingabe soll es verdeutlichen:

    Der Benutzer gibt genau das in die Konsole ein:

    12 32 45 56 78 89 123 456 789 -> [ENTER]

    Ich hab Dir doch gestern abend einen funktionierenden Quellcode dafür gepostet ...



  • Du meinst den hier?

    i = 0;
        //getchar();
        scanf("%i", &zahl);
        while(zahl != -1)
        {
            liste[i] = zahl;
            i = i + 1;
            scanf("%i", &zahl);
        }
    


  • Gut, das stimmt... 😃

    Die Abbruchbedingung der Schleife ist aber doch eine -1. Das heißt, damit ich aus der while-Schleife rauskomm, müsste der Benutzer eine -1 reinschreiben. Das ist aber doch auch nicht Sinn der Sache, oder?



  • Ich will mir in meinem Programm die Stelle im Array merken an der die kleinste Zahl gesessen hat.

    Mein Code:

    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
    
    #define NMAX 100
    
    int main()
    {
    	int zahl, liste[NMAX];
    	int i, j, k, t, kleinste_zahl, hilfs_var, zaehler;
    
    	i = 0;
        scanf("%i", &zahl);
        while(zahl != -1)
        {
            liste[i] = zahl;
            i = i + 1;
            scanf("%i", &zahl);
        }
    
    		kleinste_zahl = liste[0];
    		k = 1;
    		zaehler = 0;
    		for(j=k; j<i; j=j+1)				//Suche der kleinsten Zahl
    		{
    			if(liste[j] < kleinste_zahl)
    			{
    				kleinste_zahl = liste[j];
    				zaehler = liste[j];
    			}
    		}
    
    	printf("kleinste Zahl = %i, Index-Stelle = %i\n\n", kleinste_zahl, zaehler);
    
    return 0;
    }
    

    Ich weiß aber nicht wie ich das machen soll. Im zaehler soll sich das gemerkt werden. Kannst du mir helfen wie das gehen soll?



  • zaehler = j;
    


  • #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
    
    #define NMAX 100
    
    int main()
    {
    	int zahl, liste[NMAX], sortiert[NMAX];
    	int i, j, k, kleinste_zahl, stelle;
    
    	i = 0;
        scanf("%i", &zahl);
        while(zahl != -1)
        {
            liste[i] = zahl;
            i = i + 1;
            scanf("%i", &zahl);
        }
    
    	kleinste_zahl = liste[0];
            stelle = 0;
            for(j=1; j<i; j=j+1)                //Suche der kleinsten Zahl
            {
                if(liste[j] < kleinste_zahl)
                {
                    kleinste_zahl = liste[j];
                    stelle = j;
                }
            } 
    
    		printf("kleinste Zahl = %i, Index-Stelle der Zahl = %i", kleinste_zahl, j);
    
    return 0;
    }
    

    Dieser Code liefert für die Zahlenfolge 5,7,9,8,1,4,3,2 zwar die 1 als kleinste Zahl aber die Stelle stimmt nicht. Er gibt mir als Indexstelle eine 8 aus. In Wirklichkeit ist es aber doch die 4... Ehrlich gesagt, hab ich das auch schon ausprobiert...

    Oder hab ich dich falsch verstanden?



  • Dann schau mal, ob du in deiner Ausgabe die richtige Variable ausgibst 😉



  • Ich hab jetzt meinen Code weiter vervollständigt. Jetzt gibts allerdings das Problem, dass bei der Zahlenreihenfolge 5,7,9,8,1,4,3,2 nach dem 5. Durchlauf die 5 in der "liste" zugleich auch die kleinste Zahl ist. Das bedeutet nun, dass er mir an die 6. Stelle wieder die 5 schreibt, obwohl da die 7 kommen würde. Ich weiß aber jetzt wieder nicht an was das liegt!

    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
    
    #define NMAX 100
    
    int main()
    {
    	int zahl, liste[NMAX], hilfs_var;
    	int i, j, k, len_liste, kleinste_zahl, stelle;
    
    	i = 0;
        scanf("%i", &zahl);
        while(zahl != -1)
        {
            liste[i] = zahl;
            i = i + 1;
            scanf("%i", &zahl);
        }
    
    	len_liste = i;
    
    	stelle = 0;
    	k = 0;
    	do
    	{
    		kleinste_zahl = liste[k];
    
    			for(j=k; j<len_liste; j=j+1)                //Suche der kleinsten Zahl
    			{
    				if(liste[j] < kleinste_zahl)
    				{
    					kleinste_zahl = liste[j];
    					stelle = j;
    				}
    			}
    
    		hilfs_var = liste[k];
    		liste[k] = kleinste_zahl;
    		liste[stelle] = hilfs_var;
    		k = k + 1;
    	}while(k != len_liste);
    
    	for(i=0; i<len_liste; i=i+1)
    	{
    		printf("%i", liste[i]);
    	}
    
    return 0;
    }
    


  • Sorry, nun bin ich drauf gekommen: es musste ein "kleiner-gleiche" in die if-Abfrage eingebaut werden!

    Danke für eure Hilfe!


Anmelden zum Antworten