Hi leute!
Ich soll mir einen Sinus ausgeben lassen. Ich soll mit einem Array mit
21 Zeilen à 41 Spalten arbeiten. Meinen ersten Ansatz seht ihr da:
1
#include<iostream>
2
#include<math.h>
3
#include<stdio.h>
4
usingnamespacestd;
5
6
7
intmain()
8
{
9
inti,j;
10
chararray[21][41];
11
doubley_array[21];
12
13
for(i=0;i<=20;i=i+1)//array mit Leerzeichen füllen
14
{
15
for(j=0;j<=40;j=j+1)
16
{
17
array[i][j]=' ';
18
cout<<array[i][j];
19
}
20
}
21
22
23
24
25
system("pause");
26
return0;
27
}
Ich hab mir jetzt mein array mit Leerzeichen auffüllen lassen. Ich weiß
jetzt allerdings nicht mehr weiter. Ich muss mir ja jetzt quasi in mein
Array nur an bestimmen Stellen ein X schreiben lassen. Diese Stellen an
denen das X reinkommt unterliegen ja dieser Sinusfunktion:
y=10*sin(i/(2*PI))+10.
Wie gehts da jetzt weiter? Ich zerbrech mir da jetzt schon seit Stunden
den Kopf darüber!
Könnt ihr mir helfen?
Du hast doch quasi ein Bild mit 41x21 Pixeln, wobei du in jeder Spalte
genau ein "Pixel" setzen musst... Also für jede Spalte den y-WErt
berechnen und das passende "Pixel" auf "X" setzen...
achja, die funktion "round" hilft dir vielleicht noch?
math.h ist ein heißer Kandidat für alle Mathe-Funktionen.
round() gibt es aber dort erst seit ISO-C99, k.A. ob MS das
kennt - müsstest du in deiner Doku nachsehen.
Unter liux steht es bei
man round
for(i=0;i<=20;i=i+1)//array mit Leerzeichen füllen
15
{
16
for(j=0;j<=40;j=j+1)
17
{
18
array[i][j]=' ';
19
}
20
}
21
22
23
for(i=0;i<=40;i=i+1)
24
{
25
y_array[i]=10*sin(i/(2*3.14159265))+10;
26
}
27
28
29
system("pause");
30
return0;
31
}
Ich hab in math.h weder M_PI noch round() drin. Ich hab mir jetzt mit
ner Typumwandlung nach int "runden" lassen. Wie geht's an der Stelle
jetzt weiter? Könnt ihr mir helfen?
Tobias Mehrl schrieb:> Wie geht's an der Stelle> jetzt weiter?
Dann musst du dich entscheiden:
- ob die erste Felddimension das x sein soll und die zweite
das y bz. sin(x), oder umgekehrt
- Überlegen, wie weit der Definitionsbereich gehen soll
(die x, v... bis ...)
- entsprechend überlegen, welches x zu welchem Feldindex gehört
oder umgekehrt welcher Feldindex welchem x entspricht
- analog den Wertebereich ermitteln (y geht von... bis...)
- wieder überlegen, welches y welchem Feldindex entspricht
(jetzt in der anderen Richtung des Feldes)
- dann x von... bis... laufen lassen und die zugehörigen
y im Feld bei [i_x][i_y] oder [i_y][i_x] eintragen
- dann das Feld ausgeben
Sorry, Leute!
Aber ich finde weder round noch pi. Ich würd jetzt mal vorschlagen ich
schreib von hand in die rechnung rein und lasse mit int runden. Leider
funktioniert mein programm immer noch nicht. Könnt ihr mir vielleicht
sagen ob ich auf dem richtigen Weg bin oder auf dem totalen holzweg?
1
#include<iostream>
2
#include<math.h>
3
#include<stdio.h>
4
#include<stdlib.h>
5
usingnamespacestd;
6
7
8
intmain()
9
{
10
inti,j;
11
chararray[21][41];
12
13
for(i=0;i<=20;i=i+1)//array mit Leerzeichen füllen
Ich fragte mich immer wieder warum Leute C++ programmieren und die C
Includes benutzen...
<iostream> -> Hierfür wohl kein C-Include gefunden oder wie?
<math.h> -> <cmath>
<stdio.h> -> <cstdio>
<stdlib.h> -> <cstdlib>
Denke das Prinzip sollte klar sein...
Ansonsten, womit programmierst du?
Dann schreib dir pi und round doch selbst; siehe oben!
Die Funktion floor() gibt es auf jeden Fall in deiner math.h,
versprochen!
Und wie Tim schon sagte: entscheide dich mal, ob C oder C++.
floor() rundet mir ja immer ab; ich finde das ist genauso schlecht wie
Stellen abschneiden. Ich bleibe gleich bei der "int-Rundung". Das PI geb
ich mir als Zahl vor. Das kann man später auch noch verbessern. Ich hab
aber immer noch größere Probleme mit meinem nicht funktionierenden Code.
Der sieht jetzt so aus:
1
#include<iostream>
2
#include<math.h>
3
#include<stdio.h>
4
#include<stdlib.h>
5
usingnamespacestd;
6
7
8
9
intmain()
10
{
11
inti,j;
12
chararray[21][41];
13
14
for(i=0;i<=20;i=i+1)//array mit Leerzeichen füllen
15
{
16
for(j=0;j<=40;j=j+1)
17
{
18
array[i][j]=' ';
19
}
20
}
21
22
23
24
25
for(i=0;i<=20;i=i+1)//array mit X füllen
26
{
27
for(j=0;j<=40;j=j+1)
28
{
29
array[(10*sin(j/(2*3.14159265))+10),0][j]='X';
30
}
31
}
32
33
34
35
for(i=0;i<=20;i=i+1)
36
{
37
for(j=0;j<=40;j=j+1)
38
{
39
cout<<array[i][j];
40
}
41
}
42
43
44
45
system("pause");
46
return0;
47
}
Die erste Felddim. ist mein Wertebereich der von 0-20 geht. Die zweite
Felddim. ist meine Definitionsbereich der von 0-40 geht. Jetzt muss ich
irgendwie in Abhängigkeit von meiner Berechnung der y-Werte in mein
array schreiben und danach ausgeben. Da komm ich nicht weiter. Wenn ich
das Programm so kompiliere wie's momentan ist, dann bekomm ich zwar ne
Ausgabe, aber das ist alles andere nur kein Sinus!
Tobias Mehrl schrieb:> for(i=0; i<=20; i=i+1) //array mit X füllen> {
Das muss weg. Du gehst jeden x wert durch und errechnest den Sin.
Noch was zum runden: Das kann man auch gut selber schreiben:
Und gleich angewöhnen, keine 'magischen' Konstanten in Programmen zu
verwenden:
#define DIMX 41
#define DIMY 21
und dann im Code alle Stellen mit 20/21/40/41 entsprechend korrigieren.
Oder wenn schon C++, dann gleich
const int DIMX = 41;
const int DIMY = 21;
Und wenn Du statt i und j, beispielsweise ix und iy nimmst, kommt man
auch mit den Zeilen/Spalten nicht so durcheinander.
Du hast einen Denkfehler drin, dreh die Sinuswelle um 90 Grad gegen den
Uhrzeigersinn und deine Frage erledigt sich von selbst...
Tip, hier dran drehen:
for( i = 0; i <= 20; i++ ) //array mit X füllen
array[i][ (int) round(10 * sin( i / ( 2 * M_PI ) ) + 10)] = 'X';
Frickler schrieb:> Und gleich angewöhnen, keine 'magischen' Konstanten in Programmen zu> verwenden:>> #define DIMX 41> #define DIMY 21>> und dann im Code alle Stellen mit 20/21/40/41 entsprechend korrigieren.>> Oder wenn schon C++, dann gleich>> const int DIMX = 41;> const int DIMY = 21;
Was soll an den #define schlecht sein? Ich verwende const nur in c# da
es da keine #define gibt. Bisher bin ich immer damit gut gefahren.
Samuel K. schrieb:> Was soll an den #define schlecht sein?
z.B. daß sie in maximal einer Übersetzungseinheit zwangsweise
gleich sind (und genau genommen nicht mal da).
@Tim T.:
Du schreibst ja, ich soll die Sinushalbwelle 90 Grad gegen den
Uhrzeigersinn drehen. Wenn ich jetzt mit meinem obigen Code
weiterarbeiten möchte, müsste die komplette Sinuswelle auf der
Mittelachse quasi um 180 flippen, wenn du verstehst was ich mein!
Eine eigene Frage?
Dieser Thread ist über 15 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.