NEPTUN kód: NÉV: Aláírás: Programozás. NZH, 2016. november 28. BME-TTK, fizika BSc Arcképes igazolvány hiányában nem kezdheted meg a ZH-t. A feladatok megoldására összesen 90 perc áll rendelkezésre. Az 1. feladatot ezen a lapon oldd meg. A feladatlapot névvel ellátva akkor is be kell adni, ha semmilyen megoldást sem készítettél. Minden feladatmegoldást külön lapra írj! Minden lapra írd fel a neved és a neptun kódod, valamint a feladat sorszámát! Ezek hiányában a feladatot nem értékeljük. Szabványos C megoldásokat értékelünk csak. A kétoldalas C referencia összefoglaló használható, más írott, nyomtatott vagy elektronikus segédanyag használata tilos. feladat pont min elért 1. 12 2. 12 3. 12 4. 12 5. 12 60 21..20 elégtelen, 21..30 elégséges, 31..40 közepes, 41..50 jó, 51.. jeles 1. feladat (6 2 p) a) Definiálj egy típust vállalkozások alábbi adatainak logikusan rendszerezett tárolására: név (max. 50 karakter), adószám (hosszú egész), havi árbevétel (valós) és alkalmazotti létszám (egész). Rendeld hozzá a ceg típusazonosítót. Lásd a 2. feladatnál. b) Írj függvényt, mely két céget kap paraméterként, és egy logikai értékkel tér vissza, mely akkor igaz, ha a két adószám azonos. Lásd a 2. feladatnál. c) Írj függvényt, amely átvesz egy double tömböt, és visszatér a 63-as indexű elem címével, ha az létezik, különben érvénytelen memóriacímmel! double * cime(double * t, int n) if(63<n) return t+63; return NULL; d) Adott n egy egész típusú változó. Add meg azt a kifejezést, amely akkor, és csak akkor logikai igaz, ha n egy olyan négy- vagy ötjegyű szám, mely 113 többszöröse! n%113 == 0 && 1000<=n && n<100000 e) Írj kódrészletet, mely az int d változó utolsó előtti bitjét 1-re állítja. d = 2; if(d/2%2==0) d+=2; Bármelyik jó. f) Írj függvényt, mely a kapott szabályos C stringben megkeresi az első nagybetű karaktert, és lecseréli a megfelelő kisbetűre. Nincs teendő, ha nincs benne ilyen. void kisbe(char * s) int i=0; while(s[i]!= \0 &&(s[i]> Z A >s[i])) ++i; if(s[i]!= \0 ) s[i]+= a - A ; 2. feladat 4+4+4 p Az 1a típusát és 1b függvényét felhasználva... Készíts függvényt, amely paraméterként kap egy cégeket tartalmazó tömböt, és adószám szerinti sorrendbe rendezi azt. Ehhez felhasználhatod a könyvtári qsort függvényt is, további segédfüggvényt is definiálhatsz. Készíts függvényt, amely paraméterként kap két adószám szerint sorbarendezett cégeket tartalmazó tömböt, és egy egész értékkel tér vissza. A függvény számolja meg, hogy hány vállalkozás szerepel mindkét adatbázisban, és adja vissza ezt az értéket. Írj rövid programot, amely a már létező olvas függvény hívásával (lásd alább) létrehozza a két dinamikus tömböt, és betölti a vállalkozások adatait az adat1 ill. adat2 file-okból. Ezután a fent megírt függvények segítségével rendezd mindkét tömböt, majd határozd meg az egyesített adatbázis szükséges méretét, és
foglalj egy épp megfelelő méretű új tömböt. A duplikált cégek csak egyszer kerülnek be az összefésült tömbbe! Hívd meg a már létező egyesit függvényt, mely elvégzi a két adatbázis egyesítését. Ha foglaltál dinamikus memóriát, ne felejtsd el azt felszabadítani. Az alábbi függvényeket NEM KELL megírnod, de felhasználhatod: void olvas(ceg ** t, int * darab, char * filenev) Létrehoz egy megfelelő méretű dinamikus tömböt, feltölti a cégek adataival, és visszaadja a tömb címét, valamint a betöltött elemek számát. A másik létező függvény void egyesit(ceg * t1, int db1, ceg * t2, int db2, ceg * cel), mely elvégzi a megfelelő összefésülést a cél tömbbe. / * 1a * / typedef struct char nev[50+1]; long adosz; double arbe; int alk; ceg; / * 1b * / int azonos(ceg a, ceg b) return a.adosz==b.adosz; / * 2 * / #include <stdlib.h> int adoszhas(const void * a, const void * b) return ((ceg * )a)->adosz-((ceg * )b)->adosz; void rendez(ceg * a, int n) qsort(a,n,sizeof(ceg),adoszhas); int azonosdb(ceg * a, int na, ceg * b, int nb) int i=0, j=0, db=0; while (i<na && j<nb) if(adoszhas(a+i, b+j)==0) ++db; ++i; ++j; if(adoszhas(a+i, b+j)<0) ++i; / * >0 * / ++j; return db; int main() / * teszteleshez jo ez a ket tomb... ceg t2[]="pascal Kft",444,5e5,2,"Bohr Bt",999,0,0,"Ampere Bt",222,1e8,23, * e, t1[]="newton Bt", 333, 2e6, 2,"Pascal Kft",444,-1e5,3,"Kepler Rt",111,1e9,9; int n1=3, n2=3, ne; * / ceg * t1=null, * t2=null, * e; int n1, n2, ne; olvas(&t1, &n1, "adat1"); olvas(&t2, &n2, "adat2");
rendez(t1,n1); rendez(t2,n2); ne=n1+n2-azonosdb(t1,n1,t2,n2); e=(ceg * )malloc(ne * sizeof(ceg)); egyesit(t1,n1,t2,n2,e); free(t1); free(t2); free(e); 3. feladat 12 p Az b a ex lnx dx integrál számértékét szeretnénk kiszámítani (a C könyvtári függvényei használhatóak). A legegyszerűbb módszer szerint az [a; b] intervallumot felosztjuk valamekkora x (mondjuk kezdetben (b a)/5) szélességű részekre, és így az integrál közelítő értéke x szélességű és az adott x helyen kapott függvényérték magasságú téglalapok területösszege. Ezután addig finomítjuk a felosztást (felezzük x-et), míg a két utoljára számolt közelítő összeg eltérése kisebb nem lesz az előírt pontosságnál. Írj egy C függvényt, amely a paraméterlistán három valós paramétert kap: a határokat (a,b) és a pontosságot, és kiszámolja, végül visszaadja a fenti integrál értékét. #include <math.h> double f(double x) return exp(x-log(x)); double kozossz(double dx, double a, double b) double x=a, s=0; while(x<b) s+=f(x); x+=dx; return s * dx; double integ(double a, double b, double eps) double dx=(b-a)/5, s, sr; sr=kozossz(dx,a,b);dx/=2; s=kozossz(dx,a,b);dx/=2; while(fabs(s-sr)>eps) sr=s; s=kozossz(dx,a,b); dx/=2; return s; 4. feladat 6+6 p Tervezz állapotgépet, mely egy tetszőleges szövegből kinyeri az alábbi hatféle smiley-t, jelezd a tevékenységeket is a gráfban: :-) :-( : :D :() :o Írj egy olyan C nyelvű teljes programot, amely a szabványos bemenetről file vége jelig olvasott szövegből a fenti smiley-kat a szabványos kimenetre írja. Definiálj megfelelő típust az állapotok számára az érthetőség elősegítése céljából. (Állapotgép hiányában a program nem értékelhető.)
kp_zj ) ( alap ketpt, D, o (, ) - kp_min A tevékeny éleket piros szín jelzi. A pontozott élek elhagyása nem okoz pontveszteséget. #include <stdio.h> typedef enum allapot alap, ketpt, kp_min, kp_zj all; int main() int c; all a=alap; while((c=getchar())!=eof) / * mivel ez minden allapotban igy van, ide kihozhato lenne: if(c==) a=ketpt; * / switch(a) case alap: if(c==) a=ketpt; case ketpt: if(c== - ) a=kp_min; if(c== ( ) a=kp_zj; if(c== c== D c== o )printf(":%c",c);a=alap; if (c!=) a=alap; case kp_min: if(c== ) c== ( ) printf(":-%c",c); a=alap; if(c==) a=ketpt; a=alap; case kp_zj: if(c== ) )printf(":()"); a=alap; if(c==) a=ketpt; a=alap;
5. feladat 12 p Írj Télapó-monitoring programot december hatodikára! A program rövid időközönként megkapja Télapó koordinátáit valós számhármasként(szélesség, hosszúság, magasság). Ezt a valós számsorozatot kapja a programunk a szabványos bemenetén (mintha valaki begépelné). Az adatsor végét a 0-nál kisebb tengerszint feletti magassággal jelöljük. Határozzuk meg: a) Mely koordinátáknál járt Télapó legmesszebb otthonától (északi pólus), feltételezve, hogy a Föld gömbölyű, és a magasságot elhanyagolhatjuk. A szélességet -90 foktól +90 fokig mérjük, a hosszúságot -180-tól 180-ig, így az északi sarok koordinátája (-90; 0; 0). b) A legnagyobb magasságot, amit elért, mert Télapó egészségének védelmében fontos, hogy túl magasra ne repüljön, hiszen akkor nem jut elég oxigénhez. c) A Télapó által megtett utat, összegezve az elemi részutakat, közelítőleg: s = r ϕ 2 + ϑ 2, ahol r,ϕ,ϑ sorrendben a sugár (6000 km), a szélesség-szög (radiánban), és a hosszúság-szög (radiánban). BÓNUSZ unatkozó hallgatók részére: Adj jobb közelítést a távolság számítására! #include<stdio.h> #include<math.h> int main() double phi, phir, th, thr, ut=0, phimax, thmax, dphi,dth,pi=2 * asin(1), m, m_max; scanf("%lf%lf%lf",&phir,&thr,&m); phimax=phir; thmax=thr; m_max=m; scanf("%lf%lf%lf",&phi,&th,&m); while (m>=0) if(m>m_max) m_max=m; if(phi>phimax) phimax=phi;thmax=th; dphi=(phi-phir) * pi/180; dth=(th-thr) * pi/180; ut+=6000 * sqrt(dphi * dphi+dth * dth); phir=phi;thr=th; scanf("%lf%lf%lf",&phi,&th,&m); printf("legtavolabb: %f %f\n",phimax,thmax); printf("legmagasabban:%f\n",m_max); printf("%f km a megtett ut", ut);