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"