Wskaźniki w rekurencyjnym liczeniu całki met. proskokątu w c

0

Mam do napisania program liczący całkę metodą prostokątu, mam problem z zwracaniem wskaźnika dotyczącego zmiennej i - elementu na którym aktualnie program operuje w funkcjach: liczenie_pojedynczej_calki_kwadratem_bezh i zczytywanie_iczby_z_chaar. Program w mainie liczy dx (czyli h w programie) i wyznacza kolejne x w funkcji liczenie_sumy_calek_kwadratowych. Następnie ma obliczyć f(x) z czym właśnie mam problem z rekurencją i przemnożyć sumę przez h.

#include<stdio.h>
#include<stdlib.h> 
#include<math.h>
double liczenie_sumy_calek_kwadratowych(char tab[100],int n, double h, double a);
double zczytywanie_iczby_z_chaar(char *tab, int i, int *iwyjscowe); 
double liczenie_pojedynczej_calki_kwadratem_bezh(char tab[100],double x,int i, int g, int *iwyjscowe2);

char deklaracjafunkcji(char tab[100])
{
  int p=0;
  printf("Wpisz funkcje do obliczenia z niej calki: \n wpisz h po spis mozliwych dzialan. \n ");
    for(p=0; p<100; p++)
    {
        printf(" Wpisz %d element funkcji ( wyswietl elementy funkcji: 'h' ostatni element: ';') \n",p+1);
        scanf("%s",&tab[p]); // dlaczego nie moze byc gets, czy nie da sie tego zroobic prosciej wczytujac naraz calosc funkcji
        switch(tab[p])
            {
            case 'h': printf("\n h - pomoc\n ; - zakokonczenie wpisywania \n z - zmien poprzedni element \n  x - urzyj zmiennej \n + - dodaj \n - - odejmij \n * - pomnoz \n / - podziel \n s - sinus (w nawiasach napisz wartość sinusa) x \n cos (w nawiasach napisz wartość cosinusa \n liczba w || - wartosc bezwzgledna \n ( - nawias \n ) - nawias \n py() - pierwiastkuj (w nawiasach napisz liczbe pierwiastkowana, \n ");
            case ';': break;
            case 'n': p-=2; break;
            }
        if(tab[p]==';')
        break;
    }
return *tab;
}
/*double liczenie funkcji(double tab[100])*/
int main()
{
double a, b, h;
int n;

char tab[100];
deklaracjafunkcji(tab);
printf(" Metoda prostokatu /n");
printf(" Wpisz zakres przedzialow ");
scanf("%lf",&a);
printf("do: ");
scanf("%lf",&b);
if(a>b) b=(a+b)-(a=b);//zamiana a z b jeśli a jest większe
printf("\n Jaka dokladnosc? ");
scanf("%d",&n);
h=(b-a)/n; // liczenie szerokości przedziału
printf("\n Metoda prostokatu: \n");
double wynik=0.0;
wynik=liczenie_sumy_calek_kwadratowych( tab, n, h, a);
printf(" Całki wynosi: %lf \n",wynik);
printf("Aby zakonczyc program nacisnij dowolny przycisk...  ");
scanf("%d",&n);
return 0;
}
// calka licząc kwadratem:
double liczenie_sumy_calek_kwadratowych(char tab[100],int n, double h, double a)
{
 int niewazna;
 int j;
 double x;
 double fal=0.0;
 int q=1;
 while(tab[q]==';'){q++;}
 for(j=0;j<n;j++)
                 {
                 x=(a + j * h/2.0); // liczenie x dla którego liczymy wartość f(x):
                 fal=fal+liczenie_pojedynczej_calki_kwadratem_bezh(tab, x,0 /*i*/, 99 /*(granica)*/, &niewazna);
                 }
 return h*fal;
}
double liczenie_pojedynczej_calki_kwadratem_bezh(char tab[100], double x, int i, int g/*(granica)*/, int *iwyjscowe2) // od tego miejsca występuje błąd:
{
    g=i;
    int s=0;//oglosnik blendow
    double f=0.0; // funkcja zliczająca f()
                    swich(tab[i])// liczenie f przed pierwszym działaniem
                    {
                        case '1': f=zczytywanie_iczby_z_chaar(tab,i,&i); break;
                        case '2': f=zczytywanie_iczby_z_chaar(tab,i,&i); break;
                        case '3': f=zczytywanie_iczby_z_chaar(tab,i,&i); break;
                        case '4': f=zczytywanie_iczby_z_chaar(tab,i,&i); break;
                        case '5': f=zczytywanie_iczby_z_chaar(tab,i,&i); break;
                        case '6': f=zczytywanie_iczby_z_chaar(tab,i,&i); break;
                        case '7': f=zczytywanie_iczby_z_chaar(tab,i,&i); break;
                        case '8': f=zczytywanie_iczby_z_chaar(tab,i,&i); break;
                        case '9': f=zczytywanie_iczby_z_chaar(tab,i,&i); break;
                        case '0': f=zczytywanie_iczby_z_chaar(tab,i,&i); break;
                        case '-': f=0.0; i++; break;
                        case '(': do {g++;} while(tab[g]!=')'); f=liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+1, g, &i); break;
                        case '|': do {g++;} while(tab[g]!='|'); f=abs(liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+1, g, &i)); break;
                        case 's': g++;do {g++;} while(tab[g]!=')'); f=sin(liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+2, g, &i)); break;
                        case 'c': g++;do {g++;} while(tab[g]!=')'); f=cos(liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+2, g, &i)); break;
                        case 'p': int y/*niezadeklarowane??-->*/; y=zczytywanie_iczby_z_chaar(tab,i+1,i); g++;do {g++;} while(tab[g]!=')'); f=pow((liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+=2, g, &i))); break;
                        case 'x': f=x; i++; break;
                     }
      for(i; i<100; i++)
    {   g=i;
        switch(tab[i])//dopisac ogloszenia o blendach, na razie tylko *,/,+,-( pozniej uwaga na bledy w liczeniunp+8*sin9)
            {
            case '(':; break;
            case '*':{
                        swich(tab[i+1])
                        {
                            case '1': f*=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '2': f*=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '3': f*=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '4': f*=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '5': f*=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '6': f*=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '7': f*=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '8': f*=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '9': f*=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '0': f*=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '(': do {g++;} while(tab[g]!=')'); f*=liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+2, g, &i); break;
                            case '|': do {g++;} while(tab[g]!='|'); f*=abs(liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+2 g, &i)); break;
                            case 's': g++;do {g++;} while(tab[g]!=')'); f*=sin(liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+3, g, &i)); break;
                            case 'c': g++;do {g++;} while(tab[g]!=')'); f*=cos(liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+3, g, &i)); break;
                            case 'p': int z; z=zczytywanie_iczby_z_chaar(tab,i+1,&i); g++; do {g++;} while(tab[g]!=')'); f*=pow((liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, (i+=2)+1, g, &i))); break;
                            case 'x': f*=x; i++; break;
                        }
                        i=iwyjscowe;    break;}
            case '/': {
                        swich(tab[i+1])
                        {
                            case '1': f/=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '2': f/=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '3': f/=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '4': f/=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '5': f/=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '6': f/=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '7': f/=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '8': f/=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '9': f/=zczytywanie_iczby_z_chaar(tab,i+1,&i); break;
                            case '0': s=1; break;
                            case '(': do {g++;} while(tab[g]!=')'); f/=liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+2, g, &i); break;
                            case '|': do {g++;} while(tab[g]!='|'); f/=abs(liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+2, g, &i)); break;
                            case 's': g++;do {g++;} while(tab[g]!=')'); f/=sin(liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+3, g, &i)); break;
                            case 'c': g++;do {g++;} while(tab[g]!=')'); f/=cos(liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+3, g, &i)); break;
                            case 'p': int y; y=zczytywanie_iczby_z_chaar(tab,i+1,i); g++;do {g++;} while(tab[g]!=')'); f/=pow((liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, (i+2)+1, g, &i))); break;
                            case 'x': f/=x; i++; break;
                        }
                        if(s==1)
                        {
                            s==1;
                            printf(" W rownaniu wystapuje blad: Nie dzieli się przez zero. \n");
                            break;
                        }
                        break;}
            case '+': {f+=liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+1, 99, &i);} break;
            case '-': {f-=liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, i+1, 99, &i);} break;
            case ';': break;
            default: puts("W wpisaniu równania występuje zły znak, wynik najprawdopodobniej będzie błędny. \n"); break;
            }
        *iwyjscowe2=i;    
        if(s==1) puts(" W rownaniu wystapuje blad. \n");
        if(s==1) break;
        if(i==g) return f; // zwracanie funkcji
    }


}
double zczytywanie_iczby_z_chaar(char tab[100], int i, int *iwyjscowe3) //!!!!!!!!!!!!!!!!!!!!!!zczytywanie_iczby_z_chaar
{
       double d=0.0;
       int s=0;
       int o=i;
       for(o=i; o<100; o++)
                {
                     switch(tab[o])
                     {
                     case '1':d=d*10.0+1.0; break;
                     case '2':d=d*10.0+2.0; break;
                     case '3':d=d*10.0+3.0; break;
                     case '4':d=d*10.0+4.0; break;
                     case '5':d=d*10.0+5.0; break;
                     case '6':d=d*10.0+6.0; break;
                     case '7':d=d*10.0+7.0; break;
                     case '8':d=d*10.0+8.0; break;
                     case '9':d=d*10.0+9.0; break;
                     case '0':d=d*10.0; break;
                     default:  s=1; --o;break;
                     }
                     if(s==1) break;
                }
       *iwyjscowe3=o;
       return d;
}

