tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
29
ZUGRIFFE
10063
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    sirhC6 sirhC6 ist offline Mitglied
    Registriert seit
    Jul 2007
    Beiträge
    16
    Hallo erstmal zusammen....
    bin neu hier im Forum und wollte mich erstmal vorstellen...

    komme aus Stuttgart und studiere im ersten Semester Softwaretechnik und Medieninformatik an der FH Esslingen.

    Nun zu meinem Problem...für Euch warscheinlich gar kein Problem.
    Und zwar will ich einen Array aus 4 Zahlen anlegen. Die vier Zahlen werden vom User über die Tastatur eingegeben. Nun soll mein Programm die kleinste der Zahlen ermitteln und wieder ausgeben. D.h. Nummer der Komponente und deren Wert....

    ich komme nicht weiter an der Stelle an der ich den kleinsten Wert bestimmen lassen soll..
    wie geht dass?


    Danke schon mal im Vorraus für Hilfe.
     

  2. #2
    Registriert seit
    Oct 2003
    Beiträge
    1.706
    Hallo,

    schau doch mal:
    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    #include <stdio.h>
     
    int main()
    {
        int array[] = {12, 132,32,432,-321,321,-32, 1};
        int min, i = 0;
     
        min = array[0];
        for (; i < sizeof(array) / sizeof(int); i++) {
            if (array[i] < min)
                min = array[i];
        }
        printf("min = %d\n", min);
     
        return 0;
    }

    Gruß,
    RedWing
     
    "I'm not deaf, I'm ignoring you"
    ----

  3. #3
    LukeS LukeS ist offline Mitglied Gold
    Registriert seit
    Apr 2004
    Beiträge
    128
    Willkommen erstmal!

    Es ist eigentlich nicht sehr schwer die kleinste (oder auch die grösste) Zahl aus einem Array herauszufinden.

    - eine Variable "min" deklarieren
    - nimm die erste und die zweite Zahl aus deinem Array
    - vergleiche die zwei Zahlen
    - speichere die kleinere in "min"
    - nimm die nächste Zahl in deinem Array
    - vergleiche sie mit "min"
    - ist sie kleiner als "min" speichere sie in "min". Andernfalls verwirf sie.
    - verfahre so mit jeder anderen Zahl in deinem Array

    Pseudocode:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    int nArray[4];
    int min;
     
    for (i=0; i<4; i++)
    {
        nArray[i] = i;  // das Array mit Werten füllen
    }
     
    if (nArray[0] < nArray[1])
       min = nArray[0];
    else
       min = nArray[1];
     
    for (int j=2; j<4; j++)
    {
        if (nArray[j] < min)
            min = nArray[j];
    }
    Es gibt wahrscheinlich effizienteren Code für dieses Problem. Aber wenn dein Array nur vier Elemente enthält, spielt das keine grosse Rolle.

    Gruss LukeS
     

  4. #4
    sirhC6 sirhC6 ist offline Mitglied
    Registriert seit
    Jul 2007
    Beiträge
    16
    [QUOTE=RedWing;1447218]Hallo,

    schau doch mal:
    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    #include <stdio.h>
     
    int main()
    {
        int array[] = {12, 132,32,432,-321,321,-32, 1};
        int min, i = 0;
     
        min = array[0];
        for (; i < sizeof(array) / sizeof(int); i++) {
            if (array[i] < min)
                min = array[i];
        }
        printf("min = %d\n", min);
     
        return 0;

    Ne Frage zu deinem Programm.....
    wie kommst du auf die Werte in deinem array[] (12,132,,,,)
    Woher weiss ich dass min=array[0] ist?

    Sorry bin noch nicht so fit mit pointern und arrays....
    Geändert von sirhC6 (03.07.07 um 18:37 Uhr)
     

  5. #5
    Avatar von fluessig
    fluessig fluessig ist offline Royal Blue
    Registriert seit
    Sep 2002
    Ort
    München
    Beiträge
    1.561
    Blog-Einträge
    7
    min = array[0] ist nur die initialisierung und wird dann überschrieben, sobald ein kleinerer Wert gefunden wird. Die Zeile ist eigentlich überflüssig, da die for-Schleife sowieso mit i = 0 beginnt.

    Die Werte sind von ihm beliebig gewählt worden, damit er dir ein lauffähiges Beispiel bieten kann.

    Was ich nicht verstehe ist: sizeof(array) / sizeof(int) - was soll das denn?
     
    Bitte gelöste Threads als erledigt kennzeichnen. Über ein Danke freut sich ein jeder Helfer.

  6. #6
    Avatar von Online-Skater
    Online-Skater Online-Skater ist offline Mitglied Brillant
    Registriert seit
    Sep 2004
    Ort
    Rostock
    Beiträge
    891
    @fluessig

    Der Ausdruck liefert die Größe des Array oder anders gesagt die Anzahl der Arrayelemente.
    Code c:
    1
    2
    3
    4
    5
    
    // für Redwings Beispiel
    sizeof(array); // array setzt sich aus Datentyp int * 8(Werte) zusammen
    sizeof(int);    // Daten typ int besetzt 4 Bytes
    // daraus folgt 4Bytes*8 =32Bytes
    sizeof(array) / sizeof(int) // 32:4 = 8 ->Werte somit läuft die Schleife dynamisch egal wieviel Werte

    Hoffe ich hab das so richtig verstanden
     

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von fluessig Beitrag anzeigen
    min = array[0] ist nur die initialisierung und wird dann überschrieben, sobald ein kleinerer Wert gefunden wird. Die Zeile ist eigentlich überflüssig, da die for-Schleife sowieso mit i = 0 beginnt.
    Nein, die Zeile ist nicht überflüssig, da wenn man sie wegläßt min mit einem zufälligen Wert belegt wird der theoretisch kleiner sein kann als alle anderen Elemente in dem Array. Man könnte höchstens i mit 1 initialisieren.

    Zitat Zitat von fluessig Beitrag anzeigen
    Was ich nicht verstehe ist: sizeof(array) / sizeof(int) - was soll das denn?
    Das hat ja Online-Skater schon erklärt. Noch besser ist allerdings wenn man es unabhängig vom Typ der Arrayelemente macht:
    Code c:
    1
    
    unsigned length = sizeof(array)/sizeof(array[0]);
    Dann ist egal, ob da nun int oder float oder irgendwas in dem Array gespeichert wird - es wird immer die Anzahl der Elemente berechnet.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    Registriert seit
    Oct 2003
    Beiträge
    1.706
    Hallo,
    Zitat Zitat von deepthroat Beitrag anzeigen
    Noch besser ist allerdings wenn man es unabhängig vom Typ der Arrayelemente macht:
    Code c:
    1
    
    unsigned length = sizeof(array)/sizeof(array[0]);
    Dann ist egal, ob da nun int oder float oder irgendwas in dem Array gespeichert wird - es wird immer die Anzahl der Elemente berechnet.

    Gruß
    ich denke mittlerweile das in dem Fall die Verwendung eines Makros zur Bestimmung der Größe eines Arrays mehr Sinn macht, da
    1. sizeof eh nur bei Elementen Sinn macht die in ihrer "statischen" Größe variieren können (also bei Datentypen auf verschiedenen Architekturen)
    2. das Konstrukt IMO nur die Leserlichkeit des Codes verschlechtert
    Arrays sind sowieso immer gleich in ihrer Größe, von daher ist die Verwendung eines Makros wahrsch. leserlicher ...
    Code c:
    1
    2
    3
    4
    5
    6
    
    #define ARRAY_SIZE 8
    ...
      int array[ARRAY_SIZE] = {12, 132,32,432,-321,321,-32, 1};
    ...
      for (; i < ARRAY_SIZE; i++) {
    ...

    Gruß,
    RedWing
     
    "I'm not deaf, I'm ignoring you"
    ----

  9. #9
    sirhC6 sirhC6 ist offline Mitglied
    Registriert seit
    Jul 2007
    Beiträge
    16
    Also vielen Dank erstmal für Eure Mühe....

    ich hab mich jetzt mal an RedWings Methode gehalten, da ich die verstehe....
    Ihr dürft nicht vergessen das ich erst im ersten Semester bin und noch nicht all zu viel drauf hab....

    Vielen Dank nochmal an alle..
     

  10. #10
    sirhC6 sirhC6 ist offline Mitglied
    Registriert seit
    Jul 2007
    Beiträge
    16
    kurze Frage noch.......
    wie weise ich die vom User eingegebenen Werte dem Array zu? Will nicht jede einzelne Komponente einzeln zuweisen.
    Code c:
    1
    
    scanf("%d %d %d %d", &ar[0],&ar[1],&ar[2],&ar[3]);
    das muss doch eleganter gehen. Wenn mein array aus 100 Komponenten bestehen würde wär das doch ein Unding...


    Ach ja ich will auch noch die Array Komponente ausgeben lassen. Wenn ich aber printf(".......%d",ar[i]) ausgeben lasse schreit der mit eine riesen Zahl hin... Ich poste jetzt noch mal meinen ganzen code:

    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    #include <stdio.h>
    #define ARRAY_SIZE 4
     
    int main (void)
    {
        int ar[4];
        int min, i=0;
        
        printf("Bitte 4 Zahlen eingeben:\n");
        scanf("%d %d %d %d",&ar[0],&ar[1],&ar[2],&ar[3]);
     
        min=ar[0];
        for(;i<sizeof(ar)/sizeof(int);i++)
        {
            if(ar[i]<min)
                min = ar[i];
        }
        printf("Der Kleinste Wert des Arrays ist '%d' und befindet sich in %d.\n",min,ar[i]);
        return 0;
    }
    Geändert von sirhC6 (03.07.07 um 18:36 Uhr)
     

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    1. Bitte verwende für deinen Code die entsprechenden Tags: [c]..[/c] für C - [cpp]...[/cpp] für C++ usw..

    2. Wozu definierst du die ARRAY_SIZE Variable wenn du sie gar nicht benutzt?

    Zitat Zitat von sirhC6 Beitrag anzeigen
    kurze Frage noch.......
    wie weise ich die vom User eingegebenen Werte dem Array zu? Will nicht jede einzelne Komponente einzeln zuweisen.

    scanf("%d %d %d %d", &ar[0],&ar[1],&ar[2],&ar[3]);

    das muss doch eleganter gehen. Wenn mein array aus 100 Komponenten bestehen würde wär das doch ein Unding...
    Das Zauberwort heißt hier Schleife.


    Zitat Zitat von sirhC6 Beitrag anzeigen
    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
        int ar[4];
        int min, i=0;
        
        printf("Bitte 4 Zahlen eingeben:\n");
        scanf("%d %d %d %d",&ar[0],&ar[1],&ar[2],&ar[3]);
     
        min=ar[0];
        for(;i<sizeof(ar)/sizeof(int);i++)
        {
            if(ar[i]<min)
                min = ar[i];
        }
        printf("Der Kleinste Wert des Arrays ist '%d' und befindet sich in %d.\n",min,ar[i]);
    Du solltest dir mal ganz in Ruhe überlegen was bei der Ausführung des Programmes passiert und welchen Wert die Variablen haben. Mach dir am besten eine Tabelle wo du mitschreibst wie sich der Wert der Variablen ändert.

    Du meinst ja offensichtlich, dass die Variable i nach der Schleife den Index des Minimums enthält. Der Wert der Variablen i ist aber nicht mehr kleiner als "sizeof(ar)/sizeof(int)", denn sonst wäre die Schleife ja nicht beendet worden.

    Wenn dein Array die Größe 4 hat; also 4 Elemente darin gespeichert werden können, welchen Wert hat i dann nach der Schleife? Und ist es in Ordnung dann auf das i-te Element des Arrays mit
    Code c:
    1
    
    ar[i]
    zuzugreifen?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  12. #12
    sirhC6 sirhC6 ist offline Mitglied
    Registriert seit
    Jul 2007
    Beiträge
    16
    Bin gerade dabei da nochmal durchzusteigen.

    Aber könntest du mit diese Zeile nochmal für dummies erklären.... bitte:
    Code c:
    1
    
    i<sizeof(ar)/sizeof(int)
    Geändert von sirhC6 (03.07.07 um 18:36 Uhr)
     

  13. #13
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von sirhC6 Beitrag anzeigen
    Bin gerade dabei da nochmal durchzusteigen.

    Aber könntest du mit diese Zeile nochmal für dummies erklären.... bitte:

    i<sizeof(ar)/sizeof(int)
    sizeof ist ein Operator der die Größe in Bytes der übergebenen Variable oder Typs bestimmt.

    Nehmen wir an, ar ist ein Array von int und ist folgendermaßen definiert:
    Code c:
    1
    
    int ar[8];
    D.h. ar ist ein Array von 8 Elementen und es können also 8 int's darin gespeichert werden.

    Um einen int zu Speichern braucht man üblicherweise 4 Byte. Wenn man nun 8 Stück davon speichern will, braucht man....... 32 Byte.

    Mit sizeof kann man jetzt den Speicherbedarf von ar bestimmen und auch den Speicherbedarf eines int.

    D.h. sizeof(ar) gibt die Gesamtgröße des Arrays zurück und sizeof(int) den Bedarf eines Elementes des Arrays.

    Wenn man weiß wie groß das gesamte Array ist, und man auch weiß wie groß ein einzelnes Element ist (alle Elemente sind gleich groß), kann man einfach durch Division die Anzahl der Elemente ermitteln.

    Das heißt für das Array ar ergibt sich "sizeof(ar)/sizeof(int)" = 8. Es kommt also immer der Wert heraus, der bei der Definition in den eckigen Klammern angegeben wurde.

    Man könnte auch den Wert immer manuell in der Schleife anpassen wenn man die Größe des Arrays bei der Definition ändert, aber das ist ziemlich fehleranfällig weil man es irgendwann doch vergisst.

    Ach, und der Vergleich
    Code c:
    1
    
     i < szieof(ar) / sizeof(int)
    ist der übliche kleiner als Vergleich.


    Gruß
    Geändert von deepthroat (03.07.07 um 18:19 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  14. #14
    sirhC6 sirhC6 ist offline Mitglied
    Registriert seit
    Jul 2007
    Beiträge
    16
    Okay super danke, hab ich verstanden....

    dann könnte ich auch schreiben:

    Code c:
    1
    
    for(;i<4;i++)

    und warum wird hier der Startwert nicht gebraucht?

    in der Art von:

    Code c:
    1
    
    for(i=0;i<4;i++)
     

  15. #15
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von sirhC6 Beitrag anzeigen
    Okay super danke, hab ich verstanden....

    dann könnte ich auch schreiben:

    Code c:
    1
    
    for(;i<4;i++)
    Ja, da ar als "int ar[4];" in deinem Programm definiert ist.

    Zitat Zitat von sirhC6 Beitrag anzeigen
    und warum wird hier der Startwert nicht gebraucht?
    Die Variable i wurde doch bereits bei der Definition initialisiert und hat bereits den Wert 0. (Tabelle machen! )

    Ich ziehe es eigentlich immer vor, die Zählvariable auch in der for-Schleife zu initialisieren. Da hat man einen besseren Überblick.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Array-differenz bestimmen
    Von ala im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 3
    Letzter Beitrag: 23.04.10, 11:19
  2. Array Größe zur Laufzeit bestimmen
    Von Dolphon im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 02.11.08, 11:52
  3. Array-Differenzmenge bestimmen
    Von starforcee im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 3
    Letzter Beitrag: 09.10.08, 17:49
  4. Array größe bestimmen
    Von Winner im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 01.10.07, 13:58
  5. [newbie] Array-Länge bestimmen
    Von LukeS im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 07.02.06, 09:47