Fizikus C labor

1. óra: ismerkedés a fejlesztőkörnyezettel2. óra: ciklusok3. óra: számelméleti feladatok
4. óra: számítás valós számokkal5. óra: sok adat beolvasása, tömbök6. óra: iteráció, könyvtári sztringkezelő függvények
7. óra: függvények és sztringek8. óra: cím szerinti és tömb paraméterek, struktúrák, dinamikus tömbök9. óra: rendezés, fájlkezelés, parancssori paraméterek
10. óra: állapotgép, szabványos I/O átirányítása11. óra: rekurzió, gyakorlás12. óra: láncolt listák, fák
13. óra: NHF beadás

Rajzoljunk a konzol ablakba Windowson

4. alkalom: számítás valós számokkal

1. feladat

Írj programot, amely bekéri egy másodfokú egyenlet együtthatóit, és kiszámítja az egyenlet gyökeit!

2. feladat

Írj programot, amely bekéri a felhasználótól egy derékszögű háromszög két befogójának hosszát, és kiszámítja a háromszög területét, átfogójának hosszát, valamint a szögeit! (A math.h-ban definiált függvényeket használhatod a számításokhoz.)

3. feladat

Írj függvényt, amely paraméterként kapja egy másodfokú függvény x értékét és a, b, c együtthatóit,, és kiszámítja majd visszaadja az y értékét! (A másodfokú függvény: y=ax2+bx+c.)

Tipp: Az egyváltozós matematikai függvényeket így használhatjuk:

Ezek közül az abszolútérték a legegyszerűbb, írjuk meg mi magunk ezt a függvényt! A függvény megírását (azaz a definícióját) a visszaadott érték típusával kezdjük. Mivel valós szám abszolút értékét szeretnénk kiszámolni, ez double lesz. A visszadott érték típusát a függvény neve követi, ez legyen mondjuk sajat_abs. A függvény neve után zárójelben felsoroljuk a függvény paramétereit, vesszővel elválasztva. Az abszolút érték függvénynek 1 db paramétere van: az a valós szám, amelynek az abszolút értékét ki akarjuk számolni. (A main függvény is egy függvény, tehát hasonló a többi függvényhez. Amit a main-ben lehet, azt más függvényben is lehet.) Ezt követi a függvénytörzs, amely { } közé van zárva. Itt kell kiszámolni és visszaadni az abszolót értéket. A kiszámított értéket a return után írva tudjuk visszaadni. A return utasítás azonnali visszaugrást is jelent oda, ahonnan a függvényt meghívtuk. Egy teljes program, amely bemutatja az abszolút érték függvényt, és annak meghívását is:

#include <stdio.h>

double sajat_abs(double x){
   if(x < 0.0)
      return -x;
   return x; // nem kell else, mert az if-ben lévő return -x;-nél kiugrunk a függvényből,
             // ha az if feltétele igaz.   
}

int main(){
   double a,b;
   
   printf("Kerek egy szamot: ");
   scanf("%lg", &a);

   printf("%g abszolut erteke: %g\n", a, sajat_abs(a));
   // Így is lehet:
   b = sajat_abs(a);
   printf("%g abszolut erteke: %g\n", a, b);
	
   return 0;
}

3A feladat

Írj C programot, amely bekér a felhasználótól egy pozitív egész számot (nem kell ellenőrizni, feltételezzük, hogy a felhasználó valóban pozitív egészt adott meg)! A program számítsa ki a szám osztóinak összegét, és írja ki, hogy ez prím-e! Pl. be: 9 ki: Osszeg: 13, prím. (Mert az osztók összege 1+3+9=13.)

 

mintamegoldás függvényekkel
#include <stdio.h>
#include <stdbool.h>

int osztok_osszege(int szam) {
    int osszeg = 0;
    for (int i = 1; i <= szam; i++)
        if (szam%i == 0)
            osszeg += i;
    return osszeg;
}

bool prim_e(int szam){
    for (int i = 2; i < szam; i++)
        if (szam%i == 0)
            return false;
    return true;
}

int main() {
    int szam;
    scanf("%d", &szam);
    int sum = osztok_osszege(szam);
    printf("Osszeg: %d ", sum);
    if (prim_e(sum)) {
        printf("prim\n");
    }
    else {
        printf("nem prim");
    }
    return 0;
}

4. feladat

a) Készíts függvényt, amely egy síkbeli pont koordinátáit kapja, és kiszámítja a pont origótól való távolságát!

b) Készíts függvényt, amely egy térbeli pont koordinátáit kapja, és kiszámítja a pont origótól való távolságát!