Log kompilacji z usuniętymi kilkudziesięcioma powtórzeniami:

c error: break statement not within loop or switch
c error: case label not within a switch statement
c error: syntax error before "int"
c error: y' undeclared (first use in this function) - wydaje mi się że ją zadeklarowałem jeszcze w tej samej linijce c:89: error: for each function it appears in.) c:89: warning: passing arg 3 of zczytywanie_iczby_z_chaar' makes pointer from integer without a cast
c error: too few arguments to function `pow'

At top level:
c error: syntax error before "for"
c error: tab' undeclared here (not in a function) c:115: error: i' undeclared here (not in a function)
c error: initializer element is not constant
c warning: data definition has no type or storage class
c error: syntax error before '++' token
c error: iwyjscowe' undeclared here (not in a function) c:118: warning: data definition has no type or storage class c:118: error: syntax error before "break" c:136: warning: passing arg 3 of zczytywanie_iczby_z_chaar' makes pointer from integer without a cast
c error: initializer element is not constant
c warning: data definition has no type or storage class
c error: syntax error before '++' token
c error: syntax error before string constant
c error: conflicting types for 'printf'
c note: a parameter list with an ellipsis can't match an empty parameter name list declaration
c error: conflicting types for 'printf'
c note: a parameter list with an ellipsis can't match an empty parameter name list declaration
c warning: data definition has no type or storage class
c warning: initialization makes pointer from integer without a cast
c error: initializer element is not constant
c warning: data definition has no type or storage class
c error: syntax error before "if"

0
 swich(tab[i]

swich?
I tak ze wszystkim. Zasadniczo kompilator dał Ci listę błędów do poprawienia, proponuję iść od góry na dół i poprawiać po jednym (i próbować kompilować po każdej poprawce, jedna zmiana może usunąć sporo błędów). Prędzej czy później w ten sposób kod się skompiluje (pomijając czy zadziała dobrze, oraz ogólną jakość kodu).

0
while(tab[g]!=')'); f*=pow((liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, (i+=2)+1, g, &i))); break;

Popraw wcięcia:

while(tab[g]!=')');
f*=pow((liczenie_pojedynczej_calki_kwadratem_bezh( tab, x, (i+=2)+1, g, &i)));
break;
c:74: error: break statement not within loop or switch

Hmmm....

0

Dzięki, siedziałem nad tym parę godzin i nie mogłem zauważyć braku tego t...
Już działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1