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

5. alkalom: sok adat beolvasása, tömbök

1. feladat

Írj programot, amely a szabványos bemenetről olvas be folyamatosan valós számokat egész addig, amíg a felhasználó nem 0-t ad meg! Az adatsor végigolvasása után írja ki

a) a számok átlagát (a 0-t ne vedd figyelembe!),
b) a legkisebb számot,
c) a legnagyobb számot!

2. feladat

Írd át az 1. feladat megoldását úgy, hogy az adatokat fájlvége jelig olvassa, ne pedig 0 értékig!

 

Tipp: a scanf visszetérési értéke jelzi, hogy hány db adatot sikerült beolvasni. Ha egy db valós számot próbálunk beolvasni, akkor a következő kifejezés értéke IGAZ, ha sikeres a beolvasás:. scanf("%lg",&beolvas)==1. Ha fájlvége jel vagy egyéb hiba miatt nem sikeres a beolvasás, akkor HAMIS a kifejezés értéke.

3. feladat

Írd át a programot úgy, hogy az kiírja a beolvasott elemek átlagánál nagyobb beolvasott elemeket. Feltételezheted, hogy a felhasználó legfeljebb 2000 számot ad meg.

4. feladat

Hozz létre egy 100 elemű, valós számok tárolására alkalmas tömböt! Töltsd fel a tömböt -50 és +50 közötti véletlen értékekkel! Számítsd ki az elemek átlagát! Írd ki az átlaghoz legközelebbi, és attól legtávolabbi számot!

5. feladat*

A következő feladat szorgalmi jellegű, mert sok gondolkodást igényel, ezért ilyet ZH-ban nem adunk. Viszont érdemes megcsinálni, programozási szempontból nem nehéz.

 

Egy síkban vagyunk, ahol x a vízszintes, y a függőleges tengely. Egy ágyú az x=0, y=0 pontban található. A felhasználó adja meg egy négyzet A oldalhosszát, valamint középpontjának x0, y0 koordinátáit, melyek nemnegatív valós értékűek lehetnek. Adja meg továbbá a (0 sugarúnak tekintett) ágyugolyó kezdősebességét. Az ágyú csöve 2 fokonként állítható. Van-e olyan alfa szög, amit beállítva eltalálja az ágyú a négyzetet? Hány ilyen szög van? Ha van, írd ki ezeket!

Gyakorló feladatok

https://infoc.eet.bme.hu/f02/#7

Az órai feladatok mintamegoldása

1. feladat
#include <stdio.h>

int main(){
	double beolvas,min,max,osszeg,atlag;
	int db;

	db=0;
	osszeg = 0.0;
	scanf("%lg",&beolvas);
	min = max = beolvas;
	while(beolvas!=0.0){
		osszeg += beolvas;
		db++;
		if(min>beolvas)min=beolvas;
		if(max<beolvas)max=beolvas;
		scanf("%lg",&beolvas);
	}

	if(db>0){
		atlag = osszeg / db;
		printf("A %d db valos szam atlaga %g, minimuma %g, maximuma %g.\n",
			db,atlag,min,max);
	}

	return 0;
}

 

2. feladat
#include <stdio.h>

int main(){
	double beolvas,min,max,osszeg,atlag;
	int db;

	db=0;
	osszeg = 0.0;
	while(scanf("%lg",&beolvas)==1){
		if(db==0)
			min = max = beolvas;
		osszeg += beolvas;
		db++;
		if(min>beolvas)min=beolvas;
		if(max<beolvas)max=beolvas;
	}

	if(db>0){
		atlag = osszeg / db;
		printf("A %d db valos szam atlaga %g, minimuma %g, maximuma %g.\n",
			db,atlag,min,max);
	}

	return 0;
}

 

3. feladat
#include <stdio.h>

int main(){
	double osszeg,atlag;
	double elemek[2000];
	int db,i;

	
	osszeg = 0.0;
	for(db=0; scanf("%lg",&elemek[db])==1; db++){
		osszeg += elemek[db];
	}

	if(db>0){
		atlag = osszeg / db;
		for( i = 0; i < db; i++ )
			if( elemek[i] > atlag )
				printf("%g\n", elemek[i]);
	}

	return 0;
}

 

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

int main(){
    double tomb[100], atlag, legkozelebbi, legtavolabbi;
    int i;

    srand(time(0)); // a véletlenszámgenerátor inicializálása, egy programban csak egyszwer fusson!

    for( i = 0; i < 100; i++)
        tomb[i] = ( (double)rand() / RAND_MAX) * 100.0 - 50.0;

    atlag = 0.0;
    for( i = 0; i < 100; i++)
        atlag += tomb[i];
    atlag = atlag / 100;

    for( i = 0; i < 100; i++)
        printf("%-16g",tomb[i]);
    printf("\n");

    legkozelebbi = legtavolabbi = tomb[0];

    for( i = 0; i < 100; i++ ){
        if( fabs( atlag - tomb[i] ) < fabs ( atlag - legkozelebbi ) ) legkozelebbi = tomb[i];
        if( fabs( atlag - tomb[i] ) > fabs ( atlag - legtavolabbi ) ) legtavolabbi = tomb[i];
    }

    printf("atlag=%g\nlegkozelebbi=%g\nlegtavolabbi=%g\n", atlag, legkozelebbi, legtavolabbi);

    return 0;
}

 

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

int main(void){ // nem lett alaposan letesztelve. jó-e?
    double x, y, x0, y0, alfa, alfarad, A, v0, t, D;
    const double PI = acos(0.0) * 2.0;

    printf("A= ");  scanf("%lg", &A);
    printf("x0=");  scanf("%lg", &x0);
    printf("y0=");  scanf("%lg", &y0);
    printf("v0=");  scanf("%lg", &v0);

    for (alfa = alfarad = 0; alfa < 90; alfa += 2, alfarad = alfa * PI / 180){
        int talalt = 0;

        t = (x0 - A / 2) / (v0 * cos(alfarad));
        y = v0 * t * sin(alfarad) - 9.81 / 2 * t * t;
        if (y >= y0 - A / 2 && y <= y0 + A / 2)
            talalt = 1;

        t = (x0 + A / 2) / (v0 * cos(alfarad));
        y = v0 * t * sin(alfarad) - 9.81 / 2 * t * t;
        if (y >= y0 - A / 2 && y <= y0 + A / 2)
            talalt = 1;

        D = v0*sin(alfarad);
        D *= D;
        D -= 2 * 9.81*(y0 - A / 2);
        if (D > 0){
            D = sqrt(D);
            x = (v0*sin(alfarad) + D) / 9.81;
            if (x >= x0 - A / 2 && x <= x0 + A / 2)
                talalt = 1;
            x = (v0*sin(alfarad) - D) / 9.81;
            if (x >= x0 - A / 2 && x <= x0 + A / 2)
                talalt = 1;
        }

        D = v0*sin(alfarad);
        D *= D;
        D -= 2 * 9.81*(y0 + A / 2);
        if (D > 0){
            D = sqrt(D);
            x = (v0*sin(alfarad) + D) / 9.81;
            if (x >= x0 - A / 2 && x <= x0 + A / 2)
                talalt = 1;
            x = (v0*sin(alfarad) - D) / 9.81;
            if (x >= x0 - A / 2 && x <= x0 + A / 2)
                talalt = 1;
        }

        if (talalt)
            printf("%g fok\n", alfa);
    }

    return 0;
}