c) Egésztsd ki teljes programmá, a main függvényben mutasd be a két távolságszámító függvény működését!

 

Megjegyzés: ha egy feladatban nincs egyértelmű utalás arra, hogy egy függvény a felhasználóval kommunikál (azaz scanf-fel vagy más módon adatot olvas be, ill. printf-fel vagy más módon valamit kiír), akkor tilos ilyet beletenni. A valamit kiszámító függvények a bemenő adataikat függvényparaméterként kapják, és a kiszámított eredményt a hívás helyére visszaadják (leggyakrabban return-nel, de látni fogunk más módot is.)

5. feladat

Írj programot, amely kiszámítja az y=ax2+bx+c (másodfokú) függvény integrálját a min-max intervallumon! Az a, b, c együtthatókat, valamint a min és max értékeket a felhasználó adhatja meg. (A feladatot integrálközelítő összeg kiszámításával kell megoldani.)

Segítség: Egy függvény integrálja a függvénygörbe alatti előjeles területet jelenti. Egyszerű közelítő íntegrálás úgy végezhető, hogy felosztjuk a min-max intervallumot pl. 1000 részre, és minden részen téglalappal közelítjük a függvénygörbe alatti területet, a téglalapok területét összeadjuk. Egy téglalap területe: y(xi)*dx, dx = (max-min)/1000, xi = x értéke az i. osztópontban.

Az órai feladatok mintamegoldása

1. feladat
#include <stdio.h>
#include <math.h>

int main(){
	double a,b,c,diszkr,x1,x2;

	printf("a="); scanf("%lg",&a);
	printf("b="); scanf("%lg",&b);
	printf("c="); scanf("%lg",&c);

	if(a==0.0)
		printf("Linearis egyenlet, gyoke: %g\n",-c/b);
	else{
		diszkr = b*b - 4.0*a*c;
		if(diszkr < 0)
			printf("Nincs valos megoldas.\n");
		else if(diszkr == 0)
			printf("Egy gyok van: %g\n", -b/(2*a) );
		else{
			diszkr = sqrt(diszkr);
			x1 = ( -b + diszkr ) / (2*a);
			x2 = ( -b - diszkr ) / (2*a);
			printf("A gyokok:\n%g\n%g\n",x1,x2);
		}
	}
	return 0;
}

 

2. feladat
#include <stdio.h>
#include <math.h>

int main(){
    double a, b, c, T, alfa, beta;
    const double pi = 2*acos(0.0);

    scanf("%lg%lg", &a, &b);

    c = sqrt(a*a + b*b);
    T = a*b / 2.0;
    alfa = atan2(a, b);
    beta = pi / 2.0 - alfa;

    printf("c=%g\nT=%g\nalfa=%g\nbeta=%g\n",
        c, T, alfa / pi * 180, beta / pi * 180);
    return 0;
}

 

3. feladat
// függvényparaméter megadásakor mindegyik paraméternek oda kell írni a típusát, 
// nem lehet double x,a,b,c-t használni
double masodfoku(double x, double a, double b, double c){
   return x*x*a + x*b + c;
}

 

4. feladat
#include <stdio.h>
#include <math.h>

double tav2d(double x, double y) {
    return sqrt(x*x + y*y);
}

double tav3d(double x, double y, double z) {
    double eredmeny;
    eredmeny = sqrt(x*x + y*y + z*z);
    return eredmeny;
} // egy sorban is jó, ahogy a 2d verziónál


int main() { // egy függvényből nem látszanak más függvények változói
    double x, y, eredmeny; // lehet ugyanaz a neve, semmi köze a fenti, azonos nevű változókhoz!
    
    x = 6.0;
    y = -4.4;
    
    eredmeny = tav2d(x, y);
    printf("(%g, %g) tavolsaga %g\n", x, y, eredmeny);
    
    printf("(%g, %g, %g) tavolsaga %g\n", y, -x, 3.31, tav3d(y, -x, 3.31));

    return 0;
}

 

5. feladat
#include <stdio.h>
#include <math.h>

int main(){
	double a,b,c,min,max,x,dx,osszeg=0.0;

	printf("Az egyenlet együtthatoi (a,b,c): ");
	scanf("%lg%lg%lg",&a,&b,&c);
	printf("A tartomany hatarai (min,max): ");
	scanf("%lg%lg",&min,&max);

	dx = (max - min) / 10000.0;
	for( x = min; x < max; x += dx){
		double fx = a*x*x + b*x + c;
		osszeg += dx*fx;
	}
	printf("Az integral: %g\n",osszeg);
	return 0;
}