Fizikus C++ labor

1. hét: make és C ismétlés2. hét: pontosság és pontatlanság3. hét: azonos nevű függvények, referencia
4. hét: egyszerű osztályok5. hét: konstruktor és operator overloading6. hét: osztály dinamikus adattaggal
9. hét: >> és << használata I/O-ra, statikus tagok10. hét / 1: STL vector10. hét / 2: STL string, algorithm
11. hét: generikus algoritmusok és osztályok12. hét: öröklés13. hét: heterogén kollekció
14. hét: C++11 kitekintő15. hét: Nagyházi bemutatás

1. hét: make és C ismétlés

Tudnivalók

A ZH, jelenlét, nagy házi adminisztrációs portálja a https://ttkprog.eet.bme.hu/admin címen elérhető.

A tárgy honlapja: http://www.eet.bme.hu/vieea026/

Zsolt útmutatása

1. *nix alatt triviális, m$win alatt kicsit nyögvenyelős a make használata. Utóbbi esetben egyrészt mingw32-make a parancs, másrészt nekünk kell biztosítani, hogy a Code::Blocks installáció alatti MinGW/bin folder benne legyen a futtathatók keresési útjában (PATH). [Otthoni gépen legjobb permanensen hozzáadni: ControlPanel, System, Advanced SS, Environment variables. Vagy a PATH nevű system variable-t módosítsd, vagy hozz létre egy PATH elnevezésű user variable-t amibe csak ezt teszed bele.] Töltsük le, próbálgassuk, és értsük meg a viselkedését az órán látott 1234-es példa Makefile-nak http://www.eet.bme.hu/vieea026/hh/1/1/Makefile

Frissítés 2

A mingw32-make helyesen működött a HSzK-ban, az útvonalak rendben be voltak állítva. A Developer Command Prompt nem mindenkinél működött megfelelően.

Frissítés

A make futtatása windowsos környezetben sokszor problémás, mert az útvonalak nincsenek megfelelően beállítva. Aki Linuxot használ, annak valószínűleg probléma nélkül futnak a parancsok. Ha Windowst használsz, és van a gépen Visual Studio, akkor a "Developer Command Prompt" nevű konzolt érdemes elindítani. Ebben be kell lépni a megfelelő mappába "cd útvonal" paranccsal, és itt tuttatni az nmake-et. (Ha másik meghajtón van a Makefile, akkor előbb át kell lépni arra a meghajtóra. Pl. ha a prompt a C: meghajtón indul, és a Makefile a D: meghajtón van, akkor be kell írni, hogy D: és enter. Utána jöhet a CD mappaváltás. Egy rövid videó mutatja be ezt: videó

Ha ez nem működik, akkor lehet próbálkozni az alábbi ötletekkel is.

A make és a HSZK

A HSZK-ban valószínűleg úgy vannak telepítve a fejlesztőkörnyezetek, hogy a make elérése és használata problémás, ezért lehet, hogy az alábbi feladatokat saját gépen könnyebb kipróbálni. A HSZK-ban az 1. feladatot ki lehet próbálni: másoljuk a Visual Studio bin mappájából az nmake.exe programot a makefile mappájába, és futtassuk. A 2. feladatot nem tudjuk megoldani a HSZK-ban a make-kel, ebből a feladatból viszont csináljuk meg a programot Visual Studio vagy CodeBlocks fejlesztőkörnyezetben, és próbáljuk ki!

1. feladat: A make kipróbálása.

Próbáljuk ki az előadáson látott one-two-three-four példát Windowsos ill. Unixos verzióban!

CodeBlocks esetén mingw32-make.exe a make program neve, Visual C++ esetén nmake.exe. A letöltött one-two-three-four fájlt át kell nevezni "Makefile"-ra. (Indítsd el a parancssort (Command Prompt), menj át a mappába, ahol a makefile van a cd paranccsal, majd a rename paranccsal nevezd át a fájlt.)

Futtatás: indítsd el a parancssort (cmd.exe) abból a mappából, ahol a Makefile található. Ha nem innen indítottad, cd parancsokkal tudsz átmenni ebbe a mappába, Írd be a program nevét és ENTER.

Ha nem fut, akkor be kell állítanod a path-t arra a mappára, ahol a make program van. Nálam ez így néz ki (a következő sort a parancssorba kell beírni):

path="c:\Program Files (x86)\CodeBlocks\MinGW\bin\"

ill.

path="c:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.21.27702\bin\Hostx64\x64\"

Itt értelemszerűen a saját gépeden érvényes útvonalat kell megadni.

2. feladat: C program make-kel fordítva

a) Készíts fv.c nevű fájlt. A fájlban hozz létre egy függvényt, amely egy double elemekből álló tömböt vesz át paraméterként, és paraméterként visszaadja a tömb elemeinek átlagát.

