Informatika gyűjtemény

Egy szinttel feljebb mb_dns.c

2004050607080910

NézetNyomtat

mb_dns.c (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: 4 KB
/*
 * Forditas:
 * cc -o dns dns.c -Wall
 *
 * Forditas (keppel):
 * cc -o dns dns.c -Wall -DKEP -lgd
 *
 * Futtatas:
 * ./dns < bemenet > kimenet
 *
 * Futtatas (keppel):
 * ./dns < bemenet > kimenet 2> kep.png
 */
#include <stdio.h>

#ifdef KEP
#include <gd.h>
#include <gdfonts.h>
#endif

char tomb[100][100], a[100], b[100], honnan[100][100];
size_t a_len, b_len;

#define H_ATLO 1
#define H_BAL 2
#define H_FEL 3
/* a kepkezeleshez kell, ezek azok a mezok, amik kellenek a honnan
 * tombbol */
#define H_KIRALY 4

int beolvas()
{
    char buffer[128];
    size_t i;

    if (!fgets(buffer, 128, stdin)) {
        printf("hibas bemenet\n");
        return 0;
    }

    for (= 0; i < 128; i++)
        if (buffer[i] == 'A' || buffer[i] == 'C' ||
            buffer[i] == 'G' || buffer[i] == 'T')
            a[i] = buffer[i];
        else
            break;

    a_len = i;

    if (!fgets(buffer, 128, stdin)) {
        printf("hibas bemenet\n");
        return 0;
    }

    for (= 0; i < 128; i++)
        if (buffer[i] == 'A' || buffer[i] == 'C' ||
            buffer[i] == 'G' || buffer[i] == 'T')
            b[i] = buffer[i];
        else
            break;

    b_len = i;

    return 1;
}

int t(int i, int j)
{
    if (< 0 || j < 0)
        return 0;

    return tomb[i][j];
}

int db()
{
    int i, j, x, y;

    for (= 0; i < a_len; i++)
        for (= 0; j < b_len; j++)
            if (a[i] == b[j]) {
                tomb[i][j] = t(- 1, j - 1) + 1;
                honnan[i][j] = H_ATLO;
            } else {
                x = t(- 1, j);
                y = t(i, j - 1);

                if (>= y) {
                    tomb[i][j] = x;
                    honnan[i][j] = H_BAL;
                } else {
                    tomb[i][j] = y;
                    honnan[i][j] = H_FEL;
                }
            }

    return tomb[a_len - 1][b_len - 1];
}

char *leghosszabb()
{
    static char buffer[128];
    int i, j, l = 127;

    i = a_len - 1;
    j = b_len - 1;

    buffer[l--] = '\0';

    while (>= 0 && j >= 0) {
        switch (honnan[i][j]) {
        case H_ATLO:
            buffer[l--] = a[i];
            honnan[i][j] = H_KIRALY;
            i--;
            j--;
            break;
        case H_BAL:
            i--;
            break;
        case H_FEL:
            j--;
            break;
        }
    }

    return &buffer[+ 1];
}

#ifdef KEP
void kep()
{
    gdImagePtr im;
    gdFontPtr f;
    int feher, fekete, piros, szin;
    size_t maxx, maxy, i, j, x, y;
    char num[4];

    f = gdFontSmall;

    /* vonal 5px 3char 5px */
    maxx = (3 * f->+ 11) * (a_len + 1);
    /* vonal 5px char 5px */
    maxy = (1 * f->+ 11) * (b_len + 1);

    im = gdImageCreate(maxx + 1, maxy + 1);
    if (!im) {
        printf("nem tudom letrehozni a kepet\n");
        return;
    }

    feher = gdImageColorAllocate(im, 255, 255, 255);
    fekete = gdImageColorAllocate(im, 0, 0, 0);
    piros = gdImageColorAllocate(im, 255, 0, 0);

    /* keret */
    for (= 0; i < a_len + 1; i++) {
        x = i * (3 * f->+ 11);
        gdImageLine(im, x, 0, x, maxy, fekete);
    }

    for (= 0; i < b_len + 1; i++) {
        y = i * (1 * f->+ 11);
        gdImageLine(im, 0, y, maxx, y, fekete);
    }

    /* keret jobb es also szele */
    gdImageLine(im, 0, maxy, maxx, maxy, fekete);
    gdImageLine(im, maxx, 0, maxx, maxy, fekete);

    /* betuk */
    for (= 0; i < a_len; i++) {
        x = (+ 1) * (3 * f->+ 11);
        szin = fekete;

        for (= 0; j < b_len; j++)
            if (honnan[i][j] == H_KIRALY) {
                szin = piros;
                gdImageFilledRectangle(im, x, 0,
                               x + 3 * f->+ 10,
                               1 * f->+ 10, fekete);
                break;
            }

        gdImageChar(im, f, x + 6, 6, a[i], szin);
    }

    for (= 0; i < b_len; i++) {
        y = (+ 1) * (1 * f->+ 11);
        szin = fekete;

        for (= 0; j < a_len; j++)
            if (honnan[j][i] == H_KIRALY) {
                szin = piros;
                gdImageFilledRectangle(im, 0, y,
                               3 * f->+ 10,
                               y + 1 * f->+ 10,
                               fekete);
                break;
            }

        gdImageChar(im, f, 6, y + 6, b[i], szin);
    }

    /* szamok */
    for (= 0; i < a_len; i++) {
        for (= 0; j < b_len; j++) {
            snprintf(num, 4, "%3d", tomb[i][j]);

            x = (+ 1) * (3 * f->+ 11);
            y = (+ 1) * (1 * f->+ 11);

            if (honnan[i][j] == H_KIRALY)
                gdImageFilledRectangle(im, x, y,
                               x + 3 * f->+ 10,
                               y + 1 * f->+ 10,
                               fekete);

            gdImageString(im, f, x + 6, y + 6, (unsigned char *)num,
                      (honnan[i][j] == H_KIRALY) ? piros
                                 : fekete);
        }
    }

    gdImagePng(im, stderr);

    gdImageDestroy(im);
}
#endif

int main()
{
    if (!beolvas())
        return 1;

    printf("%u\r\n", db());
    printf("%s\r\n", leghosszabb());

#ifdef KEP
    kep();
#endif

    return 0;
}
(Vissza)