for-Schleifen (C) < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:14 So 09.12.2012 | Autor: | Mija |
Hallo, ich habe ein Problem mit zwei Schleifen. Undzwar will ich die Länge von den Diagonalen in einem n-Eck berechnen. Dabei sollen soviele verschiedene Diagonallängen ausgegeben werden, wie es verschiedene Diagonallängen in einem regelmäßigen n-Eck gibt.
Nun bekomme ich zwar bisher soviele Ergebnisse ausgegeben, wie es Diagonallängen gibt. Aber ich bekomme immer nur die zuletzt berechnete Diagonallänge als Ergebnis ausgegeben.
Wenn ich das "return laengeDiagonalen;" in meine erste for-Schleife (die unter den Funktionsdefinitionen) reinziehe, dann kommen jedoch total sinnlose negative Werte heraus.
Hier sind mal die wichtigsten Eckpunkte meines Codes:
#include <stdio.h>
#include <math.h>
#define PI 3.14592653689793
//Funktionsdeklarationen
double klBerechnen(double, int);
double umfangBerechnen(int, double);
double flaecheBerechnen(double,int);
double innererWinkelBerechnen(int);
int anzahlDiagonalen(int);
double laengeDiagonalen(double,int);
//Funktionsdefinitionen
...
double laengeDiagonalenBerechnen(double radius, int anzahlDiagonalen)
{
double laengeDiagonalen;
int i;
for (i=1; i <= anzahlDiagonalen; i++)
{
laengeDiagonalen = 2*radius*sin(2*PI*180/(360*i)); //Umrechnung Grad in Bogenmaß beachten!
}
return laengeDiagonalen;
}
//Main-Programm
int main(void) {
//Definition lokaler Variablen
double radius;
int anzahlEcken;
double kantenlaenge;
double umfang;
double flaeche;
double innererWinkel;
int anzahlDiagonalen;
double laengeDiagonalen;
int k;
//Eingabe
...
//Ausgabe
...
laengeDiagonalen = laengeDiagonalenBerechnen(radius,anzahlDiagonalen);
for (k=1; k <= anzahlDiagonalen; k++)
{
printf("Diagonale k=%d: [mm] %lf\n", [/mm] k, laengeDiagonalen);
}
...
}
/*Codeende*/
Ich weiß, ich muss eine (oder beide?) meiner for-Schleifen in Abhängigkeit von i schreiben, d.h. für die obere in etwa:
double laengeDiagonalenBerechnen(double radius, int anzahlDiagonalen)
{
double laengeDiagonalen[50];
int i;
for (i=1; i <= anzahlDiagonalen; i++)
{
laengeDiagonalen[i] = 2*radius*sin(2*PI*180/(360*i)); //Umrechnung Grad in Bogenmaß beachten!
}
return laengeDiagonalen[i];
}
Aber irgendwie funktioniert das so auch alles noch nicht.
Kann mir bitte jemand behiflich sein?
|
|
|
|
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Hallo Mija,
> Hallo, ich habe ein Problem mit zwei Schleifen. Undzwar
> will ich die Länge von den Diagonalen in einem n-Eck
> berechnen. Dabei sollen soviele verschiedene
> Diagonallängen ausgegeben werden, wie es verschiedene
> Diagonallängen in einem regelmäßigen n-Eck gibt.
>
> Nun bekomme ich zwar bisher soviele Ergebnisse ausgegeben,
> wie es Diagonallängen gibt. Aber ich bekomme immer nur die
> zuletzt berechnete Diagonallänge als Ergebnis ausgegeben.
>
> Wenn ich das "return laengeDiagonalen;" in meine erste
> for-Schleife (die unter den Funktionsdefinitionen)
> reinziehe, dann kommen jedoch total sinnlose negative Werte
> heraus.
>
Da musst Du den Betrag dieses Wertes nehmen.
> Hier sind mal die wichtigsten Eckpunkte meines Codes:
>
> #include <stdio.h>
> #include <math.h>
>
> #define PI 3.14592653689793
>
> //Funktionsdeklarationen
> double klBerechnen(double, int);
> double umfangBerechnen(int, double);
> double flaecheBerechnen(double,int);
> double innererWinkelBerechnen(int);
> int anzahlDiagonalen(int);
> double laengeDiagonalen(double,int);
>
>
> //Funktionsdefinitionen
>
> ...
>
> double laengeDiagonalenBerechnen(double radius, int
> anzahlDiagonalen)
> {
> double laengeDiagonalen;
> int i;
> for (i=1; i <= anzahlDiagonalen; i++)
> {
> laengeDiagonalen = 2*radius*sin(2*PI*180/(360*i));
> //Umrechnung Grad in Bogenmaß beachten!
> }
> return laengeDiagonalen;
> }
>
>
> //Main-Programm
>
> int main(void) {
>
> //Definition lokaler Variablen
> double radius;
> int anzahlEcken;
> double kantenlaenge;
> double umfang;
> double flaeche;
> double innererWinkel;
> int anzahlDiagonalen;
> double laengeDiagonalen;
> int k;
>
> //Eingabe
> ...
>
>
> //Ausgabe
>
> ...
>
> laengeDiagonalen =
> laengeDiagonalenBerechnen(radius,anzahlDiagonalen);
> for (k=1; k <= anzahlDiagonalen; k++)
> {
> printf("Diagonale k=%d: [mm]%lf\n",[/mm]Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
k, laengeDiagonalen);
> }
>
> ...
>
> }
>
>
> /*Codeende*/
>
>
> Ich weiß, ich muss eine (oder beide?) meiner for-Schleifen
> in Abhängigkeit von i schreiben, d.h. für die obere in
> etwa:
>
> double laengeDiagonalenBerechnen(double radius, int
> anzahlDiagonalen)
> {
> double laengeDiagonalen[50];
> int i;
> for (i=1; i <= anzahlDiagonalen; i++)
> {
> laengeDiagonalen = 2*radius*sin(2*PI*180/(360*i));
> //Umrechnung Grad in Bogenmaß beachten!
> }
> return laengeDiagonalen;
> }
>
>
> Aber irgendwie funktioniert das so auch alles noch nicht.
>
Muss des Formel zur Berechnung der Diagonalenlängen nicht so lauten:
[mm]laengeDiagonalen = 2*radius*sin(2*PI*\blue{i}*180/360); [/mm]
Das Feld laengeDiagonalen muss global sein.
> Kann mir bitte jemand behiflich sein?
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:01 So 09.12.2012 | Autor: | Mija |
Danke für den Hinweis zu der Formel! :)
Also jetzt sieht es bei mir so aus:
#include <stdio.h>
#include <math.h>
#define PI 3.14592653689793
//Funktionsdeklarationen
double klBerechnen(double, int);
double umfangBerechnen(int, double);
double flaecheBerechnen(double,int);
double innererWinkelBerechnen(int);
int anzahlDiagonalen(int);
double laengeDiagonalen(double,int,int);
double laengeDiagonalenArray[50];
//Funktionsdefinitionen
...
double laengeDiagonalenBerechnen(double radius, int anzahlDiagonalen, int anzahlEcken)
{
double laengeDiagonalen;
int i;
for (i=1; i <= anzahlDiagonalen; i++)
{
laengeDiagonalenArray[i] = 2*radius*sin(2*PI*i*180/(360*anzahlEcken)); //Umrechnung Grad in Bogenmaß beachten!
laengeDiagonalen = laengeDiagonalenArray[i];
}
return laengeDiagonalen;
}
//Main-Programm
int main(void)
{
//Definition lokaler Variablen
double radius;
int anzahlEcken;
double kantenlaenge;
double umfang;
double flaeche;
double innererWinkel;
int anzahlDiagonalen;
double laengeDiagonalen;
int k;
//Eingabe
...
//Ausgabe
...
laengeDiagonalen = laengeDiagonalenBerechnen(radius, anzahlDiagonalen, anzahlEcken);
for (k=1; k <= anzahlDiagonalen; k++)
{
printf("Diagonale k=%d: [mm] %lf\n", [/mm] k, laengeDiagonalen);
}
return 0;
}
Nun gibt er mir zwei Ergebnisse aus, aber immer nur die kürzeste Diagonale.
|
|
|
|
|
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Hallo Mija,
> Danke für den Hinweis zu der Formel! :)
>
> Also jetzt sieht es bei mir so aus:
>
> #include <stdio.h>
> #include <math.h>
>
> #define PI 3.14592653689793
>
> //Funktionsdeklarationen
> double klBerechnen(double, int);
> double umfangBerechnen(int, double);
> double flaecheBerechnen(double,int);
> double innererWinkelBerechnen(int);
> int anzahlDiagonalen(int);
> double laengeDiagonalen(double,int,int);
> double laengeDiagonalenArray[50];
>
>
> //Funktionsdefinitionen
>
> ...
>
> double laengeDiagonalenBerechnen(double radius, int
> anzahlDiagonalen, int anzahlEcken)
> {
> double laengeDiagonalen;
> int i;
> for (i=1; i <= anzahlDiagonalen; i++)
> {
> laengeDiagonalenArray =
> 2*radius*sin(2*PI*i*180/(360*anzahlEcken)); //Umrechnung
> Grad in Bogenmaß beachten!
> laengeDiagonalen = laengeDiagonalenArray;
> }
> return laengeDiagonalen;
> }
>
>
> //Main-Programm
>
> int main(void)
> {
>
> //Definition lokaler Variablen
> double radius;
> int anzahlEcken;
> double kantenlaenge;
> double umfang;
> double flaeche;
> double innererWinkel;
> int anzahlDiagonalen;
> double laengeDiagonalen;
> int k;
>
> //Eingabe
> ...
>
> //Ausgabe
>
> ...
>
> laengeDiagonalen = laengeDiagonalenBerechnen(radius,
> anzahlDiagonalen, anzahlEcken);
> for (k=1; k <= anzahlDiagonalen; k++)
> {
> printf("Diagonale k=%d: [mm]%lf\n",[/mm]Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
k, laengeDiagonalen);
> }
>
> return 0;
>
> }
>
>
> Nun gibt er mir zwei Ergebnisse aus, aber immer nur die
> kürzeste Diagonale.
In der Funktion laengeDiagonalenBerechnen ist doch das Array
mit den Absolutwerten der Formel zu füllen.
Demach so:
laengeDiagonalenArray[i] =2*radius*abs(sin(2*PI*i*180/(360*anzahlEcken)));
Auszugeben ist doch laengeDiagonalenArray[k].
Willst Du die kürzeste und längste Diagonale bestimmen,
so ist eine Funktion zu schreiben,die das bewerkstelligt.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:47 So 09.12.2012 | Autor: | Mija |
Ich dachte, ich kann mit der Funktion laengeDiagonalenBerechnen schon alle Diagonallängen berechnen lassen? (also nicht nur die kürzeste und längste, sondern soviele wie es verschiedene Diagonallängen in dem betreffenden n-Eck gibt)
So dass ich die dann im Main-Programm nur noch ausgeben lassen muss..
|
|
|
|
|
Hallo Mija,
> Ich dachte, ich kann mit der Funktion
> laengeDiagonalenBerechnen schon alle Diagonallängen
> berechnen lassen? (also nicht nur die kürzeste und
> längste, sondern soviele wie es verschiedene
> Diagonallängen in dem betreffenden n-Eck gibt)
>
Genau so ist es.
> So dass ich die dann im Main-Programm nur noch ausgeben
> lassen muss..
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:34 Mo 10.12.2012 | Autor: | Mija |
Sollte meine Schleife nicht schon dieWerte für ALLE Diagonalen verschiedener Längen ausgeben? (es ist doch eine for-Schleife..)
Oder wo ist mein Denkfehler?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:27 Mo 10.12.2012 | Autor: | link963 |
> Sollte meine Schleife nicht schon dieWerte für ALLE
> Diagonalen verschiedener Längen ausgeben? (es ist doch
> eine for-Schleife..)
>
> Oder wo ist mein Denkfehler?
Natürlich geht das. Aber:
> double laengeDiagonalenBerechnen(double radius, int anzahlDiagonalen, int anzahlEcken)
> {
> double laengeDiagonalen;
> int i;
> for (i=1; i <= anzahlDiagonalen; i++)
> {
> laengeDiagonalenArray[i] = 2*radius*sin(2*PI*i*180/(360*anzahlEcken)); //Umrechnung Grad in Bogenmaß beachten!
Das ist soweit ok.
> laengeDiagonalen = laengeDiagonalenArray[i];
Hier gibst du der Variable "laengeDiagonalen" in jedem Durchlauf einen neuen Wert. Erst nachdem die Schleife alle i abgelaufen hat, wird zum nächsten Schritt gegangen.
> }
> return laengeDiagonalen;
laengeDiagonalen kann nur einen Wert haben. Welcher ist das nach Beenden der for-Schleife ?
> }
> //Main-Programm
> int main(void)
> {
> //Definition lokaler Variablen
> double radius;
> int anzahlEcken;
> double kantenlaenge;
> double umfang;
> double flaeche;
> double innererWinkel;
> int anzahlDiagonalen;
> double laengeDiagonalen;
> int k;
> //Eingabe
> ...
> //Ausgabe
> ...
> laengeDiagonalen = laengeDiagonalenBerechnen(radius, anzahlDiagonalen, anzahlEcken);
> for (k=1; k <= anzahlDiagonalen; k++)
> {
> printf("Diagonale k=%d: $ [mm] %lf\n", [/mm] $ k, laengeDiagonalen);
Für jeden Schleifendurchlauf hat deine Variable "laengeDiagonalen" den gleichen Wert. Du musst hier die Feldwerte laengeDiagonalenArray[k] ausgeben lassen, die du eigentlich alle schon berechnet hast in deiner laengeDiagonalenBerechnen Mehode.
> }
> return 0;
> }
Gruß link963
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:11 So 09.12.2012 | Autor: | felixf |
Moin!
> Muss des Formel zur Berechnung der Diagonalenlängen nicht
> so lauten:
>
> [mm]laengeDiagonalen = 2*radius*sin(2*PI*\blue{i}*180/360);[/mm]
Sollte da nicht noch $n$ auftauchen, da es doch um regelmaessige $n$-Ecke geht?
> Das Feld laengeDiagonalen muss global sein.
Oder an die Funktion uebergeben werden, damit diese dort Werte reinschreiben kann.
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:18 So 09.12.2012 | Autor: | Mija |
Ja, genau, die Formel lautet richtig:
$ laengeDiagonalen = [mm] 2\cdot{}radius\cdot{}sin(2\cdot{}PI\cdot{}\blue{i}\cdot{}180/(360*n)); [/mm] $
|
|
|
|