Programozás C-ben függvényes feladat?
f(x)= sin^5(3x-sqrtx)(1,3-arccosx) Meg van adva ez a függvény és egy adott intervallumban egymástól egyenlő távolságokra levő x változókra kellene kiszámolni. Valamint ahol nincs értelmezve ott egy hibaüzenetet kellene kidobnia. Eddig ezt sikerült összehozni:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
float fuggveny(float a, float b, float c);
int main()
{
float a,b,c,x;
a = pow(sin(b*c),5);
b = (3*x-sqrt(x));
c = (1,3-acos(x));
printf("Adja meg az 'x' valtozo erteket!\n");
scanf("%f" , &x);
printf("A fuggveny erteke : %f\n",fuggveny(a,b,c));
return 0;
}
float fuggveny(float a, float b, float c)
{
return a*b*c;
}
Elég kezdő vagyok, szóval valószínűleg több sebből is vérzik a dolog :D Valaki meg tudná mondani, hogy mik a hibák benne és a feladatnak azt a részét, hogy lehetne megoldani, hogy egymástól egyenlő távolságra lévő x változókra számolja ki az intervallumon amit bekérek?
Előre is köszönöm!
Egész pontosan így néz ki a feladat: [link]
Bocsi ha valamit elírtam, már én is elég fáradt voltam.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
#12: Talán valahogy így:
float x;
for (x = eleje; x <= vege; x += lepeskoz)
printf("fuggveny(%f) --> %f\n", x, fuggveny(x);
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
+ Bocs, egy zárójel lemaradt a végéről:
printf("fuggveny(%f) --> %f\n", x, fuggveny(x));
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
float f(float x);
int main(){
float x;
float k,v,o;
int i;
printf("Adja meg az intervallum kezdo es vegpontjat!\n");
scanf("%f %f" , &k , &v);
for(i=0; i<100; i++){
if(v<=k){
printf("Az intervallum vegpontjanak nagyobbnak kell lennie, mint az intervallum kezdopontja, kerlek add meg ujra:\n");
scanf("%f" , &v);
}
}
printf("Adja meg az osztaskozok szamat!\n");
scanf("%f" , &o);
float c = (v-k)/o;
for(x=k; x<v; x+=c){
printf("A f(x) erteke a %f. pontban: %f\n" ,x, f(x));
if(x>1 || x<0){
printf("A fuggveny nincs ertelmezve ebben a pontban!\n");
}
}
return 0;
}
float f(float x){
return pow(sin((3*x-sqrt(x))*(1.3-acos(x))),5);
}
Ezt sikerült összehozni eddig, így már csak annyi a baja, hogy a végpontban nem számolja ki x értékét
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
"a végpontban nem számolja ki x értékét"
x <= v;
de egyébként a k, v, c, o változók helyett nevezd el rendesen őket: kezdet, veg, lepeskoz, osztas.
Illetve ez:
float f(float x);
nem kell: a main függvény elé dobd be az f függvényt (lásd a belinkelt forráskódokat).
No meg ez mi:
for(i=0; i<100; i++){
if(v<=k){
printf("Az intervallum vegpontjanak nagyobbnak kell lennie, mint az intervallum kezdopontja, kerlek add meg ujra:\n");
scanf("%f" , &v);
}
}
Mi a manónak kéred be százszor a végpontot?
Nem elég egy while ciklus?
Ha azt írom, hogy x<=v akkor sem számolja ki a végpontra.
Ja azt a 100-ast csak úgy véletlenszerűen írtam, gondoltam 100-adjára csak sikerül megadni :,D de igen egy while ciklussal jobb lenne köszi :D
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
Aha, látom, hogymás is megírta a lényeget, de most már nem szerkesztem át, ismétlés a tudás anyja...
„a végpontban nem számolja ki x értékét”
Ez az egyik, amit nem értek. Tapasztalatom szerint, ha a végpont kiszámolható, akkor ki is számolja. Ettől függetlenül előfordulhat, hogy a kerekítési hiba miatt nem pontosan érkezik a határra, hanem átlépi azt, ezért aztán nem is írja ki. Emiatt a törtszámok esetén nem is szokás egyszerűen egyenlőségre vizsgálni, hanem olyan tűréssel (pl. az eredmény egy-két tizedesjegyének levágásával), amely már biztosan nagyobb a hibahatárnál.
Ezenkívül még három dolog nem világos:
1. Honnan tudod, hogy pont 0-1 az értelmezési tartomány? Jó-jó, LÁTOD az eredményekből, vagy éppenséggel a függvény matematikai levezetésével bizonyítottad, de az lenne a korrekt megoldás, ha a program maga határozná meg (mondjuk a levezetés programbéli megvalósításával) a tilos értékeket.
2. Akárhogyan határozod is meg az értelmezési tartományt, mi értelme van annak, hogy a tiltott értékekkel is meghívd a függvényt? Az rendben van, hogy ez egy okos fordító, amelynek a visszakapott NaN sem szegi a nyakát, de minek számoltatod, és pláne íratod ki, ha előre tudod, hogy nincs értelme? Most először elvégezteted a számítást, kiíratod az eredményt, AZUTÁN az eleve ismert feltétel alapján közlöd, amit a vak is láthat a programba épített NaN-jelzésből, hogy ennek nem volt semmi értelme. Nem az volna a logikus, hogy először eldöntöd, kell-e számolni, és ha igen, megcsináltatod, ha nem, kiíratod a saját hibaüzidet?
3. Miért pont százszor próbálkozhat a felhasználó a végpont bevitelével? Tudom, nem túl életszerű, de mi van, ha százegyedjére is hülyeséget ír? Akkor ő győzött, elfogadod a véleményét? Nem volna egyszerűbb -- pl. egy while ciklussal -- pont addig bekérni, míg végre megfelelő értéket ír be az a világ barma?
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!