Vektoren in C addieren



  • Hallo,

    Ich möchte 5 float Werte in einen Vektor einlesen und zusätzlich 5 double Werte in einen anderen Vektor einlesen. Dann sollen Vektor 1 und Vektor 2 addiert werden.
    Kann mir jemand erklären, wie man das in C machen könnte ? Das würde mir extrem weiterhelfen. Danke sehr !


  • Mod

    Du musst jeden dieser Schritte einzeln durchführen. Deine Beschreibung lässt sich fast 1:1 direkt in C umsetzen. Es gibt keine tolle, vorgefertigte Funktion "lese 5 floats und 5 double und addiere sie". Leg einfach los! So ein Programm braucht keine großen Vorüberlegungen.



  • Das hört sich ja schon mal positiv an. Ich erzeuge dann einfach 2 Arrays eines für die double Werte und das andere für die float Werte. Die beiden müssen dann jeweils die größe 5 haben für je 5 Werte. ?!
    Danke


  • Mod

    Ja.



  • Ich habe jetzt einfach mal ein kleines Programm geschrieben, jeweils mit drei Werten, die Summe kann auch schon gebildet werden.

    Wenn ich jedoch 3 Float und 3 Double Werte einlese, in welchem Datentyp sollte ich das am besten ausgeben (double)?

    #include <stdio.h>
    
    int main() {
    	int i;
    	int a[3];
    	int b[3];
    	int summe[3];
    
    	printf("Bitte einen bzw 6 (sechs) Werte eingeben:\n");
    	scanf_s("%d %d %d", &a[0], &a[1], &a[2]);
    	scanf_s("%d %d %d", &b[0], &b[1], &b[2]);
    	printf("Bestaetigen sie mit ENTER, um Array auszugeben:\n");
    	printf("%d %d %d\n", a[0], a[1], a[2]);
    	printf("%d %d %d\n", b[0], b[1], b[2]);
    	printf("SUMME:   \n");
    	for (i = 0; i < 3; i++) {
    		summe[i] = a[i] + b[i];
    		printf("%d\n", summe[i]);
    		// Werte des Vektors stehen somit untereinander (\n)
    	}
    	system("PAUSE");
    	return 0;
    }
    


  • Fragensteller01 schrieb:

    Wenn ich jedoch 3 Float und 3 Double Werte einlese, in welchem Datentyp sollte ich das am besten ausgeben (double)?

    Fließkommaberechnungen erfolgen mindestens als double . Selbst wenn du nur zwei float -Werte addierst.

    printf kennt nur %f für float und double , da bei Funktionen mit variabler Argumenteliste mindestens double (bei Fließkommawerten)² genommen wird.

    Wenn du nicht gerade sehr große Arrays hast, brauchst du float eigentlich gar nicht mehr nehmen.

    ²Bei Ganzzahltypen wird auf int erweitert.



  • Ich habe den Code mal angepasst, die Werte die nun als Summe und double ausgegeben werden ist sicherlich falsch. Ich hoffe, jemand sieht den Fehler im Programm, ich sehe ihn nicht ?!

    #include <stdio.h>
    
    int main() {
    	int i;
    	float a[3];
    	double b[3];
    	double summe[3];
    
    	printf("Bitte einen bzw 6 (sechs) Werte eingeben:\n");
    	scanf_s("%f %f %f", &a[0], &a[1], &a[2]);
    	scanf_s("%f %f %f", &b[0], &b[1], &b[2]);
    	printf("Bestaetigen sie mit ENTER, um Array auszugeben:\n");
    	printf("%f %f %f\n", a[0], a[1], a[2]);
    	printf("%f %f %f\n", b[0], b[1], b[2]);
    	printf("\nSUMME:   \n");
    	for (i = 0; i < 3; i++) {
    		summe[i] = a[i] + b[i];
    		printf("%f\n", summe[i]);
    		// Werte des Vektors stehen somit untereinander (\n)
    	}
    	system("PAUSE");
    	return 0;
    }
    


  • Der Formatspezifizierer beim Einladen ist falsch, das muss %lf sein:

    #include <stdio.h>
    
    int main(void)
    {
            int i;
            float a[3];
            double b[3];
            double summe[3];
    
            printf("Bitte einen bzw 6 (sechs) Werte eingeben:\n");
            scanf("%f %f %f"   ,&a[0],&a[1],&a[2]);
            scanf("%lf %lf %lf",&b[0],&b[1],&b[2]);
    
            printf("%f %f %f\n",  a[0],a[1],a[2]);
            printf("%f %f %f\n\n",b[0],b[1],b[2]);
    
            printf("SUMME:\n");
            for(i=0;i<3;i++)
            {
                    summe[i]=a[i]+b[i];
                    printf("%f\n",summe[i]);
            }
    
            return 0;
    }
    

    Zumindest bei mir läuft das Programm so.



  • scanf erwartet bei %f Zeiger auf float .
    Bei double musst du %lf im Formatstring angeben.

    DirkB schrieb:

    ..., da bei Funktionen mit variabler Argumenteliste mindestens double (bei Fließkommawerten)² genommen wird.

    Bei scanf werden keine Werte übergeben, sondern Zeiger auf die Speicherstellen. Das ist etwas anderes.

    Die Annahme, dass die Formatspecifier bei scanf und printf die gleiche Funktion haben ist falsch.



  • Vielleicht ist das auch noch interessant. Die Ausgabe, ich denke, dass das so nicht richtig ist ?!

    Eingegeben wurde:
    2.3
    2.2
    2.1
    0.01
    0.02
    0.03

    Als Ausgabe ist dann ca. so etwas gekommen:
    -925596036......0000000000000000000000.0000....
    ....
    ....



  • Ah super jetzt Passt es ! Danke sehr.

    Aber warum genau muss man hier jetzt für double lf bei scanf/printf benutzen ?

    #include <stdio.h>
    
    int main() {
    	int i;
    	float a[3];
    	double b[3];
    	double summe[3];
    
    	printf("Bitte einen bzw 6 (sechs) Werte eingeben:\n");
    	scanf_s("%f %f %f", &a[0], &a[1], &a[2]);
    	scanf_s("%lf %lf %lf", &b[0], &b[1], &b[2]);
    	printf("Bestaetigen sie mit ENTER, um Array auszugeben:\n");
    	printf("%f %f %f\n", a[0], a[1], a[2]);
    	printf("%lf %lf %lf\n", b[0], b[1], b[2]);
    	printf("\nSUMME:   \n");
    	for (i = 0; i < 3; i++) {
    		summe[i] = a[i] + b[i];
    		printf("%lf\n", summe[i]);
    		// Werte des Vektors stehen somit untereinander (\n)
    	}
    	system("PAUSE");
    	return 0;
    }
    


  • Fragensteller01 schrieb:

    Aber warum genau muss man hier jetzt für double lf bei scanf/printf benutzen ?

    Das habe ich schon beantwortet:

    DirkB schrieb:

    printf kennt nur %f für float und double , da bei Funktionen mit variabler Argumenteliste mindestens double (bei Fließkommawerten) genommen wird.

    DirkB schrieb:

    Bei scanf werden keine Werte übergeben, sondern Zeiger auf die Speicherstellen. Das ist etwas anderes.

    Ein float belegt i.A. weniger Speicher als ein double . Die Zeiger darauf haben aber i.A. die gleiche Größe.

    DirkB schrieb:

    Die Annahme, dass die Formatspecifier bei scanf und printf die gleiche Funktion haben ist falsch.

    Das %lf für double bei printf wird von den Compilern akzeptiert und ist seit C11 auch im Standard. (wahrscheinlich aus Resignation)



  • Danke, jetzt habe ich keine Fragen mehr.
    Danke für die schnellen und hilfreichen Antworten !



  • DirkB schrieb:

    Fragensteller01 schrieb:

    Wenn ich jedoch 3 Float und 3 Double Werte einlese, in welchem Datentyp sollte ich das am besten ausgeben (double)?

    Fließkommaberechnungen erfolgen mindestens als double . Selbst wenn du nur zwei float -Werte addierst.

    Sry, aber das ist Bullshit...



  • dot schrieb:

    DirkB schrieb:

    Fragensteller01 schrieb:

    Wenn ich jedoch 3 Float und 3 Double Werte einlese, in welchem Datentyp sollte ich das am besten ausgeben (double)?

    Fließkommaberechnungen erfolgen mindestens als double . Selbst wenn du nur zwei float -Werte addierst.

    Sry, aber das ist Bullshit...

    Ist aber so.



  • <Loriot> Ach </Loriot>
    Wo steht das?
    Die "arithmetic conversions" sagen was anderes. Es wird immer zum ranghöheren Typ (implizit) konvertiert, wenn der Typ beider Operanden unterschiedlich ist.
    Wahrscheinlich verwechselst du das für die Gleitkommatypen mit den Regeln für char/short -> int, oder den default argument promotions.



  • Ihr habt recht.

    Wutz schrieb:

    Wahrscheinlich verwechselst du das für die Gleitkommatypen mit den Regeln für char/short -> int, oder den default argument promotions.

    Ja, außerdem hab ich die floating point promotion bei der Argumentübergabe an Ellipsen falsch verallgemeinert. Gut, dass wir drüber gesprochen haben.


Log in to reply