Informatika gyűjtemény

Egy szinttel feljebb uj_brainduck.cpp

2004050607080910

NézetNyomtat

uj_brainduck.cpp (Vissza)
Az alábbi letöltési lehetőségek közül választhatsz: (segítség)
Karakterkódolás:
Sortörés:
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 2 KB
/*
    Informatika: algoritmus szakkor
    Feladat: AgyKacsa
    Forras: http://prog.berzsenyi.hu:8080/prog/View/szakkor/bdg/0910/03ora/agykacsa
    Uray M. Janos, 2009. szeptember 29.
*/
#include <stdio.h>
#include <conio.h>

typedef unsigned char byte;

#define CodeSize 65536
#define DataSize 30000

byte Code[CodeSize], Data[DataSize];

bool Read (const char *);
void Init (void);
bool Run (void);

void PrintCode (void);
void PrintData (void);

int main (int AN, char * Args []) {
    if (AN < 1)
        return 1;
    if (!Read(Args[1]))
        return 1;
    Init();
    Run();
    scanf("\n");
    return 0;
}

bool Read (const char * FN) {
    FILE * F = fopen(FN, "r");
    char X[9] = "<>+-.,[]", C;
    int I, N = 0;
    
    if (!F)
        return false;
    while (!feof(F)) {
        C = getc(F);
        for (= 0; I < 8; I++)
            if (X[I] == C)
                break;
        if (< 8)
            Code[N++] = C;
    }
    Code[N] = 0;
    fclose(F);
    return true;
}
void Init (void) {
    for (int I = 0; I < DataSize; I++)
        Data[I] = 0;
}
bool Run (void) {
    // Adatmutato, utasitasmutato
    int DP = 0, CP = 0, Bracket;
    
    while (Code[CP]) {
        switch (Code[CP++]) {
            case '>':
                DP++;
                if (DP >= DataSize) {
                    printf("Run-time error #1: pointer overflow.\n");
                    return false;
                }
                break;
            case '<':
                DP--;
                if (DP < 0) {
                    printf("Run-time error #2: pointer underflow.\n");
                    return false;
                }
                break;
            case '+':
                Data[DP]++;
                break;
            case '-':
                Data[DP]--;
                break;
            case '.':
                putc(Data[DP], stdout);
                break;
            case ',':
                Data[DP] = getch();
                break;
            case '[':
                if (Data[DP])
                    break;
                Bracket = 1;
                while (Code[CP]) {
                    if (Code[CP] == '[')
                        Bracket++;
                    if (Code[CP] == ']') {
                        Bracket--;
                        if (Bracket == 0) {
                            CP++;
                            break;
                        }
                    }
                    CP++;
                }
                if (Bracket)
                    printf("Run-time error #3: opening bracket '[' found without closing bracket ']'.");
                break;
            case ']':
                while (CP > 0) {
                    Bracket = 1;
                    if (Code[CP] == ']')
                        Bracket++;
                    if (Code[CP] == '[') {
                        Bracket--;
                        if (Bracket == 0)
                            break;
                    }
                    CP--;
                }
                if (Bracket)
                    printf("Run-time error #4: closing bracket '[' found without opening bracket ']'.");
                break;
        }
    }
    return true;
}

void PrintCode (void) {
    for (int I = 0; Code[I]; I++)
        printf("%c", Code[I]);
    printf("\n");
}
void PrintData (int N = DataSize) {
    for (int I = 0; I < N; I++)
        printf("%c", Data[I]);
    printf("\n");
}
(Vissza)