b) Készíts fv.h nevű fájlt, amelyben a fv.c-ben definiált függvény prototípusát helyezed el.

c) Készíts main.c nevű fájlt, amelybe include.-olod az fv.h-t, és megírod benne a main függvényt. A main függvény hozzon létre egy, a felhasználó által megadott méretű, double típusú dinamikus tömböt, amelyet véletlen értékekkel töltsön fel, majd az a)-ban megírt függvénnyel számítsa ki a tömb elemeinek átlagát, és ezt írja ki. Ne feledd a tömböt felszabadítani.

A hozzá tartozó make fájl: Windows + Visual Studio-ra, Windows + gcc-re (pl. code::Blocks) ill. Unixra

Ha ezt a make fájlt akarod használni, akkor a CodeBlocks-os path-t kell beállítanod.

Ha Visual C++-szal szeretnéd lefordítanod, a következő make fájlt használhatod (a Visual C++ megoldás a Developer Command Prompt nem megfelelő beállítása miatt a HSzK-ban nem megy):

main.exe : main.obj fv.obj
	@link main.obj fv.obj
main.obj : main.c fv.h
	@cl -c main.c
fv.obj : fv.c fv.h
	@cl -c fv.c

Ehhez viszont nem a "sima" parancssort kell futtatnod, hanem keresd meg a Start menüben a Visual Studiót, azon belül a Visual Studio Tools mappát, és indítsd el a benne lévő Developer Command Prompt-ot. Ebben menj át abba a mappába, ahol a C program és a makefile található, és futtasd az nmake-et.

make az Ural2-n

ural2-n a user 2 betu 3 szam kombinacio. ezt az accadmin.hszk.bme.hu oldalon lehet megnezni. a password pedig az eredetileg beallitott jelszo. aki erre nem emlekszik, sajnos "Az itt végrehajtott regisztrációk, jelszóváltoztatások érvényre jutásának ideje kb. 1-2 óra.", az nem tud belepni.

1. ural2 belepes (pl. putty)
2. wget http://eet.bme.hu/vieea026/m/Makefile1
3. mv Makefile1 Makefile
4. make, make one, stb.

5. win alatt IDE-ben az atlagszamolos ketmodulos programot elkesziteni.

6. a belepni kepesek winscp-vel ural2-re fv.h fv.c main.c file-okat.
7. ural2 terminalban: rm Makefile
8. wget http://eet.bme.hu/vieea026/m/Makefile2
9. mv Makefile2 Makefile
10 make (2 forditas, 1 linkeles)
11 make (semmi)
12 touch main.c (valtoztattunk benne...)
13 make (1 forditas, 1 linkeles)
14 make (semmi)
15 touch main.o
16 make (csak 1 linkeles)

Gyakorló feladat

Egészítsd ki a 2. feladatot egy újabb .c-.h fájlpárral. Helyezz el bennük egy függvényt, amely egy double típusú tömböt vesz át, és a benne található elemek közül az átlagnál nagyobbakat egy éppen megfelelő méretű új dinamikus tömbbe másolja. A függvény adja vissza az új tömb címét, paraméterként pedig az új tömb méretét. A main függvényből hívd meg a függvényt, írd ki az átlagnál nagyobb elemeket, majd szabadítsd fel a dinamikus tömböt.

Órai feladatok mintamegoldása

fv.h
#ifndef ATLAG_H
#define ATLAG_H

void atlag(double *t, int n, double *atl);

#endif

 

fv.c
#include "fv.h"

void atlag(double *t, int n, double *atl){
    double sum = 0;
    int i;
    for (i = 0; i < n; i++)
        sum += t[i];
    *atl = sum / n;
}

 

main.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "fv.h"

int main(){
    double *tomb, atl;
    int n, i;

    scanf("%d", &n);
    tomb = (double*)malloc(n*sizeof(double));
    for (i = 0; i < n; i++)
        tomb[i] = rand();
    atlag(tomb, n, &atl);
    printf("%g\n", atl);
    free(tomb);

    return 0;
}