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

7. alkalom: állapotgép, szabványos I/O átirányítása

1. feladat

Rendezd át az 5. heti 4. példában szereplő tömb elemeit úgy, hogy a negatív értékű elemek a tömb elején, a pozitív értékűek a tömb végén legyenek! Ne használj segédtömböt! (Segédváltozót használni szabad.) Az átrendezés után az elemek sorrendje mindegy, nem kell abban a sorrendben lenniük, mint eredetileg.

2. feladat

Írj programot, amely a szabványos bemenetről olvasott szöveget úgy írja a szabványos kimenetre, hogy az összes kisbetűt nagybetűvé alakítja! Futtasd a programot konzolablakból úgy, hogy egy szöveges fájlt átirányítasz, és ez legyen a program bemenete, és úgy is,hogy az eredmény szöveges fájlba kerüljön!

3. feladat

Írj programot, a szabványos bemeneten érkezett szöveget úgy írja a szabványos kimenetre, hogy a benne érkező :) és :( szmájlikat "szuper" ill. "sajnos" szöveggel helyettesítve írja a szabványos kimenetre! A feladatot állapotgéppel valósítsd meg!

4. feladat

Írj programot, amely a szabványos bemeneten érkező szöveget a szövegbe rejtett vezérlőkaraktereknek megfelelően írja ki a szabványos kimenetre. Amíg nincs vezérlőkarakter, addig a beérkező szöveget változatlanul írja ki. Ha a beérkező szövegben '^' karakter érkezik, akkor onnantól kezdve a kisbetűk helyett azok nagybetű változatt írja ki, a többi karaktert pedig változatlanul írja ki.Ha a beérkező szövegben '!' karakter érkezik, akkor onnantól kezdve a nagybetűk helyett azok kisbetű változatt írja ki, a többi karaktert pedig változatlanul írja ki. Ha már érvényben van a nagybetűsítés és '!' érkezik, vagy érvényben van a kisbetűsítés és '^' érkezik, akkor utána a kisbetűket nagybetűvé, a nagybetűket kicsivé konvertálva írja ki, a többi karaktert változatlanul. Ha '=' érkezik bármikor, akkor az összes korábbi konverzió érvényét veszti, azaz minden karaktert úgy ír ki, ahogy beérkezik. A vezérlőkaraktereket sohasem írja ki a kimenetre.

Tervezd meg az állapotgépet állapotgráffal vagy állapottáblával, és valósítsd meg a megtervezett állapotgépet a programban!

 

Az órai feladatok mintamegoldása

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

#define MERET 10

int main(){
    double tomb[MERET];
    int i,j;

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

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

    i = 0;
    j = MERET - 1;
    while (i < j){
        while (tomb[i] < 0 && i < j) // a tömb elején megkeressük az elso pozitív elemet
            i++;
        while (tomb[j] > 0 && i < j) // a tömb végén megkeressük az elso negatív elemet
            j--;
        if (i < j){ // Ha a pozitív elem elobb van, mint a negatív, akkor megcseréljük oket
            double temp = tomb[i];
            tomb[i] = tomb[j];
            tomb[j] = temp;
        }
        i++;
        j--;
    }

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

    return 0;
}

 

2. feladat
#include <stdio.h>

int main(){
	int ch;
	while( (ch = getchar()) != EOF ){
		if( ch >= 'a' && ch <= 'z' )
			putchar(ch - 'a' + 'A' );
		else putchar(ch);
	}
	return 0;
}
/*
int main(){
	char ch;
	while( scanf("%c",&ch)==1 ){
		if( ch >= 'a' && ch <= 'z' )
			printf("%c",ch - 'a' + 'A' );
		else printf("%c",ch);
	}
	return 0;
}
*/

 

3. feladat: alapmegoldás scanf-fel és switchekkel
#include <stdio.h>

int main(){
    typedef enum allapot{Alap, Kp} allapot;
    char ch;
    allapot all = Alap;

    while(scanf("%c",&ch)==1){
        switch(all){
            case Alap:
                switch(ch){
                    case ':':
                        all=Kp;
                        break;
                    case '(':
                    case ')':
                    default:
                        printf("%c", ch);
                        break;
                }
                break;
            case Kp:
                switch(ch){
                    case ':':
                        printf(":");
                        break;
                    case '(':
                        all = Alap;
                        printf("sajnos");
                        break;
                    case ')':
                        all = Alap;
                        printf("szuper");
                        break;
                    default:
                        all = Alap;
                        printf(":%c", ch);
                        break;
                }
                break;
        }
    }
    return 0;
}

 

3. feladat: így is lehet (getchar-ral, putchar-ral, if-fel) => Ez a megoldás se nem jobb, se nem rosszabb, mint a másik.
#include <stdio.h>

int main(){
	enum { Alap, Kettospont} allapot = Alap;
	int ch;

	while( (ch = getchar()) != EOF ){
		switch(allapot){
			case Alap:
				if(ch==':')allapot=Kettospont;
				else putchar(ch);
				break;
			case Kettospont:
				if(ch=='('){
					printf("sajnos");
					allapot = Alap;
				}
				else if(ch==')'){
					printf("szuper");
					allapot = Alap;
				}
				else if(ch==':')
					putchar(':');
				else{
					printf(":%c",ch);
					allapot = Alap;
				}
				break;
		}
	}

	return 0;
}

 

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

int main() {
    char ch;
    typedef enum { alap, naggya, kicsive, kisnaggya } Allapot;
    Allapot all = alap;
    while (scanf("%c", &ch) == 1) {
        switch (all) {
        case alap:
            if (ch == '^')
                all = naggya;
            else if (ch == '!')
                all = kicsive;
            else if (ch != '=')
                printf("%c", ch);
            break;
        case naggya:
            switch (ch) {
            case '=':
                all = alap;
                break;
            case '^':
                break;
            case '!':
                all = kisnaggya;
                break;
            default:
                printf("%c", toupper(ch));
                break;
            }
            break;
        case kicsive:
            switch (ch) {
            case '=':
                all = alap;
                break;
            case '^':
                all = kisnaggya;
                break;
            case '!':
                break;
            default:
                printf("%c", tolower(ch));
                break;
            }
            break;
        case kisnaggya:
            switch (ch) {
            case '=':
                all = alap;
                break;
            case '^':
            case '!':
                break;
            default:
                if (isupper(ch))
                    printf("%c", tolower(ch));
                else
                    printf("%c", toupper(ch));
                break;
            }
            break;
        }
    }
    return 0;
}