Mal wieder eine Aufgabe



  • Tut mir leid, ich habe den Eindrucke dein Kopf ist, was C betrifft, schon leer.

    Fang nochmal von vorne an. Programmiere die Beispiele nach und spiele mit denen.
    Verändere sie und schau was sich anders verhält.



  • So, in neuer frische, so sollte es ja passen:

    parallel = 0;
    for (j=0;j<anzahl;j++)
    {
    	parallel = parallel + 1/widerstaende[j];
    }
    parallelschaltung = 1/parallel;
    

    und die Reihenschaltung:

    reihe = 0;
    for (k=0;k<anzahl;k++)
    {
    	reihe = reihe + widerstaende[k];
    }
    


  • Geht doch. 👍



  • Der Vollständigkeit halber mal der gesamte Code bis jetzt:

    #include <stdio.h> 
    #include <Windows.h>
    
    int einlesen(float widerstaende[]) { 
    
    	int anzahl=0, i;
    
    	printf("Wie viele Widerstaende moechten Sie berechnen? ");
    	scanf("%i", &anzahl);  
    
        printf("Bitte geben Sie fuer die Widerstaende positive Zahlen groesser als 0 ein.\n\n"); 
    
    	for (i=0;i<anzahl;i++)
    		{
    			printf("Bitte geben Sie den %i. Widerstand in Ohm ein: ", i+1); 
    			scanf("%f", &widerstaende[i]); 
    		}
    	return anzahl;
    } 
    
    double berechnen(char circuit) { 
    	double reihenschaltung, parallelschaltung, parallel=0, reihe=0;
    	int j, k;
            float widerstaende[3]; 	
        double equivRes = 0; 
        circuit ='x'; 
        einlesen(widerstaende);
    
        printf("\nBitte waehlen Sie 'p' fuer Parallelschaltung und 'r' fuer Reihenschaltung: "); 
    
        scanf(" %c", &circuit); 
    
    	for (j=0;j<anzahl;j++) 
    	{ 
    	   parallel = parallel + 1/widerstaende[j]; 
    	} 
    	parallelschaltung = 1/parallel;
    
    	for (k=0;k<anzahl;k++) 
    	{ 
    	   reihe = reihe + widerstaende[k]; 
    	}
    
        switch (circuit) 
        { 
            case 'p': 
            case 'P': 
                        equivRes = parallelschaltung; // Parallelschaltung 
            break; 
            case 'r': 
            case 'R': 
                        equivRes = reihenschaltung; // Reihenschaltung 
            break; 
            default: 
                        printf("\nKein Schaltungstyp gewaehlt."); 
                        equivRes = 0; 
        } 
        return equivRes; 
    } 
    
    void main(char equivRes) { 
        double v = berechnen(equivRes); 
    
    printf ("\n\nDer Ersatzwiderstand ist: %.2f\n", v); 
    //return 0; 
    
    system("PAUSE");
    }
    

    Jetzt muss "anzahl" noch übergeben werden sowie das array "widerstaende" muss dynamisch angelegt werden, hoffe das ist die richtige Bezeichnung.



  • Da musst du dir wohl nochmal im Ablauf vom Programm etwas einfallen lassen.
    Das Array wird in berechnen angelegt.
    Die Größe wird aber erst in einlesen bestimmt. Da ist es bereits zu spät.

    Dein main ist immer noch Müll.

    Schon mal an folgenden Ablauf gedacht:
    Ermitteln der Größe in main .
    Array anlegen (in main )
    Übergabe des Array und Größe an einlesen .
    - im Array stehen jetzt die Werte

    Abfrage des Ersatztyps in main
    Übergabe von Array, Größe und Ersatztyp an berechnen .
    - Rückgabe vom Ersatzwert

    Ausgabe vom Erstzwert in main



  • Ermitteln der Größe in main.
    Array anlegen (in main)

    void main(float widerstaende[], int anzahl) {
    	anzahl = 0;
    
        printf("Wie viele Widerstaende moechten Sie berechnen? "); 
        scanf("%i", &anzahl);   
    	widerstaende[anzahl];
    
    }
    

    Soweit i.O.?



  • Nein.
    Die Parameter von main sind Müll. Immer noch. 🙄
    Ein Array das du einmal definiert hast, kannst du später nicht mehr in der Größe ändern.

    Fang mal mit

    int main(void) {  // Fuer dich die beste der drei Möglichkeiten bei main
    ....
    

    an.



  • int main(void) {
    	int anzahl=0;
    	float widerstaende[];
    
        printf("Wie viele Widerstaende moechten Sie berechnen? "); 
        scanf("%i", &anzahl);   
    	widerstaende[anzahl];
    
    }
    

    'widerstaende': Unbekannte Größe.. 😕



  • Seit C99 kannst du Variablen jederzeit definieren und es gibt auch VLA (Arrays mit variable Länge).

    Also machst du die Definition (das ist das, wo vorne float steht) vom Array nach dem scanf. Mit Angabe der Größe zwschen den []



  • Ja das wenn ich aber folgendes schreibe:

    int main(void) {
    	int anzahl=0;
    
        printf("Wie viele Widerstaende moechten Sie berechnen? "); 
        scanf("%i", &anzahl);   
    	float widerstaende[anzahl];
    

    Bekomme ich einen Syntaxfehler, warum auch immer, vor Typ muss ; stehen..



  • Welchen Compiler und IDE nimmst du denn?



  • Ich nehm Microsoft Visual Studio 2012 mit normalem C-Compiler, sprich ich mach an meine Quellcodedate am Ende des namens ein .c



  • Pech gehabt, Visual Studio unterstützt in C nur C89. Da geht das nicht.

    Dann kannst du
    a) dynamsich Speicher anfordern (mit malloc)
    b) erstmal ein ausreichend großes Feld vorher definieren
    c) einen anderen Compiler nehmen (z.B den gcc und als IDE Code::Blocks)

    a funktioniert immer, ist auch nicht schwer
    b hilft dir erstmal weiter



  • Gut, dann gib ich dem array halt erstmal 20 Elemente oder so.

    int main(void) {
    	int anzahl=0;
    	float widerstaende[20];
    
        printf("Wie viele Widerstaende moechten Sie berechnen? "); 
        scanf("%i", &anzahl);   
    	widerstaende[anzahl];
    
    }
    

    Dann wärs soweit aber echt in Ordnung.?!



  • Was soll denn Zeile 7 darstellen?


Anmelden zum Antworten