Tájékoztató programozás demonstrátorságról az EET-n.
Visual Studio-ban a fordító nem szereti a scanf-et. Írjuk be a program legelejére (a #include-ok ELÉ!), hogy:
#define _CRT_SECURE_NO_WARNINGS
A ZH, jelenlét, nagy házi adminisztrációs portálja a https://ttkprog.eet.bme.hu/adminlogin.php címen elérhető.
A fizikus nagy házi feladatok oldala itt található.
Visual C++-ban az M_PI és a többi matematikai konstans a math.h beszerkesztése elé beírt _USE_MATH_DEFINES makro definícióval történik, azaz pl.:
#include <stdio.h>
#define _USE_MATH_DEFINES
#include <math.h>
int main(){
double a = sin(M_PI/4.0);
return 0;
}
A felhasználótól való adatbekéréssel kapcsolatos gyakorlati összefoglaló.
Adott a következő deklarációval megadott függvény:
double f(double);
(Ugyanúgy használhatjuk, mint pl. az sqrt(), vagy a sin() függvényt.)
Írj C programot, amely ε=10-6 pontossággal kiszámítja és kiírja az f(x)=0; egyenlet gyökét az x = [2,10] zárt intervallumban! Annyit biztosan tudunk f(x)-ről, hogy a [2,10] intervallumban folytonos, és pontosan egy gyöke van.
#include <stdio.h>
int main(){
double also=2.0, felso=10.0, kozep;
while( felso - also > 1e-6 ){
kozep = ( also + felso ) / 2.0;
if( f(kozep) * f(also) > 0.0 ) // az azonos előjelűt cseréljük
also = kozep;
else felso = kozep;
}
printf("gyok=%g\n", ( also + felso ) / 2.0 );
return 0;
}
Egy házi feladathoz született az alábbi vélemény. Úgy gondolom, tanulságos lehet többeknek, ezért megosztom a társasággal:
A >> és << operátorokat nem tagfüggvényként, hanem globális függvényként kell megvalósítani.Úgy látom, nem egészen világos az operátor függvények értelme.
class Komplex{ double re,im; public: Komplex operator +(Komplex b){ Komplex sum; sum.re = re + b.re; sum.im = im + b.im; } };
itt pl. a sum.re = re + b.re; helyett lehet írni, hogy sum.re = this->re + b.re;
(Ha nem írjuk oda a this-t, akkor a fordíto teszi oda helyettünk.)
Használat:
Komplex a,b,c;
c = a + b;
Ugyanezt így is lehetett volna írni:
c = a.operator+(b);
A fordító is ezt helyettesíti.
Ha ide az ön megoldásában
(Komplex& operator+ (Komplex ado) {re= re + ado(re); im= im + ado(im);} ;)
szereplő operator + -t képzeljük, akkor az látszik, hogy a c= a+b; kifejezésben a értéke növelődne meg, pedig nem ezt várjuk egy ilyen kifejezéstől. A visszatérési érték is hiányzik, ami c-be kerülhetne. A + operátor nem adhat vissza referenciát, mert egy új eredmény keletkezik egy új változóban, amit lokális változóként hozunk létre.
Ahogy megvalósította a >> és << operátorokat, az a következő módon lenne használható:
a << b;
Nem így szoktuk használni ezeket, hanem
cout << a;
formában. Ha megnézi a + operátor függvényét, látja, hogy a c=a+b; kifejezésben a +-tól balra lévő változó + operátora hívódott meg. A << esetén ugyanez a helyzet, vagyis a cout nevű, ostream típusú változó << tagfüggvénye kéne hívódjon. Van neki ilyen? Nincs. És nem is illene nekünk belehekkelni egy ilyet. Szerencsére a C++ megengedi globális operátorfüggvények létrehozását. Ezek az operátortól balra és jobbra lévő változót is paraméterként kapják, és nem tagfüggvényei egyik osztálynak sem. A + operátor így valósítható meg globális függvényként:
Komplex operator +(const Komplex & a, const Komplex & b){ Komplex c; c.re = a.re + b.re; c.im = a.im + b.im; return c; }
Ez a függvény tehát nem a Komplex osztályba kerül beírásra, hanem azon kívül! A függvényt viszont friend-ként hozzá kell adni az osztályhoz, vagy az osztály lekérdező függvényeit (getRe, getIm) használni!
Ugyanennek egy trükkösebb megvalósítása:
Komplex operator +(const Komplex & a, const Komplex & b){ return Komplex(a.re + b.re, a.im + b.im); }
A << operátor megvalósítása globális függvénnyel:
ostream & operator<<(ostream & os, const Kompex & a){ os << a.re << showpos << a.im << 'j'; return os; } istream & operator >>(istream && is, Komplex & a){ is >> a.re >> a.im; is.ignore(); }
Egy dgb tutorial: http://www.cs.cmu.edu/~gilpin/tutorial/