Witam. Mam problem z kodem, który po uruchomieniu ma drukować wykres funkcji sin x. Na początku zastrzegam, że są to moje początki z C, więc jeśli mój tok rozumowania wydaje się chaotyczny, a kod jest bezsensowny, to prosiłbym o zasygnalizowanie tego faktu. Na początku wolałem spróbować jednak doprowadzić mój pomysł do końca, wolałem uniknąć bazowania na czyichś kodach.
#include <stdio.h>
#include <math.h>
#define FUNC "sin(x)"
#define PI acos(-1)
#define X_MIN 0 //lewy koniec dziedziny
#define X_MAX 2*PI //prawy koniec dziedziny
#define Y_MAX 1.0 //granica przedzialu zbioru wartosci
#define RZAD 9 //dlugosc osi OY
#define KOL 36 //dlugosc osi OX
main(){
printf("Program rysuje wykres funkcji %s w przedziale [%d,%d].\n\n",FUNC,X_MIN,X_MAX);
char tab[RZAD][KOL];
//wypelnienie tablicy jednowymiarowej wartosciami funkcji sin(x) w przedziale [0;6.28]
double sin_val[KOL+1];
for (int i = 0; i < KOL + 1; i++) {
sin_val[i] = sin(i*PI / 18);
}
//wypelnienie tablicy jednowymiarowej wartosciami y dla kazdego nastepnego rzedu
double y_val[RZAD];
for (int i = 0; i < RZAD; i++) {
y_val[i] = Y_MAX - (i / ((RZAD - 1)/2.0))*Y_MAX;;
}
//drukowanie ukladu wspolrzednych
printf("^\n");
for (int i = 0; i < RZAD; i++) {
for (int j = 0; j < KOL; j++) {
if (j == 0) {
tab[i][j] = '|';
continue;
}
if (i == (RZAD / 2)) {
if (j == KOL - 1) {
tab[i][j] = '->';
}
else {
tab[i][j] = '-';
}
continue;
}
tab[i][j] = ' ';
}
}
int indeks;
for (int i = 0; i < KOL; i++) {
int min = y_val[0];
for (int j = 0; j < RZAD; j++) {
if (fabs(y_val[j] - sin_val[i]) <= min) {
min = fabs(y_val[j] - sin_val[i]);
indeks = j;
}
if (j == RZAD - 1) {
tab[indeks][i] = '*';
}
}
}
for (int i = 0; i < RZAD; i++) {
for (int j = 0; j < KOL; j++) {
printf("%c", tab[i][j]);
}
printf("\n");
}
printf("\n\nKoniec programu.\n\n");
return 0;
}
Dla pierwszej kolumny x = 0 gwiazdka drukowana jest we właściwym miejscu. Problem pojawia się już w drugiej kolumnie x = 1/16*pi. Po rozpisaniu sobie warunku
for (int j = 0; j < RZAD; j++) {
if (fabs(y_val[j] - sin_val[i]) <= min) {
min = fabs(y_val[j] - sin_val[i]);
indeks = j;
}
if (j == RZAD - 1) {
tab[indeks][i] = '*';
}
}
dla i = 1 obliczyłem, że w momencie, gdy j = 3, wtedy if (fabs(0.25-0.2)<=0.3) po raz ostatni zwraca true, aż do wyjścia z pętli. Z tego powinno wynikać, że w przybliżeniu min = 0.05, a indeks = 3, więc gwiazdka powinna się wydrukować na pozycji tab[3][1]. Niestety tak się nie dzieje, czy ktoś potrafiłby pokazać mi, dlaczego? Wiem, że w kodzie może być więcej błędów, ale póki co skupiam się na tym, żeby gwiazdka wyświetlała się na pozycji tab[3][1], być może po naprawieniu kodu pozostałe gwiazdki również będą na poprawnych pozycjach.